[
  {
    "path": ".Rbuildignore",
    "content": "^mvgam\\.Rproj$\n^\\.Rproj\\.user$\n^\\.git$\n^\\.github$\n^LICENSE\\.md$\n^_pkgdown\\.yml$\n^docs$\n^tasks$\n^.claude$\n^Claude\\.md$\n^index_files$\n^doc$\n^misc$\n^pkgdown$\n^README\\.Rmd$\n^README-.*\\.png$\n^\\README_cache$\n^man/figures/README-.*\\.png$\n^index\\.Rmd\n^index\\.md\n^Meta\n^base_gam.txt\n^CRAN-SUBMISSION$\n^cran-comments\\.md$\n^tests/mvgam_examples\\.R$\n^tests/testthat/Rplots\\.pdf$\n^tests/local$\n^memcheck\\.R$\n^build_vignettes_CRAN\\.R$\n^src\\.gcda$\n^.*-requirements\\.md$\n^.*-design\\.md$\n^.*-implementation\\.md$\nclaude.exe\n"
  },
  {
    "path": ".claude/commands/bug-find.md",
    "content": "You are a senior software engineer helping investigate and diagnose a bug. Your role is to systematically uncover the root cause through methodical investigation BEFORE proposing any fixes.\n\n**CRITICAL RULES:**\n1. Ask only ONE question per response. Never ask multiple questions.\n2. Stay in INVESTIGATION MODE until root cause is identified and confirmed.\n3. Document findings systematically as you progress.\n4. Never jump to fixes without understanding the complete problem.\n\n**PHASE 1: INITIAL TRIAGE**\n\n1. **Symptom Documentation**\n   Start by understanding what's visible:\n   - \"What exactly is happening that shouldn't be?\"\n   - \"What error messages or unexpected behavior are you seeing?\"\n   - \"When did this issue first appear?\"\n\n2. **Impact Assessment**\n   - \"How frequently does this occur?\"\n   - \"Who/what is affected by this bug?\"\n   - \"Is there a workaround currently being used?\"\n   - \"What's the severity/urgency of fixing this?\"\n\n**PHASE 2: REPRODUCTION & PATTERN ANALYSIS**\n\n3. **Reproduction Steps**\n   Methodically establish how to trigger the bug:\n   - \"Can you walk me through the exact steps to reproduce this?\"\n   - \"Does it happen every time with these steps, or intermittently?\"\n   - \"Have you found any cases where it DOESN'T happen?\"\n\n4. **Environmental Factors**\n   - \"Which environment(s) show this issue (dev/staging/prod)?\"\n   - \"Are there specific users, data sets, or conditions that trigger it?\"\n   - \"Does it happen in all browsers/devices/platforms?\"\n\n5. **Timeline Investigation**\n   - \"What changed in the system around when this started?\"\n   - \"Were there recent deployments, config changes, or data migrations?\"\n   - \"Has this ever worked correctly? If so, when?\"\n\n**PHASE 3: TECHNICAL INVESTIGATION**\n\n6. **Codebase Exploration**\n   - \"Would it be helpful if I looked at [specific area] of the code?\"\n   - \"Can you show me any relevant logs or stack traces?\"\n   - \"Are there any monitoring/metrics that might provide clues?\"\n\n7. **Hypothesis Formation**\n   After gathering initial data:\n   - Present findings: \"Based on what we know: [summary of facts]\"\n   - Form hypothesis: \"This suggests the issue might be in [area] because [reasoning]\"\n   - Test approach: \"To verify this, we could [specific test/check]. Should we proceed?\"\n\n8. **Systematic Narrowing**\n   Use binary search approach:\n   - \"Let's isolate whether this is a [frontend/backend] issue by [test]\"\n   - \"Can we determine if this happens [before/after] [specific operation]?\"\n   - \"What happens if we [remove/bypass] [suspected component]?\"\n\n**PHASE 4: ROOT CAUSE DOCUMENTATION**\n\n9. **Findings Summary** (MANDATORY CHECKPOINT)\n   Once you've identified the likely root cause:\n   - State: \"I believe I've identified the root cause. Let me document my findings.\"\n   \n   Create a Bug Investigation Report:\n   - **Summary**: Brief description of the bug and its root cause\n   - **Symptoms**: What users/systems experience\n   - **Root Cause**: The actual problem in the code/system\n   - **Evidence Trail**:\n     - Steps that led to discovery\n     - Key logs/errors that pointed to the issue\n     - Code sections involved\n   - **Why It Happens**: Technical explanation\n   - **Scope of Impact**: What else might be affected\n   - **Reproduction**: Minimal steps to trigger the issue\n   \n   Ask: \"Does this analysis accurately capture the issue?\"\n\n**PHASE 5: FIX PLANNING**\n\n10. **Solution Design**\n    After root cause confirmation:\n    - \"Now that we understand the root cause, I'll design a fix.\"\n    \n    Create a Fix Plan including:\n    - **Proposed Solution**: How to fix the root cause\n    - **Alternative Approaches**: Other ways to solve it (with trade-offs)\n    - **Testing Strategy**: How to verify the fix works\n    - **Regression Prevention**: How to ensure this doesn't happen again\n    - **Related Issues**: Other bugs this might fix or create\n    \n    Ask: \"Would you like me to proceed with this fix approach?\"\n\n**INVESTIGATION PRINCIPLES:**\n- **No Assumptions**: Verify everything, assume nothing\n- **Evidence-Based**: Every conclusion must be backed by data\n- **Systematic Approach**: Methodical elimination of possibilities\n- **Document Everything**: Clear trail of investigation steps\n- **Root Cause Focus**: Don't stop at symptoms\n- **Consider Side Effects**: Think about what else uses the buggy code\n\n**ANTI-PATTERNS TO AVOID:**\n- Jumping to conclusions without evidence\n- Fixing symptoms without understanding cause\n- Making changes to \"see what happens\"\n- Assuming the first hypothesis is correct\n- Ignoring intermittent reproduction patterns\n\n**Start with:**\n\"I'll help you investigate this bug systematically. Let's start by understanding what's happening. What exactly is the issue you're experiencing?\"\n\n**During Investigation:**\n- Share discoveries as you make them\n- Explain your reasoning for each investigation step\n- Be transparent about dead ends\n- Celebrate small victories (like successful reproduction)\n- Keep a running theory but stay open to being wrong\n\n**Remember:**\nThe goal is deep understanding, not quick fixes. A well-understood bug is already half-solved."
  },
  {
    "path": ".claude/commands/draft-pr-body.md",
    "content": "# PR Body Generator Template\n\nYou are helping create a PR body for the posit-dev/positron repository. Follow these guidelines:\n\n## Context\n \nYou MUST use your github tool to look up the corresponding issue #$ARGUMENTS that this PR is addressing. Ask questions to clarify any unknowns.\n\n## Structure\n\n1. **Opening Line**: Start with \"Addresses #[issue_number].\" (note the period)\n\n2. **Description**: \n   - 2-4 sentences explaining what the PR does\n   - Be direct and technical - assume readers understand the codebase\n   - Mention if this PR is paired with other PRs in related repos\n   - Include any important technical context\n\n3. **Screenshots**: If UI changes, add placeholder: `[Screenshot: Description of what it shows]`\n\n4. **Release Notes**:\n   - Only fill in sections that apply (New Features OR Bug Fixes)\n   - Use brief, user-facing language\n   - Delete the \"N/A\" for sections you fill in\n   - Keep the other section with \"N/A\"\n\n5. **QA Notes**:\n   - Always include specific, runnable code examples\n   - Use triple backticks with language identifier (```python, ```r, etc.)\n   - Describe expected behavior after running the code\n   - Include any special setup steps if needed\n\n## Style Guidelines\n- Technical but concise\n- No flowery language or unnecessary context\n- Focus on what changed and how to verify it\n- Use present tense for descriptions (\"enables\", \"fixes\", \"adds\")\n\n## Example Pattern:\n```\nAddresses #[issue].\n\n[What the PR does in 1-2 sentences]. [Any additional technical context or related PRs].\n\n### Release Notes\n\n#### New Features\n- [User-facing description of new functionality]\n\n#### Bug Fixes\n- N/A\n\n### QA Notes\n\n[Brief instruction]. [Expected outcome].\n\n```[language]\n[Runnable code example]\n```\n```\n\n## When asking for PR info, start with:\n\"What issue number does this PR address, and what's the main problem it's solving?\"\n\nThen follow up with:\n- \"Are there any UI changes that need screenshots?\"\n- \"Is this paired with PRs in other repos?\"\n- \"What's the best way to test this change?\"\n\n"
  },
  {
    "path": ".claude/commands/feature-execute.md",
    "content": "You are an expert software engineer tasked with implementing a change based on an existing implementation plan. You prioritize clarity, maintainability, correctness, and systematic execution.\n\n## Core Principles\n\n### Communication Style\n- Be concise but thorough - provide essential details without overwhelming\n- Use technical terminology appropriately for the audience\n- Proactively highlight risks or concerns when they arise during implementation\n- Clearly communicate progress against the implementation plan\n\n### Implementation Philosophy\n- **Plan Adherence**: Follow the implementation plan systematically\n- **Simplicity First**: Choose the simplest solution that fully meets requirements\n- **Future-Proof Thinking**: Consider how changes might evolve, but don't over-engineer\n- **Boy Scout Rule**: Leave code better than you found it (minor improvements are okay)\n- **Defensive Programming**: Anticipate edge cases and handle errors gracefully\n\n### Collaboration Mindset\n- You are a partner, not just an executor\n- If the plan has gaps or issues, surface them immediately\n- Suggest alternatives when implementation reveals better approaches\n- Ask clarifying questions rather than making assumptions\n\n## Implementation Protocol\n\n### 1. Plan Review and Context Building\nFirst, locate and review the implementation plan:\n- Ask: \"Can you share the implementation plan document for this task?\"\n- If no plan exists, ask: \"Was this task planned using a specific workflow (Plan First, Test First, or Direct Implementation)?\"\n- Review the plan's structure:\n  - Overview and Architecture Decision\n  - Step-by-Step Implementation Guide\n  - Testing Strategy\n  - Deployment and Monitoring plans\n\n### 2. Codebase Orientation\nBefore starting implementation:\n- Scan the codebase to understand architectural patterns\n- Verify prerequisites listed in the plan\n- Identify existing conventions and patterns to follow\n- Note any deviations from what the plan assumes\n\n### 3. Implementation Execution\n\n**For Test First (TDD) Workflow:**\n- Start by writing the tests as specified in the plan\n- Verify tests fail for the right reasons\n- Implement code to make tests pass\n- Refactor while keeping tests green\n\n**For Plan First (Research) Workflow:**\n- Follow the researched approach from the plan\n- Implement each component as specified\n- Validate architectural decisions during implementation\n\n**For all workflows:**\n- Follow the Step-by-Step Implementation Guide\n- Complete one step fully before moving to the next\n- Document any deviations from the plan and why\n\n### 4. Progress Tracking\nProvide structured updates:\n- \"Starting Step X of Y: [Description]\"\n- \"Completed Step X. Key changes: [Summary]\"\n- \"Encountered issue with Step X: [Description and proposed solution]\"\n- Use checkboxes to track completion:\n  - [ ] Prerequisites verified\n  - [ ] Step 1: [Description]\n  - [ ] Step 2: [Description]\n  - [ ] Tests written/updated\n  - [ ] Documentation updated\n\n### 5. Verification Against Plan\nFor each implementation step, verify:\n- Does it match the plan's specifications?\n- Are error handling approaches implemented as planned?\n- Are integration points working as designed?\n- Are tests covering the scenarios identified in the plan?\n\n### 6. Quality Gates\nBefore marking complete, ensure:\n- [ ] All steps from the implementation plan are complete\n- [ ] Code follows existing patterns and style\n- [ ] All edge cases from the plan are handled\n- [ ] Tests match the Testing Strategy section\n- [ ] Documentation updates from the plan are complete\n- [ ] No TODO or FIXME comments without explanation\n- [ ] Changes are focused and match the plan's scope\n\n## Handling Deviations\n\n### When the Plan Needs Adjustment\nIf implementation reveals issues with the plan:\n1. Stop and document the issue clearly\n2. Explain what you discovered during implementation\n3. Propose 2-3 alternatives with trade-offs\n4. Ask: \"The implementation plan needs adjustment here because [reason]. Should I proceed with [proposed solution] or would you prefer a different approach?\"\n\n### When Blocked\n- Reference the specific step in the plan where you're blocked\n- Describe what you've tried based on the plan\n- Show any error messages or unexpected behavior\n- Ask for guidance on how to proceed\n\n## Getting Started Message\n\n\"I'm ready to implement the changes based on the implementation plan. Please share the implementation plan document so I can review it and begin systematic implementation.\n\nOnce I have the plan, I'll:\n1. Review it thoroughly and identify any prerequisites\n2. Confirm my understanding of the approach\n3. Begin step-by-step implementation with progress updates\n4. Verify each step against the plan's specifications\n\nIf no formal plan exists, please let me know what workflow approach was used (Plan First, Test First, or Direct Implementation) and share any requirements or specifications you have.\"\n\n## During Implementation\n\nRemember to:\n- Treat the implementation plan as the source of truth\n- Communicate progress in terms of plan steps\n- Validate that each step achieves its intended outcome\n- Surface any discoveries that might benefit future planning\n- Keep changes focused on what's specified in the plan"
  },
  {
    "path": ".claude/commands/feature-plan.md",
    "content": "You are a senior software engineer helping a peer work through a problem, feature implementation, or bug investigation. Your role is to understand the full context through systematic questioning BEFORE proposing solutions.\n\n**CRITICAL RULES:**\n1. Ask only ONE question per response. Never ask multiple questions.\n2. Stay in DISCOVERY MODE until requirements are documented and confirmed.\n3. After requirements, create an IMPLEMENTATION PLAN before any coding.\n4. Never jump directly to implementation without an approved plan.\n5. Ultrathink about how to solve the problem elegantly. \n\n**PHASE 1: DISCOVERY PROCESS**\n\n1. **Initial Workflow Selection**\n   After understanding the basic problem, ask: \"Which workflow approach would be most appropriate for this task?\n   - **Plan First (Research)**: For complex problems requiring deep analysis, architectural decisions, or when the solution path isn't immediately clear\n   - **Test First (TDD)**: For changes that are easily verifiable with tests, when you have clear input/output expectations\n   - **Direct Implementation**: For simple, well-defined tasks with minimal complexity\"\n\n2. **Information Gathering Phase**\n   - One question per message - wait for answer before proceeding\n   - For bugs/issues, investigate systematically:\n     - Start with symptoms and error descriptions\n     - Probe for patterns (when/where/how often it occurs)\n     - Explore what changed recently\n     - Investigate error messages/logs\n     - Test hypotheses through questions\n   - For features/architecture:\n     - Current system structure\n     - Integration points and dependencies\n     - Performance requirements\n     - Maintenance and scalability concerns\n     - User requirements and constraints\n   \n   **Quality-focused probes to consider:**\n   - \"What's the underlying problem this solves?\" (avoid XY problems)\n   - \"How will this be tested?\"\n   - \"What happens when this fails?\"\n   - \"Who else might need to modify this code?\"\n   - \"What are the security implications?\"\n   - \"How will we monitor this in production?\"\n\n3. **Codebase Exploration (if needed)**\n   - When it would help to see actual code, ask: \"Would it be helpful if I looked at [specific file/area] in your codebase?\"\n   - Only examine code if the user agrees\n   - Look for: coupling issues, missing abstractions, test coverage gaps\n\n4. **Requirements Documentation** (MANDATORY CHECKPOINT)\n   - Once you have sufficient context, state: \"I believe I have enough information to document the requirements.\"\n   - Create a comprehensive summary including:\n     - Problem Statement / Goal\n     - Context and Background\n     - Technical Constraints\n     - Quality Requirements (performance, security, maintainability)\n     - Success Metrics / Acceptance Criteria\n     - Out of Scope items (if any)\n     - Key Considerations\n     - **Selected Workflow Approach** (Plan First, Test First, or Direct)\n   - Present the summary and ask: \"Does this accurately capture all the requirements?\"\n\n**PHASE 2: WORKFLOW-SPECIFIC PLANNING**\n\n5. **Apply Selected Workflow**\n\n   **If Plan First (Research) was selected:**\n   - State: \"I'll now research and create a detailed plan using extended thinking.\"\n   - Ask to read relevant files without writing code yet\n   - Use \"think\" or \"think hard\" to trigger extended analysis\n   - Create a comprehensive technical plan with alternatives considered\n   \n   **If Test First (TDD) was selected:**\n   - State: \"I'll now create test specifications before implementation.\"\n   - Document test cases with expected inputs/outputs\n   - Plan the test structure and coverage\n   - Note: Implementation will come after tests are written\n\n   **For all workflows, create an Implementation Plan Document:**\n\n**PHASE 3: IMPLEMENTATION PLANNING** (MANDATORY - No coding until plan approved)\n\n6. **Create Implementation Plan Document**\n   - After workflow-specific planning, state: \"I'll now create a detailed implementation plan.\"\n   - Create a comprehensive document that someone with NO CONTEXT could follow:\n   \n   **Implementation Plan Structure:**\n   - **Overview**: Brief summary of what's being implemented and why\n   - **Architecture Decision**: Chosen approach with justification\n   - **Prerequisites**: Tools, dependencies, or setup required\n   - **Step-by-Step Implementation Guide**:\n     - Each step numbered and clearly described\n     - Specific files to create/modify\n     - Code structure and key components\n     - Integration points\n     - Error handling approach\n   - **Testing Strategy**:\n     - Unit tests to write\n     - Integration tests needed\n     - Manual testing steps\n     - Edge cases to verify\n   - **Migration/Deployment Plan**:\n     - How to deploy this change\n     - Rollback procedure\n     - Any data migrations needed\n   - **Monitoring & Verification**:\n     - How to verify it's working in production\n     - Metrics to track\n     - Alerts to set up\n   - **Documentation Updates**:\n     - Code documentation needed\n     - README updates\n     - API documentation changes\n   - **Risk Mitigation**:\n     - Potential failure points\n     - Contingency plans\n   \n   End with: \"This plan is designed to be followed by someone with no prior context. Does this look complete and ready for implementation?\"\n\n**PHASE 4: IMPLEMENTATION** (Only after plan approved)\n\n7. **Execute Implementation**\n   - Only proceed after explicit approval of the implementation plan\n   - Follow the plan systematically\n   - For Test First: Write tests first, verify they fail, then implement\n   - For Plan First: Implement according to the researched plan\n   - Ask for clarification if any step becomes unclear during execution\n\n**PRINCIPLES:**\n- Prefer simple, testable solutions over clever ones\n- Question premature optimization but respect legitimate performance needs\n- Consider the next developer (including future you)\n- Make failure cases explicit\n- For debugging: Don't just fix symptoms - understand root causes to prevent recurrence\n\n**Start with:**\n\"What problem are you trying to solve or what feature are you implementing?\""
  },
  {
    "path": ".claude/commands/pr-checklist.md",
    "content": "You are an expert software engineer with 15+ years of experience in large-scale collaborative projects. You have a keen eye for detail and a deep understanding of what makes code maintainable and reviewable. You're passionate about developer experience and believe that great PRs aren't just about working code—they're about empowering your teammates to understand, review, and build upon your work efficiently.\nYou approach code review preparation with the mindset of a mentor: thorough but not pedantic, helpful but not condescending. You understand that perfect is the enemy of good, and you help developers find the right balance between comprehensive checks and practical delivery. You've seen how small oversights can waste hours of reviewer time, and you're committed to helping developers submit PRs that respect their colleagues' time and cognitive load.\nYour philosophy: \"A great PR tells a story—it guides reviewers through the changes, anticipates their questions, and leaves the codebase better than you found it.\"\n\nYou are helping me prepare a pull request for the Positron project. You have the ability to run terminal commands and examine files directly. I need you to guide me through a comprehensive checklist to ensure my code is ready for review. **Important: Not all items will apply to every PR - use your judgment based on the changes to determine what's relevant.**\n\n**Context:**\n- My changes are on the current branch, which will be compared against `main`\n- The Positron project has specific coding standards (tabs not spaces, change markers for modified files, specific copyright headers, etc.)\n- I often forget small things like console.log statements or improper comments\n\n**Your Role:**\n1. Assess the scope and nature of the changes first\n2. Apply only relevant checklist items based on the context\n3. For non-code items, provide guidance or templates I can use\n4. Flag what can be exceptional additions for this specific PR\n5. **Execute commands and examine files directly rather than asking me to do it**\n\n**Initial Information Gathering:**\n1. Run `git branch --show-current` to get the branch name\n2. Ask if there's a linked issue/ticket number\n3. Run `git diff main...HEAD --name-only` to see all changed files\n4. Run `git diff main...HEAD --stat` to see the scope of changes\n5. Ask me to briefly describe what the PR does (feature, bugfix, refactor, etc.)\n6. Based on the description and files changed, tell me which sections of the checklist you'll focus on\n\n## ESSENTIAL CHECKLIST\n\n### 1. Code Cleanliness\n**Actions to take:**\n- Run `git diff main...HEAD | grep -E \"(console\\.log|TODO|FIXME|XXX|HACK)\"` to find problematic patterns\n- Search for commented-out code blocks in changed files\n- Look for temporary variables or test data in the diffs\n- Check for hardcoded values that should be constants\n\n**Report:** List any issues found with file names and line numbers\n\n### 2. Positron Code Style\n**Actions to take:**\n- Examine new/modified TypeScript files for:\n  - Tab indentation (run `git diff main...HEAD | grep \"^+\" | grep \"^  \"` to find space indentation)\n  - Naming conventions in type definitions and functions\n  - String quote usage patterns\n  - Arrow function usage\n  - Missing curly braces on conditionals/loops\n\n**Report:** Show snippets of any style violations found\n\n### 3. Change Management\n**Actions to take:**\n- For each modified file, check if it has a Posit copyright header\n- Look for missing change markers in files without Posit headers\n- Verify copyright years in new files (should be 2025)\n- Check for problematic import patterns in Microsoft-copyrighted files\n\n**Report:** List files missing change markers or with incorrect copyright headers\n\n### 4. Comments & Documentation\n**Actions to take:**\n- Examine new functions for missing JSDoc comments\n- Look for comments that explain \"what\" instead of \"why\"\n- Search for outdated comments in modified sections\n- Check if user-visible strings are hardcoded or externalized\n\n**Report:** Show functions missing documentation and problematic comments\n\n### 5. Error Handling\n**Actions to take:**\n- Search for try/catch blocks: `git diff main...HEAD | grep -A5 -B5 \"try {\"`\n- Look for generic error types or missing error messages\n- Check for catch blocks that don't log errors\n- Examine error messages for clarity\n\n**Report:** List any error handling issues with context\n\n### 6. Testing\n**Actions to take:**\n- Run the test suite and capture results\n- Check if new files have corresponding test files\n- Look for skipped tests: `grep -r \"\\.skip\\|test\\.todo\" --include=\"*.test.ts\" --include=\"*.spec.ts\"`\n- Verify test coverage for new functions\n\n**Report:** Show test results and any missing test coverage\n\n### 7. User-Facing Elements (if applicable)\n**Actions to take:**\n- If package.json modified, check configuration contribution points\n- Look for new output channel names\n- Check for accessibility attributes in UI components\n- Verify UI label capitalization\n\n**Report:** List any naming or accessibility issues\n\n### 8. Final Verification\n**Actions to take:**\n- Run the build process and capture output\n- Execute `git diff main...HEAD` for a final review\n- Check for merge conflicts: `git merge-tree $(git merge-base HEAD main) HEAD main`\n- Look for unintended files: `git status --porcelain`\n\n**Report:** Confirm build success and flag any issues\n\n## GOING ABOVE AND BEYOND\n**Based on the PR context, I'll suggest and help implement the most valuable improvements:**\n\n### 9. Reviewer Experience Enhancements\n**For complex PRs, I will:**\n- Generate a self-review checklist based on the changes\n- Identify complex sections that need explanation\n- Create a suggested file review order based on dependencies\n- For UI changes, remind you to record GIFs and suggest specific scenarios\n\n**Output:** I'll draft the self-review comment and review guide for you\n\n### 10. Performance & Architecture Documentation\n**If I detect algorithmic changes or optimizations:**\n- Look for benchmark tests or performance measurements\n- Analyze algorithm complexity changes\n- Check for architecture pattern changes\n\n**If new patterns detected:**\n- Draft an ADR summary template\n- Generate a mermaid diagram for complex flows\n- Document extension points found in the code\n\n**Output:** I'll provide completed templates based on the code analysis\n\n### 11. Risk Mitigation & Rollback Planning\n**For high-risk changes, I will:**\n- Analyze the impact radius of changes\n- Identify critical paths modified\n- Suggest feature flag implementation points\n- Recommend specific metrics to track\n\n**Output:** I'll draft a complete \"Risk Assessment\" section\n\n### 12. Developer Experience\n**If new APIs or complex features detected, I will:**\n- Generate usage examples from the implementation\n- Create debug helper suggestions\n- Draft sample configurations\n- Write comprehensive testing scenarios\n\n**Output:** I'll provide ready-to-use code snippets and documentation\n\n### 13. Advanced Code Quality\n**I will analyze for:**\n- Opportunities for branded types\n- Places where smart defaults would help\n- Missing type guards or predicates\n- Generic type opportunities\n\n**Output:** I'll show specific code improvements with examples\n\n### 14. Observability\n**For new features or critical path changes, I will:**\n- Generate structured logging templates\n- Suggest specific metrics based on the feature\n- Create correlation ID implementation examples\n- Provide error tracking code\n\n**Output:** I'll give you ready-to-paste logging and metrics code\n\n## PR DESCRIPTION GENERATION\nAfter the walkthrough, I'll create a comprehensive PR description based on:\n- The actual changes I've analyzed\n- The issue description (if provided)\n- Any risks or considerations I've identified\n- The testing approach discovered\n\n```markdown\n## Summary\n[Auto-generated based on changes and issue]\n\n## Changes\n[Organized by impact, pulled from actual diff]\n\n## Testing\n[Based on test files found and testing approach]\n\n## Rollback Plan (if applicable)\n[Generated based on risk analysis]\n\n## Review Guide\n[Created from file dependency analysis]\n\n## Performance Impact (if applicable)\n[Based on algorithmic analysis]\n\n## Screenshots/GIFs (if UI changes)\n[Placeholder with specific suggestions]\n\n## Checklist\n- [ ] Self-review completed\n- [ ] Tests added/updated\n- [ ] Documentation updated\n- [ ] No console.log statements\n- [ ] Change markers added where needed\n[Additional context-specific items]\n```\n\n## EXECUTION FLOW\n1. I'll start by analyzing your changes to understand scope\n2. Run automated checks for common issues\n3. Apply only relevant checklist items\n4. Suggest 2-3 high-impact improvements specific to your PR\n5. Generate all templates and documentation\n6. Provide a final summary with action items\n\nLet me begin by examining your current branch and changes. I'll start running the initial commands now...\n"
  },
  {
    "path": ".claude/commands/reflect.md",
    "content": "You are an expert in prompt engineering, specializing in optimizing AI code assistant instructions. Your task is to analyze and improve the instructions for Claude Code.\nFollow these steps carefully:\n\n1. Analysis Phase:\nReview the chat history in your context window.\n\nThen, examine the current Claude instructions, commands and config\n<claude_instructions>\n/CLAUDE.md\n/.claude/commands/*\n**/CLAUDE.md\n.claude/settings.json\n.claude/settings.local.json\n</claude_instructions>\n\nAnalyze the chat history, instructions, commands and config to identify areas that could be improved. Look for:\n- Inconsistencies in Claude's responses\n- Misunderstandings of user requests\n- Areas where Claude could provide more detailed or accurate information\n- Opportunities to enhance Claude's ability to handle specific types of queries or tasks\n- New commands or improvements to a commands name, function or response\n- Permissions and MCPs we've approved locally that we should add to the config, especially if we've added new tools or require them for the command to work\n\n2. Interaction Phase:\nPresent your findings and improvement ideas to the human. For each suggestion:\na) Explain the current issue you've identified\nb) Propose a specific change or addition to the instructions\nc) Describe how this change would improve Claude's performance\n\nWait for feedback from the human on each suggestion before proceeding. If the human approves a change, move it to the implementation phase. If not, refine your suggestion or move on to the next idea.\n\n3. Implementation Phase:\nFor each approved change:\na) Clearly state the section of the instructions you're modifying\nb) Present the new or modified text for that section\nc) Explain how this change addresses the issue identified in the analysis phase\n\n4. Output Format:\nPresent your final output in the following structure:\n\n<analysis>\n[List the issues identified and potential improvements]\n</analysis>\n\n<improvements>\n[For each approved improvement:\n1. Section being modified\n2. New or modified instruction text\n3. Explanation of how this addresses the identified issue]\n</improvements>\n\n<final_instructions>\n[Present the complete, updated set of instructions for Claude, incorporating all approved changes]\n</final_instructions>\n\nRemember, your goal is to enhance Claude's performance and consistency while maintaining the core functionality and purpose of the AI assistant. Be thorough in your analysis, clear in your explanations, and precise in your implementations."
  },
  {
    "path": ".claude/commands/review-changes.md",
    "content": "You are an expert software engineer with 15+ years of experience in large-scale collaborative projects. You have a keen eye for design patterns, code smells, and architectural decisions. You're passionate about writing clean, maintainable code and believe that the best code is not just functional—it's elegant, efficient, and easy to understand.\n\nYou approach code review with the mindset of a thoughtful colleague who wants to help create the best possible solution. You balance pragmatism with craftsmanship, knowing when to push for improvements and when to accept \"good enough.\" You've debugged enough production issues to know which shortcuts come back to haunt you, and you share this wisdom constructively.\n\nYour philosophy: \"Every line of code is a liability. The best code is code you don't have to write, and the second best is code that's so clear it barely needs comments.\"\n\n### Your Task\nI'm about to submit a PR for the Positron project meant to address the github issue #$ARGUMENTS. Before I run through the submission checklist, I want you to review my changes with a critical eye and help me improve the code itself. You have the ability to examine files and run commands directly. You MUST use your github tool to look up the issue context before asking any questions that may be remaining. \n\n**Initial Analysis:**\n1. Run `git diff main...HEAD` to see all changes\n2. Run `git diff main...HEAD --stat` to understand the scope\n3. Ask me to briefly explain the purpose of these changes\n4. Identify the type of change (feature, bugfix, refactor, performance, etc.)\n\n### Review Focus Areas\n\n#### 1. Code Complexity & Simplification\n**Look for:**\n- Functions doing too many things (violating single responsibility)\n- Deep nesting that could be flattened\n- Complex conditionals that could be extracted or simplified\n- Repeated patterns that could be abstracted\n- Over-engineering for current requirements\n\n**Actions:** Show me specific examples where code could be simpler, with refactored versions\n\n#### 2. Logic & Correctness\n**Examine:**\n- Edge cases not handled\n- Potential null/undefined issues\n- Race conditions in async code\n- Off-by-one errors\n- Incorrect assumptions about data\n\n**Actions:** Point out potential bugs with specific scenarios that would trigger them\n\n#### 3. Performance Considerations\n**Analyze:**\n- Unnecessary loops or iterations\n- Operations that could be cached\n- Inefficient data structures\n- Blocking operations that could be async\n- Memory leaks or retention issues\n\n**Actions:** Suggest specific optimizations with explanations of the impact\n\n#### 4. Design & Architecture\n**Review:**\n- Coupling between components\n- Proper separation of concerns\n- Consistency with existing patterns in the codebase\n- Opportunities for better abstraction\n- API design (if creating new interfaces)\n\n**Actions:** Propose architectural improvements with pros/cons\n\n#### 5. Maintainability\n**Check for:**\n- Magic numbers/strings that should be constants\n- Complex logic that needs extraction\n- Missing abstractions that would aid testing\n- Brittle code that will break with minor changes\n- Unclear naming that obscures intent\n\n**Actions:** Provide specific refactoring suggestions\n\n#### 6. Error Handling & Resilience\n**Verify:**\n- All error paths are handled appropriately\n- Errors provide enough context for debugging\n- Graceful degradation where appropriate\n- No silent failures\n- Proper cleanup in error cases\n\n**Actions:** Show me where error handling could be improved\n\n#### 7. Future-Proofing\n**Consider:**\n- How this code might need to evolve\n- Whether the design allows for extension\n- If we're painting ourselves into a corner\n- Whether we're solving the right problem\n\n**Actions:** Suggest design changes that would make future modifications easier\n\n### Review Process\n\n1. **First Pass - High Level:**\n   - Does this change solve the stated problem effectively?\n   - Is this the right approach, or is there a simpler way?\n   - Are we modifying the right files/components?\n\n2. **Second Pass - Implementation:**\n   - Line-by-line review of logic\n   - Look for code smells and anti-patterns\n   - Check for consistency with codebase conventions\n\n3. **Third Pass - Integration:**\n   - How does this fit with existing code?\n   - Are there hidden dependencies or side effects?\n   - Will this cause problems elsewhere?\n\n### Output Format\n\nOrganize your feedback by severity:\n\n**🔴 Critical Issues** (Must fix before PR)\n- Bugs, security issues, or major design flaws\n- Include specific line numbers and explanations\n\n**🟡 Important Improvements** (Should strongly consider)\n- Performance issues, complexity problems, maintainability concerns\n- Provide refactored code examples\n\n**🟢 Suggestions** (Nice to have)\n- Style improvements, minor optimizations, alternative approaches\n- Quick wins that would make the code better\n\n**💡 Learning Opportunities**\n- Patterns or techniques that could level up my coding\n- Links to relevant best practices or documentation\n\n### Special Considerations for Positron\n\nRemember that Positron extends VS Code, so:\n- Check for conflicts with VS Code's architecture\n- Ensure changes follow VS Code's extension patterns\n- Verify compatibility with the broader ecosystem\n- Consider impact on memory/performance in Electron environment\n\n### Collaborative Approach\n\n- Explain the \"why\" behind each suggestion\n- Provide code examples for significant changes\n- Acknowledge trade-offs when they exist\n- Respect that I might have context you don't\n- Focus on the most impactful improvements\n\nStart by analyzing my changes and giving me a high-level assessment, then dive into specific issues ordered by importance.\n\n### Final Deliverable\n\nAfter completing the review, generate a comprehensive markdown document that summarizes all findings and provides actionable next steps:\n\n**Review Summary Document Structure:**\n\n```markdown\n# Code Review Summary - [PR Title/Issue #]\n\n## Overview\n- **Change Type:** [Feature/Bugfix/Refactor/etc.]\n- **Files Modified:** [count] files, [count] insertions, [count] deletions\n- **Overall Assessment:** [Brief summary of change quality]\n\n## Critical Action Items 🔴\n- [ ] **[File:Line]** [Description of critical issue]\n  - **Problem:** [What's wrong]\n  - **Impact:** [Why it matters]\n  - **Solution:** [Specific fix needed]\n\n## Important Improvements 🟡\n- [ ] **[File:Line]** [Description of improvement]\n  - **Current:** [What exists now]\n  - **Suggested:** [What should change]\n  - **Benefit:** [Why this helps]\n\n## Suggestions 🟢\n- [ ] **[File:Line]** [Description of suggestion]\n  - **Enhancement:** [Quick description]\n  - **Effort:** [Low/Medium/High]\n\n## Architecture Notes 🏗️\n[High-level design observations and recommendations]\n\n## Next Steps\n1. **Immediate:** Address all 🔴 critical issues\n2. **Before PR:** Consider implementing 🟡 important improvements\n3. **Future:** Keep 🟢 suggestions for follow-up work\n\n## Ready for PR Checklist\n- [ ] All critical issues resolved\n- [ ] Important improvements addressed or documented as tech debt\n- [ ] Code follows project conventions\n- [ ] Error handling is robust\n- [ ] Performance considerations reviewed\n```\n\nGenerate this markdown summary at the end of your review to provide a clear, actionable roadmap for improving the code before submission.\n"
  },
  {
    "path": ".claude/commands/spec-driven-dev.md",
    "content": "You are a software development agent focused on creating simple, beautiful software through thoughtful specification. Your philosophy: the best code is often the code not written, and the clearest solution emerges from deep understanding of the problem.\n\n## Core Principles\n\n1. **Simplicity First**: Always favor the simplest solution that fully addresses the need\n2. **Question Before Building**: Challenge whether features are truly necessary\n3. **Iterative Clarity**: Start minimal, expand only when justified\n4. **User-Centric**: Focus on actual user needs, not imagined ones\n\n## Initial Context Check\n\n**Before starting any conversation, check for existing project documents:**\n\n1. Look for files matching these patterns:\n   - `*-requirements.md`\n   - `*-design.md`\n   - `*-implementation.md`\n\n2. If documents exist, provide a brief summary:\n   ```\n   I found existing project documents:\n   \n   📋 **Requirements**: `<filename>-requirements.md`\n   - Problem: [One sentence summary of the problem]\n   - Solution: [One sentence summary of the minimal solution]\n   - Status: [Approved/Draft/Needs Review]\n   \n   🎨 **Design**: `<filename>-design.md` \n   - Approach: [One sentence summary]\n   - Components: [List main components]\n   - Status: [Approved/Draft/Needs Review]\n   \n   📝 **Implementation**: `<filename>-implementation.md`\n   - Increments: [Number of increments planned]\n   - Current: [Which increment we're on]\n   - Status: [In Progress/Planned/Complete]\n   \n   Would you like to continue from [next phase] or revisit any existing work?\n   ```\n   \n3. **Assess current project state**:\n    - If specification documents exist, provide status summary and offer to continue/revise\n    - If project CLAUDE.md exists, incorporate its development practices and build commands\n    - If in active development context, adapt workflow to complement existing work\n\n4. **Integrate with established patterns**:\n    - Use existing code style guidelines from project documentation\n    - Respect established architectural patterns and service dependencies\n    - Follow existing testing and build processes\n\n3. If no documents exist, proceed with: \"I don't see any existing project documents. Let's start by understanding the problem you're trying to solve.\"\n\n## Development Process\n\n### Phase 1: Problem Understanding & Requirements\n\nBefore documenting anything, engage in discovery through focused, single questions:\n- What problem are we actually solving?\n- Who experiences this problem and how often?\n- What's the simplest possible solution?\n- What can we NOT build and still succeed?\n\nBuild understanding iteratively—one question at a time—before creating documentation.\n\nThen create a focused requirements document:\n\n```markdown\n# Requirements: [Feature Name]\n\n## Problem Statement\n[One clear sentence describing the core problem]\n\n## Minimal Solution\n[The simplest thing that could possibly work]\n\n## Users & Use Cases\n- Primary User: [Who] needs [what] because [why]\n- Use Case: [Specific scenario with concrete example]\n\n## Success Criteria\n- [ ] [Observable, measurable outcome]\n- [ ] [Another specific criterion]\n\n## Non-Goals\n[What we're explicitly NOT doing and why]\n\n## Status\n- Created: [Date]\n- Status: [Draft/Approved]\n- Next Step: Design specification\n```\n\n**Output**: Generate `<brief-description>-requirements.md`\n\n### Phase 2: Design Specification\n\nOnly after requirements approval, design the simplest viable solution:\n\n```markdown\n# Design: [Feature Name]\n\n## Approach\n[2-3 sentences on the solution strategy]\n\n## Components\n[Only essential components, each with clear single responsibility]\n\n### Component Name\n- Purpose: [One sentence]\n- Interface: [Minimal public API]\n- Dependencies: [What it needs, kept minimal]\n\n## Data Flow\n[Simple diagram or description of how data moves]\n\n## Error Handling\n[Only handle likely errors, fail fast for unexpected ones]\n\n## What We're Not Doing\n[Complexity we're avoiding and why]\n\n## Status\n- Created: [Date]\n- Status: [Draft/Approved]\n- Next Step: Implementation planning\n```\n\n**Output**: Generate `<brief-description>-design.md`\n\n### Phase 3: Implementation Roadmap\n\nBreak work into small, complete increments:\n\n```markdown\n# Implementation: [Feature Name]\n\n## Increments\nEach increment should be shippable and add value.\n\n### Increment 1: [Core Functionality]\n- [ ] Task: [Specific, small change]\n  - Files: [What to modify]\n  - Validates: [Which requirement]\n  - Complete when: [Definition of done]\n\n### Increment 2: [Enhancement]\n[Only if truly needed after Increment 1 is live]\n\n## Status\n- Created: [Date]\n- Current Increment: [1/2/etc]\n- Overall Progress: [Not Started/In Progress/Complete]\n```\n\n**Output**: Generate `<brief-description>-implementation.md`\n\n## Working Method\n\n### Conversation Style\n**Always ask one focused question at a time.** This helps users think clearly and provide specific answers without feeling overwhelmed. Build understanding iteratively through a natural conversation.\n\n### During Problem Understanding:\n1. **Ask \"Why?\" repeatedly**: Get to the root need\n2. **Challenge scope**: \"Do we really need this?\"\n3. **Seek the 80/20**: What 20% of effort delivers 80% of value?\n4. **Consider alternatives**: Including non-technical solutions\n5. **Define \"good enough\"**: Perfect is the enemy of done\n\n### During Design:\n1. **Start with the naive approach**: Why won't the simple solution work?\n2. **Add complexity only when forced**: Document why it's necessary\n3. **Design for deletion**: Make components easy to remove\n4. **Embrace constraints**: They force creative simplicity\n5. **Show your work**: Explain rejected alternatives\n\n### During Planning:\n1. **First make it work**: Function before form\n2. **Then make it right**: Refactor with working tests\n3. **Finally, only if needed, make it fast**: Measure first\n4. **Each step deployable**: No long-running branches\n5. **Learn and adjust**: Each increment informs the next\n\n## Deliverables\n\n### File Naming Convention\nFor each project, generate three markdown files with consistent naming:\n\n1. **Requirements**: `<brief-description>-requirements.md`\n2. **Design**: `<brief-description>-design.md`  \n3. **Implementation**: `<brief-description>-implementation.md`\n\nWhere `<brief-description>` is a kebab-case identifier (e.g., `user-notifications`, `order-tracking`, `auth-refresh`).\n\n### Phase Transitions\n\n#### When starting fresh:\n- After completing requirements discovery, say: \"I'll now create the requirements document as `<brief-description>-requirements.md`\"\n- After requirements approval, say: \"Great! I'll now create the design document as `<brief-description>-design.md`\"\n- After design approval, say: \"Excellent! I'll create the implementation plan as `<brief-description>-implementation.md`\"\n\n#### When resuming existing work:\n- If only requirements exist: \"I've reviewed the requirements in `<filename>-requirements.md`. Shall we proceed with the design phase?\"\n- If requirements and design exist: \"I've reviewed both requirements and design documents. Ready to create the implementation plan?\"\n- If all documents exist: \"All project documents are in place. Would you like to review progress or continue with implementation?\"\n\n## Quality Markers\n\nGood specifications have:\n- **Brevity**: If it's longer than a page, it's probably too complex\n- **Clarity**: A junior developer could implement it\n- **Focus**: Solves one problem well\n- **Flexibility**: Doesn't over-specify implementation details\n- **Justification**: Every complexity has a reason\n\n## Question Flow Examples\n\n### Understanding the Problem\nInstead of asking multiple questions at once, follow this pattern:\n\n1. \"What specific problem led you to need this feature?\"\n2. [After response] \"Who is experiencing this problem?\"\n3. [After response] \"How frequently does this occur?\"\n4. [After response] \"What happens currently when they encounter this?\"\n5. [After response] \"What would success look like for them?\"\n\n### Challenging Complexity\nWhen complexity creeps in:\n\n1. \"What's the core need behind that requirement?\"\n2. [After response] \"Could we achieve 80% of the value with something simpler?\"\n3. [After response] \"What would break if we didn't include that?\"\n4. [After response] \"Is that risk acceptable for the first version?\"\n\n### Design Decisions\nWhen exploring solutions:\n\n1. \"What's the most straightforward way to solve this?\"\n2. [After response] \"What makes you think that won't work?\"\n3. [After response] \"Is that constraint real or assumed?\"\n4. [After response] \"What if we tried [simpler alternative]?\"\n\n## Example Interactions\n\n### Starting Fresh\n**User**: \"We need a notification system that...\"\n\n**Agent**: \"Before we dive into specifications, let me understand the core need. What specific problem are notifications solving for your users?\"\n\n[Continue with single questions as before...]\n\n### Resuming Existing Work\n**User**: \"Can you help me with the notification system?\"\n\n**Agent**: \"I found existing project documents:\n\n📋 **Requirements**: `delivery-notifications-requirements.md`\n- Problem: Customers miss important delivery updates\n- Solution: SMS alerts 30 minutes before delivery\n- Status: Approved\n\nWould you like to continue with the design phase, or should we revisit the requirements?\"\n\n**User**: \"Let's continue with design.\"\n\n**Agent**: \"Great! Based on the approved requirements, I'll now create the design document as `delivery-notifications-design.md`. Let me start with the simplest approach...\"\n\n## Remember\n\n- The best feature is often the one we don't build\n- Simple solutions require deep understanding\n- Every line of code is a liability\n- When in doubt, do less but do it well\n- Beautiful software is simple software that delights users\n\nThe goal isn't to create comprehensive documentation—it's to think deeply enough that the solution becomes obvious and simple."
  },
  {
    "path": ".claude/settings.local.json",
    "content": "{\n  \"permissions\": {\n    \"allow\": [\n      \"WebFetch(domain:github.com)\",\n      \"Bash(R CMD Rd2pdf:*)\",\n      \"Bash(git pull:*)\",\n      \"Bash(git stash:*)\"\n    ],\n    \"deny\": []\n  }\n}\n"
  },
  {
    "path": ".github/.gitignore",
    "content": "*.html\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at codeofconduct@posit.co. \nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n<https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][https://github.com/mozilla/inclusion].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n<https://www.contributor-covenant.org/faq>. Translations are available at <https://www.contributor-covenant.org/translations>.\n\n[homepage]: https://www.contributor-covenant.org\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing to mvgam\n\nThis document outlines how to propose a change to mvgam.\nFor a detailed discussion on contributing to this and other open source R packages, please see the [development contributing guide](https://rstd.io/tidy-contrib) and our [code review principles](https://code-review.tidyverse.org/).\n\n## Fixing typos\n\nYou can fix typos, spelling mistakes, or grammatical errors in the documentation directly using the GitHub web interface, as long as the changes are made in the _source_ file. \nThis generally means you'll need to edit [roxygen2 comments](https://roxygen2.r-lib.org/articles/roxygen2.html) in an `.R`, not a `.Rd` file. \nYou can find the `.R` file that generates the `.Rd` by reading the comment in the first line.\n\n## Bigger changes\n\nIf you want to make a bigger change, it's a good idea to first file an issue and make sure someone from the team agrees that it’s needed. \nIf you’ve found a bug, please file an issue that illustrates the bug with a minimal \n[reprex](https://www.tidyverse.org/help/#reprex) (this will also help you write a unit test, if needed).\nSee the tidyverse guide on [how to create a great issue](https://code-review.tidyverse.org/issues/) for more advice.\n\n### Pull request process\n\n*   Fork the package and clone onto your computer. If you haven't done this before, we recommend using `usethis::create_from_github(\"nicholasjclark/mvgam\", fork = TRUE)`.\n\n*   Install all development dependencies with `devtools::install_dev_deps()`, and then make sure the package passes R CMD check by running `devtools::check()`. \n    If R CMD check doesn't pass cleanly, it's a good idea to ask for help before continuing. \n*   Create a Git branch for your pull request (PR). We recommend using `usethis::pr_init(\"brief-description-of-change\")`.\n\n*   Make your changes, commit to git, and then create a PR by running `usethis::pr_push()`, and following the prompts in your browser.\n    The title of your PR should briefly describe the change.\n    The body of your PR should contain `Fixes #issue-number`.\n\n*  For user-facing changes, add a bullet to the top of `NEWS.md` (i.e. just below the first header). Follow the style described in <https://style.tidyverse.org/news.html>.\n\n### Code style\n\n*   New code should follow the tidyverse [style guide](https://style.tidyverse.org) where possible. \n    You can use the [styler](https://CRAN.R-project.org/package=styler) package to apply these styles, but please don't restyle code that has nothing to do with your PR.  \n\n*  We use [roxygen2](https://cran.r-project.org/package=roxygen2), with [Markdown syntax](https://cran.r-project.org/web/packages/roxygen2/vignettes/rd-formatting.html), for documentation.  \n\n*  We use [testthat](https://cran.r-project.org/package=testthat) for unit tests. \n   Contributions with test cases included are easier to accept.  \n\n## Code of Conduct\n\nPlease note that the mvgam project is released with a\n[Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this\nproject you agree to abide by its terms.\n\n## Roadmap\n\nThe mvgam package is in a stable state of development, with some degree of active subsequent development as envisioned by the primary authors.\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: nicholasjclark\n"
  },
  {
    "path": ".github/workflows/R-CMD-check-rstan.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/master/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\nname: R-CMD-check-rstan\n\njobs:\n  R-CMD-check:\n    runs-on: ${{ matrix.config.os }}\n\n    name: ${{ matrix.config.os }} (${{ matrix.config.r }})\n\n    strategy:\n      fail-fast: false\n      matrix:\n        config:\n          - {os: macos-latest,   r: 'release'}\n          - {os: windows-latest, r: 'release'}\n          # use 4.0 or 4.1 to check with rtools40's older compiler\n          - {os: windows-latest, r: 'oldrel-4'}\n          - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'}\n          - {os: ubuntu-latest, r: 'release'}\n\n# Use a CRAN-like environment to emulate CRAN submission checks\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      NOT_CRAN: false\n      R_KEEP_PKG_SOURCE: yes\n\n    steps:\n      - uses: actions/checkout@v4\n      - uses: n1hility/cancel-previous-runs@v2\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: r-lib/actions/setup-pandoc@v2\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          r-version: ${{ matrix.config.r }}\n          rtools-version: ${{ matrix.config.rtools }}\n          http-user-agent: ${{ matrix.config.http-user-agent }}\n          use-public-rspm: true\n\n      # Install some suggests packages\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          dependencies: NA\n          extra-packages: |\n              BH\n              RcppEigen\n              knitr\n              extraDistr\n              lubridate\n              wrswoR\n              tweedie\n              corpcor\n              splines2\n              ggrepel\n              ggpp\n              ggarrow\n              scoringRules\n              matrixStats\n              xts\n              collapse\n              rmarkdown\n              ggplot2\n              rjags\n              coda\n              testthat\n              usethis\n              rcmdcheck\n\n      - name: Ensure install works\n        run: |\n          install.packages('mvgam', repos = \"http://cran.rstudio.com\")\n        shell: Rscript {0}\n\n      - uses: r-lib/actions/check-r-package@v2\n        with:\n          build_args: 'c(\"--no-manual\", \"--no-build-vignettes\")'\n          args: 'c(\"--no-examples\", \"--no-manual\", \"--as-cran\", \"--ignore-vignettes\")'\n"
  },
  {
    "path": ".github/workflows/R-CMD-check.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/master/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\nname: R-CMD-check\n\njobs:\n  R-CMD-check:\n    runs-on: ${{ matrix.config.os }}\n\n    name: ${{ matrix.config.os }} (${{ matrix.config.r }})\n\n    strategy:\n      fail-fast: false\n      matrix:\n        config:\n          # Cmdstan isntall not working on win-latest release; check back later\n          - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'}\n          - {os: ubuntu-latest, r: 'release'}\n\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      R_KEEP_PKG_SOURCE: yes\n\n    steps:\n      - uses: actions/checkout@v4\n      - uses: n1hility/cancel-previous-runs@v2\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: r-lib/actions/setup-pandoc@v2\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          r-version: ${{ matrix.config.r }}\n          rtools-version: ${{ matrix.config.rtools }}\n          http-user-agent: ${{ matrix.config.http-user-agent }}\n          use-public-rspm: true\n\n      # As cmdstanr is not yet on CRAN, configure the action to only install the\n      # 'Depends' packages by default and then manually specify the 'Suggests'\n      # packages that are needed for R CMD CHECK\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          dependencies: NA\n          extra-packages: |\n              knitr\n              extraDistr\n              lubridate\n              wrswoR\n              tweedie\n              corpcor\n              splines2\n              scoringRules\n              matrixStats\n              xts\n              collapse\n              rmarkdown\n              ggplot2\n              rjags\n              ggrepel\n              ggpp\n              ggarrow\n              coda\n              stan-dev/cmdstanr\n              testthat\n              usethis\n              rcmdcheck\n              devtools\n\n      - name: Build Cmdstan\n        run: |\n          install.packages('mvgam', repos = \"http://cran.rstudio.com\")\n          cmdstanr::check_cmdstan_toolchain(fix = TRUE)\n          cmdstanr::install_cmdstan()\n        shell: Rscript {0}\n\n      - name: Install colorspace manually\n        run: |\n          install.packages(\"colorspace\", repos = \"https://cran.rstudio.com/\")\n        shell: Rscript {0}\n        \n      - uses: r-lib/actions/check-r-package@v2\n        with:\n          build_args: 'c(\"--no-manual\", \"--no-build-vignettes\")'\n          args: 'c(\"--no-manual\", \"--as-cran\", \"--ignore-vignettes\")'\n\n      - name: Run dontrun examples\n        run: |\n          devtools::run_examples(run_dontrun = TRUE, fresh = FALSE)\n        shell: Rscript {0}\n"
  },
  {
    "path": ".github/workflows/memcheck.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/master/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\nname: memcheck\n\njobs:\n  memcheck:\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      NOT_CRAN: false\n\n    steps:\n      - uses: actions/checkout@v2\n      - uses: n1hility/cancel-previous-runs@v2\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: actions/checkout@v2\n      - name: apt install dependency\n        run: |\n          sudo apt-get update\n          sudo apt-get -y install valgrind\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          dependencies: NA\n          extra-packages: |\n              devtools\n              testthat\n\n      - name: Memory check\n        run: |\n          R -d valgrind -f memcheck.R\n\n      - name: Configure GH\n        run: |\n          git config --global user.name \"$GITHUB_ACTOR\"\n          git config --global user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n\n\n      - name: Install Air latest\n        shell: bash\n        run: |\n          curl -LsSf https://github.com/posit-dev/air/releases/latest/download/air-installer.sh | sh\n\n      - name: Air version\n        shell: bash\n        run: |\n          echo \"\"\n          echo \"Formatting R code with $(air --version)\"\n          echo \"\"\n\n      - name: Format R code using Air\n        shell: bash\n        run: air format .\n\n      - name: Commit any Air formatting changes\n        shell: bash\n        run: |\n          if find . -type f \\( -name '*.r' -o -name '*.R' \\) -exec git add -u {} +; then\n            echo \"Staged modified R files\"\n            git commit -a -m '`air format` (GitHub Actions)'\n            git push\n          else\n            echo \"No changes found in any R files\"\n          fi\n"
  },
  {
    "path": ".github/workflows/pkgdown.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/master/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n  release:\n    types: [published]\n  workflow_dispatch:\n\nname: pkgdown\n\njobs:\n  pkgdown:\n    runs-on: ubuntu-latest\n    # Only restrict concurrency for non-PR jobs\n    concurrency:\n      group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }}\n\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      R_KEEP_PKG_SOURCE: yes\n\n    steps:\n      - uses: actions/checkout@v3\n\n      - uses: r-lib/actions/setup-pandoc@v2\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          dependencies: NA\n          extra-packages: |\n              local::.\n              remotes\n              knitr\n              extraDistr\n              lubridate\n              gratia\n              wrswoR\n              tweedie\n              ggrepel\n              ggpp\n              ggarrow\n              corpcor\n              splines2\n              scoringRules\n              matrixStats\n              xts\n              collapse\n              rmarkdown\n              stan-dev/cmdstanr\n              usethis\n\n      - name: Build Cmdstan and install development brms version\n        run: |\n          cmdstanr::check_cmdstan_toolchain(fix = TRUE)\n          cmdstanr::install_cmdstan()\n          remotes::install_github('paul-buerkner/brms')\n          remotes::install_version(\"pkgdown\", version = \"2.0.9\")\n        shell: Rscript {0}\n\n      - name: Build site\n        run: pkgdown::build_site_github_pages(lazy = TRUE, run_dont_run = TRUE, new_process = FALSE, install = FALSE)\n        shell: Rscript {0}\n\n      - name: Deploy to GitHub pages 🚀\n        if: github.event_name != 'pull_request'\n        uses: JamesIves/github-pages-deploy-action@v4.4.1\n        with:\n          clean: false\n          branch: gh-pages\n          folder: docs\n"
  },
  {
    "path": ".github/workflows/readme.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/master/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: master\n\nname: render-rmarkdown\n\njobs:\n  render-rmarkdown:\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - name: Checkout repo\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: |\n            rmarkdown\n            knitr\n            gratia\n            patchwork\n            remotes\n            splines2\n            extraDistr\n            stan-dev/cmdstanr\n\n      - name: Install mvgam\n        run: Rscript -e 'remotes::install_github(\"nicholasjclark/mvgam\", upgrade_dependencies = FALSE)'\n\n      - name: Build Cmdstan\n        run: |\n          cmdstanr::check_cmdstan_toolchain(fix = TRUE)\n          cmdstanr::install_cmdstan()\n        shell: Rscript {0}\n\n      - name: Render README\n        run: Rscript -e 'rmarkdown::render(\"README.Rmd\", output_format = \"md_document\")'\n\n      - name: Render pkgdown index\n        run: Rscript -e 'rmarkdown::render(\"index.Rmd\", output_format = \"md_document\")'\n\n      - name: Commit results\n        run: |\n          git config --local user.name \"$GITHUB_ACTOR\"\n          git config --local user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n          git commit README.md index.md man/figures/README*.png -m 'Re-build README.Rmd' || echo \"No changes to commit\"\n          git push origin || echo \"No changes to commit\"\n"
  },
  {
    "path": ".gitignore",
    "content": "*.Rproj*\n.Rhistory\n.RData\n.Ruserdata\n.Rprofile\nMeta\n.Rproj.user\n/Meta/\ndesktop.ini\n^cran-comments\\.md$\n^src\\.gcda$\nclaude.exe\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Package Overview\n\nmvgam is an R package for fitting Multivariate Dynamic Generalized Additive Models.The package enables Bayesian forecasting and analysis of multivariate time series data using flexible GAM frameworks. It can handle various data types (counts, proportions, continuous values) with complex temporal dynamics, missing data, and seasonality, building custom Stan models that provide robust Bayesian inference.\n\n## Development Commands\n\n### Testing\n- `R CMD check` - Full package check (used in CI)\n- `testthat::test_check(\"mvgam\")` - Run all tests via testthat\n- `devtools::test()` - Run tests interactively during development\n\n### Building and Documentation\n- `devtools::document()` - Generate documentation from roxygen2 comments\n- `pkgdown::build_site()` - Build package website\n- `devtools::build()` - Build package tarball\n- `devtools::install()` - Install package locally for development\n\n### Package Structure\n- Uses standard R package structure with DESCRIPTION, NAMESPACE, and man/ directories\n- Source code organized in `R/` directory with provider-specific files\n- Vignettes in vignettes/ directory demonstrate key features\n- Tests in `tests/testthat/`\n\n## Architecture\n\n### Key Design Patterns\n\n**S3 Type System**: Uses S3 for structured objects\n- Maintains compatibility with R's statistical modeling ecosystem\n- Supports method inheritance and specialization\n\n**Layered Architecture Pattern**: Uses clear separation of concerns across multiple layers:\n- Interface Layer: User-facing functions (mvgam(), forecast(), plot()) provide clean APIs\n- Model Specification Layer: Formula processing, trend model constructors (RW(), VAR(), GP()), family definitions\n- Code Generation Layer: Translates R specifications into Stan/JAGS model code\n- Computational Backend Layer: Interfaces with Stan/JAGS for MCMC sampling\n- Post-processing Layer: Methods for analysis, diagnostics, and visualization\n\n**Modular Component System**: Modular design where different components can be mixed and matched:\n- Trend Modules: Independent implementations of different temporal dynamics (Random Walk, AR, VAR, Gaussian Process, CAR)\n- Family Modules: Separate observation model implementations for different distributions\n- Backend Modules: Pluggable computational backends (Stan via rstan/cmdstanr, JAGS)\n- Visualization Modules: Modular plotting system with specialized functions for different aspects\n\n**Bayesian Workflow Integration Pattern**: Designed around the complete Bayesian modeling workflow:\n- Model Building: Formula specification, prior setup, trend model selection\n- Fitting: MCMC sampling with convergence monitoring\n- Checking: Posterior predictive checks, residual analysis, diagnostic plots\n- Inference: Parameter summarization, uncertainty quantification\n- Prediction: Forecasting with proper uncertainty propagation\n- Evaluation: Cross-validation, scoring rules, model comparison\n\n## Key Files\n\n### Core Model Functions\n- `R/mvgam.R` - Main model fitting function that:\n  - Validates and processes GAM formulas for observation and trend processes\n  - Sets up Stan/JAGS model code generation\n  - Runs MCMC sampling and returns fitted model objects\n\n- Trend model constructors in `R/mvgam_trend_types.R` (`RW()`, `AR()`, `VAR()`, `GP()`, `CAR()`):\n  - Define temporal dynamics specifications\n  - Configure stationarity constraints and correlation structures\n\n### Prediction & Forecasting\n- `R/forecast.mvgam.R` - Generates in-sample and out-of-sample forecasts:\n  - Respects temporal dynamics for proper time series forecasting\n  - Supports multiple prediction types (response, trend, link)\n  - Returns structured forecast objects with uncertainty quantification\n\n- `R/predict.mvgam.R` - General prediction treating trends as random effects\n  \n### Visualization Suite\n- `R/plot.mvgam.R` - Main plotting method with multiple types:\n  - Series plots, residual diagnostics, smooth functions, forecasts\n  - Calls specialized functions: `plot_mvgam_forecasts()`, `plot_mvgam_series()`, `plot_mvgam_trend()`\n\n### Model Analysis\n- `R/summary.mvgam.R` - Parameter estimates and convergence diagnostics\n- `R/ppc.mvgam.R` - Posterior predictive checks using bayesplot\n- `R/residuals.mvgam.R` - Dunn-Smyth residuals for model checking\n- `R/loo.mvgam.R` - Approximate leave-one-out cross-validation\n\n### Family Support\n- Extensive distribution families in `R/families.R`:\n  - Standard: gaussian, poisson, binomial, Gamma\n  - Extended: negative binomial, beta, Student-t, Tweedie\n  - Special: N-mixture models for imperfect detection\n  \n### Testing and Quality\n- `tests/testthat/` - Test suite\n- `vignettes/` - Documentation and examples\n- `.github/workflows/` - CI/CD with R CMD check, pkgdown building and valgrind check\n\n## Development Notes\n\n### Testing Strategy\n- Separate test files for each major component\n- Prioritize internal mvgam objects (i.e. `mvgam:::mvgam_example1`) for testing\n\n### File Management\n- Specification documents (`*-requirements.md`, `*-design.md`, `*-implementation.md`) should be automatically added to `.Rbuildignore`\n- Any temporary development files should be excluded from package builds\n- When creating new specification files, always update `.Rbuildignore` to prevent inclusion in built package\n\n### Code Organization\n- Provider files should follow consistent naming pattern\n- Utility functions should be grouped by purpose (`utils-*.R`)\n- Standalone imports should minimize external dependencies\n\n### Documentation\n- Roxygen2 comments for all exported functions\n- tidyverse styling (https://style.tidyverse.org/) for all R and roxygen code\n- Vignettes demonstrate in-depth use cases\n- pkgdown site provides comprehensive documentation\n- Examples demonstrate simpler use cases\n"
  },
  {
    "path": "CRAN-SUBMISSION",
    "content": "Version: 1.1.0\nDate: 2024-04-18 23:09:30 UTC\nSHA: 3d852f1f92b4d6d10ed64dc212fd6b0ebf933bca\n"
  },
  {
    "path": "DESCRIPTION",
    "content": "Package: mvgam\nTitle: Multivariate (Dynamic) Generalized Additive Models\nVersion: 1.1.595\nDate: 2026-01-19\nAuthors@R: c(person(\"Nicholas J\", \"Clark\", email = \"nicholas.j.clark1214@gmail.com\", \n                    role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-7131-3301\")),\n             person(\"KANK\", \"Karunarathna\", role = c(\"ctb\"),\n                    comment = c(\"ARMA parameterisations and factor models\", ORCID = \"0000-0002-8995-5502\")),\n             person(\"Sarah\", \"Heaps\", role = c(\"ctb\"),\n                    comment = c(\"VARMA parameterisations\", ORCID = \"0000-0002-5543-037X\")),\n             person(\"Scott\", \"Pease\", role = c(\"ctb\"),\n                    comment = c(\"broom enhancements\", ORCID = \"0009-0006-8977-9285\")),\n             person(\"Matthijs\", \"Hollanders\", role = c(\"ctb\"),\n                    comment = c(\"ggplot visualizations\", ORCID = \"0000-0003-0796-1018\")))\nDescription: Fit Bayesian Dynamic Generalized Additive Models to multivariate observations. Users can build nonlinear State-Space models that can incorporate semiparametric effects in observation and process components, using a wide range of observation families. Estimation is performed using Markov Chain Monte Carlo with Hamiltonian Monte Carlo in the software 'Stan'. References: Clark & Wells (2023) <doi:10.1111/2041-210X.13974>.\nURL: https://github.com/nicholasjclark/mvgam, https://nicholasjclark.github.io/mvgam/\nBugReports: https://github.com/nicholasjclark/mvgam/issues\nLicense: MIT + file LICENSE\nDepends: \n    R (>= 3.6.0)\nImports: \n    brms (>= 2.21.0),\n    methods,\n    mgcv (>= 1.8-13),\n    insight (>= 0.19.1),\n    marginaleffects (>= 0.29.0),\n    Rcpp (>= 0.12.0),\n    rstan (>= 2.29.0),\n    posterior (>= 1.0.0),\n    loo (>= 2.3.1),\n    rstantools (>= 2.1.1),\n    bayesplot (>= 1.5.0),\n    ggplot2 (>= 3.5.0),\n    mvnfast,\n    purrr,\n    dplyr,\n    magrittr,\n    rlang,\n    generics,\n    tibble (>= 3.0.0),\n    patchwork (>= 1.2.0)\nEncoding: UTF-8\nLazyData: true\nRoxygen: list(markdown = TRUE)\nRoxygenNote: 7.3.2\nSuggests: \n    scoringRules,\n    matrixStats,\n    cmdstanr (>= 0.5.0),\n    tweedie,\n    splines2,\n    extraDistr,\n    corpcor,\n    wrswoR,\n    ggrepel,\n    ggpp,\n    ggarrow,\n    xts,\n    lubridate,\n    knitr, \n    collapse,\n    rmarkdown, \n    rjags,\n    coda,\n    runjags,\n    usethis,\n    testthat,\n    colorspace\nEnhances:\n    gratia (>= 0.9.0),\n    tidyr\nAdditional_repositories: https://mc-stan.org/r-packages/\nLinkingTo: Rcpp, RcppArmadillo\nVignetteBuilder: knitr\n"
  },
  {
    "path": "LICENSE",
    "content": "YEAR: 2021\nCOPYRIGHT HOLDER: Nicholas Clark\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# MIT License\n\nCopyright (c) 2021 Nicholas Clark\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NAMESPACE",
    "content": "# Generated by roxygen2: do not edit by hand\n\nS3method(Predict.matrix,mod.smooth)\nS3method(Predict.matrix,moi.smooth)\nS3method(add_residuals,mvgam)\nS3method(as.array,mvgam)\nS3method(as.data.frame,mvgam)\nS3method(as.matrix,mvgam)\nS3method(as_draws,mvgam)\nS3method(as_draws_array,mvgam)\nS3method(as_draws_df,mvgam)\nS3method(as_draws_list,mvgam)\nS3method(as_draws_matrix,mvgam)\nS3method(as_draws_rvars,mvgam)\nS3method(augment,mvgam)\nS3method(coef,mvgam)\nS3method(conditional_effects,mvgam)\nS3method(ensemble,mvgam_forecast)\nS3method(fevd,mvgam)\nS3method(find_predictors,mvgam)\nS3method(find_predictors,mvgam_prefit)\nS3method(fitted,mvgam)\nS3method(forecast,mvgam)\nS3method(formula,mvgam)\nS3method(formula,mvgam_prefit)\nS3method(get_coef,mvgam)\nS3method(get_data,mvgam)\nS3method(get_data,mvgam_prefit)\nS3method(get_predict,mvgam)\nS3method(get_vcov,mvgam)\nS3method(hindcast,mvgam)\nS3method(how_to_cite,mvgam)\nS3method(irf,mvgam)\nS3method(lfo_cv,mvgam)\nS3method(logLik,mvgam)\nS3method(log_posterior,mvgam)\nS3method(loo,mvgam)\nS3method(loo_compare,mvgam)\nS3method(mcmc_plot,mvgam)\nS3method(model.frame,mvgam)\nS3method(model.frame,mvgam_prefit)\nS3method(neff_ratio,mvgam)\nS3method(nuts_params,mvgam)\nS3method(ordinate,jsdgam)\nS3method(pairs,mvgam)\nS3method(plot,mvgam)\nS3method(plot,mvgam_conditional_effects)\nS3method(plot,mvgam_fevd)\nS3method(plot,mvgam_forecast)\nS3method(plot,mvgam_irf)\nS3method(plot,mvgam_lfo)\nS3method(plot,mvgam_residcor)\nS3method(posterior_epred,mvgam)\nS3method(posterior_linpred,mvgam)\nS3method(posterior_predict,mvgam)\nS3method(pp_check,mvgam)\nS3method(ppc,mvgam)\nS3method(predict,mvgam)\nS3method(print,how_to_cite)\nS3method(print,mvgam)\nS3method(print,mvgam_conditional_effects)\nS3method(print,mvgam_prefit)\nS3method(print,mvgam_summary)\nS3method(print,mvgammodel)\nS3method(residual_cor,jsdgam)\nS3method(residual_cor,mvgam)\nS3method(residuals,mvgam)\nS3method(rhat,mvgam)\nS3method(score,mvgam_forecast)\nS3method(set_coef,mvgam)\nS3method(smooth.construct,mod.smooth.spec)\nS3method(smooth.construct,moi.smooth.spec)\nS3method(stability,mvgam)\nS3method(stancode,mvgam)\nS3method(stancode,mvgam_prefit)\nS3method(standata,mvgam_prefit)\nS3method(summary,mvgam)\nS3method(summary,mvgam_fevd)\nS3method(summary,mvgam_forecast)\nS3method(summary,mvgam_irf)\nS3method(summary,mvgam_prefit)\nS3method(tidy,mvgam)\nS3method(update,jsdgam)\nS3method(update,mvgam)\nS3method(variables,mvgam)\nexport(\"%>%\")\nexport(AR)\nexport(CAR)\nexport(GP)\nexport(PW)\nexport(RW)\nexport(VAR)\nexport(ZMVN)\nexport(add_residuals)\nexport(as_draws)\nexport(as_draws_array)\nexport(as_draws_df)\nexport(as_draws_list)\nexport(as_draws_matrix)\nexport(as_draws_rvars)\nexport(augment)\nexport(avg_predictions)\nexport(bernoulli)\nexport(beta_binomial)\nexport(betar)\nexport(code)\nexport(compare_mvgams)\nexport(comparisons)\nexport(conditional_effects)\nexport(datagrid)\nexport(drawDotmvgam)\nexport(dynamic)\nexport(ensemble)\nexport(eval_mvgam)\nexport(eval_smoothDothilbertDotsmooth)\nexport(eval_smoothDotmodDotsmooth)\nexport(eval_smoothDotmoiDotsmooth)\nexport(fevd)\nexport(forecast)\nexport(get_data)\nexport(get_mvgam_priors)\nexport(get_predict)\nexport(gp)\nexport(hindcast)\nexport(how_to_cite)\nexport(hypotheses)\nexport(irf)\nexport(jsdgam)\nexport(lfo_cv)\nexport(lognormal)\nexport(loo)\nexport(loo_compare)\nexport(lv_correlations)\nexport(mcmc_plot)\nexport(mvgam)\nexport(nb)\nexport(neff_ratio)\nexport(nmix)\nexport(nuts_params)\nexport(ordinate)\nexport(plot_comparisons)\nexport(plot_mvgam_factors)\nexport(plot_mvgam_fc)\nexport(plot_mvgam_pterms)\nexport(plot_mvgam_randomeffects)\nexport(plot_mvgam_resids)\nexport(plot_mvgam_series)\nexport(plot_mvgam_smooth)\nexport(plot_mvgam_trend)\nexport(plot_mvgam_uncertainty)\nexport(plot_predictions)\nexport(plot_slopes)\nexport(posterior_epred)\nexport(posterior_linpred)\nexport(posterior_predict)\nexport(pp_check)\nexport(ppc)\nexport(predictions)\nexport(prior)\nexport(prior_)\nexport(prior_string)\nexport(residual_cor)\nexport(rhat)\nexport(roll_eval_mvgam)\nexport(s)\nexport(score)\nexport(series_to_mvgam)\nexport(set_prior)\nexport(sim_mvgam)\nexport(slopes)\nexport(stability)\nexport(stancode)\nexport(standata)\nexport(student)\nexport(student_t)\nexport(t2)\nexport(te)\nexport(ti)\nexport(tidy)\nexport(tweedie)\nexport(variables)\nimportFrom(Rcpp,evalCpp)\nimportFrom(bayesplot,color_scheme_get)\nimportFrom(bayesplot,color_scheme_set)\nimportFrom(bayesplot,log_posterior)\nimportFrom(bayesplot,neff_ratio)\nimportFrom(bayesplot,nuts_params)\nimportFrom(bayesplot,pp_check)\nimportFrom(brms,bernoulli)\nimportFrom(brms,beta_binomial)\nimportFrom(brms,brm)\nimportFrom(brms,brmsterms)\nimportFrom(brms,conditional_effects)\nimportFrom(brms,dbeta_binomial)\nimportFrom(brms,do_call)\nimportFrom(brms,dstudent_t)\nimportFrom(brms,get_prior)\nimportFrom(brms,gp)\nimportFrom(brms,logm1)\nimportFrom(brms,lognormal)\nimportFrom(brms,mcmc_plot)\nimportFrom(brms,ndraws)\nimportFrom(brms,pbeta_binomial)\nimportFrom(brms,prior)\nimportFrom(brms,prior_)\nimportFrom(brms,prior_string)\nimportFrom(brms,pstudent_t)\nimportFrom(brms,qstudent_t)\nimportFrom(brms,rbeta_binomial)\nimportFrom(brms,read_csv_as_stanfit)\nimportFrom(brms,rstudent_t)\nimportFrom(brms,set_prior)\nimportFrom(brms,stancode)\nimportFrom(brms,standata)\nimportFrom(brms,student)\nimportFrom(generics,augment)\nimportFrom(generics,forecast)\nimportFrom(generics,tidy)\nimportFrom(ggplot2,aes)\nimportFrom(ggplot2,facet_wrap)\nimportFrom(ggplot2,geom_bar)\nimportFrom(ggplot2,ggplot)\nimportFrom(ggplot2,labs)\nimportFrom(ggplot2,scale_colour_discrete)\nimportFrom(ggplot2,scale_fill_discrete)\nimportFrom(ggplot2,theme_classic)\nimportFrom(grDevices,devAskNewPage)\nimportFrom(grDevices,hcl.colors)\nimportFrom(grDevices,rgb)\nimportFrom(graphics,abline)\nimportFrom(graphics,axis)\nimportFrom(graphics,barplot)\nimportFrom(graphics,box)\nimportFrom(graphics,boxplot)\nimportFrom(graphics,bxp)\nimportFrom(graphics,hist)\nimportFrom(graphics,layout)\nimportFrom(graphics,legend)\nimportFrom(graphics,lines)\nimportFrom(graphics,par)\nimportFrom(graphics,plot)\nimportFrom(graphics,points)\nimportFrom(graphics,polygon)\nimportFrom(graphics,rect)\nimportFrom(graphics,rug)\nimportFrom(graphics,title)\nimportFrom(grid,arrow)\nimportFrom(grid,unit)\nimportFrom(insight,find_predictors)\nimportFrom(insight,get_data)\nimportFrom(insight,get_predictors)\nimportFrom(loo,is.loo)\nimportFrom(loo,loo)\nimportFrom(loo,loo_compare)\nimportFrom(magrittr,\"%>%\")\nimportFrom(marginaleffects,avg_predictions)\nimportFrom(marginaleffects,comparisons)\nimportFrom(marginaleffects,datagrid)\nimportFrom(marginaleffects,get_coef)\nimportFrom(marginaleffects,get_predict)\nimportFrom(marginaleffects,get_vcov)\nimportFrom(marginaleffects,hypotheses)\nimportFrom(marginaleffects,plot_comparisons)\nimportFrom(marginaleffects,plot_predictions)\nimportFrom(marginaleffects,plot_slopes)\nimportFrom(marginaleffects,predictions)\nimportFrom(marginaleffects,set_coef)\nimportFrom(marginaleffects,slopes)\nimportFrom(methods,cbind2)\nimportFrom(mgcv,Predict.matrix)\nimportFrom(mgcv,Rrank)\nimportFrom(mgcv,bam)\nimportFrom(mgcv,betar)\nimportFrom(mgcv,gam.control)\nimportFrom(mgcv,gam.side)\nimportFrom(mgcv,get.var)\nimportFrom(mgcv,initial.sp)\nimportFrom(mgcv,interpret.gam)\nimportFrom(mgcv,nb)\nimportFrom(mgcv,s)\nimportFrom(mgcv,smooth.construct)\nimportFrom(mgcv,smoothCon)\nimportFrom(mgcv,t2)\nimportFrom(mgcv,te)\nimportFrom(mgcv,ti)\nimportFrom(parallel,clusterExport)\nimportFrom(parallel,setDefaultCluster)\nimportFrom(parallel,stopCluster)\nimportFrom(posterior,as_draws)\nimportFrom(posterior,as_draws_array)\nimportFrom(posterior,as_draws_df)\nimportFrom(posterior,as_draws_list)\nimportFrom(posterior,as_draws_matrix)\nimportFrom(posterior,as_draws_rvars)\nimportFrom(posterior,rhat)\nimportFrom(posterior,variables)\nimportFrom(rlang,missing_arg)\nimportFrom(rlang,parse_expr)\nimportFrom(rlang,warn)\nimportFrom(rstantools,posterior_epred)\nimportFrom(rstantools,posterior_linpred)\nimportFrom(rstantools,posterior_predict)\nimportFrom(stats,.getXlevels)\nimportFrom(stats,Gamma)\nimportFrom(stats,acf)\nimportFrom(stats,as.dist)\nimportFrom(stats,as.formula)\nimportFrom(stats,binomial)\nimportFrom(stats,coef)\nimportFrom(stats,complete.cases)\nimportFrom(stats,cor)\nimportFrom(stats,cov)\nimportFrom(stats,cov2cor)\nimportFrom(stats,dbeta)\nimportFrom(stats,dbinom)\nimportFrom(stats,density)\nimportFrom(stats,dgamma)\nimportFrom(stats,dlnorm)\nimportFrom(stats,dnbinom)\nimportFrom(stats,dnorm)\nimportFrom(stats,dpois)\nimportFrom(stats,drop.terms)\nimportFrom(stats,ecdf)\nimportFrom(stats,fitted)\nimportFrom(stats,formula)\nimportFrom(stats,frequency)\nimportFrom(stats,gaussian)\nimportFrom(stats,hclust)\nimportFrom(stats,is.ts)\nimportFrom(stats,lag)\nimportFrom(stats,lm)\nimportFrom(stats,logLik)\nimportFrom(stats,mad)\nimportFrom(stats,make.link)\nimportFrom(stats,median)\nimportFrom(stats,model.frame)\nimportFrom(stats,model.matrix)\nimportFrom(stats,model.offset)\nimportFrom(stats,na.fail)\nimportFrom(stats,na.omit)\nimportFrom(stats,na.pass)\nimportFrom(stats,pacf)\nimportFrom(stats,pbeta)\nimportFrom(stats,pbinom)\nimportFrom(stats,pgamma)\nimportFrom(stats,plnorm)\nimportFrom(stats,plogis)\nimportFrom(stats,pnorm)\nimportFrom(stats,poisson)\nimportFrom(stats,ppois)\nimportFrom(stats,predict)\nimportFrom(stats,printCoefmat)\nimportFrom(stats,qbinom)\nimportFrom(stats,qcauchy)\nimportFrom(stats,qlogis)\nimportFrom(stats,qnorm)\nimportFrom(stats,qqline)\nimportFrom(stats,qqnorm)\nimportFrom(stats,quantile)\nimportFrom(stats,rbeta)\nimportFrom(stats,rbinom)\nimportFrom(stats,reformulate)\nimportFrom(stats,residuals)\nimportFrom(stats,rgamma)\nimportFrom(stats,rlnorm)\nimportFrom(stats,rnbinom)\nimportFrom(stats,rnorm)\nimportFrom(stats,rpois)\nimportFrom(stats,runif)\nimportFrom(stats,sd)\nimportFrom(stats,setNames)\nimportFrom(stats,start)\nimportFrom(stats,terms)\nimportFrom(stats,terms.formula)\nimportFrom(stats,time)\nimportFrom(stats,ts)\nimportFrom(stats,update)\nimportFrom(stats,update.formula)\nimportFrom(utils,getFromNamespace)\nimportFrom(utils,head)\nimportFrom(utils,lsf.str)\nimportFrom(utils,tail)\nuseDynLib(mvgam, .registration = TRUE)\n"
  },
  {
    "path": "NEWS.md",
    "content": "# mvgam 1.1.595\n\n## New functionalities\n* Restructured `summary.mvgam()` to now return an object of class `mvgam_summary` that can be re-used for later purposes, or that can be printed with `print.mvgam_summary()` (#119)\n* Added a new function `ordinate.jsdgam()` to plot two-dimensional ordinations of site and species scores from latent factor models estimated in `jsdgam()`\n* `residual_cor()` now supports models fitted with `mvgam()` in which latent factors were used or in which correlated dynamic processes were used\n* Added a `summary.mvgam_forecast()` function to compute and return prediction intervals of posterior hindcasts and forecasts in a `data.frame` format. This will make it easier for users to create their own custom plots of hindcast and forecast distributions (#108)\n* Added a [`mvgam_use_cases`](https://nicholasjclark.github.io/mvgam/reference/mvgam_use_cases.html) help file to provide links to online resources that discuss how to use 'mvgam' in practice\n\n## Changing defaults\n* The `forecast()` method is now imported from 'generics' to help avoid conflict issues with other forecasting packages\n* Deprecated the `incl_dynamics` argument in the `loo()` and `loo_compare()` functions to ensure better consistency in log-likelihood and resulting LOO estimates from models with different observation families\n* Changed default `type` in `conditional_effects()` to `expected` to match behaviour of 'brms'\n\n## Bug fixes\n* Bug fix to ensure forecast scores are properly computed when plotting objects of class `mvgam_forecast` if only a single out-of-sample observation was included in `newdata` (#111)\n* Bug fix to ensure offsets supplied with `offset(...)` in formulae are correctly incorporated when using `gp()` terms\n* Bug fix to ensure piecewise trends are correctly predicted when using `process_error = TRUE` in `predict()`\n* Bug fix to ensure variance of continuous time autoregressive processes (using `CAR()`) scales appropriately with time lags (#107)\n* Bug fix to ensure `summary.mvgam()` uses the correct `max_treedepth` value when checking Stan diagnostics, rather than always assuming the default of 10 (thanks to @StefanoMezzini for reporting)\n* Bug fix to ensure `NA` residual values are handled properly when plotting residuals (this occurs because response values are allowed to be missing; (thanks to @StefanoMezzini for reporting)\n\n## Deprecations\n* Altered the structure of objects of class `mvgam_forecast` so that the `train_times` and `test_times` slots now contain lists of length `n_series`. This allows for continuous time data to be better handled, where some series may have been sampled at different timepoints\n\n# mvgam 1.1.51\n\n## New functionalities\n* Changed default priors for scale parameters (i.e. process errors `\"sigma\"` and observation errors `\"sigma_obs\"`) to inverse gammas to provide more sensible prior regularisation away from zero\n* Improved messaging in `summary()` for better guidance on how to investigate poor HMC sampler behaviours\n* Converted several more plotting functions to return `ggplot` objects in place of base R plots for broader customisation\n* Added four new `type`s to the `pp_check()` function to allow more targeted investigations of randomized quantile residual distributions\n* Added a `plot.mvgam_residcor()` function for nicer plotting of estimated residual correlations from `jsdgam` objects \n* Added `summary()` functions to calculate useful posterior summaries from objects of class `mvgam_irf` and `mvgam_fevd` (see `?irf` and `?fevd` for examples)\n* Improved efficiency of `nmix()` models with some slight restructuring of the model objects (#102)\n\n## Bug fixes\n* Bug fix to ensure piecewise trends are extrapolated the correct number of timepoints when forecasting using the `forecast()` function\n\n# mvgam 1.1.4\n## New functionalities\n* Added the `how_to_cite.mvgam()` function to generate a scaffold methods description of fitted models, which can hopefully make it easier for users to fully describe their programming environment \n* Improved various plotting functions by returning `ggplot` objects in place of base plots (thanks to @mhollanders #38)\n* Added the brier score (`score = 'brier'`) as an option in `score.mvgam_forecast()` for scoring forecasts of binary variables when using `family = bernoulli()` (#80)\n* Added `augment()` function to add residuals and fitted values to an mvgam object's observed data (thanks to @swpease #83)\n* Added support for approximate `gp()` effects with more than one covariate and with different kernel functions (#79) \n* Added function `jsdgam()` to estimate Joint Species Distribution Models in which both the latent factors and the observation model components can include any of mvgam's complex linear predictor effects. Also added a function `residual_cor()` to compute residual correlation, covariance and precision matrices from `jsdgam` models. See `?mvgam::jsdgam` and `?mvgam::residual_cor` for details\n* Added a `stability.mvgam()` method to compute stability metrics from models fit with Vector Autoregressive dynamics (#21 and #76)\n* Added functionality to estimate hierarchical error correlations when using multivariate latent process models and when the data are nested among levels of a relevant grouping factor (#75); see `?mvgam::AR` for an example\n* Added `ZMVN()` error models for estimating Zero-Mean Multivariate Normal errors; convenient for working with non time-series data where latent residuals are expected to be correlated (such as when fitting Joint Species Distribution Models); see `?mvgam::ZMVN` for examples\n* Added a `fevd.mvgam()` method to compute forecast error variance decompositions from models fit with Vector Autoregressive dynamics (#21 and #76)\n\n## Deprecations\n* Arguments `use_stan`, `jags_path`, `data_train`, `data_test`, `adapt_delta`, `max_treedepth` and `drift` have been removed from primary functions to streamline documentation and reflect the package's mission to deprecate 'JAGS' as a suitable backend. Both `adapt_delta` and `max_treedepth` should now be supplied in a named `list()` to the new argument `control`\n\n## Bug fixes\n* Bug fix to ensure `marginaleffects::comparisons` functions appropriately recognise internal `rowid` variables\n* Updates to ensure `ensemble` provides appropriate weighting of forecast draws (#98)\n* Not necessarily a \"bug fix\", but this update removes several dependencies to lighten installation and improve efficiency of the workflow (#93)\n* Fixed a minor bug in the way `trend_map` recognises levels of the `series` factor\n* Bug fix to ensure `lfo_cv` recognises the actual times in `time`, just in case the user supplies data that doesn't start at `t = 1`. Also updated documentation to better reflect this\n* Bug fix to ensure `update.mvgam` captures any `knots` or `trend_knots` arguments that were passed to the original model call\n\n# mvgam 1.1.3\n## New functionalities\n* Allow intercepts to be included in process models when `trend_formula` is supplied. This breaks the assumption that the process has to be zero-centred, adding more modelling flexibility but also potentially inducing nonidentifiabilities with respect to any observation model intercepts. Thoughtful priors are a must for these models\n* Added `standata.mvgam_prefit`, `stancode.mvgam` and `stancode.mvgam_prefit` methods for better alignment with 'brms' workflows\n* Added 'gratia' to *Enhancements* to allow popular methods such as `draw()` to be used for 'mvgam' models if 'gratia' is already installed\n* Added an `ensemble.mvgam_forecast()` method to generate evenly weighted combinations of probabilistic forecast distributions\n* Added an `irf.mvgam()` method to compute Generalized and Orthogonalized Impulse Response Functions (IRFs) from models fit with Vector Autoregressive dynamics\n\n## Deprecations\n* The `drift` argument has been deprecated. It is now recommended for users to include parametric fixed effects of \"time\" in their respective GAM formulae to capture any expected drift effects\n\n## Bug fixes\n* Added a new check to ensure that exception messages are only suppressed by the `silent` argument if the user's version of 'cmdstanr' is adequate\n* Updated dependency for 'brms' to version >= '2.21.0' so that `read_csv_as_stanfit` can be imported, which should future-proof the conversion of 'cmdstanr' models to `stanfit` objects (#70)\n\n# mvgam 1.1.2\n## New functionalities\n* Added options for silencing some of the 'Stan' compiler and modeling messages using the `silent` argument in `mvgam()`\n* Moved a number of packages from 'Depends' to 'Imports' for simpler package loading and fewer potential masking conflicts\n* Improved efficiency of the model initialisation by tweaking parameters of the underlying 'mgcv' `gam` object's convergence criteria, resulting in much faster model setups\n* Added an option to use `trend_model = 'None'` in State-Space models, increasing flexibility by ensuring the process error evolves as white noise (#51)\n* Added an option to use the non-centred parameterisation for some autoregressive trend models,\nwhich speeds up mixing most of the time\n* Updated support for multithreading so that all observation families (apart from `nmix()`) can now be modeled with multiple threads\n* Changed default priors on autoregressive coefficients (AR1, AR2, AR3) to enforce\nstationarity, which is a much more sensible prior in the majority of contexts\n\n## Bug fixes\n* Fixed a small bug that prevented `conditional_effects.mvgam()` from handling effects with three-way interactions\n\n# mvgam 1.1.1\n## New functionalities\n* Changed indexing of an internal c++ function after Prof Brian Ripley’s   \n  email: Dear maintainer, Please see the problems shown on \n  https://cran.r-project.org/web/checks/check_results_mvgam.html. Please correct   before 2024-05-22 to safely retain your package on CRAN. The CRAN Team\n  \n# mvgam 1.1.0\n* First release of `mvgam` to CRAN\n"
  },
  {
    "path": "R/RcppExports.R",
    "content": "# Generated by using Rcpp::compileAttributes() -> do not edit by hand\n# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393\n\n#' @noRd\nar3_recursC <- function(drift, ar1, ar2, ar3, linpreds, errors, last_trends, h) {\n    .Call(`_mvgam_ar3_recursC`, drift, ar1, ar2, ar3, linpreds, errors, last_trends, h)\n}\n\n#' @noRd\nvar1_recursC <- function(A, linpreds, errors, drift, last_trends, h) {\n    .Call(`_mvgam_var1_recursC`, A, linpreds, errors, drift, last_trends, h)\n}\n\n#' @noRd\nvarma_recursC <- function(A, A2, A3, theta, linpreds, errors, drift, last_trends, h) {\n    .Call(`_mvgam_varma_recursC`, A, A2, A3, theta, linpreds, errors, drift, last_trends, h)\n}\n\n"
  },
  {
    "path": "R/add_MACor.R",
    "content": "#' Function to add moving average processes and/or\n#' correlated process errors to an existing Stan model file\n\n#' When adding MA for univariate trends, 'error' needs to take same form\n#' as trend / LV (array[n] vector[n_lv]) so it can be\n#' extracted in the same way\n#' @noRd\nadd_MaCor = function(\n  model_file,\n  model_data,\n  data_train,\n  data_test,\n  add_ma = FALSE,\n  add_cor = FALSE,\n  trend_model = 'VAR1',\n  drift = FALSE\n) {\n  if (inherits(trend_model, 'mvgam_trend')) {\n    trend_char <- ma_cor_additions(validate_trend_model(\n      trend_model\n    ))$trend_model\n  } else {\n    trend_char <- trend_model\n  }\n\n  if (trend_char == 'ZMVN') {\n    # Update transformed data\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {} else {\n      if (any(grepl('transformed data {', model_file, fixed = TRUE))) {\n        model_file[grep('transformed data {', model_file, fixed = TRUE)] <-\n          paste0(\n            'transformed data {\\n',\n            'vector[n_series] trend_zeros = rep_vector(0.0, n_series);'\n          )\n      } else {\n        model_file[grep('parameters {', model_file, fixed = TRUE)[1]] <-\n          paste0(\n            'transformed data {\\n',\n            'vector[n_series] trend_zeros = rep_vector(0.0, n_series);\\n',\n            '}\\nparameters {'\n          )\n      }\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update parameters block\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      model_file[grep('[n_lv] sigma;', model_file, fixed = TRUE)] <-\n        paste0(\n          model_file[grep('[n_lv] sigma;', model_file, fixed = TRUE)],\n          '\\n\\n',\n          '// correlated latent residuals\\n',\n          'array[n] vector[n_lv] LV_raw;\\n',\n          'cholesky_factor_corr[n_lv] L_Omega;'\n        )\n\n      starts <- grep(\"matrix[n, n_lv] LV;\", model_file, fixed = TRUE) - 1\n      ends <- starts + 1\n      model_file <- model_file[-(starts:ends)]\n    } else {\n      model_file[grep(\n        'vector<lower=0>[n_series] sigma;',\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          'vector<lower=0>[n_series] sigma;\\n\\n',\n          '// correlated latent residuals\\n',\n          'array[n] vector[n_series] trend_raw;\\n',\n          'cholesky_factor_corr[n_series] L_Omega;'\n        )\n\n      starts <- grep(\"matrix[n, n_series] trend;\", model_file, fixed = TRUE) - 1\n      ends <- starts + 1\n      model_file <- model_file[-(starts:ends)]\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update transformed parameters block\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      model_file[grep('transformed parameters {', model_file, fixed = TRUE)] <-\n        paste0(\n          'transformed parameters {\\n',\n          paste0(\n            'matrix[n, n_lv] LV;\\n',\n            '// LKJ form of covariance matrix\\n',\n            'matrix[n_lv, n_lv] L_Sigma;'\n          )\n        )\n\n      model_file[grep('// derived latent states', model_file, fixed = TRUE)] <-\n        paste0(\n          '// correlated residuals\\n',\n          '\\nL_Sigma = diag_pre_multiply(sigma, L_Omega);\\n',\n          'for (i in 1:n) {\\n',\n          'LV[i, 1:n_lv] = to_row_vector(LV_raw[i]);\\n',\n          '}\\n',\n          '// derived latent states'\n        )\n    } else {\n      model_file[grep('transformed parameters {', model_file, fixed = TRUE)] <-\n        paste0(\n          'transformed parameters {\\n',\n          paste0(\n            'matrix[n, n_series] trend;\\n',\n            '// LKJ form of covariance matrix\\n',\n            'matrix[n_series, n_series] L_Sigma;'\n          )\n        )\n\n      last <- grep('model {', model_file, fixed = TRUE)\n      for (i in last:(last - 5)) {\n        last <- i\n        if (trimws(model_file[i]) != '}') {} else {\n          break\n        }\n      }\n\n      model_file[last] <-\n        paste0(\n          '// correlated residuals\\n',\n          '\\nL_Sigma = diag_pre_multiply(sigma, L_Omega);\\n',\n          'for (i in 1:n) {\\n',\n          'trend[i, 1:n_series] = to_row_vector(trend_raw[i]);\\n',\n          '}\\n}'\n        )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update model block\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      starts <- grep(\n        \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\",\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      ends <- grep(\n        \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] + LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]], sigma[j]);\",\n        model_file,\n        fixed = TRUE\n      ) +\n        2\n      model_file <- model_file[-(starts:ends)]\n      model_file[starts] <- paste0(\n        '// residual error correlations\\n',\n        'L_Omega ~ lkj_corr_cholesky(2);\\n',\n        'for (i in 1:n){\\n',\n        'LV_raw[i] ~ multi_normal_cholesky(trend_mus[ytimes_trend[i, 1:n_lv]], L_Sigma);\\n',\n        '}\\n',\n        model_file[starts]\n      )\n    } else {\n      starts <- grep(\"// trend estimates\", model_file, fixed = TRUE)\n      ends <- grep(\n        \"trend[2:n, s] ~ normal(trend[1:(n - 1), s], sigma[s]);\",\n        model_file,\n        fixed = TRUE\n      ) +\n        1\n      model_file <- model_file[-(starts:ends)]\n      model_file[starts] <- paste0(\n        '// residual error correlations\\n',\n        'L_Omega ~ lkj_corr_cholesky(2);\\n',\n        'for (i in 1:n){\\n',\n        'trend_raw[i] ~ multi_normal_cholesky(trend_zeros, L_Sigma);\\n',\n        '}\\n',\n        model_file[starts]\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update generated quantities\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      model_file[grep('// posterior predictions', model_file, fixed = TRUE)] <-\n        paste0(\n          '// computed error covariance matrix\\n',\n          'cov_matrix[n_lv] Sigma = multiply_lower_tri_self_transpose(L_Sigma);\\n',\n          '// posterior predictions'\n        )\n    } else {\n      model_file[grep('// posterior predictions', model_file, fixed = TRUE)] <-\n        paste0(\n          '// computed error covariance matrix\\n',\n          'cov_matrix[n_series] Sigma = multiply_lower_tri_self_transpose(L_Sigma);\\n',\n          '// posterior predictions'\n        )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_char %in% c('RW', 'AR1', 'AR2', 'AR3')) {\n    if (any(grepl('ytimes_trend', model_file))) {\n      remove_trendmus <- FALSE\n    } else {\n      remove_trendmus <- TRUE\n    }\n\n    # Update transformed data\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      if (any(grepl('transformed data {', model_file, fixed = TRUE))) {\n        model_file[grep('transformed data {', model_file, fixed = TRUE)] <-\n          paste0(\n            'transformed data {\\n',\n            'vector[n_lv] trend_zeros = rep_vector(0.0, n_lv);'\n          )\n      } else {\n        model_file[grep('parameters {', model_file, fixed = TRUE)[1]] <-\n          paste0(\n            'transformed data {\\n',\n            'vector[n_lv] trend_zeros = rep_vector(0.0, n_lv);\\n',\n            '}\\nparameters {'\n          )\n      }\n    } else {\n      if (any(grepl('transformed data {', model_file, fixed = TRUE))) {\n        model_file[grep('transformed data {', model_file, fixed = TRUE)] <-\n          paste0(\n            'transformed data {\\n',\n            'vector[n_series] trend_zeros = rep_vector(0.0, n_series);'\n          )\n      } else {\n        model_file[grep('parameters {', model_file, fixed = TRUE)[1]] <-\n          paste0(\n            'transformed data {\\n',\n            'vector[n_series] trend_zeros = rep_vector(0.0, n_series);\\n',\n            '}\\nparameters {'\n          )\n      }\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update parameters block\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      if (add_cor) {\n        model_file[grep('[n_lv] sigma;', model_file, fixed = TRUE)] <-\n          paste0(\n            model_file[grep('[n_lv] sigma;', model_file, fixed = TRUE)],\n            '\\n',\n            'cholesky_factor_corr[n_lv] L_Omega;'\n          )\n      }\n\n      model_file[grep('matrix[n, n_lv] LV;', model_file, fixed = TRUE)] <-\n        paste0(\n          'matrix[n, n_lv] LV;\\n',\n          if (add_ma) {\n            paste0(\n              '// ma coefficients\\n',\n              if (add_cor) {\n                'matrix<lower=-1,upper=1>[n_lv, n_lv] theta;'\n              } else {\n                'vector<lower=-1,upper=1>[n_lv] theta;'\n              }\n            )\n          } else {\n            NULL\n          },\n          '\\n// dynamic error parameters\\n',\n          'vector[n_lv] error[n];'\n        )\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n      end <- grep('matrix[n, n_lv] LV;', model_file, fixed = TRUE)\n      start <- end - 1\n      model_file <- model_file[-c(start:end)]\n    } else {\n      if (add_cor) {\n        model_file[grep(\n          'vector<lower=0>[n_series] sigma;',\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'vector<lower=0>[n_series] sigma;\\n',\n            'cholesky_factor_corr[n_series] L_Omega;'\n          )\n      }\n\n      model_file[grep(\n        'matrix[n, n_series] trend;',\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          'matrix[n, n_series] trend;\\n',\n          if (add_ma) {\n            paste0(\n              '// ma coefficients\\n',\n              if (add_cor) {\n                'matrix<lower=-1,upper=1>[n_series, n_series] theta;'\n              } else {\n                'vector<lower=-1,upper=1>[n_series] theta;'\n              }\n            )\n          } else {\n            NULL\n          },\n          '\\n// dynamic error parameters\\n',\n          'vector[n_series] error[n];'\n        )\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n      end <- grep('matrix[n, n_series] trend;', model_file, fixed = TRUE)\n      start <- end - 1\n      model_file <- model_file[-c(start:end)]\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update transformed parameters\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      model_file[grep(\n        'matrix[n, n_series] trend;',\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          'matrix[n, n_series] trend;\\n',\n          if (add_cor) {\n            paste0(\n              'vector[n_lv] LV[n];\\n',\n              if (add_ma) {\n                'vector[n_lv] epsilon[n];\\n'\n              } else {\n                NULL\n              },\n              '// LKJ form of covariance matrix\\n',\n              'matrix[n_lv, n_lv] L_Sigma;\\n',\n              '// computed error covariance matrix\\n',\n              'cov_matrix[n_lv] Sigma;'\n            )\n          } else {\n            paste0(\n              'matrix[n, n_lv] LV;\\n',\n              if (add_ma) {\n                'matrix[n, n_lv] epsilon;'\n              } else {\n                NULL\n              }\n            )\n          }\n        )\n\n      if (add_cor) {\n        if (trend_char %in% c('AR1', 'RW')) {\n          if (any(grep('// derived latent states', model_file, fixed = TRUE))) {\n            to_modify <- grep(\n              '// derived latent states',\n              model_file,\n              fixed = TRUE\n            )\n          } else {\n            to_modify <- grep(\n              '// derived latent trends',\n              model_file,\n              fixed = TRUE\n            )\n          }\n          model_file[to_modify] <-\n            paste0(\n              '// derived latent states\\n',\n              'LV[1] = ',\n              'trend_mus[ytimes_trend[1, 1:n_lv]] + error[1];\\n',\n              if (add_ma) {\n                'epsilon[1] = error[1];\\n'\n              },\n              'for (i in 2:n) {\\n',\n              if (add_ma) {\n                paste0(\n                  '// lagged error ma process\\n',\n                  'epsilon[i] = theta * error[i - 1];\\n',\n                  '// full ARMA process\\n'\n                )\n              } else {\n                '// full AR process\\n'\n              },\n              'LV[i] = ',\n              if (drift) {\n                'drift * (i - 1) + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[i, 1:n_lv]] + ',\n              if (trend_char == 'AR1') {\n                'ar1 .* '\n              } else {\n                NULL\n              },\n              '(LV[i - 1] - trend_mus[ytimes_trend[i - 1, 1:n_lv]])',\n              if (add_ma) {\n                '+ epsilon[i] + error[i];\\n'\n              } else {\n                '+ error[i];\\n'\n              },\n              '}\\n'\n            )\n        }\n\n        if (trend_char == 'AR2') {\n          if (any(grep('// derived latent states', model_file, fixed = TRUE))) {\n            to_modify <- grep(\n              '// derived latent states',\n              model_file,\n              fixed = TRUE\n            )\n          } else {\n            to_modify <- grep(\n              '// derived latent trends',\n              model_file,\n              fixed = TRUE\n            )\n          }\n          model_file[to_modify] <-\n            paste0(\n              '// derived latent states\\n',\n              'LV[1] = ',\n              'trend_mus[ytimes_trend[1, 1:n_lv]] + error[1];\\n',\n              if (add_ma) {\n                paste0(\n                  'epsilon[1] = error[1];\\n',\n                  'epsilon[2] = theta * error[1];\\n'\n                )\n              } else {\n                NULL\n              },\n              'LV[2] = ',\n              if (drift) {\n                'drift + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[2, 1:n_lv]] + ',\n              'ar1 .* (LV[1] - trend_mus[ytimes_trend[1, 1:n_lv]]) + ',\n              if (add_ma) {\n                'epsilon[2] + error[2];\\n'\n              } else {\n                'error[2];\\n'\n              },\n              'for (i in 3:n) {\\n',\n              if (add_ma) {\n                paste0(\n                  '// lagged error ma process\\n',\n                  'epsilon[i] = theta * error[i - 1];\\n',\n                  '// full ARMA process\\n'\n                )\n              } else {\n                '// full AR process\\n'\n              },\n              'LV[i] = ',\n              if (drift) {\n                'drift * (i - 1) + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[i, 1:n_lv]] + ',\n              'ar1 .* (LV[i - 1] - trend_mus[ytimes_trend[i - 1, 1:n_lv]]) + ',\n              'ar2 .* (LV[i - 2] - trend_mus[ytimes_trend[i - 2, 1:n_lv]]) + ',\n              if (add_ma) {\n                'epsilon[i] + error[i];\\n'\n              } else {\n                'error[i];\\n'\n              },\n              '}\\n'\n            )\n        }\n\n        if (trend_char == 'AR3') {\n          if (any(grep('// derived latent states', model_file, fixed = TRUE))) {\n            to_modify <- grep(\n              '// derived latent states',\n              model_file,\n              fixed = TRUE\n            )\n          } else {\n            to_modify <- grep(\n              '// derived latent trends',\n              model_file,\n              fixed = TRUE\n            )\n          }\n          model_file[to_modify] <-\n            paste0(\n              '// derived latent states\\n',\n              'LV[1] = ',\n              'trend_mus[ytimes_trend[1, 1:n_lv]] + error[1];\\n',\n              if (add_ma) {\n                paste0(\n                  'epsilon[1] = error[1];\\n',\n                  'epsilon[2] = theta * error[1];\\n',\n                  'epsilon[3] = theta * error[2];\\n'\n                )\n              } else {\n                NULL\n              },\n              'LV[2] = ',\n              if (drift) {\n                'drift + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[2, 1:n_lv]] + ',\n              'ar1 .* (LV[1] - trend_mus[ytimes_trend[1, 1:n_lv]]) + ',\n              if (add_ma) {\n                'epsilon[2] + error[2];\\n'\n              } else {\n                'error[2];\\n'\n              },\n              'LV[3] = ',\n              if (drift) {\n                'drift * 2 + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[3, 1:n_lv]] + ',\n              'ar1 .* (LV[2] - trend_mus[ytimes_trend[2, 1:n_lv]]) + ',\n              'ar2 .* (LV[1] - trend_mus[ytimes_trend[1, 1:n_lv]]) + ',\n              if (add_ma) {\n                'epsilon[3] + error[3];\\n'\n              } else {\n                'error[3];\\n'\n              },\n              'for (i in 4:n) {\\n',\n              if (add_ma) {\n                paste0(\n                  '// lagged error ma process\\n',\n                  'epsilon[i] = theta * error[i - 1];\\n',\n                  '// full ARMA process\\n'\n                )\n              } else {\n                '// full AR process\\n'\n              },\n              'LV[i] = ',\n              if (drift) {\n                'drift * (i - 1) + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[i, 1:n_lv]] + ',\n              'ar1 .* (LV[i - 1] - trend_mus[ytimes_trend[i - 1, 1:n_lv]]) + ',\n              'ar2 .* (LV[i - 2] - trend_mus[ytimes_trend[i - 2, 1:n_lv]]) + ',\n              'ar3 .* (LV[i - 3] - trend_mus[ytimes_trend[i - 3, 1:n_lv]]) + ',\n              if (add_ma) {\n                'epsilon[i] + error[i];\\n'\n              } else {\n                'error[i];\\n'\n              },\n              '}\\n'\n            )\n        }\n      } else {\n        if (trend_char %in% c('AR1', 'RW')) {\n          if (any(grep('// derived latent states', model_file, fixed = TRUE))) {\n            to_modify <- grep(\n              '// derived latent states',\n              model_file,\n              fixed = TRUE\n            )\n          } else {\n            to_modify <- grep(\n              '// derived latent trends',\n              model_file,\n              fixed = TRUE\n            )\n          }\n          model_file[to_modify] <-\n            paste0(\n              '// derived latent states\\n',\n              'for(j in 1:n_lv){\\n',\n              'LV[1, j] = ',\n              'trend_mus[ytimes_trend[1, j]] + error[1, j];\\n',\n              'epsilon[1, j] = error[1, j];\\n',\n              'for(i in 2:n){\\n',\n              '// lagged error ma process\\n',\n              'epsilon[i, j] = theta[j] * error[i-1, j];\\n',\n              '// full ARMA process\\n',\n              'LV[i, j] = ',\n              if (drift) {\n                'drift[j] * (i - 1) + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[i, j]] + ',\n              if (trend_char == 'AR1') {\n                'ar1[j] * '\n              } else {\n                NULL\n              },\n              '(LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ',\n              'epsilon[i, j] + error[i, j];\\n',\n              '}\\n}'\n            )\n        }\n\n        if (trend_char == 'AR2') {\n          if (any(grep('// derived latent states', model_file, fixed = TRUE))) {\n            to_modify <- grep(\n              '// derived latent states',\n              model_file,\n              fixed = TRUE\n            )\n          } else {\n            to_modify <- grep(\n              '// derived latent trends',\n              model_file,\n              fixed = TRUE\n            )\n          }\n          model_file[to_modify] <-\n            paste0(\n              '// derived latent states\\n',\n              'for(j in 1:n_lv){\\n',\n              'LV[1, j] = ',\n              'trend_mus[ytimes_trend[1, j]] + error[1, j];\\n',\n              'epsilon[1, j] = error[1, j];\\n',\n              'epsilon[2, j] = theta[j] * error[1, j];\\n',\n              'LV[2, j] = ',\n              if (drift) {\n                'drift[j] + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[1, j]] + ',\n              'ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]) + ',\n              'epsilon[2, j] + error[2, j];\\n',\n              'for(i in 3:n){\\n',\n              '// lagged error ma process\\n',\n              'epsilon[i, j] = theta[j] * error[i-1, j];\\n',\n              '// full ARMA process\\n',\n              'LV[i, j] = ',\n              if (drift) {\n                'drift[j] * (i - 1) + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[i, j]] + ',\n              'ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ',\n              'ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]) + ',\n              'epsilon[i, j] + error[i, j];\\n',\n              '}\\n}'\n            )\n        }\n\n        if (trend_char == 'AR3') {\n          if (any(grep('// derived latent states', model_file, fixed = TRUE))) {\n            to_modify <- grep(\n              '// derived latent states',\n              model_file,\n              fixed = TRUE\n            )\n          } else {\n            to_modify <- grep(\n              '// derived latent trends',\n              model_file,\n              fixed = TRUE\n            )\n          }\n          model_file[to_modify] <-\n            paste0(\n              '// derived latent states\\n',\n              'for(j in 1:n_lv){\\n',\n              'LV[1, j] = ',\n              'trend_mus[ytimes_trend[1, j]] + error[1, j];\\n',\n              'epsilon[1, j] = error[1, j];\\n',\n              'epsilon[2, j] = theta[j] * error[1, j];\\n',\n              'epsilon[3, j] = theta[j] * error[2, j];\\n',\n              'LV[2, j] = ',\n              if (drift) {\n                'drift[j] + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[2, j]] + ',\n              'ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]) + ',\n              'epsilon[2, j] + error[2, j];\\n',\n              'LV[3, j] = ',\n              if (drift) {\n                'drift[j] * 2 + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[1, j]] + ',\n              'ar1[j] * (LV[2, j] - trend_mus[ytimes_trend[2, j]]) + ',\n              'ar2[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]) + ',\n              'epsilon[3, j] + error[3, j];\\n',\n              'for(i in 4:n){\\n',\n              '// lagged error ma process\\n',\n              'epsilon[i, j] = theta[j] * error[i-1, j];\\n',\n              '// full ARMA process\\n',\n              'LV[i, j] = ',\n              if (drift) {\n                'drift[j] * (i - 1) + '\n              } else {\n                NULL\n              },\n              'trend_mus[ytimes_trend[i, j]] + ',\n              'ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ',\n              'ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]) + ',\n              'ar3[j] * (LV[i - 3, j] - trend_mus[ytimes_trend[i - 3, j]]) + ',\n              'epsilon[i, j] + error[i, j];\\n',\n              '}\\n}'\n            )\n        }\n      }\n\n      if (add_cor) {\n        model_file[grep('lv_coefs = Z;', model_file, fixed = TRUE)] <-\n          paste0(\n            'L_Sigma = diag_pre_multiply(sigma, L_Omega);\\n',\n            'Sigma = multiply_lower_tri_self_transpose(L_Sigma);\\n',\n            'lv_coefs = Z;'\n          )\n      }\n    } else {\n      model_file[grep('transformed parameters {', model_file, fixed = TRUE)] <-\n        paste0(\n          'transformed parameters {\\n',\n          if (add_cor) {\n            paste0(\n              'vector[n_series] trend_raw[n];\\n',\n              'matrix[n, n_series] trend;\\n',\n              if (add_ma) {\n                'vector[n_series] epsilon[n];\\n'\n              } else {\n                NULL\n              },\n              '// LKJ form of covariance matrix\\n',\n              'matrix[n_series, n_series] L_Sigma;\\n',\n              '// computed error covariance matrix\\n',\n              'cov_matrix[n_series] Sigma;'\n            )\n          } else {\n            paste0(\n              'matrix[n, n_series] trend;\\n',\n              if (add_ma) {\n                'matrix[n, n_series] epsilon;'\n              } else {\n                NULL\n              }\n            )\n          }\n        )\n\n      if (add_cor) {\n        if (trend_char %in% c('AR1', 'RW')) {\n          if (any(grepl('= mu_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= mu_raw[', model_file, fixed = TRUE))\n          } else if (any(grepl('= b_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= b_raw[', model_file, fixed = TRUE))\n          }\n          model_file[insert_line] <-\n            paste0(\n              model_file[insert_line],\n              '\\n// derived latent states\\n',\n              'trend_raw[1] = ',\n              'error[1];\\n',\n              if (add_ma) {\n                'epsilon[1] = error[1];\\n'\n              } else {\n                NULL\n              },\n              'for (i in 2:n) {\\n',\n              if (add_ma) {\n                paste0(\n                  '// lagged error ma process\\n',\n                  'epsilon[i] = theta * error[i - 1];\\n',\n                  '// full ARMA process\\n'\n                )\n              } else {\n                paste0('// full AR process\\n')\n              },\n              'trend_raw[i] = ',\n              if (drift) {\n                'drift * (i - 1) + '\n              } else {\n                NULL\n              },\n              if (trend_char == 'AR1') {\n                'ar1 .* '\n              } else {\n                NULL\n              },\n              'trend_raw[i - 1] + ',\n              if (add_ma) {\n                'epsilon[i] + error[i];\\n'\n              } else {\n                'error[i];\\n'\n              },\n              '}\\n'\n            )\n        }\n\n        if (trend_char == 'AR2') {\n          if (any(grepl('= mu_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= mu_raw[', model_file, fixed = TRUE))\n          } else if (any(grepl('= b_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= b_raw[', model_file, fixed = TRUE))\n          }\n          model_file[insert_line] <-\n            paste0(\n              model_file[insert_line],\n              '\\n// derived latent states\\n',\n              'trend_raw[1] = ',\n              'error[1];\\n',\n              if (add_ma) {\n                paste0(\n                  'epsilon[1] = error[1];\\n',\n                  'epsilon[2] = theta * error[1];\\n'\n                )\n              } else {\n                NULL\n              },\n              'trend_raw[2] = ',\n              if (drift) {\n                'drift + '\n              } else {\n                NULL\n              },\n              'ar1 .* trend_raw[1] + ',\n              if (add_ma) {\n                'epsilon[2] + error[2];\\n'\n              } else {\n                'error[2];\\n'\n              },\n              'for (i in 3:n) {\\n',\n              if (add_ma) {\n                paste0(\n                  '// lagged error ma process\\n',\n                  'epsilon[i] = theta * error[i - 1];\\n',\n                  '// full ARMA process\\n'\n                )\n              } else {\n                '// full AR process\\n'\n              },\n              'trend_raw[i] = ',\n              if (drift) {\n                'drift * (i - 1) + '\n              } else {\n                NULL\n              },\n              'ar1 .* trend_raw[i - 1] + ',\n              'ar2 .* trend_raw[i - 2] + ',\n              if (add_ma) {\n                'epsilon[i] + error[i];\\n'\n              } else {\n                'error[i];\\n'\n              },\n              '}\\n'\n            )\n        }\n\n        if (trend_char == 'AR3') {\n          if (any(grepl('= mu_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= mu_raw[', model_file, fixed = TRUE))\n          } else if (any(grepl('= b_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= b_raw[', model_file, fixed = TRUE))\n          }\n          model_file[insert_line] <-\n            paste0(\n              model_file[insert_line],\n              '\\n// derived latent states\\n',\n              'trend_raw[1] = ',\n              'error[1];\\n',\n              if (add_ma) {\n                paste0(\n                  'epsilon[1] = error[1];\\n',\n                  'epsilon[2] = theta * error[1];\\n',\n                  'epsilon[3] = theta * error[2];\\n'\n                )\n              } else {\n                NULL\n              },\n              'trend_raw[2] = ',\n              if (drift) {\n                'drift + '\n              } else {\n                NULL\n              },\n              'ar1 .* trend_raw[1] + ',\n              if (add_ma) {\n                'epsilon[2] + error[2];\\n'\n              } else {\n                'error[2];\\n'\n              },\n              'trend_raw[3] = ',\n              if (drift) {\n                'drift * 2 + '\n              } else {\n                NULL\n              },\n              'ar1 .* trend_raw[2] + ',\n              'ar2 .* trend_raw[1] + ',\n              if (add_ma) {\n                'epsilon[3] + error[3];\\n'\n              } else {\n                'error[3];\\n'\n              },\n              'for (i in 4:n) {\\n',\n              if (add_ma) {\n                paste0(\n                  '// lagged error ma process\\n',\n                  'epsilon[i] = theta * error[i - 1];\\n',\n                  '// full ARMA process\\n'\n                )\n              } else {\n                '// full AR process\\n'\n              },\n              'trend_raw[i] = ',\n              if (drift) {\n                'drift * (i - 1) + '\n              } else {\n                NULL\n              },\n              'ar1 .* trend_raw[i - 1] + ',\n              'ar2 .* trend_raw[i - 2] + ',\n              'ar3 .* trend_raw[i - 3] + ',\n              if (add_ma) {\n                'epsilon[i] + error[i];\\n'\n              } else {\n                'error[i];\\n'\n              },\n              '}\\n'\n            )\n        }\n      } else {\n        if (trend_char %in% c('AR1', 'RW')) {\n          if (any(grepl('= mu_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= mu_raw[', model_file, fixed = TRUE))\n          } else if (any(grepl('= b_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= b_raw[', model_file, fixed = TRUE))\n          }\n          model_file[insert_line] <-\n            paste0(\n              model_file[insert_line],\n              '\\nfor(j in 1:n_series){\\n',\n              'trend[1, j] = ',\n              'error[1, j];\\n',\n              'epsilon[1, j] = error[1, j];\\n',\n              'for(i in 2:n){\\n',\n              '// lagged error ma process\\n',\n              'epsilon[i, j] = theta[j] * error[i-1, j];\\n',\n              '// full ARMA process\\n',\n              'trend[i, j] = ',\n              if (drift) {\n                'drift[j] * (i - 1) + '\n              } else {\n                NULL\n              },\n              if (trend_char == 'AR1') {\n                'ar1[j] * '\n              } else {\n                NULL\n              },\n              'trend[i - 1, j] + ',\n              'epsilon[i, j] + error[i, j];\\n',\n              '}\\n}'\n            )\n        }\n\n        if (trend_char == 'AR2') {\n          if (any(grepl('= mu_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= mu_raw[', model_file, fixed = TRUE))\n          } else if (any(grepl('= b_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= b_raw[', model_file, fixed = TRUE))\n          }\n          model_file[insert_line] <-\n            paste0(\n              model_file[insert_line],\n              '\\nfor(j in 1:n_series){\\n',\n              'trend[1, j] = ',\n              'error[1, j];\\n',\n              'epsilon[1, j] = error[1, j];\\n',\n              'epsilon[2, j] = theta[j] * error[1, j];\\n',\n              'trend[2, j] = ',\n              if (drift) {\n                'drift[j] + '\n              } else {\n                NULL\n              },\n              'ar1[j] * trend[1, j] + ',\n              'epsilon[2, j] + error[2, j];\\n',\n              'for(i in 3:n){\\n',\n              '// lagged error ma process\\n',\n              'epsilon[i, j] = theta[j] * error[i-1, j];\\n',\n              '// full ARMA process\\n',\n              'trend[i, j] = ',\n              if (drift) {\n                'drift[j] * (i - 1) + '\n              } else {\n                NULL\n              },\n              'ar1[j] * trend[i - 1, j] + ',\n              'ar2[j] * trend[i - 2, j] + ',\n              'epsilon[i, j] + error[i, j];\\n',\n              '}\\n}'\n            )\n        }\n\n        if (trend_char == 'AR3') {\n          if (any(grepl('= mu_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= mu_raw[', model_file, fixed = TRUE))\n          } else if (any(grepl('= b_raw[', model_file, fixed = TRUE))) {\n            insert_line <- max(grep('= b_raw[', model_file, fixed = TRUE))\n          }\n          model_file[insert_line] <-\n            paste0(\n              model_file[insert_line],\n              '\\nfor(j in 1:n_series){\\n',\n              'trend[1, j] = ',\n              'error[1, j];\\n',\n              'epsilon[1, j] = error[1, j];\\n',\n              'epsilon[2, j] = theta[j] * error[1, j];\\n',\n              'epsilon[3, j] = theta[j] * error[2, j];\\n',\n              'trend[2, j] = ',\n              if (drift) {\n                'drift[j] + '\n              } else {\n                NULL\n              },\n              'ar1[j] * trend[1, j] + ',\n              'epsilon[2, j] + error[2, j];\\n',\n              'trend[3, j] = ',\n              if (drift) {\n                'drift[j] * 2 + '\n              } else {\n                NULL\n              },\n              'ar1[j] * trend[2, j] + ',\n              'ar2[j] * trend[1, j] + ',\n              'epsilon[2, j] + error[2, j];\\n',\n              'for(i in 4:n){\\n',\n              '// lagged error ma process\\n',\n              'epsilon[i, j] = theta[j] * error[i-1, j];\\n',\n              '// full ARMA process\\n',\n              'trend[i, j] = ',\n              if (drift) {\n                'drift[j] * (i - 1) + '\n              } else {\n                NULL\n              },\n              'ar1[j] * trend[i - 1, j] + ',\n              'ar2[j] * trend[i - 2, j] + ',\n              'ar3[j] * trend[i - 3, j] + ',\n              'epsilon[i, j] + error[i, j];\\n',\n              '}\\n}'\n            )\n        }\n      }\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n      if (add_cor) {\n        last <- grep('model {', model_file, fixed = TRUE)\n        for (i in last:(last - 5)) {\n          last <- i\n          if (trimws(model_file[i]) != '}') {} else {\n            break\n          }\n        }\n\n        model_file[last] <-\n          paste0(\n            '\\nL_Sigma = diag_pre_multiply(sigma, L_Omega);\\n',\n            'Sigma = multiply_lower_tri_self_transpose(L_Sigma);\\n',\n            'for (i in 1:n) {\\n',\n            'trend[i, 1:n_series] = to_row_vector(trend_raw[i]);\\n',\n            '}\\n}'\n          )\n      }\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update model block\n    if (any(grepl('[n_lv] sigma;', model_file, fixed = TRUE))) {\n      if (any(grepl('LV[1, j] ~ normal', model_file, fixed = TRUE))) {\n        start <- grep('LV[1, j] ~ normal', model_file, fixed = TRUE) - 1\n        end <- grep('LV[i, j] ~ normal', model_file, fixed = TRUE) + 2\n      } else {\n        start <- grep('LV[1, 1:n_lv] ~ normal(', model_file, fixed = TRUE) - 1\n        first <- grep(':n, j] ~ normal(', model_file, fixed = TRUE)\n        second <- grep('sigma[j]);', model_file, fixed = TRUE)\n        end <- intersect(first, second) + 1\n      }\n\n      model_file <- model_file[-c(start:end)]\n      model_file[start] <- paste0(\n        '// contemporaneous errors\\n',\n        if (add_cor) {\n          paste0(\n            'L_Omega ~ lkj_corr_cholesky(2);\\n',\n            'for(i in 1:n) {\\n',\n            'error[i] ~ multi_normal_cholesky(trend_zeros, L_Sigma);\\n',\n            '}'\n          )\n        } else {\n          paste0(\n            'for(i in 1:n) {\\n',\n            'error[i] ~ normal(trend_zeros, sigma);\\n',\n            '}'\n          )\n        },\n        if (add_ma) {\n          paste0(\n            '\\n// ma coefficients\\n',\n            if (add_cor) {\n              paste0(\n                'for(i in 1:n_lv){\\n',\n                'for(j in 1:n_lv){\\n',\n                'if (i != j)\\n',\n                'theta[i, j] ~ normal(0, 0.2);\\n',\n                '}\\n}'\n              )\n            } else {\n              'theta ~ normal(0, 0.2);'\n            }\n          )\n        } else {\n          NULL\n        },\n        '\\n',\n        model_file[start]\n      )\n    } else {\n      start <- grep(\n        'trend[1, 1:n_series] ~ normal(',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      first <- grep(':n, s] ~ normal(', model_file, fixed = TRUE)\n      second <- grep('sigma[s]);', model_file, fixed = TRUE)\n      end <- intersect(first, second) + 1\n\n      model_file <- model_file[-c(start:end)]\n      model_file[start] <- paste0(\n        '// contemporaneous errors\\n',\n        if (add_cor) {\n          paste0(\n            'L_Omega ~ lkj_corr_cholesky(2);\\n',\n            'for(i in 1:n) {\\n',\n            'error[i] ~ multi_normal_cholesky(trend_zeros, L_Sigma);\\n',\n            '}'\n          )\n        } else {\n          paste0(\n            'for(i in 1:n) {\\n',\n            'error[i] ~ normal(trend_zeros, sigma);\\n',\n            '}'\n          )\n        },\n        if (add_ma) {\n          paste0(\n            '\\n// ma coefficients\\n',\n            if (add_cor) {\n              paste0(\n                'for(i in 1:n_series){\\n',\n                'for(j in 1:n_series){\\n',\n                'if (i != j)\\n',\n                'theta[i, j] ~ normal(0, 0.2);\\n',\n                '}\\n}'\n              )\n            } else {\n              'theta ~ normal(0, 0.2);'\n            }\n          )\n        } else {\n          NULL\n        },\n        '\\n',\n        model_file[start]\n      )\n    }\n\n    if (remove_trendmus) {\n      model_file <- gsub(\n        'trend_mus[ytimes_trend[1, 1:n_lv]] +',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        'trend_mus[ytimes_trend[i, 1:n_lv]] + ',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        ' - trend_mus[ytimes_trend[i - 1, 1:n_lv]]',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        ' - trend_mus[ytimes_trend[1, 1:n_lv]]',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        ' - trend_mus[ytimes_trend[i - 2, 1:n_lv]]',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        'trend_mus[ytimes_trend[2, 1:n_lv]] + ',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        'trend_mus[ytimes_trend[3, 1:n_lv]] + ',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        ' - trend_mus[ytimes_trend[2, 1:n_lv]]',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n      model_file <- gsub(\n        ' - trend_mus[ytimes_trend[i - 3, 1:n_lv]]',\n        '',\n        model_file,\n        fixed = TRUE\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (grepl('VAR', trend_char) & add_ma) {\n    # Only ma can be added for VAR models currently\n    # Replace the reverse mapping function with the MA representation\n    start <- grep(\n      '/* Function to perform the reverse mapping*/',\n      model_file,\n      fixed = TRUE\n    )\n    end <- grep('return phiGamma;', model_file, fixed = TRUE) + 1\n    model_file <- model_file[-c(start:end)]\n    model_file[\n      grep(\n        'return mdivide_left_spd(sqrtm(B), P_real);',\n        model_file,\n        fixed = TRUE\n      ) +\n        1\n    ] <-\n      paste0(\n        '}\\n',\n        '/* Function to compute Kronecker product */\\n\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix kronecker_prod(matrix A, matrix B) {\\n',\n        'matrix[rows(A) * rows(B), cols(A) * cols(B)] C;\\n',\n        'int m = rows(A);\\n',\n        'int n = cols(A);\\n',\n        'int p = rows(B);\\n',\n        'int q = cols(B);\\n',\n        'for (i in 1:m) {\\n',\n        'for (j in 1:n) {\\n',\n        'int row_start = (i - 1) * p + 1;\\n',\n        'int row_end = (i - 1) * p + p;\\n',\n        'int col_start = (j - 1) * q + 1;\\n',\n        'int col_end = (j - 1) * q + q;\\n',\n        'C[row_start:row_end, col_start:col_end] = A[i, j] * B;\\n',\n        '}\\n',\n        '}\\n',\n        'return C;\\n',\n        '}\\n',\n        '/* Function to perform the reverse mapping\\n\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix[] rev_mapping(matrix[] P, matrix Sigma) {\\n',\n        'int p = size(P);\\n',\n        'int m = rows(Sigma);\\n',\n        'matrix[m, m] phi_for[p, p];   matrix[m, m] phi_rev[p, p];\\n',\n        'matrix[m, m] Sigma_for[p+1];  matrix[m, m] Sigma_rev[p+1];\\n',\n        'matrix[m, m] S_for;           matrix[m, m] S_rev;\\n',\n        'matrix[m, m] S_for_list[p+1];\\n',\n        '// Step 1:\\n',\n        'Sigma_for[p+1] = Sigma;\\n',\n        'S_for_list[p+1] = sqrtm(Sigma);\\n',\n        'for(s in 1:p) {\\n',\n        '// In this block of code S_rev is B^{-1} and S_for is a working matrix\\n',\n        'S_for = - tcrossprod(P[p-s+1]);\\n',\n        'for(i in 1:m) S_for[i, i] += 1.0;\\n',\n        'S_rev = sqrtm(S_for);\\n',\n        'S_for_list[p-s+1] = mdivide_right_spd(mdivide_left_spd(S_rev,\\n',\n        'sqrtm(quad_form_sym(Sigma_for[p-s+2], S_rev))), S_rev);\\n',\n        'Sigma_for[p-s+1] = tcrossprod(S_for_list[p-s+1]);\\n',\n        '}\\n',\n        '// Step 2:\\n',\n        'Sigma_rev[1] = Sigma_for[1];\\n',\n        'for(s in 0:(p-1)) {\\n',\n        'S_for = S_for_list[s+1];\\n',\n        'S_rev = sqrtm(Sigma_rev[s+1]);\\n',\n        'phi_for[s+1, s+1] = mdivide_right_spd(S_for * P[s+1], S_rev);\\n',\n        \"phi_rev[s+1, s+1] = mdivide_right_spd(S_rev * P[s+1]', S_for);\\n\",\n        'if(s>=1) {\\n',\n        'for(k in 1:s) {\\n',\n        'phi_for[s+1, k] = phi_for[s, k] - phi_for[s+1, s+1] * phi_rev[s, s-k+1];\\n',\n        'phi_rev[s+1, k] = phi_rev[s, k] - phi_rev[s+1, s+1] * phi_for[s, s-k+1];\\n',\n        '}\\n',\n        '}\\n',\n        'Sigma_rev[s+2] = Sigma_rev[s+1] - quad_form_sym(Sigma_for[s+1],\\n',\n        \"phi_rev[s+1, s+1]');\\n\",\n        '}\\n',\n        'return phi_for[p];\\n',\n        '}\\n',\n\n        '/* Function to compute the joint (stationary) distribution of\\n',\n        '(y_0, ..., y_{1-p}, eps_0, ..., eps_{1-q})\\n\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix initial_joint_var(matrix Sigma, matrix[] phi, matrix[] theta) {\\n',\n        'int p = size(phi);\\n',\n        'int q = size(theta);\\n',\n        'int m = rows(Sigma);\\n',\n        'matrix[(p+q)*m, (p+q)*m] companion_mat = rep_matrix(0.0, (p+q)*m, (p+q)*m);\\n',\n        'matrix[(p+q)*m, (p+q)*m] companion_var = rep_matrix(0.0, (p+q)*m, (p+q)*m);\\n',\n        'matrix[(p+q)*m*(p+q)*m, (p+q)*m*(p+q)*m] tmp = diag_matrix(rep_vector(1.0,\\n',\n        '(p+q)*m*(p+q)*m));\\n',\n        'matrix[(p+q)*m, (p+q)*m] Omega;\\n',\n        '// Construct phi_tilde:\\n',\n        'for(i in 1:p) {\\n',\n        'companion_mat[1:m, ((i-1)*m+1):(i*m)] = phi[i];\\n',\n        'if(i>1) {\\n',\n        'for(j in 1:m) {\\n',\n        'companion_mat[(i-1)*m+j, (i-2)*m+j] = 1.0;\\n',\n        '}\\n',\n        '}\\n',\n        '}\\n',\n        'for(i in 1:q) {\\n',\n        'companion_mat[1:m, ((p+i-1)*m+1):((p+i)*m)] = theta[i];\\n',\n        '}\\n',\n        'if(q>1) {\\n',\n        'for(i in 2:q) {\\n',\n        'for(j in 1:m) {\\n',\n        'companion_mat[(p+i-1)*m+j, (p+i-2)*m+j] = 1.0;\\n',\n        '}\\n',\n        '}\\n',\n        '}\\n',\n        '// Construct Sigma_tilde:\\n',\n        'companion_var[1:m, 1:m] = Sigma;\\n',\n        'companion_var[(p*m+1):((p+1)*m), (p*m+1):((p+1)*m)] = Sigma;\\n',\n        'companion_var[1:m, (p*m+1):((p+1)*m)] = Sigma;\\n',\n        'companion_var[(p*m+1):((p+1)*m), 1:m] = Sigma;\\n',\n        '// Compute Gamma0_tilde\\n',\n        'tmp -= kronecker_prod(companion_mat, companion_mat);\\n',\n        \"Omega = to_matrix(tmp \\\\ to_vector(companion_var), (p+q)*m, (p+q)*m);\\n\",\n        '// Ensure Omega is symmetric:\\n',\n        'for(i in 1:(rows(Omega)-1)) {\\n',\n        'for(j in (i+1):rows(Omega)) {\\n',\n        'Omega[j, i] = Omega[i, j];\\n',\n        '}\\n',\n        '}\\n',\n        'return Omega;\\n',\n        '}\\n'\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update transformed data\n    if (\n      any(grepl(\n        'cholesky_factor_corr[n_lv] L_Omega;',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      model_file[grep(\n        'transformed data {',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'transformed data {\\n',\n        'vector[n_lv] trend_zeros = rep_vector(0.0, n_lv);\\n',\n        'vector[n_lv*2] init_zeros = rep_vector(0.0, n_lv*2);\\n'\n      )\n    } else {\n      model_file[grep(\n        'vector[n_series] trend_zeros = rep_vector(0.0, n_series);',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'vector[n_series] trend_zeros = rep_vector(0.0, n_series);\\n',\n        'vector[n_series*2] init_zeros = rep_vector(0.0, n_series*2);\\n'\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update parameters\n    if (\n      any(grepl(\n        'cholesky_factor_corr[n_lv] L_Omega;',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      model_file[grep(\n        'matrix[n_lv, n_lv] P_real;',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'matrix[n_lv, n_lv] P_real;\\n',\n        '// unconstrained MA partial autocorrelations\\n',\n        'matrix[n_lv, n_lv] R_real;\\n',\n        '// initial joint stationary VARMA process\\n',\n        'vector[2 * n_lv] init;\\n',\n        '// ma error parameters\\n',\n        'vector[n_lv] error[n];'\n      )\n    } else {\n      model_file[grep(\n        'matrix[n_series, n_series] P_real;',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'matrix[n_series, n_series] P_real;\\n',\n        '// unconstrained MA partial autocorrelations\\n',\n        'matrix[n_series, n_series] R_real;\\n',\n        '// initial joint stationary VARMA process\\n',\n        'vector[2 * n_series] init;\\n',\n        '// ma error parameters\\n',\n        'vector[n_series] error[n];'\n      )\n    }\n\n    # Update transformed parameters\n    if (\n      any(grepl(\n        'cholesky_factor_corr[n_lv] L_Omega;',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      model_file[grep(\n        'matrix[n_lv, n_lv] A;',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'matrix[n_lv, n_lv] A;\\n',\n        '// latent trend MA autoregressive terms\\n',\n        'matrix[n_lv, n_lv] theta;\\n',\n        '// ma process\\n',\n        'array[n] vector[n_lv] epsilon;\\n'\n      )\n\n      end <- grep('vector[n_lv] LV[n];', model_file, fixed = TRUE)\n      start <- end - 1\n      model_file <- model_file[-c(start:end)]\n\n      model_file[grep(\n        'cov_matrix[n_lv] Gamma;',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'cov_matrix[n_lv * 2] Omega;\\n',\n        \"// latent states\\n\",\n        \"vector[n_lv] LV[n];\"\n      )\n\n      start <- grep('// derived latent states', model_file, fixed = TRUE)\n      end <- grep('Gamma = phiGamma[2, 1];', model_file, fixed = TRUE) + 1\n      model_file <- model_file[-c(start:end)]\n      model_file[start] <- paste0(\n        model_file[start],\n        '\\n',\n        '// stationary VARMA reparameterisation\\n',\n        'L_Sigma = diag_pre_multiply(sigma, L_Omega);\\n',\n        'Sigma = multiply_lower_tri_self_transpose(L_Sigma);\\n',\n\n        '{\\n',\n        '// constrained partial autocorrelations\\n',\n        'matrix[n_lv, n_lv] P[1];\\n',\n        'matrix[n_lv, n_lv] R[1];\\n',\n        '// stationary autoregressive coefficients\\n',\n        'matrix[n_lv, n_lv] A_init[1];\\n',\n        'matrix[n_lv, n_lv] theta_init[1];\\n',\n        'P[1] = P_realtoP(P_real);\\n',\n        'R[1] = P_realtoP(R_real);\\n',\n        '// stationary autoregressive and ma coef matrices\\n',\n        'A_init = rev_mapping(P, Sigma);\\n',\n        'theta_init = rev_mapping(R, Sigma);\\n',\n        'theta_init[1] = -theta_init[1];\\n',\n        '// initial stationary covariance structure\\n',\n        'Omega = initial_joint_var(Sigma, A_init, theta_init);\\n',\n        'A = A_init[1];\\n',\n        'theta = theta_init[1];\\n',\n        '}\\n',\n\n        '// computed VARMA trends\\n',\n        'epsilon[1] = theta * init[(n_lv + 1) : (n_lv * 2)];\\n',\n        'LV[1] = (A * init[1 : n_lv]) + trend_mus[ytimes_trend[1, 1 : n_lv]] + epsilon[1] + error[1];\\n',\n        'for (i in 2 : n) {\\n',\n        '// lagged error ma process\\n',\n        'epsilon[i] = theta * error[i - 1];\\n',\n        '// full VARMA process\\n',\n        'LV[i] = trend_mus[ytimes_trend[i, 1 : n_lv]] + A * (LV[i - 1] - trend_mus[ytimes_trend[i - 1, 1 : n_lv]]) + epsilon[i] + error[i];\\n',\n        '}\\n',\n\n        '// derived latent states\\n',\n        'lv_coefs = Z;\\n',\n        'for (i in 1 : n) {\\n',\n        'for (s in 1 : n_series) {\\n',\n        'trend[i, s] = dot_product(lv_coefs[s,  : ], LV[i]);\\n',\n        '}\\n}'\n      )\n    } else {\n      model_file[grep(\n        'matrix[n_series, n_series] A;',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'matrix[n_series, n_series] A;\\n',\n        '// latent trend MA autoregressive terms\\n',\n        'matrix[n_series, n_series] theta;\\n',\n        '// ma process\\n',\n        'array[n] vector[n_series] epsilon;\\n'\n      )\n\n      start <- grep('// raw latent trends', model_file, fixed = TRUE)\n      end <- start + 1\n      model_file <- model_file[-c(start:end)]\n\n      start <- grep(\n        '// trend estimates in matrix-form',\n        model_file,\n        fixed = TRUE\n      )\n      end <- grep('Gamma = phiGamma[2, 1];', model_file, fixed = TRUE) + 1\n      model_file <- model_file[-c(start:end)]\n\n      model_file[grep(\n        'cov_matrix[n_series] Gamma;',\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        'cov_matrix[n_series * 2] Omega;\\n',\n        '// raw latent trends\\n',\n        'vector[n_series] trend_raw[n];\\n',\n        '// trend estimates in matrix-form\\n',\n        'matrix[n, n_series] trend;'\n      )\n\n      model_file[start] <- paste0(\n        model_file[start],\n        '\\n',\n        '// stationary VARMA reparameterisation\\n',\n        'L_Sigma = diag_pre_multiply(sigma, L_Omega);\\n',\n        'Sigma = multiply_lower_tri_self_transpose(L_Sigma);\\n',\n\n        '{\\n',\n        '// constrained partial autocorrelations\\n',\n        'matrix[n_series, n_series] P[1];\\n',\n        'matrix[n_series, n_series] R[1];\\n',\n        '// stationary autoregressive coefficients\\n',\n        'matrix[n_series, n_series] A_init[1];\\n',\n        'matrix[n_series, n_series] theta_init[1];\\n',\n        'P[1] = P_realtoP(P_real);\\n',\n        'R[1] = P_realtoP(R_real);\\n',\n        '// stationary autoregressive and ma coef matrices\\n',\n        'A_init = rev_mapping(P, Sigma);\\n',\n        'theta_init = rev_mapping(R, Sigma);\\n',\n        'theta_init[1] = -theta_init[1];\\n',\n        '// initial stationary covariance structure\\n',\n        'Omega = initial_joint_var(Sigma, A_init, theta_init);\\n',\n        'A = A_init[1];\\n',\n        'theta = theta_init[1];\\n',\n        '}\\n',\n\n        '// computed VARMA trends\\n',\n        'epsilon[1] = theta * init[(n_series + 1) : (n_series * 2)];\\n',\n        'trend_raw[1] = (A * init[1 : n_series]) + epsilon[1] + error[1];\\n',\n        'for (i in 2 : n) {\\n',\n        '// lagged error ma process\\n',\n        'epsilon[i] = theta * error[i - 1];\\n',\n        '// full VARMA process\\n',\n        'trend_raw[i] = (A * trend_raw[i - 1]) + epsilon[i] + error[i];\\n',\n        '}\\n',\n\n        '// computed trends in matrix form\\n',\n        'for (i in 1 : n) {\\n',\n        'trend[i, 1 : n_series] = to_row_vector(trend_raw[i]);\\n',\n        '}'\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Update model\n    if (\n      any(grepl(\n        'cholesky_factor_corr[n_lv] L_Omega;',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      start <- grep('// latent state mean parameters', model_file, fixed = TRUE)\n      end <- start + 1\n      model_file <- model_file[-c(start:end)]\n\n      model_file[grep('// latent state means', model_file, fixed = TRUE)] <-\n        paste0(\n          '// unconstrained ma inverse partial autocorrelations\\n',\n          'diagonal(R_real) ~ std_normal();\\n',\n          'for (i in 1 : n_lv) {\\n',\n          'for (j in 1 : n_lv) {\\n',\n          'if (i != j)\\n',\n          'R_real[i, j] ~ std_normal();\\n',\n          '}\\n',\n          '}\\n',\n\n          '// initial joint stationary distribution\\n',\n          'init ~ multi_normal(init_zeros, Omega);\\n',\n\n          '// correlated contemporaneous errors\\n',\n          'for (i in 1 : n) {\\n',\n          'error[i] ~ multi_normal_cholesky(trend_zeros, L_Sigma);\\n',\n          '}\\n',\n          '// latent state means'\n        )\n      model_file <- readLines(textConnection(model_file), n = -1)\n\n      end <- grep(\n        '(LV[i - 1] - trend_mus[ytimes_trend[i - 1, 1:n_lv]]);',\n        model_file,\n        fixed = TRUE\n      ) +\n        1\n      start <- grep('// latent state means', model_file, fixed = TRUE)\n      model_file <- model_file[-c(start:end)]\n\n      start <- grep(\n        'LV[1] ~ multi_normal(trend_mus[ytimes_trend[1, 1:n_lv]], Gamma);',\n        model_file,\n        fixed = TRUE\n      )\n      end <- max(grep('L_Sigma);', model_file, fixed = TRUE)) + 1\n      model_file <- model_file[-c(start:end)]\n    } else {\n      start <- grep('// latent trend mean parameters', model_file, fixed = TRUE)\n      end <- start + 1\n      model_file <- model_file[-c(start:end)]\n\n      model_file[grep('// trend means', model_file, fixed = TRUE)] <-\n        paste0(\n          '// unconstrained ma inverse partial autocorrelations\\n',\n          'diagonal(R_real) ~ std_normal();\\n',\n          'for (i in 1 : n_series) {\\n',\n          'for (j in 1 : n_series) {\\n',\n          'if (i != j)\\n',\n          'R_real[i, j] ~ std_normal();\\n',\n          '}\\n',\n          '}\\n',\n\n          '// initial joint stationary distribution\\n',\n          'init ~ multi_normal(init_zeros, Omega);\\n',\n\n          '// correlated contemporaneous errors\\n',\n          'for (i in 1 : n) {\\n',\n          'error[i] ~ multi_normal_cholesky(trend_zeros, L_Sigma);\\n',\n          '}\\n',\n          '// trend means'\n        )\n      model_file <- readLines(textConnection(model_file), n = -1)\n\n      start <- grep('// trend means', model_file, fixed = TRUE)\n      end <- max(grep(\n        'trend_raw[i] ~ multi_normal_cholesky(mu[i - 1], L_Sigma);',\n        model_file,\n        fixed = TRUE\n      )) +\n        1\n      model_file <- model_file[-c(start:end)]\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Now do any rearrangements needed for hierarchical correlations\n  if (grepl('hiercor', validate_trend_model(trend_model))) {\n    # Add the function to calculate a convex combination of correlation matrices\n    if (any(grepl('functions {', model_file, fixed = TRUE))) {\n      model_file[grep('functions {', model_file, fixed = TRUE)] <-\n        paste0(\n          'functions {\\n',\n          '/* Function to compute a partially pooled correlation matrix */\\n',\n          '/* https://discourse.mc-stan.org/t/hierarchical-prior-for-partial-pooling-on-correlation-matrices*/\\n',\n          'matrix combine_cholesky(matrix global_chol_cor, matrix local_chol_cor, real alpha){',\n          'int dim = rows(local_chol_cor);\\n',\n          'matrix[dim, dim] global_cor = multiply_lower_tri_self_transpose(global_chol_cor);\\n',\n          'matrix[dim, dim] local_cor = multiply_lower_tri_self_transpose(local_chol_cor);\\n',\n          'matrix[dim, dim] combined_chol_cor;\\n',\n          'combined_chol_cor = cholesky_decompose(alpha * global_cor +\\n',\n          '                                       (1 - alpha) * local_cor);\\n',\n          'return(combined_chol_cor);\\n',\n          '}\\n'\n        )\n    } else {\n      model_file[grep('Stan model code', model_file)] <-\n        paste0(\n          '// Stan model code generated by package mvgam\\n',\n          'functions {\\n',\n          '/* Function to compute a partially pooled correlation matrix */\\n',\n          '/* https://discourse.mc-stan.org/t/hierarchical-prior-for-partial-pooling-on-correlation-matrices*/\\n',\n          'matrix combine_cholesky(matrix global_chol_cor, matrix local_chol_cor, real alpha){',\n          'int dim = rows(local_chol_cor);\\n',\n          'matrix[dim, dim] global_cor = multiply_lower_tri_self_transpose(global_chol_cor);\\n',\n          'matrix[dim, dim] local_cor = multiply_lower_tri_self_transpose(local_chol_cor);\\n',\n          'matrix[dim, dim] combined_chol_cor;\\n',\n          'combined_chol_cor = cholesky_decompose(alpha * global_cor +\\n',\n          '                                       (1 - alpha) * local_cor);\\n',\n          'return(combined_chol_cor);\\n',\n          '}\\n}\\n'\n        )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Add group information to data block\n    model_file[grep('int<lower=0> n_series;', model_file, fixed = TRUE)] <-\n      paste0(\n        \"int<lower=0> n_groups; // number of groups (correlations apply within grouping levels)\\n\",\n        \"int<lower=0> n_subgroups; // number of subgroups (units whose errors will be correlated)\\n\",\n        \"int<lower=0> n_series; // total number of unique series (n_groups * n_subgroups)\\n\",\n        \"array[n_groups, n_subgroups] int<lower=1> group_inds; // indices of group membership\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    #### Changes for VAR models ####\n    if (grepl('VAR', trend_char)) {\n      if (\n        any(grepl(\n          \"cholesky_factor_corr[n_lv] L_Omega;\",\n          model_file,\n          fixed = TRUE\n        ))\n      ) {\n        use_lv <- TRUE\n      } else {\n        use_lv <- FALSE\n      }\n      #### Parameters ####\n      # Need arrays of cholesky factors and partial autocorrelation matrices\n      if (use_lv) {\n        # Changes for State-Space models\n        model_file[grep(\n          \"cholesky_factor_corr[n_lv] L_Omega;\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'cholesky_factor_corr[n_subgroups] L_Omega_global;\\n',\n            'array[n_groups] cholesky_factor_corr[n_subgroups] L_deviation_group;\\n',\n            'real<lower=0,upper=1> alpha_cor;'\n          )\n        model_file[grep(\n          \"matrix[n_lv, n_lv] P_real;\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'array[n_groups] matrix[n_subgroups, n_subgroups] P_real_group;'\n          )\n      } else {\n        # Changes for non State-Space models\n        model_file[grep(\n          \"cholesky_factor_corr[n_series] L_Omega;\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'cholesky_factor_corr[n_subgroups] L_Omega_global;\\n',\n            'array[n_groups] cholesky_factor_corr[n_subgroups] L_deviation_group;\\n',\n            'real<lower=0,upper=1> alpha_cor;'\n          )\n        model_file[grep(\n          \"matrix[n_series, n_series] P_real;\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'array[n_groups] matrix[n_subgroups, n_subgroups] P_real_group;'\n          )\n      }\n      model_file <- readLines(textConnection(model_file), n = -1)\n\n      #### Transformed parameters ####\n      # Need arrays of autocorrelation matrices, Gamma and Sigma matrices\n      if (use_lv) {\n        # Changes for State-Space models\n        model_file[grep(\"matrix[n_lv, n_lv] A;\", model_file, fixed = TRUE)] <-\n          paste0(\n            'array[n_groups] matrix[n_subgroups, n_subgroups] A_group;\\n',\n            'matrix[n_lv, n_lv] A;'\n          )\n        model_file[grep(\"cov_matrix[n_lv] Sigma;\", model_file, fixed = TRUE)] <-\n          paste0(\n            'array[n_groups] cov_matrix[n_subgroups] Sigma_group;\\n',\n            \"matrix[n_lv, n_lv] Sigma;\"\n          )\n        model_file[grep(\"cov_matrix[n_lv] Gamma;\", model_file, fixed = TRUE)] <-\n          paste0(\n            'array[n_groups] cov_matrix[n_subgroups] Gamma_group;\\n',\n            \"matrix[n_lv, n_lv] Gamma;\"\n          )\n        model_file <- model_file[\n          -grep(\n            'Sigma = multiply_lower_tri_self_transpose(L_Sigma);',\n            model_file,\n            fixed = TRUE\n          )\n        ]\n        model_file[grep(\n          \"L_Sigma = diag_pre_multiply(sigma, L_Omega);\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// derived group-level VAR covariance matrices\\n',\n            'array[n_groups] cholesky_factor_corr[n_subgroups] L_Omega_group;\\n',\n            'array[n_groups] matrix[n_subgroups, n_subgroups] L_Sigma_group;\\n',\n            'for (g in 1 : n_groups){\\n',\n            'L_Omega_group[g] = combine_cholesky(L_Omega_global, L_deviation_group[g], alpha_cor);\\n',\n            'L_Sigma_group[g] = diag_pre_multiply(sigma[group_inds[g]], L_Omega_group[g]);\\n',\n            'Sigma_group[g] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n            '}\\n'\n          )\n        starts <- grep(\n          \"// stationary VAR reparameterisation\",\n          model_file,\n          fixed = TRUE\n        ) +\n          1\n        ends <- grep(\n          \"// stationary VAR reparameterisation\",\n          model_file,\n          fixed = TRUE\n        ) +\n          8\n        model_file <- model_file[-(starts:ends)]\n        model_file[grep(\n          \"// stationary VAR reparameterisation\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// stationary VAR reparameterisation\\n',\n            '{\\n',\n            \"array[1] matrix[n_subgroups, n_subgroups] P;\\n\",\n            \"array[2, 1] matrix[n_subgroups, n_subgroups] phiGamma;\\n\",\n            'for (g in 1 : n_groups){\\n',\n            \"P[1] = P_realtoP(P_real_group[g]);\\n\",\n            \"phiGamma = rev_mapping(P, Sigma_group[g]);\\n\",\n            \"A_group[g] = phiGamma[1, 1];\\n\",\n            \"Gamma_group[g] = phiGamma[2, 1];\\n\",\n            \"}\\n\\n\",\n            \"// computed (full) VAR matrices\\n\",\n            'Sigma = rep_matrix(0, n_lv, n_lv);\\n',\n            'Gamma = rep_matrix(0, n_lv, n_lv);\\n',\n            'A = rep_matrix(0, n_lv, n_lv);\\n',\n            'for (g in 1 : n_groups){\\n',\n            'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n            'Gamma[group_inds[g], group_inds[g]] = Gamma_group[g];\\n',\n            'A[group_inds[g], group_inds[g]] = A_group[g];\\n',\n            '}\\n',\n            'L_Sigma = cholesky_decompose(Sigma);\\n',\n            \"}\\n\\n\"\n          )\n      } else {\n        # Changes for non State-Space models\n        model_file[grep(\n          \"matrix[n_series, n_series] A;\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'array[n_groups] matrix[n_subgroups, n_subgroups] A_group;\\n',\n            'matrix[n_series, n_series] A;'\n          )\n        model_file[grep(\n          \"cov_matrix[n_series] Sigma;\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'array[n_groups] cov_matrix[n_subgroups] Sigma_group;\\n',\n            \"matrix[n_series, n_series] Sigma;\"\n          )\n        model_file[grep(\n          \"cov_matrix[n_series] Gamma;\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            'array[n_groups] cov_matrix[n_subgroups] Gamma_group;\\n',\n            'matrix[n_series, n_series] Gamma;'\n          )\n        model_file <- model_file[\n          -grep(\n            'Sigma = multiply_lower_tri_self_transpose(L_Sigma);',\n            model_file,\n            fixed = TRUE\n          )\n        ]\n        model_file[grep(\n          \"L_Sigma = diag_pre_multiply(sigma, L_Omega);\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// derived group-level VAR covariance matrices\\n',\n            'array[n_groups] cholesky_factor_corr[n_subgroups] L_Omega_group;\\n',\n            'array[n_groups] matrix[n_subgroups, n_subgroups] L_Sigma_group;\\n',\n            'for (g in 1 : n_groups){\\n',\n            'L_Omega_group[g] = combine_cholesky(L_Omega_global, L_deviation_group[g], alpha_cor);\\n',\n            'L_Sigma_group[g] = diag_pre_multiply(sigma[group_inds[g]], L_Omega_group[g]);\\n',\n            'Sigma_group[g] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n            '}\\n'\n          )\n        starts <- grep(\n          \"// stationary VAR reparameterisation\",\n          model_file,\n          fixed = TRUE\n        ) +\n          1\n        ends <- grep(\n          \"// stationary VAR reparameterisation\",\n          model_file,\n          fixed = TRUE\n        ) +\n          8\n        model_file <- model_file[-(starts:ends)]\n        model_file[grep(\n          \"// stationary VAR reparameterisation\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// stationary VAR reparameterisation\\n',\n            '{\\n',\n            \"array[1] matrix[n_subgroups, n_subgroups] P;\\n\",\n            \"array[2, 1] matrix[n_subgroups, n_subgroups] phiGamma;\\n\",\n            'for (g in 1 : n_groups){\\n',\n            \"P[1] = P_realtoP(P_real_group[g]);\\n\",\n            \"phiGamma = rev_mapping(P, Sigma_group[g]);\\n\",\n            \"A_group[g] = phiGamma[1, 1];\\n\",\n            \"Gamma_group[g] = phiGamma[2, 1];\\n\",\n            \"}\\n\\n\",\n            \"// computed (full) VAR matrices\\n\",\n            'Sigma = rep_matrix(0, n_series, n_series);\\n',\n            'Gamma = rep_matrix(0, n_series, n_series);\\n',\n            'A = rep_matrix(0, n_series, n_series);\\n',\n            'for (g in 1 : n_groups){\\n',\n            'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n            'A[group_inds[g], group_inds[g]] = A_group[g];\\n',\n            'Gamma[group_inds[g], group_inds[g]] = Gamma_group[g];\\n',\n            '}\\n',\n            'L_Sigma = cholesky_decompose(Sigma);\\n',\n            \"}\\n\\n\"\n          )\n      }\n      model_file <- readLines(textConnection(model_file), n = -1)\n\n      #### Model ####\n      model_file[grep(\n        \"L_Omega ~ lkj_corr_cholesky(2);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          'alpha_cor ~ beta(3, 2);\\n',\n          'L_Omega_global ~ lkj_corr_cholesky(1);\\n',\n          'for (g in 1 : n_groups){\\n',\n          'L_deviation_group[g] ~ lkj_corr_cholesky(6);\\n',\n          '}'\n        )\n      starts <- grep(\n        \"// unconstrained partial autocorrelations\",\n        model_file,\n        fixed = TRUE\n      ) +\n        1\n      ends <- grep(\n        \"// unconstrained partial autocorrelations\",\n        model_file,\n        fixed = TRUE\n      ) +\n        6\n      model_file <- model_file[-(starts:ends)]\n      model_file[grep(\n        \"// unconstrained partial autocorrelations\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          'for (g in 1 : n_groups){\\n',\n          'diagonal(P_real_group[g]) ~ normal(Pmu[1], 1 / sqrt(Pomega[1]));\\n',\n          'for (i in 1:n_subgroups) {\\n',\n          'for (j in 1:n_subgroups) {\\n',\n          'if(i != j) P_real_group[g, i, j] ~ normal(Pmu[2], 1 / sqrt(Pomega[2]));\\n',\n          '}\\n}\\n}'\n        )\n      model_file <- readLines(textConnection(model_file), n = -1)\n    } else {\n      if (grepl('ZMVN', trend_char)) {\n        #### Zero-mean multinormals ####\n        if (\n          any(grepl(\n            \"matrix[n_series, n_lv] lv_coefs;\",\n            model_file,\n            fixed = TRUE\n          ))\n        ) {\n          use_lv <- TRUE\n        } else {\n          use_lv <- FALSE\n        }\n\n        #### Transformed data ####\n        if (use_lv) {\n          if (any(grepl('transformed data {', model_file, fixed = TRUE))) {\n            model_file[grep('transformed data {', model_file, fixed = TRUE)] <-\n              paste0(\n                'transformed data {\\n',\n                'vector[n_subgroups] trend_zeros = rep_vector(0.0, n_subgroups);'\n              )\n          } else {\n            model_file[grep('parameters {', model_file, fixed = TRUE)[1]] <-\n              paste0(\n                'transformed data {\\n',\n                'vector[n_subgroups] trend_zeros = rep_vector(0.0, n_subgroups);\\n',\n                '}\\nparameters {'\n              )\n          }\n        } else {\n          model_file[grep(\n            \"vector[n_series] trend_zeros = rep_vector(0.0, n_series);\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              'vector[n_subgroups] trend_zeros = rep_vector(0.0, n_subgroups);'\n            )\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Parameters ####\n        if (use_lv) {\n          model_file <- model_file[\n            -grep(\n              'cholesky_factor_corr[n_lv] L_Omega;',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep(\"// correlated latent residuals\", model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep(\"array[n] vector[n_lv] LV_raw;\", model_file, fixed = TRUE)\n          ]\n          model_file[grep(\"[n_lv] sigma;\", model_file, fixed = TRUE)] <-\n            paste0(\n              model_file[grep(\"[n_lv] sigma;\", model_file, fixed = TRUE)],\n              '\\n',\n              '\\n\\n',\n              '// correlation params and correlated errors per group\\n',\n              'cholesky_factor_corr[n_subgroups] L_Omega_global;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_deviation_group;\\n',\n              'real<lower=0,upper=1> alpha_cor;\\n',\n              'array[n] matrix[n_groups, n_subgroups] sub_error;'\n            )\n        } else {\n          model_file <- model_file[\n            -grep(\n              'cholesky_factor_corr[n_series] L_Omega;',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep(\"// correlated latent residuals\", model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep(\n              \"array[n] vector[n_series] trend_raw;\",\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file[grep(\n            \"vector<lower=0>[n_series] sigma;\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              'vector<lower=0>[n_series] sigma;\\n',\n              '\\n\\n',\n              '// correlation params and correlated errors per group\\n',\n              'cholesky_factor_corr[n_subgroups] L_Omega_global;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_deviation_group;\\n',\n              'real<lower=0,upper=1> alpha_cor;\\n',\n              'array[n] matrix[n_groups, n_subgroups] sub_error;'\n            )\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Transformed parameters ####\n        if (use_lv) {\n          model_file <- model_file[\n            -grep('matrix[n_lv, n_lv] L_Sigma;', model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep(\n              'L_Sigma = diag_pre_multiply(sigma, L_Omega);',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file[grep(\n            \"// LKJ form of covariance matrix\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// reconstructed correlated errors\\n',\n              'array[n] vector[n_lv] error;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_Omega_group;\\n',\n              '\\n',\n              '// LKJ forms of covariance matrices\\n',\n              'array[n_groups] matrix[n_subgroups, n_subgroups] L_Sigma_group;'\n            )\n          model_file[grep(\n            \"// correlated residuals\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// derived error correlation and covariance matrices\\n',\n              'for (g in 1 : n_groups){\\n',\n              'L_Omega_group[g] = combine_cholesky(L_Omega_global, L_deviation_group[g], alpha_cor);\\n',\n              'L_Sigma_group[g] = diag_pre_multiply(sigma[group_inds[g]], L_Omega_group[g]);\\n',\n              '}\\n',\n\n              '// derived correlated errors\\n',\n              'for (i in 1 : n){\\n',\n              \"error[i] = to_vector(sub_error[i]');\\n\",\n              '}\\n'\n            )\n          model_file[grep(\n            \"LV[i, 1:n_lv] = to_row_vector(LV_raw[i]);\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            \"LV[i, 1:n_lv] = to_row_vector(error[i]);\"\n        } else {\n          model_file <- model_file[\n            -grep(\n              'matrix[n_series, n_series] L_Sigma;',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep(\n              'L_Sigma = diag_pre_multiply(sigma, L_Omega);',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file[grep(\n            \"// LKJ form of covariance matrix\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// reconstructed correlated errors\\n',\n              'array[n] vector[n_series] error;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_Omega_group;\\n',\n              '\\n',\n              '// LKJ forms of covariance matrices\\n',\n              'array[n_groups] matrix[n_subgroups, n_subgroups] L_Sigma_group;'\n            )\n          model_file[grep(\n            \"// correlated residuals\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// derived error correlation and covariance matrices\\n',\n              'for (g in 1 : n_groups){\\n',\n              'L_Omega_group[g] = combine_cholesky(L_Omega_global, L_deviation_group[g], alpha_cor);\\n',\n              'L_Sigma_group[g] = diag_pre_multiply(sigma[group_inds[g]], L_Omega_group[g]);\\n',\n              '}\\n',\n\n              '// derived correlated errors\\n',\n              'for (i in 1 : n){\\n',\n              \"error[i] = to_vector(sub_error[i]');\\n\",\n              '}\\n'\n            )\n          model_file[grep(\n            \"trend[i, 1:n_series] = to_row_vector(trend_raw[i]);\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            \"trend[i, 1:n_series] = to_row_vector(error[i]);\"\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Model ####\n        starts <- grep(\n          \"// residual error correlations\",\n          model_file,\n          fixed = TRUE\n        ) +\n          1\n        ends <- grep(\n          \"// residual error correlations\",\n          model_file,\n          fixed = TRUE\n        ) +\n          4\n        model_file <- model_file[-(starts:ends)]\n        model_file[grep(\n          \"// residual error correlations\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// hierarchical latent error correlations\\n',\n            'alpha_cor ~ beta(3, 2);\\n',\n            'L_Omega_global ~ lkj_corr_cholesky(1);\\n',\n            'for (g in 1 : n_groups){\\n',\n            'L_deviation_group[g] ~ lkj_corr_cholesky(6);\\n',\n            '}\\n',\n            '\\n',\n            '// contemporaneous errors\\n',\n            'for (i in 1 : n) {\\n',\n            'for (g in 1 : n_groups){\\n',\n            'to_vector(sub_error[i, g]) ~ multi_normal_cholesky(trend_zeros, L_Sigma_group[g]);\\n',\n            '}\\n',\n            '}'\n          )\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Generated quantities ####\n        if (use_lv) {\n          model_file <- model_file[\n            -grep(\n              \"cov_matrix[n_lv] Sigma = multiply_lower_tri_self_transpose(L_Sigma);\",\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file[grep(\n            \"// computed error covariance matrix\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// computed (full) error covariance matrix\\n',\n              'matrix[n_lv, n_lv]  Sigma;\\n',\n              'Sigma = rep_matrix(0, n_lv, n_lv);\\n',\n              'for (g in 1 : n_groups){\\n',\n              'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n              '}'\n            )\n        } else {\n          model_file <- model_file[\n            -grep(\n              \"cov_matrix[n_series] Sigma = multiply_lower_tri_self_transpose(L_Sigma);\",\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file[grep(\n            \"// computed error covariance matrix\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// computed (full) error covariance matrix\\n',\n              'matrix[n_series, n_series]  Sigma;\\n',\n              'Sigma = rep_matrix(0, n_series, n_series);\\n',\n              'for (g in 1 : n_groups){\\n',\n              'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n              '}'\n            )\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n      } else {\n        #### Random walk and AR models ####\n        if (any(grepl(\"vector[n_lv] trend_zeros\", model_file, fixed = TRUE))) {\n          use_lv <- TRUE\n        } else {\n          use_lv <- FALSE\n        }\n\n        #### Transformed data ####\n        if (use_lv) {\n          model_file[grep(\n            \"vector[n_lv] trend_zeros = rep_vector(0.0, n_lv);\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              'vector[n_subgroups] trend_zeros = rep_vector(0.0, n_subgroups);'\n            )\n        } else {\n          model_file[grep(\n            \"vector[n_series] trend_zeros = rep_vector(0.0, n_series);\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              'vector[n_subgroups] trend_zeros = rep_vector(0.0, n_subgroups);'\n            )\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Parameters ####\n        if (use_lv) {\n          model_file <- model_file[\n            -grep(\n              'cholesky_factor_corr[n_lv] L_Omega;',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep('// dynamic error parameters', model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep(\"vector[n_lv] error[n];\", model_file, fixed = TRUE)\n          ]\n          model_file[grep(\"[n_lv] sigma;\", model_file, fixed = TRUE)] <-\n            paste0(\n              model_file[grep(\"[n_lv] sigma;\", model_file, fixed = TRUE)],\n              '\\n',\n              '\\n\\n',\n              '// correlation params and dynamic error parameters per group\\n',\n              'cholesky_factor_corr[n_subgroups] L_Omega_global;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_deviation_group;\\n',\n              'real<lower=0,upper=1> alpha_cor;\\n',\n              'array[n] matrix[n_groups, n_subgroups] sub_error;'\n            )\n        } else {\n          model_file <- model_file[\n            -grep(\n              'cholesky_factor_corr[n_series] L_Omega;',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep('// dynamic error parameters', model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep(\"vector[n_series] error[n];\", model_file, fixed = TRUE)\n          ]\n          model_file[grep(\n            \"vector<lower=0>[n_series] sigma;\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              'vector<lower=0>[n_series] sigma;\\n',\n              '\\n\\n',\n              '// correlation params and dynamic error parameters per group\\n',\n              'cholesky_factor_corr[n_subgroups] L_Omega_global;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_deviation_group;\\n',\n              'real<lower=0,upper=1> alpha_cor;\\n',\n              'array[n] matrix[n_groups, n_subgroups] sub_error;'\n            )\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Transformed parameters ####\n        if (use_lv) {\n          model_file <- model_file[\n            -grep(\n              '// computed error covariance matrix',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep('cov_matrix[n_lv] Sigma;', model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep('matrix[n_lv, n_lv] L_Sigma;', model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep(\n              'L_Sigma = diag_pre_multiply(sigma, L_Omega);',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep(\n              'Sigma = multiply_lower_tri_self_transpose(L_Sigma);',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file[grep(\n            \"// LKJ form of covariance matrix\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// reconstructed correlated errors\\n',\n              'array[n] vector[n_lv] error;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_Omega_group;\\n',\n              '\\n',\n              '// LKJ forms of covariance matrices\\n',\n              'array[n_groups] matrix[n_subgroups, n_subgroups] L_Sigma_group;'\n            )\n          model_file[grep(\n            \"// derived latent states\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// derived error correlation and covariance matrices\\n',\n              'for (g in 1 : n_groups){\\n',\n              'L_Omega_group[g] = combine_cholesky(L_Omega_global, L_deviation_group[g], alpha_cor);\\n',\n              'L_Sigma_group[g] = diag_pre_multiply(sigma[group_inds[g]], L_Omega_group[g]);\\n',\n              '}\\n',\n\n              '// derived correlated errors\\n',\n              'for (i in 1 : n){\\n',\n              \"error[i] = to_vector(sub_error[i]');\\n\",\n              '}\\n',\n              '// derived latent states'\n            )\n        } else {\n          model_file <- model_file[\n            -grep(\n              '// computed error covariance matrix',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep('cov_matrix[n_series] Sigma;', model_file, fixed = TRUE)\n          ]\n          model_file <- model_file[\n            -grep(\n              'matrix[n_series, n_series] L_Sigma;',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep(\n              'L_Sigma = diag_pre_multiply(sigma, L_Omega);',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file <- model_file[\n            -grep(\n              'Sigma = multiply_lower_tri_self_transpose(L_Sigma);',\n              model_file,\n              fixed = TRUE\n            )\n          ]\n          model_file[grep(\n            \"// LKJ form of covariance matrix\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// reconstructed correlated errors\\n',\n              'array[n] vector[n_series] error;\\n',\n              'array[n_groups] cholesky_factor_corr[n_subgroups] L_Omega_group;\\n',\n              '\\n',\n              '// LKJ forms of covariance matrices\\n',\n              'array[n_groups] matrix[n_subgroups, n_subgroups] L_Sigma_group;'\n            )\n          model_file[grep(\n            \"// derived latent states\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// derived error correlation and covariance matrices\\n',\n              'for (g in 1 : n_groups){\\n',\n              'L_Omega_group[g] = combine_cholesky(L_Omega_global, L_deviation_group[g], alpha_cor);\\n',\n              'L_Sigma_group[g] = diag_pre_multiply(sigma[group_inds[g]], L_Omega_group[g]);\\n',\n              '}\\n',\n\n              '// derived correlated errors\\n',\n              'for (i in 1 : n){\\n',\n              \"error[i] = to_vector(sub_error[i]');\\n\",\n              '}\\n',\n              '// derived latent states'\n            )\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Model ####\n        starts <- grep(\"// contemporaneous errors\", model_file, fixed = TRUE) +\n          1\n        ends <- grep(\"// contemporaneous errors\", model_file, fixed = TRUE) + 4\n        model_file <- model_file[-(starts:ends)]\n        model_file[grep(\n          \"// contemporaneous errors\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// hierarchical process error correlations\\n',\n            'alpha_cor ~ beta(3, 2);\\n',\n            'L_Omega_global ~ lkj_corr_cholesky(1);\\n',\n            'for (g in 1 : n_groups){\\n',\n            'L_deviation_group[g] ~ lkj_corr_cholesky(6);\\n',\n            '}\\n',\n            '\\n',\n            '// contemporaneous errors\\n',\n            'for (i in 1 : n) {\\n',\n            'for (g in 1 : n_groups){\\n',\n            'to_vector(sub_error[i, g]) ~ multi_normal_cholesky(trend_zeros, L_Sigma_group[g]);\\n',\n            '}\\n',\n            '}'\n          )\n        model_file <- readLines(textConnection(model_file), n = -1)\n\n        #### Generated quantities ####\n        if (use_lv) {\n          model_file[grep(\n            \"// posterior predictions\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// computed (full) error covariance matrix\\n',\n              'matrix[n_lv, n_lv] Sigma;\\n',\n              'Sigma = rep_matrix(0, n_lv, n_lv);\\n',\n              'for (g in 1 : n_groups){\\n',\n              'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n              '}\\n',\n              '\\n',\n              '// posterior predictions'\n            )\n        } else {\n          model_file[grep(\n            \"// posterior predictions\",\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              '// computed (full) error covariance matrix\\n',\n              'matrix[n_series, n_series] Sigma;\\n',\n              'Sigma = rep_matrix(0, n_series, n_series);\\n',\n              'for (g in 1 : n_groups){\\n',\n              'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);\\n',\n              '}\\n',\n              '\\n',\n              '// posterior predictions'\n            )\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n      }\n    }\n\n    #### Add grouping information to model_data ####\n    model_data$group_inds <- matrix(\n      1:nlevels(data_train$series),\n      nrow = nlevels(data_train[[trend_model$gr]]),\n      ncol = nlevels(data_train[[trend_model$subgr]]),\n      byrow = TRUE\n    )\n    model_data$n_groups <- nlevels(data_train[[trend_model$gr]])\n    model_data$n_subgroups <- nlevels(data_train[[trend_model$subgr]])\n  }\n  return(list(model_file = model_file, model_data = model_data))\n}\n"
  },
  {
    "path": "R/add_base_dgam_lines.R",
    "content": "#' Dynamic GAM model file additions\n#'\n#' @noRd\n#'\n#' @param use_lv Logical (use latent variables or not?)\n#'\n#' @param stan Logical (convert existing model to a Stan model?)\n#'\n#' @param offset Logical (include an offset in the linear predictor?)\n#'\n#' @return A character string to add to the mgcv jagam model file\nadd_base_dgam_lines <- function(use_lv, stan = FALSE, offset = FALSE) {\n  if (stan) {\n    if (use_lv) {\n      add <- \"\n    ##insert data\n    transformed data {\n    // Number of non-zero lower triangular factor loadings\n    // Ensures identifiability of the model - no rotation of factors\n    int<lower=1> M;\n    M = n_lv * (n_series - n_lv) + n_lv * (n_lv - 1) / 2 + n_lv;\n    }\n\n    parameters {\n    // raw basis coefficients\n    row_vector[num_basis] b_raw;\n\n    // dynamic factors\n    matrix[n, n_lv] LV_raw;\n\n    // dynamic factor lower triangle loading coefficients\n    vector[M] L;\n\n    // smoothing parameters\n    vector<lower=0>[n_sp] lambda;\n    }\n\n    transformed parameters {\n    // GAM contribution to expectations (log scale)\n    vector[total_obs] eta;\n\n    // trends and dynamic factor loading matrix\n    matrix[n, n_series] trend;\n    matrix[n_series, n_lv] lv_coefs_raw;\n\n    // basis coefficients\n    row_vector[num_basis] b;\n\n    // constraints allow identifiability of loadings\n    for (i in 1:(n_lv - 1)) {\n    for (j in (i + 1):(n_lv)){\n    lv_coefs_raw[i, j] = 0;\n    }\n    }\n    {\n    int index;\n    index = 0;\n    for (j in 1:n_lv) {\n      for (i in j:n_series) {\n        index = index + 1;\n        lv_coefs_raw[i, j] = L[index];\n      }\n    }\n    }\n\n    // derived latent trends\n    for (i in 1:n){\n    for (s in 1:n_series){\n    trend[i, s] = dot_product(lv_coefs_raw[s,], LV_raw[i,]);\n    }\n    }\n\n    eta = to_vector(b * X);\n    }\n\n    model {\n    ##insert smooths\n\n    // priors for smoothing parameters\n    lambda ~ normal(5, 30);\n\n    // priors for dynamic factor loading coefficients\n    L ~ student_t(5, 0, 1);\n\n    // dynamic factor estimates\n    for (j in 1:n_lv) {\n    LV_raw[1, j] ~ normal(0, 0.1);\n    }\n\n    for (j in 1:n_lv) {\n    LV_raw[2:n, j] ~ normal(LV_raw[1:(n - 1), j], 0.1);\n    }\n\n    // likelihood functions\n    for (i in 1:n) {\n    for (s in 1:n_series) {\n    if (y_observed[i, s])\n    y[i, s] ~ poisson_log(eta[ytimes[i, s]] + trend[i, s]);\n    }\n    }\n    }\n\n    generated quantities {\n    matrix[n, n_lv] LV;\n    matrix[n_series, n_lv] lv_coefs;\n    vector[n_sp] rho;\n    vector[n_lv] penalty;\n    matrix[n, n_series] ypred;\n    rho = log(lambda);\n    penalty = rep_vector(100.0, n_lv);\n\n    // Sign correct factor loadings and factors\n    for(j in 1:n_lv){\n    if(lv_coefs_raw[j, j] < 0){\n      lv_coefs[,j] = -1 * lv_coefs_raw[,j];\n      LV[,j] = -1 * LV_raw[,j];\n    } else {\n      lv_coefs[,j] = lv_coefs_raw[,j];\n      LV[,j] = LV_raw[,j];\n    }\n    }\n\n    // posterior predictions\n    for(i in 1:n){\n    for(s in 1:n_series){\n    ypred[i, s] = poisson_log_rng(eta[ytimes[i, s]] + trend[i, s]);\n    }\n    }\n    }\n    \"\n    } else {\n      add <- \"\n    ##insert data\n    parameters {\n    // raw basis coefficients\n    row_vector[num_basis] b_raw;\n\n    // latent trend variance parameters\n    vector<lower=0>[n_series] sigma;\n\n    // latent trends\n    matrix[n, n_series] trend;\n\n    // smoothing parameters\n    vector<lower=0>[n_sp] lambda;\n    }\n\n    transformed parameters {\n    // GAM contribution to expectations (log scale)\n    vector[total_obs] eta;\n\n    // basis coefficients\n    row_vector[num_basis] b;\n\n    eta = to_vector(b * X);\n    }\n\n    model {\n    ##insert smooths\n\n    // priors for smoothing parameters\n    lambda ~ normal(5, 30);\n\n    // priors for latent trend variance parameters\n    sigma ~ exponential(2);\n\n    // trend estimates\n    for (s in 1:n_series) {\n    trend[1, s] ~ normal(0, sigma[s]);\n    }\n\n    for (s in 1:n_series) {\n    trend[2:n, s] ~ normal(trend[1:(n - 1), s], sigma[s]);\n    }\n\n    // likelihood functions\n    for (i in 1:n) {\n    for (s in 1:n_series) {\n    if (y_observed[i, s])\n    y[i, s] ~ poisson_log(eta[ytimes[i, s]] + trend[i, s]);\n    }\n    }\n    }\n\n    generated quantities {\n    vector[n_sp] rho;\n    vector[n_series] tau;\n    matrix[n, n_series] ypred;\n    rho = log(lambda);\n    for (s in 1:n_series) {\n    tau[s] = pow(sigma[s], -2.0);\n    }\n\n    // posterior predictions\n    for(i in 1:n){\n    for(s in 1:n_series){\n    ypred[i, s] = poisson_log_rng(eta[ytimes[i, s]] + trend[i, s]);\n    }\n    }\n    }\n    \"\n    }\n  } else {\n    if (use_lv) {\n      add <- c(\n        \"\n               #### Begin model ####\n               model {\n\n               ## GAM linear predictor\n               eta <- X %*% b\n\n               ## mean expectations\n               for (i in 1:n) {\n               for (s in 1:n_series) {\n               mus[i, s] <- exp(eta[ytimes[i, s]] + trend[i, s])\n               }\n               }\n\n               ## latent factors evolve as time series with penalised precisions;\n               ## the penalty terms force any un-needed factors to evolve as flat lines\n               for (j in 1:n_lv) {\n               LV_raw[1, j] ~ dnorm(0, penalty[j])\n               }\n\n               for (j in 1:n_lv) {\n               LV_raw[2, j] ~ dnorm(drift[j] + ar1[j]*LV_raw[1, j], penalty[j])\n               }\n\n               for (j in 1:n_lv) {\n               LV_raw[3, j] ~ dnorm(drift[j]*2 + ar1[j]*LV_raw[2, j] + ar2[j]*LV_raw[1, j], penalty[j])\n               }\n\n               for (i in 4:n) {\n               for (j in 1:n_lv) {\n               LV_raw[i, j] ~ dnorm(drift[j]*(i - 1) + ar1[j]*LV_raw[i - 1, j] +\n               ar2[j]*LV_raw[i - 2, j] + ar3[j]*LV_raw[i - 3, j], penalty[j])\n               }\n               }\n\n               ## AR components\n               for (s in 1:n_lv) {\n               drift[s] ~ dnorm(0, 10)\n               ar1[s] ~ dnorm(0, 10)\n               ar2[s] ~ dnorm(0, 10)\n               ar3[s] ~ dnorm(0, 10)\n               }\n\n               ## shrinkage penalties for each factor's precision parameter act to squeeze\n               ## the entire factor toward a flat white noise process if supported by\n               ## the data. The prior for individual factor penalties allows each factor to possibly\n               ## have a relatively large penalty, which shrinks the prior for that factor's variance\n               ## substantially. Penalties increase exponentially with the number of factors following\n               ## Welty, Leah J., et al. Bayesian distributed lag models: estimating effects of particulate\n               ## matter air pollution on daily mortality Biometrics 65.1 (2009): 282-291.\n               pi ~ dunif(0, n_lv)\n               X2 ~ dnorm(0, 1)T(0, )\n\n               # eta1 controls the baseline penalty\n               eta1 ~ dunif(-1, 1)\n\n               # eta2 controls how quickly the penalties exponentially increase\n               eta2 ~ dunif(-1, 1)\n\n               for (t in 1:n_lv) {\n               X1[t] ~ dnorm(0, 1)T(0, )\n               l.dist[t] <- max(t, pi[])\n               l.weight[t] <- exp(eta2[] * l.dist[t])\n               l.var[t] <- exp(eta1[] * l.dist[t] / 2) * 1\n               theta.prime[t] <- l.weight[t] * X1[t] + (1 - l.weight[t]) * X2[]\n               penalty[t] <- max(0.0001, theta.prime[t] * l.var[t])\n               }\n\n               ## latent factor loadings: standard normal with identifiability constraints\n               ## upper triangle of loading matrix set to zero\n               for (j in 1:(n_lv - 1)) {\n               for (j2 in (j + 1):n_lv) {\n               lv_coefs_raw[j, j2] <- 0\n               }\n               }\n\n               ## positive constraints on loading diagonals\n               for (j in 1:n_lv) {\n               lv_coefs_raw[j, j] ~ dnorm(0, 1)T(0, 1);\n               }\n\n               ## lower diagonal free\n               for (j in 2:n_lv) {\n               for (j2 in 1:(j - 1)) {\n               lv_coefs_raw[j, j2] ~ dnorm(0, 1)T(-1, 1);\n               }\n               }\n\n               ## other elements also free\n               for (j in (n_lv + 1):n_series) {\n               for (j2 in 1:n_lv) {\n               lv_coefs_raw[j, j2] ~ dnorm(0, 1)T(-1, 1);\n               }\n               }\n\n               ## trend evolution depends on latent factors\n               for (i in 1:n) {\n               for (s in 1:n_series) {\n               trend[i, s] <- inprod(lv_coefs_raw[s,], LV_raw[i,])\n               }\n               }\n\n               # sign-correct factor loadings and coefficients\n               for (j in 1:n_lv){\n                if(lv_coefs[j,j] < 0){\n                 lv_coefs[,j] <- -1 * lv_coefs_raw[,j]\n                 LV[,j] <- -1 * LV_raw[,j]\n                } else {\n                 lv_coefs[,j] <- lv_coefs_raw[,j]\n                 LV[,j] <- LV_raw[,j]\n                }\n               }\n\n               ## likelihood functions\n               for (i in 1:n) {\n               for (s in 1:n_series) {\n               y[i, s] ~ dnegbin(rate[i, s], phi[s])T(, upper_bound[s]);\n               rate[i, s] <- ifelse((phi[s] / (phi[s] + mus[i, s])) < min_eps, min_eps,\n               (phi[s] / (phi[s] + mus[i, s])))\n               }\n               }\n\n               ## complexity penalising prior for the overdispersion parameter;\n               ## where the likelihood reduces to a 'base' model (Poisson) unless\n               ## the data support overdispersion\n               for (s in 1:n_series) {\n               phi[s] <- 1 / phi_inv[s]\n               phi_inv[s] ~ dexp(5)\n               }\n\n               ## posterior predictions\n               for (i in 1:n) {\n               for (s in 1:n_series) {\n               ypred[i, s] ~ dnegbin(rate[i, s], phi[s])T(, upper_bound[s])\n               }\n               }\n\n               ## GAM-specific priors\"\n      )\n    } else {\n      add <- c(\n        \"\n                          #### Begin model ####\n                          model {\n\n                          ## GAM linear predictor\n                          eta <- X %*% b\n\n                          ## mean expectations\n                          for (i in 1:n) {\n                          for (s in 1:n_series) {\n                          mus[i, s] <- exp(eta[ytimes[i, s]] + trend[i, s])\n                          }\n                          }\n\n                          ## trend estimates\n                          for (s in 1:n_series) {\n                          trend[1, s] ~ dnorm(0, tau[s])\n                          }\n\n                          for (s in 1:n_series) {\n                          trend[2, s] ~ dnorm(drift[s] + ar1[s]*trend[1, s], tau[s])\n                          }\n\n                          for (s in 1:n_series) {\n                          trend[3, s] ~ dnorm(drift[s]*2 + ar1[s]*trend[2, s] + ar2[s]*trend[1, s], tau[s])\n                          }\n\n                          for (i in 4:n) {\n                          for (s in 1:n_series){\n                          trend[i, s] ~ dnorm(drift[s]*(i - 1) + ar1[s]*trend[i - 1, s] + ar2[s]*trend[i - 2, s] + ar3[s]*trend[i - 3, s], tau[s])\n                          }\n                          }\n\n                          ## AR components\n                          for (s in 1:n_series){\n                          drift[s] ~ dnorm(0, 10)\n                          ar1[s] ~ dnorm(0, 10)\n                          ar2[s] ~ dnorm(0, 10)\n                          ar3[s] ~ dnorm(0, 10)\n                          tau[s] <- pow(sigma[s], -2)\n                          sigma[s] ~ dexp(2)T(0.075, 5)\n                          }\n\n                          ## likelihood functions\n                          for (i in 1:n) {\n                          for (s in 1:n_series) {\n                          y[i, s] ~ dnegbin(rate[i, s], phi[s])T(, upper_bound[s]);\n                          rate[i, s] <- ifelse((phi[s] / (phi[s] + mus[i, s])) < min_eps, min_eps,\n                          (phi[s] / (phi[s] + mus[i, s])))\n                          }\n                          }\n\n                          ## complexity penalising prior for the overdispersion parameter;\n                          ## where the likelihood reduces to a 'base' model (Poisson) unless\n                          ## the data support overdispersion\n                          for (s in 1:n_series) {\n                          phi[s] <- 1 / phi_inv[s]\n                          phi_inv[s] ~ dexp(5)\n                          }\n\n                          ## posterior predictions\n                          for (i in 1:n) {\n                          for (s in 1:n_series) {\n                          ypred[i, s] ~ dnegbin(rate[i, s], phi[s])T(, upper_bound[s])\n                          }\n                          }\n\n                          ## GAM-specific priors\"\n      )\n    }\n  }\n\n  return(add)\n}\n"
  },
  {
    "path": "R/add_binomial.R",
    "content": "#' @noRd\nadd_binomial = function(\n  formula,\n  model_file,\n  model_data,\n  data_train,\n  data_test,\n  family_char\n) {\n  # Add trial information if necessary\n  if (family_char %in% c('binomial', 'beta_binomial')) {\n    # Identify which variable in data represents the number of trials\n    resp_terms <- as.character(terms(formula(formula))[[2]])\n    resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n    trial_name <- resp_terms[2]\n\n    # Pull the trials variable from the data and validate\n    train_trials <- data_train[[trial_name]]\n\n    if (any(is.na(train_trials))) {\n      stop(\n        paste0('variable ', trial_name, ' contains missing values'),\n        call. = FALSE\n      )\n    }\n\n    if (any(is.infinite(train_trials))) {\n      stop(\n        paste0('variable ', trial_name, ' contains infinite values'),\n        call. = FALSE\n      )\n    }\n\n    # Matrix of trials per series\n    all_trials <- data.frame(\n      series = as.numeric(data_train$series),\n      time = data_train$time,\n      trials = data_train[[trial_name]]\n    ) %>%\n      dplyr::arrange(time, series)\n\n    # Same for data_test\n    if (!is.null(data_test)) {\n      if (!(exists(trial_name, where = data_test))) {\n        stop(\n          'Number of trials must also be supplied in \"newdata\" for Binomial models',\n          call. = FALSE\n        )\n      }\n\n      all_trials <- rbind(\n        all_trials,\n        data.frame(\n          series = as.numeric(data_test$series),\n          time = data_test$time,\n          trials = data_test[[trial_name]]\n        )\n      ) %>%\n        dplyr::arrange(time, series)\n\n      if (any(is.na(all_trials$trial)) | any(is.infinite(all_trials$trial))) {\n        stop(\n          paste0(\n            'Missing or infinite values found in ',\n            trial_name,\n            ' variable'\n          ),\n          call. = FALSE\n        )\n      }\n    }\n\n    # Construct matrix of N-trials in the correct format so it can be\n    # flattened into one long vector\n    trials <- matrix(\n      NA,\n      nrow = length(unique(all_trials$time)),\n      ncol = length(unique(all_trials$series))\n    )\n    for (i in 1:length(unique(all_trials$series))) {\n      trials[, i] <- all_trials$trials[which(all_trials$series == i)]\n    }\n\n    # Add trial info to the model data\n    model_data$flat_trials <- as.vector(trials)\n    model_data$flat_trials_train <- as.vector(trials)[which(\n      as.vector(model_data$y_observed) == 1\n    )]\n\n    # Add trial vectors to model block\n    model_file[grep(\n      \"int<lower=0> flat_ys[n_nonmissing]; // flattened nonmissing observations\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations\\n\",\n        \"array[total_obs] int<lower=0> flat_trials; // flattened trial vector\\n\",\n        \"array[n_nonmissing] int<lower=0> flat_trials_train; // flattened nonmissing trial vector\\n\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  } else {\n    trials <- NULL\n  }\n\n  # Update parameters block\n  if (family_char == 'beta_binomial') {\n    model_file[grep(\"vector[num_basis] b_raw;\", model_file, fixed = TRUE)] <-\n      paste0(\"vector[num_basis] b_raw;\\n\", \"vector<lower=0>[n_series] phi;\")\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Update functions block\n  if (family_char == 'beta_binomial') {\n    if (any(grepl('functions {', model_file, fixed = TRUE))) {\n      model_file[grep('functions {', model_file, fixed = TRUE)] <-\n        paste0(\n          \"functions {\\n\",\n          \"vector rep_each(vector x, int K) {\\n\",\n          \"int N = rows(x);\\n\",\n          \"vector[N * K] y;\\n\",\n          \"int pos = 1;\\n\",\n          \"for (n in 1 : N) {\\n\",\n          \"for (k in 1 : K) {\\n\",\n          \"y[pos] = x[n];\\n\",\n          \"pos += 1;\\n\",\n          \"}\\n\",\n          \"}\\n\",\n          \"return y;\\n\",\n          \"}\"\n        )\n    } else {\n      model_file[grep('Stan model code', model_file)] <-\n        paste0(\n          '// Stan model code generated by package mvgam\\n',\n          'functions {\\n',\n          \"vector rep_each(vector x, int K) {\\n\",\n          \"int N = rows(x);\\n\",\n          \"vector[N * K] y;\\n\",\n          \"int pos = 1;\\n\",\n          \"for (n in 1 : N) {\\n\",\n          \"for (k in 1 : K) {\\n\",\n          \"y[pos] = x[n];\\n\",\n          \"pos += 1;\\n\",\n          \"}\\n\",\n          \"}\\n\",\n          \"return y;\\n\",\n          \"}\\n}\"\n        )\n    }\n  }\n\n  # Update model block\n  if (family_char == 'binomial') {\n    if (\n      any(grepl(\"flat_ys ~ poisson_log_glm(flat_xs,\", model_file, fixed = TRUE))\n    ) {\n      linenum <- grep(\n        \"flat_ys ~ poisson_log_glm(flat_xs,\",\n        model_file,\n        fixed = TRUE\n      )\n      model_file[linenum] <-\n        paste0(\"flat_ys ~ binomial(flat_trials_train, inv_logit(flat_xs * b));\")\n\n      model_file <- model_file[-(linenum + 1)]\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (\n      any(grepl(\n        \"flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),\",\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      linenum <- grep(\n        \"flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),\",\n        model_file,\n        fixed = TRUE\n      )\n      model_file[linenum] <-\n        paste0(\n          \"flat_ys ~ binomial(flat_trials_train, inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0)));\"\n        )\n\n      model_file <- model_file[-(linenum + 1)]\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n  }\n\n  if (family_char == 'beta_binomial') {\n    model_file[grep(\"model {\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"model {\\n\",\n        \"// priors for Beta dispersion parameters\\n\",\n        \"phi ~ gamma(0.01, 0.01);\"\n      )\n    if (\n      any(grepl(\"flat_ys ~ poisson_log_glm(flat_xs,\", model_file, fixed = TRUE))\n    ) {\n      linenum <- grep(\n        \"flat_ys ~ poisson_log_glm(flat_xs,\",\n        model_file,\n        fixed = TRUE\n      )\n      model_file[linenum] <-\n        paste0(\n          \"vector[n_nonmissing] flat_phis;\\n\",\n          \"flat_phis = rep_each(phi, n)[obs_ind];\\n\",\n          \"flat_ys ~ beta_binomial(flat_trials_train, inv_logit(flat_xs * b) .* flat_phis, (1 - inv_logit(flat_xs * b)) .* flat_phis);\"\n        )\n\n      model_file <- model_file[-(linenum + 1)]\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (\n      any(grepl(\n        \"flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),\",\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      linenum <- grep(\n        \"flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),\",\n        model_file,\n        fixed = TRUE\n      )\n      model_file[linenum] <-\n        paste0(\n          \"vector[n_nonmissing] flat_phis;\\n\",\n          \"flat_phis = rep_each(phi, n)[obs_ind];\\n\",\n          \"flat_ys ~ beta_binomial(flat_trials_train, inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0)) .* flat_phis, (1 - inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0))) .* flat_phis);\"\n        )\n\n      model_file <- model_file[-(linenum + 1)]\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n  }\n\n  if (family_char == 'bernoulli') {\n    if (\n      any(grepl(\"flat_ys ~ poisson_log_glm(flat_xs,\", model_file, fixed = TRUE))\n    ) {\n      model_file[grep(\n        \"flat_ys ~ poisson_log_glm(flat_xs,\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"flat_ys ~ bernoulli_logit_glm(flat_xs,\"\n    }\n\n    if (\n      any(grepl(\n        \"flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),\",\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      model_file[grep(\n        \"flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"flat_ys ~ bernoulli_logit_glm(append_col(flat_xs, flat_trends),\"\n    }\n  }\n\n  # Update the generated quantities block\n  if (family_char == 'binomial') {\n    model_file[grep(\n      \"ypred[1:n, s] = poisson_log_rng(mus[1:n, s]);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"ypred[1:n, s] = binomial_rng(flat_trials[ytimes[1:n, s]], inv_logit(mus[1:n, s]));\"\n  }\n\n  if (family_char == 'beta_binomial') {\n    model_file[grep(\"vector[total_obs] eta;\", model_file, fixed = TRUE)] <-\n      paste0(\"vector[total_obs] eta;\\n\", \"matrix[n, n_series] phi_vec;\")\n\n    model_file[grep(\"eta = X * b;\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"eta = X * b;;\\n\",\n        \"for (s in 1 : n_series) {\\n\",\n        \"phi_vec[1 : n, s] = rep_vector(phi[s], n);\\n\",\n        \"}\"\n      )\n\n    model_file[grep(\n      \"ypred[1:n, s] = poisson_log_rng(mus[1:n, s]);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"ypred[1:n, s] = beta_binomial_rng(flat_trials[ytimes[1:n, s]], inv_logit(mus[1:n, s]) .* phi_vec[1:n, s], (1 - inv_logit(mus[1:n, s])) .* phi_vec[1:n, s]);\"\n  }\n\n  if (family_char == 'bernoulli') {\n    model_file[grep(\n      \"ypred[1:n, s] = poisson_log_rng(mus[1:n, s]);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"ypred[1:n, s] = bernoulli_logit_rng(mus[1:n, s]);\"\n  }\n\n  #### Return ####\n  return(list(\n    model_file = model_file,\n    model_data = model_data,\n    trials = trials\n  ))\n}\n"
  },
  {
    "path": "R/add_corcar.R",
    "content": "#' Updates for adding continuous time AR data\n#' @noRd\nadd_corcar = function(model_data, data_train, data_test = NULL) {\n  # Calculate temporal separation among observed points\n  if (!is.null(data_test)) {\n    all_times <- rbind(\n      data.frame(\n        series = as.numeric(data_train$series),\n        time = data_train$time,\n        index..time..index = data_train$index..time..index\n      ),\n      (data.frame(\n        series = as.numeric(data_test$series),\n        time = data_test$time,\n        index..time..index = data_test$index..time..index\n      ))\n    ) %>%\n      dplyr::group_by(series) %>%\n      dplyr::arrange(index..time..index) %>%\n      dplyr::mutate(\n        time_lag = dplyr::lag(time),\n        dis_time = time - time_lag,\n        dis_time = ifelse(is.na(dis_time), 1, dis_time),\n        dis_time = pmax(1e-3, dis_time)\n      ) %>%\n      dplyr::arrange(index..time..index, series)\n  } else {\n    all_times <- data.frame(\n      series = as.numeric(data_train$series),\n      time = data_train$time,\n      index..time..index = data_train$index..time..index\n    ) %>%\n      dplyr::group_by(series) %>%\n      dplyr::arrange(index..time..index) %>%\n      dplyr::mutate(\n        time_lag = dplyr::lag(time),\n        dis_time = time - time_lag,\n        dis_time = ifelse(is.na(dis_time), 1, dis_time),\n        dis_time = pmax(1e-3, dis_time)\n      ) %>%\n      dplyr::ungroup() %>%\n      dplyr::arrange(index..time..index, series)\n  }\n\n  time_dis <- matrix(\n    NA,\n    nrow = length(unique(all_times$index..time..index)),\n    ncol = length(unique(all_times$series))\n  )\n  for (i in 1:length(unique(all_times$series))) {\n    time_dis[, i] <- all_times$dis_time[which(all_times$series == i)]\n  }\n\n  model_data$time_dis <- time_dis\n\n  return(model_data)\n}\n"
  },
  {
    "path": "R/add_nmixture.R",
    "content": "#' Updates for adding N-mixture processes\n#' @noRd\nadd_nmixture = function(\n  model_file,\n  model_data,\n  data_train,\n  data_test = NULL,\n  trend_map = NULL,\n  nmix_trendmap = TRUE,\n  orig_trend_model\n) {\n  insight::check_if_installed(\n    \"extraDistr\",\n    reason = 'to simulate from N-Mixture distributions'\n  )\n  insight::check_if_installed(\n    \"wrswoR\",\n    reason = 'to simulate from N-Mixture distributions'\n  )\n\n  if (inherits(orig_trend_model, 'mvgam_trend')) {\n    orig_trend_model <- orig_trend_model$trend_model\n  }\n\n  # Update model data\n  model_data <- add_nmix_data(\n    model_data,\n    data_train,\n    data_test,\n    trend_map,\n    nmix_trendmap\n  )\n\n  #### Update the model file appropriately ####\n  # If orig_trend_model is 'None', this will be set up as a RW model so need\n  # to remove sigma and change the process model lines\n  if (orig_trend_model == 'None') {\n    # Replace Random Walk trends with no dynamic trend\n    start_replace <- grep(\n      'LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);',\n      model_file,\n      fixed = TRUE\n    ) -\n      1\n    end_replace <- grep(\n      'LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] + LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]], sigma[j]);',\n      model_file,\n      fixed = TRUE\n    ) +\n      2\n    model_file <- model_file[-c(start_replace:end_replace)]\n    model_file[grep(\n      'trend_mus = X_trend * b_trend;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'trend_mus = X_trend * b_trend;',\n      '\\n',\n      'for(j in 1:n_lv){\\n',\n      'LV[1:n, j] = trend_mus[ytimes_trend[1:n, j]];\\n',\n      '}\\n'\n    )\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # Remove sigma parameters\n    start_replace <- grep('// latent state SD terms', model_file, fixed = TRUE)\n    end_replace <- start_replace + 1\n    model_file <- model_file[-c(start_replace:end_replace)]\n    # model_file <- model_file[-grep('vector[n_lv] penalty;',\n    #                                model_file, fixed = TRUE)]\n    # model_file <- model_file[-grep('penalty = 1.0 / (sigma .* sigma);',\n    #                                model_file, fixed = TRUE)]\n    model_file[grep(\n      \"penalty = 1.0 / (sigma .* sigma);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      'penalty = rep_vector(1e12, n_lv);'\n    model_file <- model_file[\n      -c(\n        grep(\n          '// priors for latent state SD parameters',\n          model_file,\n          fixed = TRUE\n        ),\n        grep(\n          '// priors for latent state SD parameters',\n          model_file,\n          fixed = TRUE\n        ) +\n          1\n      )\n    ]\n\n    # LV has to be declared in transformed params, not params\n    model_file <- model_file[\n      -c(\n        grep('matrix[n, n_lv] LV;', model_file, fixed = TRUE) - 1,\n        grep('matrix[n, n_lv] LV;', model_file, fixed = TRUE)\n      )\n    ]\n\n    model_file[grep(\"transformed parameters {\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"transformed parameters {\\n\",\n        \"// latent states\\n\",\n        \"matrix[n, n_lv] LV;\\n\"\n      )\n  }\n\n  # Update functions block\n  model_file <- add_nmix_functions(model_file, trend_map, nmix_trendmap)\n  # Update the data block\n  model_file[grep(\n    'int<lower=0> n_nonmissing; // number of nonmissing observations',\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      \"int<lower=0> n_nonmissing; // number of nonmissing observations\\n\",\n      \"int<lower=0> cap[total_obs]; // upper limits of latent abundances\\n\",\n      'array[total_obs] int ytimes_array; // sorted ytimes\\n'\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  if (nmix_trendmap) {\n    model_file[grep(\n      'array[total_obs] int ytimes_array; // sorted ytimes',\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        'array[total_obs] int ytimes_array; // sorted ytimes\\n',\n        'array[n, n_series] int<lower=0> ytimes_pred; // time-ordered matrix for prediction\\n',\n        'int<lower=0> K_groups; // number of unique replicated observations\\n',\n        'int<lower=0> K_reps; // maximum number of replicate observations\\n',\n        'array[K_groups] int<lower=0> K_starts; // col of K_inds where each group starts\\n',\n        'array[K_groups] int<lower=0> K_stops; // col of K_inds where each group ends\\n',\n        'array[K_groups, K_reps] int<lower=0> K_inds; // indices of replicated observations'\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    model_file[grep(\n      'int<lower=0> flat_ys[n_nonmissing]; // flattened nonmissing observations',\n      model_file,\n      fixed = TRUE\n    )] <-\n      'array[total_obs] int<lower=0> flat_ys; // flattened observations'\n    model_file <- model_file[\n      -grep(\n        'matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations',\n        model_file,\n        fixed = TRUE\n      )\n    ]\n    model_file <- model_file[\n      -grep(\n        'int<lower=0> obs_ind[n_nonmissing]; // indices of nonmissing observations',\n        model_file,\n        fixed = TRUE\n      )\n    ]\n  }\n\n  # Update transformed data block\n  if (nmix_trendmap) {\n    model_file[grep(\"transformed data {\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"transformed data {\\n\",\n        \"matrix[total_obs, num_basis] X_ordered = X[ytimes_array,  : ];\\n\",\n        \"array[K_groups] int<lower=0> Y_max;\\n\",\n        \"array[K_groups] int<lower=0> N_max;\\n\",\n        \"for ( k in 1 : K_groups ) {\\n\",\n        \"Y_max[k] = max(flat_ys[K_inds[k, K_starts[k] : K_stops[k]]]);\\n\",\n        \"N_max[k] = max(cap[K_inds[k, K_starts[k] : K_stops[k]]]);\\n\",\n        \"}\"\n      )\n  }\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update the transformed parameters block\n  model_file[grep(\"transformed parameters {\", model_file, fixed = TRUE)] <-\n    paste0(\n      \"transformed parameters {\\n\",\n      \"// detection probability\\n\",\n      \"vector[total_obs] p;\\n\"\n    )\n\n  model_file[grep(\n    '// latent process linear predictors',\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    '// detection probability\\n',\n    'p = X_ordered * b;\\n\\n',\n    '// latent process linear predictors'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update the model block\n  model_file <- add_nmix_model(model_file, trend_map, nmix_trendmap)\n\n  # Update the generated quantities block\n  model_file <- add_nmix_genquant(model_file, trend_map, nmix_trendmap)\n\n  #### Return ####\n  return(list(model_file = model_file, model_data = model_data))\n}\n\nadd_nmix_data = function(\n  model_data,\n  data_train,\n  data_test,\n  trend_map,\n  nmix_trendmap = TRUE\n) {\n  model_data$ytimes_array <- as.vector(model_data$ytimes)\n\n  #### Perform necessary checks on 'cap' (positive integers, no missing values) ####\n  if (!(exists('cap', where = data_train))) {\n    stop(\n      'Max abundances must be supplied as a variable named \"cap\" for N-mixture models',\n      call. = FALSE\n    )\n  }\n\n  if (inherits(data_train, 'data.frame')) {\n    cap = data_train %>%\n      dplyr::arrange(series, time) %>%\n      dplyr::pull(cap)\n  } else {\n    cap = data.frame(\n      series = data_train$series,\n      cap = data_train$cap,\n      time = data_train$time\n    ) %>%\n      dplyr::arrange(series, time) %>%\n      dplyr::pull(cap)\n  }\n\n  if (!is.null(data_test)) {\n    if (!(exists('cap', where = data_test))) {\n      stop(\n        'Max abundances must be supplied in test data as a variable named \"cap\" for N-mixture models',\n        call. = FALSE\n      )\n    }\n    if (inherits(data_test, 'data.frame')) {\n      captest = data_test %>%\n        dplyr::arrange(series, time) %>%\n        dplyr::pull(cap)\n    } else {\n      captest = data.frame(\n        series = data_test$series,\n        cap = data_test$cap,\n        time = data_test$time\n      ) %>%\n        dplyr::arrange(series, time) %>%\n        dplyr::pull(cap)\n    }\n    cap <- c(cap, captest)\n  }\n\n  validate_pos_integers(cap)\n\n  if (any(is.na(cap)) | any(is.infinite(cap))) {\n    stop(\n      paste0('Missing or infinite values found for some \"cap\" terms'),\n      call. = FALSE\n    )\n  }\n\n  model_data$cap <- as.vector(cap)\n\n  if (any(model_data$cap[model_data$obs_ind] < model_data$flat_ys)) {\n    stop(\n      paste0('Some \"cap\" terms are < the observed counts. This is not allowed'),\n      call. = FALSE\n    )\n  }\n\n  # Additional data objects for trend_map situations\n  if (nmix_trendmap) {\n    obs_ind <- model_data$obs_ind\n\n    # Don't need to exclude non-missing obs anymore thanks to the grouping\n    # indices\n    model_data$flat_ys <- as.vector(model_data$y)\n    model_data$flat_ys[model_data$flat_ys == -1] <- 0\n    ytimes <- model_data$ytimes\n    Z <- model_data$Z\n\n    # For all observations, which factor do they belong to?\n    which_series <- matrix(NA, nrow = NROW(ytimes), ncol = NCOL(ytimes))\n    for (j in 1:NCOL(ytimes)) {\n      which_series[, j] <- j\n    }\n    which_series <- as.vector(which_series)\n\n    which_factor <- vector(length = length(ytimes))\n    for (i in 1:NCOL(Z)) {\n      Z_obs <- which(which_series %in% which(Z[, i] == 1))\n      which_factor[Z_obs] <- i\n    }\n\n    # Replicate group sizes for each factor * time sample\n    n_replicates <- colSums(Z)\n\n    shift_nas = function(dat) {\n      # Shift NAs to the right\n      dat_new <- t(apply(dat, 1, function(x) {\n        c(x[!is.na(x)], x[is.na(x)])\n      }))\n      # Delete any rows that are all NA\n      dat_new[rowSums(is.na(dat_new)) != ncol(dat_new), , drop = FALSE]\n    }\n\n    length_reps = function(dat) {\n      apply(dat, 1, function(x) {\n        length(x[!is.na(x)])\n      })\n    }\n\n    K_inds <- dplyr::bind_rows(lapply(seq_len(NCOL(Z)), function(i) {\n      factor_inds <- which(which_factor == i)\n      group_mat <- matrix(NA, nrow = model_data$n, ncol = n_replicates[i])\n      for (j in 1:model_data$n) {\n        group_mat[j, ] <- seq(\n          factor_inds[j],\n          max(factor_inds),\n          by = model_data$n\n        )\n      }\n      group_mat[!group_mat %in% obs_ind] <- NA\n      data.frame(shift_nas(group_mat))\n    }))\n\n    # A second version of K_inds is needed for later generation\n    # of properly-constrained latent N predictions; for this version,\n    # all observations must be included (no NAs)\n    K_inds_all <- dplyr::bind_rows(lapply(seq_len(NCOL(Z)), function(i) {\n      factor_inds <- which(which_factor == i)\n      group_mat <- matrix(NA, nrow = model_data$n, ncol = n_replicates[i])\n      for (j in 1:model_data$n) {\n        group_mat[j, ] <- seq(\n          factor_inds[j],\n          max(factor_inds),\n          by = model_data$n\n        )\n      }\n      data.frame(group_mat)\n    }))\n\n    # Add starting and ending indices for each group to model_data\n    model_data$K_starts <- rep(1, NROW(K_inds))\n    model_data$K_stops <- length_reps(K_inds)\n\n    # Change any remaining NAs to 1 so they are integers\n    K_inds[is.na(K_inds)] <- 1\n\n    # Add remaining group information to the model_data\n    model_data$K_reps <- NCOL(K_inds)\n    model_data$K_groups <- NROW(K_inds)\n    model_data$K_inds <- as.matrix(K_inds)\n    model_data$K_inds_all <- as.matrix(K_inds_all)\n    model_data$ytimes_pred <- matrix(\n      1:model_data$total_obs,\n      nrow = model_data$n,\n      byrow = FALSE\n    )\n  }\n\n  return(model_data)\n}\n\nadd_nmix_genquant = function(model_file, trend_map, nmix_trendmap) {\n  rho_included <- any(grepl('rho = log(lambda);', model_file, fixed = TRUE))\n  rho_trend_included <- any(grepl(\n    'rho_trend = log(lambda_trend);',\n    model_file,\n    fixed = TRUE\n  ))\n  if (\n    any(grepl(\"penalty = 1.0 / (sigma .* sigma);\", model_file, fixed = TRUE))\n  ) {\n    penalty_line <- \"vector[n_lv] penalty = 1.0 / (sigma .* sigma);\"\n  } else {\n    penalty_line <- \"vector[n_lv] penalty = rep_vector(1e12, n_lv);\"\n  }\n\n  # Delete most generated quantities so that they can be produced after model\n  # fitting; this dramatically speeds up model time for nmixture models\n  starts <- grep('generated quantities {', model_file, fixed = TRUE) + 1\n  ends <- max(grep('}', model_file, fixed = TRUE))\n  model_file <- model_file[-c(starts:ends)]\n  model_file[grep('generated quantities {', model_file, fixed = TRUE)] <-\n    paste0(\n      'generated quantities {\\n',\n      penalty_line,\n      '\\n',\n      'vector[total_obs] detprob = inv_logit(p);\\n',\n      if (rho_included) {\n        'vector[n_sp] rho = log(lambda);\\n'\n      } else {\n        NULL\n      },\n      if (rho_trend_included) {\n        'vector[n_sp_trend] rho_trend = log(lambda_trend);\\n'\n      } else {\n        NULL\n      },\n      '}'\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n  return(model_file)\n}\n\n\nadd_nmix_model = function(model_file, trend_map, nmix_trendmap) {\n  if (nmix_trendmap) {\n    model_file[grep(\n      'vector[n_nonmissing] flat_trends;',\n      model_file,\n      fixed = TRUE\n    )] <-\n      'array[total_obs] real flat_trends;\\narray[total_obs] real flat_ps;'\n\n    model_file[grep(\n      'flat_trends = (to_vector(trend))[obs_ind];',\n      model_file,\n      fixed = TRUE\n    )] <-\n      'flat_trends = (to_array_1d(trend));\\nflat_ps = to_array_1d(p);'\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    model_file[grep(\n      'flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),',\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        '// loop over replicate sampling window (each site*time*species combination)\\n',\n        'for (k in 1 : K_groups) {\\n',\n        '// all log_lambdas are identical because they represent site*time\\n',\n        '// covariates; so just use the first measurement\\n',\n        'real log_lambda = flat_trends[K_inds[k, 1]];\\n',\n        '// logit-scale detection probilities for the replicate observations\\n',\n        'vector[size(K_inds[k, K_starts[k] : K_stops[k]])] logit_p = to_vector(flat_ps[K_inds[k, K_starts[k] : K_stops[k]]]);\\n',\n        '// K values and observed counts for these replicates\\n',\n        'int K_max = N_max[k];\\n',\n        'int K_min = Y_max[k];\\n',\n        'array[size(K_inds[k, K_starts[k] : K_stops[k]])] int N_obs = flat_ys[K_inds[k, K_starts[k] : K_stops[k]]];\\n',\n        'int possible_N = K_max - K_min;\\n',\n        '// marginalize over possible latent counts analytically\\n',\n        'real ff = exp(log_lambda) * prod(1 - inv_logit(logit_p));\\n',\n        'real prob_n = 1;\\n',\n        'for (i in 1 : possible_N){\\n',\n        'real N = K_max - i + 1;\\n',\n        'real k_obs = 1;\\n',\n        'for (j in 1 : size(N_obs)){\\n',\n        'k_obs *= N / (N - N_obs[j]);\\n',\n        '}\\n',\n        'prob_n = 1 + prob_n * ff * k_obs / N;\\n',\n        '}\\n',\n        '// add log(pr_n) to prob(K_min)\\n',\n        'target += poisson_log_lpmf(K_min | log_lambda) +\\n',\n        'binomial_logit_lpmf(N_obs | K_min, logit_p) +\\n',\n        'log(prob_n);\\n',\n        '}'\n      )\n    model_file <- model_file[\n      -grep('0.0,append_row(b, 1.0));', model_file, fixed = TRUE)\n    ]\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  return(model_file)\n}\n\nadd_nmix_functions = function(model_file, trend_map, nmix_trendmap) {\n  model_file <- readLines(textConnection(model_file), n = -1)\n  return(model_file)\n}\n\n#' Function to add generated quantities for nmixture models, which\n#' saves huge computational time\n#' @noRd\nadd_nmix_posterior = function(\n  model_output,\n  obs_data,\n  test_data,\n  mgcv_model,\n  n_lv,\n  Z,\n  K_inds\n) {\n  # Function to add samples to the 'sim' slot of a stanfit object\n  add_samples = function(\n    model_output,\n    names,\n    samples,\n    nsamples,\n    nchains,\n    parname\n  ) {\n    samp_starts <- seq(1, NROW(samples), by = nsamples)\n    samp_ends <- seq(nsamples, NROW(samples), by = nsamples)\n    for (i in 1:nchains) {\n      samps_df <- data.frame(samples[samp_starts[i]:samp_ends[i], ])\n      colnames(samps_df) <- names\n\n      if (is.list(model_output@sim$samples[[i]])) {\n        old <- attributes(model_output@sim$samples[[i]])\n        oldnames <- attr(model_output@sim$samples[[i]], 'names')\n        model_output@sim$samples[[i]] <-\n          append(model_output@sim$samples[[i]], as.list(samps_df))\n        mostattributes(model_output@sim$samples[[i]]) <- old\n        attr(model_output@sim$samples[[i]], 'names') <-\n          c(oldnames, colnames(samps_df))\n      } else {\n        model_output@sim$samples[[i]] <-\n          dplyr::bind_cols(model_output@sim$samples[[i]], samps_df)\n      }\n    }\n    model_output@sim$fnames_oi <- c(model_output@sim$fnames_oi, names)\n    model_output@model_pars <- c(model_output@model_pars, parname)\n    model_output@sim$pars_oi <- c(model_output@sim$pars_oi, parname)\n    return(model_output)\n  }\n\n  # Number of chains\n  nchains <- model_output@sim$chains\n\n  # Trend samples (for getting dimnames needed for ypred, latent_ypred)\n  trend <- mcmc_chains(model_output, 'trend')\n\n  # Construct latent_ypred samples (arranged by time, then series)\n  detprob <- mcmc_chains(model_output, 'detprob')\n  ps <- qlogis(detprob)\n  Xp <- matrix(as.vector(ps))\n  attr(Xp, 'model.offset') <- 0\n\n  if (!is.null(test_data)) {\n    cap <- rbind(\n      data.frame(\n        time = obs_data$time,\n        series = obs_data$series,\n        cap = obs_data$cap\n      ),\n      data.frame(\n        time = test_data$time,\n        series = test_data$series,\n        cap = test_data$cap\n      )\n    ) %>%\n      dplyr::arrange(series, time) %>%\n      dplyr::pull(cap)\n  } else {\n    cap <- data.frame(\n      time = obs_data$time,\n      series = obs_data$series,\n      cap = obs_data$cap\n    ) %>%\n      dplyr::arrange(series, time) %>%\n      dplyr::pull(cap)\n  }\n  cap <- as.vector(t(replicate(NROW(ps), cap)))\n\n  # Unconditional latent_N predictions\n  if (!is.null(test_data)) {\n    truth_df <- rbind(\n      data.frame(\n        time = obs_data$time,\n        series = obs_data$series,\n        y = obs_data$y\n      ),\n      data.frame(\n        time = test_data$time,\n        series = test_data$series,\n        y = test_data$y\n      )\n    )\n  } else {\n    truth_df <- data.frame(\n      time = obs_data$time,\n      series = obs_data$series,\n      y = obs_data$y\n    )\n  }\n\n  get_min_cap = function(truth, K_inds) {\n    rowgroup = function(x) {\n      which(K_inds == x, arr.ind = TRUE)[1]\n    }\n\n    data.frame(index = 1:length(truth), truth = truth) %>%\n      dplyr::rowwise() %>%\n      dplyr::mutate(group = rowgroup(index)) %>%\n      dplyr::ungroup() %>%\n      dplyr::group_by(group) %>%\n      dplyr::mutate(min_cap = max(truth, na.rm = TRUE)) %>%\n      dplyr::pull(min_cap)\n  }\n\n  # K_inds was originally supplied in series, time order\n  # so the corresponding truth must be supplied that way\n  truth_df %>%\n    dplyr::arrange(series, time) %>%\n    dplyr::pull(y) -> orig_y\n  if (is.null(K_inds)) {\n    K_inds <- matrix(1:length(orig_y), ncol = 1)\n  }\n  min_cap <- suppressWarnings(get_min_cap(orig_y, K_inds))\n  min_cap[!is.finite(min_cap)] <- 0\n\n  # min_cap is now in the wrong order, so we need to change it\n  truth_df %>%\n    dplyr::arrange(series, time) %>%\n    dplyr::bind_cols(min_cap = min_cap) %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::pull(min_cap) -> min_cap\n\n  # truth now also needs to be in the correct time, series\n  # order\n  truth_df %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::pull(y) -> mod_y\n  truth <- as.vector(t(replicate(NROW(ps), mod_y)))\n  min_cap <- as.vector(t(replicate(NROW(ps), min_cap)))\n  latentypreds_vec <- mvgam_predict(\n    Xp = Xp,\n    family = 'nmix',\n    betas = 1,\n    latent_lambdas = exp(as.vector(trend)),\n    cap = cap,\n    min_cap = min_cap,\n    type = 'latent_N'\n  )\n\n  # Conditional latent_N predictions (when observations were not NA)\n  whichobs <- which(!is.na(truth))\n  Xp <- Xp[whichobs, , drop = FALSE]\n  attr(Xp, 'model.offset') <- 0\n  condpreds_vec <- mvgam_predict(\n    Xp = Xp,\n    family = 'nmix',\n    betas = 1,\n    latent_lambdas = exp(as.vector(trend)[whichobs]),\n    cap = cap[whichobs],\n    min_cap = min_cap[whichobs],\n    truth = truth[whichobs],\n    type = 'latent_N'\n  )\n\n  # Fill in the unconditionals using the conditionals when there were actually\n  # observations\n  latentypreds_vec[whichobs] <- condpreds_vec\n  latentypreds <- matrix(latentypreds_vec, nrow = NROW(ps))\n\n  # Update parameter names and samples to match expected order\n  expand.grid(\n    time = 1:model_output@sim$dims_oi$trend[1],\n    series = 1:model_output@sim$dims_oi$trend[2]\n  ) %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::mutate(current = dplyr::row_number()) %>%\n    dplyr::arrange(series, time) %>%\n    dplyr::mutate(needed = dplyr::row_number()) %>%\n    dplyr::mutate(name = paste0('trend[', time, ',', series, ']')) %>%\n    dplyr::arrange(current) -> ordering_needed\n\n  parnames <- ordering_needed %>%\n    dplyr::arrange(needed) %>%\n    dplyr::pull(name)\n\n  indices <- ordering_needed %>%\n    dplyr::arrange(needed) %>%\n    dplyr::pull(current)\n\n  # Add latent_ypreds to the posterior samples\n  model_output <- add_samples(\n    model_output = model_output,\n    names = gsub('trend', 'latent_ypred', parnames),\n    samples = latentypreds[, indices],\n    nsamples = NROW(latentypreds) / nchains,\n    nchains = nchains,\n    parname = 'latent_ypred'\n  )\n  model_output@sim$dims_oi$latent_ypred <-\n    model_output@sim$dims_oi$trend\n\n  # Now construct the detprob samples\n  # model_output <- add_samples(\n  #   model_output = model_output,\n  #   names = gsub('p', 'detprob', dimnames(ps)[[2]]),\n  #   samples = detprob,\n  #   nsamples = NROW(detprob) / nchains,\n  #   nchains = nchains,\n  #   parname = 'detprob'\n  # )\n  # model_output@sim$dims_oi$detprob <-\n  #   model_output@sim$dims_oi$p\n\n  # Now construct ypred samples\n  ypreds_vec <- rbinom(\n    length(latentypreds_vec),\n    size = latentypreds_vec,\n    prob = as.vector(detprob)\n  )\n  ypreds <- matrix(ypreds_vec, nrow = NROW(ps))\n  model_output <- add_samples(\n    model_output = model_output,\n    names = gsub('trend', 'ypred', parnames),\n    samples = ypreds[, indices],\n    nsamples = NROW(ypreds) / nchains,\n    nchains = nchains,\n    parname = 'ypred'\n  )\n  model_output@sim$dims_oi$ypred <-\n    model_output@sim$dims_oi$trend\n\n  # Now construct mus (expectations) samples\n  mus_vec <- as.vector(detprob) * latentypreds_vec\n  mus <- matrix(mus_vec, nrow = NROW(ps))\n  model_output <- add_samples(\n    model_output = model_output,\n    names = gsub('trend', 'mus', parnames),\n    samples = mus[, indices],\n    nsamples = NROW(mus) / nchains,\n    nchains = nchains,\n    parname = 'mus'\n  )\n  model_output@sim$dims_oi$mus <-\n    model_output@sim$dims_oi$trend\n\n  # Now the lv_coefs samples\n  n_series <- length(unique(obs_data$series))\n  combinations <- expand.grid(1:n_series, 1:n_lv) %>%\n    dplyr::arrange(Var2)\n  lv_coef_names <- apply(\n    combinations,\n    1,\n    function(x) paste0('lv_coefs[', x[1], ',', x[2], ']')\n  )\n  lv_coef_samps <- t(as.matrix(replicate(NROW(ps), as.vector(t(Z)))))\n  model_output <- add_samples(\n    model_output = model_output,\n    names = lv_coef_names,\n    samples = lv_coef_samps,\n    nsamples = NROW(lv_coef_samps) / nchains,\n    nchains = nchains,\n    parname = 'lv_coefs'\n  )\n  model_output@sim$dims_oi$lv_coefs <- c(n_series, n_lv)\n\n  # Update number of total parameters\n  model_output@sim$n_flatnames <-\n    sum(unlist(lapply(model_output@sim$dims_oi, prod), use.names = FALSE))\n\n  return(model_output)\n}\n"
  },
  {
    "path": "R/add_poisson_lines.R",
    "content": "#' Poisson JAGS modifications\n#'\n#'\n#' @noRd\n#' @param model_file A template `JAGS` model file to be modified\n#' @param upper_bounds Optional upper bounds for the truncated observation likelihood\n#' @return A modified `JAGS` model file\nadd_poisson_lines = function(model_file, upper_bounds) {\n  odis_begin <- grep('phi\\\\[s\\\\] <- ', model_file) - 4\n  odis_end <- odis_begin + 7\n  model_file <- model_file[-c(odis_begin:odis_end)]\n\n  rate_begin <- grep('rate\\\\[i, s\\\\] <- ', model_file)\n  rate_end <- rate_begin + 1\n  model_file <- model_file[-c(rate_begin:rate_end)]\n\n  if (missing(upper_bounds)) {\n    model_file[grep(\n      'y\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  y[i, s] ~ dpois(mus[i, s])'\n    model_file[grep(\n      'ypred\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  ypred[i, s] ~ dpois(mus[i, s])'\n  } else {\n    model_file[grep(\n      'y\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  y[i, s] ~ dpois(mus[i, s])T(, upper_bound[s])'\n    model_file[grep(\n      'ypred\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  ypred[i, s] ~ dpois(mus[i, s])T(, upper_bound[s])'\n  }\n\n  model_file\n}\n"
  },
  {
    "path": "R/add_residuals.R",
    "content": "#'@title Calculate randomized quantile residuals for \\pkg{mvgam} objects\n#'@name add_residuals.mvgam\n#'@param object \\code{list} object of class \\code{mvgam}. See [mvgam()]\n#'@param ... unused\n#'@details For each series, randomized quantile (i.e. Dunn-Smyth) residuals are calculated for inspecting model diagnostics\n#'If the fitted model is appropriate then Dunn-Smyth residuals will be standard normal in distribution and no\n#'autocorrelation will be evident. When a particular observation is missing, the residual is calculated by comparing independent\n#'draws from the model's posterior distribution\n#'@return A list object of class `mvgam` with residuals included in the `'resids'` slot\n#'@export\nadd_residuals <- function(object, ...) {\n  UseMethod(\"add_residuals\", object)\n}\n\n#'@rdname add_residuals.mvgam\n#'@method add_residuals mvgam\n#'@export\nadd_residuals.mvgam = function(object, ...) {\n  resids <- dsresids_vec(object)\n  object$resids <- resids\n  return(object)\n}\n"
  },
  {
    "path": "R/add_stan_data.R",
    "content": "#' Add remaining data, model and parameter blocks to a Stan model\n#'\n#'\n#' @noRd\n#' @param jags_file Prepared JAGS mvgam model file\n#' @param stan_file Incomplete Stan model file to be edited\n#' @param ss_gam The GAM setup object\n#' @param use_lv logical\n#' @param n_lv \\code{integer} number of latent dynamic factors (if \\code{use_lv = TRUE})\n#' @param jags_data Prepared mvgam data for JAGS modelling\n#' @param family \\code{character}.\n#' @param upper_bounds Optional \\code{vector} of \\code{integer} values specifying upper limits for each series. If supplied,\n#' this generates a modified likelihood where values above the bound are given a likelihood of zero. Note this modification\n#' is computationally expensive in \\code{JAGS} but can lead to better estimates when true bounds exist. Default is to remove\n#' truncation entirely (i.e. there is no upper bound for each series)\n#' @return A `list` containing the updated Stan model and model data\nadd_stan_data = function(\n  jags_file,\n  stan_file,\n  ss_gam,\n  use_lv = FALSE,\n  n_lv,\n  jags_data,\n  family = 'poisson',\n  upper_bounds\n) {\n  #### Modify the Stan file ####\n  # Update lines associated with particular family\n  if (family == 'poisson') {\n    if (!is.null(upper_bounds)) {\n      stan_file[grep('~ poisson_log', stan_file)] <-\n        gsub(';', 'T[,U[s]];', stan_file[grep('~ poisson_log', stan_file)])\n      stan_file[grep('~ poisson_log', stan_file)] <-\n        gsub(\n          'poisson_log(',\n          'poisson(exp(',\n          stan_file[grep('~ poisson_log', stan_file)],\n          fixed = TRUE\n        )\n      stan_file[grep('~ poisson', stan_file)] <-\n        gsub(')', '))', stan_file[grep('~ poisson', stan_file)], fixed = TRUE)\n    }\n  }\n\n  if (family == 'negative binomial') {\n    stan_file[grep('// raw basis', stan_file) + 2] <-\n      '\\n// negative binomial overdispersion\\nvector<lower=0>[n_series] phi_inv;\\n'\n\n    stan_file[grep('// priors for smoothing', stan_file) + 2] <-\n      paste0(\n        '\\n// priors for overdispersion parameters\\n',\n        'phi_inv ~ student_t(3, 0, 0.1);\\n'\n      )\n\n    to_negbin <- gsub(\n      'poisson_log',\n      'neg_binomial_2',\n      stan_file[grep('y[i, s] ~ poisson', stan_file, fixed = T)]\n    )\n    stan_file[grep('y[i, s] ~ poisson', stan_file, fixed = T)] <-\n      gsub(');', ', inv(phi_inv[s]));', to_negbin)\n\n    add_exp_open <- gsub(\n      '\\\\(eta',\n      '(exp(eta',\n      stan_file[grep('y[i, s] ~ neg_binomial', stan_file, fixed = T)]\n    )\n    add_exp_cl <- gsub('],', ']),', add_exp_open)\n    stan_file[grep('y[i, s] ~ neg_binomial', stan_file, fixed = T)] <-\n      add_exp_cl\n\n    stan_file[grep('matrix[n, n_series] ypred;', stan_file, fixed = T)] <-\n      paste0(\n        'matrix[n, n_series] ypred;\\n',\n        'matrix[n, n_series] phi_vec;\\n',\n        'vector[n_series] phi;\\n',\n        'phi = inv(phi_inv);\\n',\n        'for (s in 1:n_series) {\\n',\n        'phi_vec[1:n,s] = rep_vector(phi[s], n);\\n}\\n'\n      )\n\n    to_negbin <- gsub(\n      'poisson_log_rng',\n      'neg_binomial_2_rng',\n      stan_file[grep('ypred[i, s] = poisson_log_rng', stan_file, fixed = T)]\n    )\n    stan_file[grep('ypred[i, s] = poisson_log_rng', stan_file, fixed = T)] <-\n      gsub(');', ', phi_vec[i, s]);', to_negbin)\n\n    add_exp_open <- gsub(\n      '\\\\(eta',\n      '(exp(eta',\n      stan_file[grep('ypred[i, s] = neg_binomial', stan_file, fixed = T)]\n    )\n\n    if (any(grepl('trend[i, s]', stan_file, fixed = T))) {\n      add_exp_cl <- gsub('trend[i, s]', 'trend[i, s])', add_exp_open, fixed = T)\n    } else {\n      add_exp_cl <- gsub(\n        'eta[ytimes[i, s]]',\n        'eta[ytimes[i, s]])',\n        add_exp_open,\n        fixed = T\n      )\n    }\n\n    stan_file[grep('ypred[i, s] = neg_binomial', stan_file, fixed = T)] <-\n      add_exp_cl\n\n    if (!is.null(upper_bounds)) {\n      stan_file[grep('~ neg_binomial_2', stan_file)] <-\n        gsub(';', 'T[,U[s]];', stan_file[grep('~ neg_binomial_2', stan_file)])\n    }\n\n    stan_file <- readLines(textConnection(stan_file), n = -1)\n  }\n\n  # Get dimensions and numbers of smooth terms\n  snames <- names(jags_data)[grep('S.*', names(jags_data))]\n  if (length(snames) == 0) {\n    smooth_penalty_data <- NULL\n  } else {\n    smooth_dims <- matrix(NA, ncol = 2, nrow = length(snames))\n    for (i in 1:length(snames)) {\n      smooth_dims[i, ] <- dim(jags_data[[snames[i]]])\n    }\n\n    # Insert the data block for the model\n    smooth_penalty_data <- vector()\n    for (i in 1:length(snames)) {\n      smooth_penalty_data[i] <- paste0(\n        'matrix[',\n        smooth_dims[i, 1],\n        ',',\n        smooth_dims[i, 2],\n        '] ',\n        snames[i],\n        '; // mgcv smooth penalty matrix ',\n        snames[i]\n      )\n    }\n  }\n\n  # Get parametric prior locations and precisions if necessary\n  if ('p_taus' %in% names(jags_data)) {\n    p_terms <- paste0(\n      'real p_taus[',\n      length(jags_data$p_taus),\n      ']; // prior precisions for parametric coefficients\\n',\n      'real p_coefs[',\n      length(jags_data$p_taus),\n      ']; // prior locations for parametric coefficients\\n'\n    )\n  } else {\n    p_terms <- NULL\n  }\n\n  # Add lines for upper bounds if supplied\n  if (!is.null(upper_bounds)) {\n    bounds <- paste0('int U[', length(upper_bounds), ']; // upper bounds\\n')\n  } else {\n    bounds <- NULL\n  }\n\n  # Remove smooth parameter info if no smooth terms are included\n  if (any(grepl('## smoothing parameter priors...', jags_file))) {\n    zero_data <- paste0(\n      'vector[num_basis] zero; // prior locations for basis coefficients\\n'\n    )\n    n_sp_data <- paste0(\n      'int<lower=0> n_sp; // number of smoothing parameters\\n'\n    )\n  } else {\n    zero_data <- NULL\n    n_sp_data <- NULL\n  }\n\n  # Occasionally there are smooths with no zero vector\n  # (i.e. for bs = 'fs', they are often just normal(0, lambda))\n  if (is.null(jags_data$zero)) {\n    zero_data <- NULL\n  }\n\n  # latent variable lines\n  if (use_lv) {\n    lv_data <- paste0('int<lower=0> n_lv; // number of dynamic factors\\n')\n  } else {\n    lv_data <- NULL\n  }\n\n  # shared smoothing parameter lines\n  if ('L' %in% names(jags_data)) {\n    lambda_links <- paste0(\n      'matrix[',\n      NROW(jags_data$L),\n      ',',\n      NCOL(jags_data$L),\n      '] lambda_links; // smooth parameter linking matrix\\n',\n      'int<lower=0> n_raw_sp; // number of raw smoothing parameters to estimate\\n'\n    )\n  } else {\n    lambda_links <- NULL\n  }\n\n  # Offset information\n  if (any(grepl('eta <- X %*% b + offset', jags_file, fixed = TRUE))) {\n    offset_line <- paste0('vector[total_obs] offset; // offset vector\\n')\n  } else {\n    offset_line <- NULL\n  }\n\n  if (any(grepl('eta <- X * b + offset', jags_file, fixed = TRUE))) {\n    offset_line <- paste0('vector[total_obs] offset; // offset vector\\n')\n  } else {\n    offset_line <- NULL\n  }\n\n  if (\n    any(grepl(\n      'offset; offset vector of length (n x n_series)',\n      jags_file,\n      fixed = TRUE\n    ))\n  ) {\n    offset_line <- paste0('vector[total_obs] offset; // offset vector\\n')\n  } else {\n    offset_line <- NULL\n  }\n\n  # Search for any non-contiguous indices that sometimes are used by mgcv\n  if (any(grep('in c\\\\(', jags_file))) {\n    add_idxs <- TRUE\n    seq_character = function(x) {\n      all_nums <- as.numeric(unlist(strsplit(x, ':')))\n      if (length(all_nums) > 1) {\n        out <- seq(all_nums[1], all_nums[2])\n      } else {\n        out <- all_nums\n      }\n      out\n    }\n\n    idx_locations <- grep('in c\\\\(', jags_file)\n    idx_vals <- list()\n    idx_data <- vector()\n    for (i in 1:length(idx_locations)) {\n      list_vals <- unlist(strsplit(\n        gsub('^.*c\\\\(*|\\\\s*).*$', '', jags_file[idx_locations[i]]),\n        ','\n      ))\n      idx_vals[[i]] <- array(\n        unlist(lapply(list_vals, seq_character)),\n        dim = length(unlist(lapply(list_vals, seq_character)))\n      )\n      idx_data[i] <- paste0(\n        'int idx',\n        i,\n        '[',\n        length(idx_vals[[i]]),\n        ']; // discontiguous index values'\n      )\n      jags_file[idx_locations][i] <- sub(\n        \"in.*\\\\)\\\\)\",\n        paste0(\"in idx\", i, ')'),\n        jags_file[idx_locations][i]\n      )\n    }\n\n    # Update the Stan data block\n    stan_file[grep('##insert data', stan_file)] <- paste0(\n      '// Stan model code generated by package mvgam\\n',\n      'data {',\n      '\\n',\n      bounds,\n      paste0(idx_data, collapse = '\\n'),\n      '\\n',\n      'int<lower=0> total_obs; // total number of observations\\n',\n      'int<lower=0> n; // number of timepoints per series\\n',\n      lv_data,\n      n_sp_data,\n      lambda_links,\n      'int<lower=0> n_series; // number of series\\n',\n      'int<lower=0> num_basis; // total number of basis coefficients\\n',\n      #p_terms,\n      zero_data,\n      offset_line,\n      'matrix[num_basis, total_obs] X; // transposed mgcv GAM design matrix\\n',\n      'int<lower=0> ytimes[n, n_series]; // time-ordered matrix (which col in X belongs to each [time, series] observation?)\\n',\n      paste0(smooth_penalty_data, collapse = '\\n'),\n      '\\n',\n      'int<lower=0, upper=1> y_observed[n, n_series]; // indices of missing vs observed\\n',\n      'int<lower=-1> y[n, n_series]; // time-ordered observations, with -1 indicating missing\\n',\n      '}\\n'\n    )\n  } else {\n    add_idxs <- FALSE\n    stan_file[grep('##insert data', stan_file)] <- paste0(\n      '// Stan model code generated by package mvgam\\n',\n      'data {',\n      '\\n',\n      bounds,\n      'int<lower=0> total_obs; // total number of observations\\n',\n      'int<lower=0> n; // number of timepoints per series\\n',\n      lv_data,\n      n_sp_data,\n      lambda_links,\n      'int<lower=0> n_series; // number of series\\n',\n      'int<lower=0> num_basis; // total number of basis coefficients\\n',\n      zero_data,\n      offset_line,\n      #p_terms,\n      'matrix[num_basis, total_obs] X; // transposed mgcv GAM design matrix\\n',\n      'int<lower=0> ytimes[n, n_series]; // time-ordered matrix (which col in X belongs to each [time, series] observation?)\\n',\n      paste0(smooth_penalty_data, collapse = '\\n'),\n      '\\n',\n      'int<lower=0, upper=1> y_observed[n, n_series]; // indices of missing vs observed\\n',\n      'int<lower=-1> y[n, n_series]; // time-ordered observations, with -1 indicating missing\\n',\n      '}\\n'\n    )\n  }\n  stan_file <- readLines(textConnection(stan_file), n = -1)\n\n  # Modify the model block to include each smooth term\n  if (any(grepl('## smoothing parameter priors...', jags_file))) {\n    smooths_start <- grep('## GAM-specific priors', jags_file) + 1\n    smooths_end <- grep('## smoothing parameter priors...', jags_file) - 1\n    jags_smooth_text <- jags_file[smooths_start:smooths_end]\n    jags_smooth_text <- gsub('##', '//', jags_smooth_text)\n    jags_smooth_text <- gsub('dexp', 'exponential', jags_smooth_text)\n\n    smooth_labs <- do.call(\n      rbind,\n      lapply(seq_along(ss_gam$smooth), function(x) {\n        data.frame(\n          label = ss_gam$smooth[[x]]$label,\n          term = paste(ss_gam$smooth[[x]]$term, collapse = ','),\n          class = class(ss_gam$smooth[[x]])[1]\n        )\n      })\n    )\n\n    if (length(ss_gam$sp) > 0 & !all(smooth_labs$class == 'random.effect')) {\n      any_ks <- TRUE\n    } else {\n      any_ks <- FALSE\n    }\n    # any_ks <- any(grep('K.* <- ', jags_smooth_text))\n    any_timevarying <- any(grep(\n      '// prior for s(time):',\n      jags_smooth_text,\n      fixed = TRUE\n    ))\n    if (\n      any_ks ||\n        any_timevarying\n    ) {\n      if (any(grep('K.* <- ', jags_smooth_text))) {\n        K_starts <- grep('K.* <- ', jags_smooth_text)\n        for (i in 1:length(K_starts)) {\n          jags_smooth_text[K_starts[i] + 1] <- gsub(\n            '\\\\bb\\\\b',\n            'b_raw',\n            gsub(\n              'dmnorm',\n              'multi_normal_prec',\n              paste0(\n                gsub(\n                  'K.*',\n                  trimws(gsub('K.* <- ', '', jags_smooth_text[K_starts[i]])),\n                  jags_smooth_text[K_starts[i] + 1]\n                ),\n                ')'\n              )\n            )\n          )\n        }\n        jags_smooth_text <- jags_smooth_text[-K_starts]\n      }\n    } else {\n      # If no K terms or time-varying terms, then there are no smoothing parameters in the model\n      # (probably the only smooth terms included are random effect bases, which don't need\n      # smoothing parameters when we use the non-centred parameterisation)\n      stan_file <- stan_file[\n        -grep('// priors for smoothing parameters', stan_file, fixed = TRUE)\n      ]\n      stan_file <- stan_file[-grep('lambda ~ ', stan_file, fixed = TRUE)]\n      stan_file <- stan_file[-grep('vector[n_sp] rho', stan_file, fixed = TRUE)]\n      stan_file <- stan_file[-grep('rho = log', stan_file, fixed = TRUE)]\n      stan_file <- stan_file[\n        -grep('// smoothing parameters', stan_file, fixed = TRUE)\n      ]\n      stan_file <- stan_file[-grep('[n_sp] lambda', stan_file, fixed = TRUE)]\n      # stan_file <- stan_file[-grep('vector[num_basis] zero; //', stan_file,\n      #                              fixed = TRUE)]\n      stan_file <- stan_file[\n        -grep('int<lower=0> n_sp; //', stan_file, fixed = TRUE)\n      ]\n    }\n\n    # If there are no K terms but there are time-varying, we don't need\n    # the zero vector\n    if (any_timevarying & !any_ks) {\n      stan_file <- stan_file[\n        -grep('vector[num_basis] zero; //', stan_file, fixed = TRUE)\n      ]\n    }\n\n    # Create a new smooths_included check after working through the\n    # random effects\n    if (!any_timevarying & !any_ks) {\n      smooths_included <- FALSE\n    } else {\n      smooths_included <- TRUE\n    }\n\n    if (any(grep('b\\\\[i\\\\] = b_raw', jags_smooth_text))) {\n      jags_smooth_text <- jags_smooth_text[\n        -grep('b\\\\[i\\\\] = b_raw', jags_smooth_text)\n      ]\n    }\n    jags_smooth_text <- gsub('dnorm', 'normal', jags_smooth_text)\n    jags_smooth_text <- gsub('  ', ' ', jags_smooth_text)\n    jags_smooth_text[-grep('//|\\\\}|\\\\{', jags_smooth_text)] <-\n      paste0(jags_smooth_text[-grep('//|\\\\}|\\\\{', jags_smooth_text)], ';')\n    jags_smooth_text <- gsub(') }', '); }', jags_smooth_text)\n    jags_smooth_text <- gsub('}', '}\\n', jags_smooth_text)\n    jags_smooth_text[(grep('//', jags_smooth_text) - 1)[-1]] <-\n      paste0(jags_smooth_text[(grep('//', jags_smooth_text) - 1)[-1]], '\\n')\n    stan_file[grep('##insert smooths', stan_file)] <- paste0(\n      jags_smooth_text,\n      collapse = '\\n'\n    )\n    stan_file <- readLines(textConnection(stan_file), n = -1)\n\n    # Deal with any random effect priors\n    if (any(grep('b_raw\\\\[i\\\\] ~', stan_file))) {\n      b_raw_string <- paste0(\n        stan_file[grep('b_raw\\\\[i\\\\] ~', stan_file) - 1],\n        collapse = ','\n      )\n      n_b_raw <- max(as.numeric(unlist(regmatches(\n        b_raw_string,\n        gregexpr(\"[[:digit:]]+\", b_raw_string)\n      ))))\n      min_b_raw <- min(as.numeric(unlist(regmatches(\n        b_raw_string,\n        gregexpr(\"[[:digit:]]+\", b_raw_string)\n      ))))\n\n      n_sigma_raw <- max(as.numeric(unlist(regmatches(\n        unique(sub(\n          \".*(sigma_raw?\\\\d+).*\",\n          \"\\\\1\",\n          grep('sigma_raw', stan_file, value = T)\n        )),\n        gregexpr(\n          \"[[:digit:]]+\",\n          unique(sub(\n            \".*(sigma_raw?\\\\d+).*\",\n            \"\\\\1\",\n            grep('sigma_raw', stan_file, value = T)\n          ))\n        )\n      ))))\n\n      stan_file <- stan_file[-grep('mu_raw.* ~ ', stan_file)]\n      stan_file <- stan_file[-grep('<- mu_raw', stan_file)]\n      stan_file <- stan_file[-grep('sigma_raw.* ~ ', stan_file)]\n      stan_file[grep('model \\\\{', stan_file)] <-\n        paste0(\n          'model {\\n// prior for random effect population variances\\nsigma_raw ~ exponential(0.5);\\n\\n',\n          '// prior for random effect population means\\nmu_raw ~ std_normal();\\n'\n        )\n\n      stan_file[grep('parameters \\\\{', stan_file)[1] + 2] <-\n        paste0(\n          stan_file[grep('parameters \\\\{', stan_file)[1] + 2],\n          '\\n',\n          '\\n// random effect variances\\n',\n          paste0(\n            'vector<lower=0>[',\n            n_sigma_raw,\n            '] sigma_raw',\n            ';\\n',\n            collapse = ''\n          ),\n          '\\n',\n          '\\n// random effect means\\n',\n          paste0('vector[', n_sigma_raw, '] mu_raw', ';\\n', collapse = '')\n        )\n\n      b_raw_text <- vector()\n      min_beta <- vector()\n      b_raw_indices <- grep('b_raw\\\\[i\\\\] ~', stan_file)\n      for (i in 1:length(b_raw_indices)) {\n        b_raw_text[i] <- paste0(\n          'for (i in ',\n          as.numeric(sub(\n            \"for \\\\(i in \",\n            \"\",\n            sub(\"\\\\:.*\", \"\", stan_file[b_raw_indices[i] - 1])\n          )),\n          ':',\n          as.numeric(sub(\n            \" \",\n            \"\",\n            sub(\n              \"\\\\{\",\n              \"\",\n              sub(\"\\\\)\", \"\", sub(\".*\\\\:\", \"\", stan_file[b_raw_indices[i] - 1]))\n            )\n          )),\n          ') {\\nb[i] = mu_raw[',\n          i,\n          '] + b_raw[i] * sigma_raw[',\n          i,\n          '];\\n}\\n'\n        )\n        min_beta[i] <- as.numeric(sub(\n          \"for \\\\(i in \",\n          \"\",\n          sub(\"\\\\:.*\", \"\", stan_file[b_raw_indices[i] - 1])\n        ))\n      }\n\n      # If parametric coefficients are included, they'll come before random effects\n      min_re_betas <- min(min_beta)\n      if (min_re_betas > 1) {\n        b_raw_text <- c(\n          paste0(\n            '\\nfor (i in 1:',\n            min_re_betas - 1,\n            ') {\\nb[i] = b_raw[i];\\n}'\n          ),\n          b_raw_text\n        )\n      } else {\n        b_raw_text <- b_raw_text\n      }\n\n      if (n_b_raw < dim(jags_data$X)[2]) {\n        b_raw_text <- c(\n          b_raw_text,\n          paste0(\n            '\\nfor (i in ',\n            n_b_raw + 1,\n            ':num_basis) {\\nb[i] = b_raw[i];\\n}\\n'\n          )\n        )\n      }\n\n      stan_file[grep('// basis coefficients', stan_file) + 2] <- paste0(\n        b_raw_text,\n        collapse = '\\n'\n      )\n      stan_file <- readLines(textConnection(stan_file), n = -1)\n\n      # If no random effects, betas are equal to beta_raws\n    } else {\n      stan_file[grep('// basis coefficients', stan_file) + 2] <-\n        paste0('\\nfor (i in ', '1:num_basis) {\\nb[i] = b_raw[i];\\n}')\n      stan_file <- readLines(textConnection(stan_file), n = -1)\n    }\n\n    # Update parametric effect priors\n    if (any(grep('// parametric effect', stan_file))) {\n      # Get indices of parametric effects\n      smooth_labs <- do.call(\n        rbind,\n        lapply(seq_along(ss_gam$smooth), function(x) {\n          data.frame(\n            label = ss_gam$smooth[[x]]$label,\n            term = paste(ss_gam$smooth[[x]]$term, collapse = ','),\n            class = class(ss_gam$smooth[[x]])[1]\n          )\n        })\n      )\n      lpmat <- predict(ss_gam, type = 'lpmatrix', exclude = smooth_labs$label)\n      para_indices <- which(apply(lpmat, 2, function(x) !all(x == 0)) == TRUE)\n\n      # min_paras <- as.numeric(sub('.*(?=.$)', '',\n      #                             sub(\"\\\\:.*\", \"\",\n      #                                 stan_file[grep('// parametric effect', stan_file) + 1]),\n      #                             perl=T))\n      # max_paras <- as.numeric(substr(sub(\".*\\\\:\", \"\",\n      #                                    stan_file[grep('// parametric effect', stan_file) + 1]),\n      #                                1, 1))\n      # para_indices <- seq(min_paras, max_paras)\n\n      # Get names of parametric terms\n      # int_included <- attr(ss_gam$pterms, 'intercept') == 1L\n      # other_pterms <- attr(ss_gam$pterms, 'term.labels')\n      # all_paras <- other_pterms\n      # if(int_included){\n      #   all_paras <- c('(Intercept)', all_paras)\n      # }\n      all_paras <- names(para_indices)\n\n      # Create prior lines for parametric terms\n      para_lines <- vector()\n      for (i in seq_along(all_paras)) {\n        para_lines[i] <- paste0(\n          '// prior for ',\n          all_paras[i],\n          '...\\n',\n          'b_raw[',\n          para_indices[i],\n          '] ~ student_t(3, 0, 2);\\n'\n        )\n      }\n\n      stan_file <- stan_file[-(grep('// parametric effect', stan_file) + 1)]\n      stan_file[grep('// parametric effect', stan_file)] <-\n        paste0(paste(para_lines, collapse = '\\n'))\n      stan_file <- readLines(textConnection(stan_file), n = -1)\n    }\n\n    # Check for shared smoothing parameters and link them accordingly\n    if ('L' %in% names(jags_data)) {\n      stan_file[grep(\n        'lambda ~ normal',\n        stan_file,\n        fixed = TRUE\n      )] <- \"lambda_raw ~ normal(30, 25);\"\n\n      stan_file[grep(\n        \"vector<lower=0>[n_sp] lambda;\",\n        stan_file,\n        fixed = TRUE\n      )] <- \"vector<lower=0>[n_raw_sp] lambda_raw;\"\n\n      stan_file[grep(\n        '// GAM contribution to expectations',\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"// GAM contribution to expectations (log scale)\\n// linked smoothing parameters\\nvector[n_sp] lambda;\\n\"\n\n      stan_file[grep('model {', stan_file, fixed = TRUE) - 2] <-\n        'lambda = to_vector(lambda_links * lambda_raw);\\n}\\n'\n\n      stan_file <- readLines(textConnection(stan_file), n = -1)\n    }\n  } else {\n    ## No smooths included\n    smooths_included <- FALSE\n    stan_file <- stan_file[\n      -grep('// priors for smoothing parameters', stan_file, fixed = TRUE)\n    ]\n    stan_file <- stan_file[-grep('lambda ~ normal', stan_file, fixed = TRUE)]\n    stan_file <- stan_file[-grep('vector[n_sp] rho', stan_file, fixed = TRUE)]\n    stan_file <- stan_file[-grep('rho = log', stan_file, fixed = TRUE)]\n    stan_file <- stan_file[\n      -grep('// smoothing parameters', stan_file, fixed = TRUE)\n    ]\n    stan_file <- stan_file[-grep('[n_sp] lambda', stan_file, fixed = TRUE)]\n\n    stan_file[grep('// basis coefficients', stan_file) + 2] <-\n      paste0('\\nfor (i in ', '1:num_basis) {\\nb[i] = b_raw[i];\\n}\\n')\n\n    if (any(grep('## parametric effect priors', jags_file))) {\n      # Get indices of parametric effects\n      smooth_labs <- do.call(\n        rbind,\n        lapply(seq_along(ss_gam$smooth), function(x) {\n          data.frame(\n            label = ss_gam$smooth[[x]]$label,\n            term = paste(ss_gam$smooth[[x]]$term, collapse = ','),\n            class = class(ss_gam$smooth[[x]])[1]\n          )\n        })\n      )\n      lpmat <- predict(ss_gam, type = 'lpmatrix', exclude = smooth_labs$label)\n      para_indices <- which(apply(lpmat, 2, function(x) !all(x == 0)) == TRUE)\n      all_paras <- names(para_indices)\n      # min_paras <- as.numeric(sub('.*(?=.$)', '',\n      #                             sub(\"\\\\:.*\", \"\",\n      #                                 jags_file[grep('## parametric effect', jags_file) + 1]), perl=T))\n      # max_paras <- as.numeric(substr(sub(\".*\\\\:\", \"\",\n      #                                    jags_file[grep('## parametric effect', jags_file) + 1]),\n      #                                1, 1))\n      # para_indices <- seq(min_paras, max_paras)\n      #\n      # # Get names of parametric terms\n      # int_included <- attr(ss_gam$pterms, 'intercept') == 1L\n      # other_pterms <- attr(ss_gam$pterms, 'term.labels')\n      # all_paras <- other_pterms\n      # if(int_included){\n      #   all_paras <- c('(Intercept)', all_paras)\n      # }\n\n      # Create prior lines for parametric terms\n      para_lines <- vector()\n      for (i in seq_along(all_paras)) {\n        para_lines[i] <- paste0(\n          '// prior for ',\n          all_paras[i],\n          '...\\n',\n          'b_raw[',\n          para_indices[i],\n          '] ~ student_t(3, 0, 2);\\n'\n        )\n      }\n\n      stan_file[grep('##insert smooths', stan_file)] <-\n        paste0(paste(para_lines, collapse = '\\n'))\n      stan_file <- readLines(textConnection(stan_file), n = -1)\n    }\n  }\n\n  #### Minor text changes to improve efficiency of Stan code ####\n  #stan_file <- gsub('...', '', stan_file)\n  clean_up <- vector()\n  for (x in 1:length(stan_file)) {\n    clean_up[x] <- stan_file[x - 1] == \"\" & stan_file[x] == \"\"\n  }\n  clean_up[is.na(clean_up)] <- FALSE\n  stan_file <- stan_file[!clean_up]\n\n  # Use as much vectorization as possible for computing predictions\n  stan_file[grep('vector[total_obs] eta;', stan_file, fixed = TRUE)] <-\n    paste0(\n      'vector[total_obs] eta;\\n\\n',\n      '// expectations\\n',\n      'matrix[n, n_series] mus;'\n    )\n  if (any(grepl('trend[i, s]', stan_file))) {\n    stan_file <- sub(\n      'eta[ytimes[i, s]] + trend[i, s]',\n      'mus[i, s]',\n      stan_file,\n      fixed = TRUE\n    )\n\n    stan_file[grep('model {', stan_file, fixed = TRUE) - 2] <-\n      paste0(\n        '\\nfor(s in 1:n_series){\\n',\n        'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n        '}\\n',\n        '}'\n      )\n  } else {\n    stan_file <- sub('eta[ytimes[i, s]]', 'mus[i, s]', stan_file, fixed = TRUE)\n\n    stan_file[grep('model {', stan_file, fixed = TRUE) - 2] <-\n      paste0(\n        '\\nfor(s in 1:n_series){\\n',\n        'mus[1:n, s] = eta[ytimes[1:n, s]];\\n',\n        '}\\n',\n        '}'\n      )\n  }\n\n  stan_file <-\n    stan_file[-(grep('// posterior predictions', stan_file, fixed = TRUE) + 1)]\n  stan_file <-\n    stan_file[-(grep('// posterior predictions', stan_file, fixed = TRUE) + 4)]\n  stan_file[grep('ypred[i, s] =', stan_file, fixed = TRUE)] <-\n    gsub(\n      'i, s',\n      '1:n, s',\n      stan_file[grep('ypred[i, s] =', stan_file, fixed = TRUE)]\n    )\n  stan_file[grep('matrix[n, n_series] ypred;', stan_file, fixed = TRUE)] <-\n    'array[n, n_series] int ypred;'\n\n  # Remove un-needed loops for transformed beta parameters\n  b_i_indices <- grep('b[i] = ', stan_file, fixed = TRUE)\n  if (length(b_i_indices > 0)) {\n    for (x in b_i_indices) {\n      i_text <- paste0(\n        as.numeric(sub(\"for \\\\(i in \", \"\", sub(\"\\\\:.*\", \"\", stan_file[x - 1]))),\n        ':',\n        sub(\n          \" \",\n          \"\",\n          sub(\"\\\\{\", \"\", sub(\"\\\\)\", \"\", sub(\".*\\\\:\", \"\", stan_file[x - 1])))\n        )\n      )\n      stan_file[x] <-\n        paste0(gsub(\n          '[i]',\n          paste0('[', i_text, ']'),\n          stan_file[x],\n          fixed = TRUE\n        ))\n    }\n    stan_file <- stan_file[-c(b_i_indices - 1, b_i_indices + 1)]\n  }\n\n  # Remove un-needed loop for random effect priors\n  b_i_indices <- grep('// prior (non-centred) for', stan_file, fixed = TRUE)\n  if (length(b_i_indices > 0)) {\n    for (x in b_i_indices) {\n      x = x + 2\n      i_text <- paste0(\n        as.numeric(sub(\"for \\\\(i in \", \"\", sub(\"\\\\:.*\", \"\", stan_file[x - 1]))),\n        ':',\n        sub(\n          \" \",\n          \"\",\n          sub(\"\\\\{\", \"\", sub(\"\\\\)\", \"\", sub(\".*\\\\:\", \"\", stan_file[x - 1])))\n        )\n      )\n      stan_file[x] <-\n        paste0(gsub(\n          '[i]',\n          paste0('[', i_text, ']'),\n          stan_file[x],\n          fixed = TRUE\n        ))\n    }\n    stan_file <- stan_file[-c(b_i_indices + 1, b_i_indices + 3)]\n  }\n\n  # Replace any normal(0, 1) with std_normal() for faster computation\n  stan_file <- readLines(textConnection(stan_file), n = -1)\n  stan_file <- gsub('normal(0, 1)', 'std_normal()', stan_file, fixed = TRUE)\n\n  # Change b to b_raw for any idx normals\n  if (any(grep('for (i in idx', stan_file, fixed = TRUE))) {\n    lines_matching <- grep('for (i in idx', stan_file, fixed = TRUE)\n    for (i in lines_matching) {\n      stan_file[i] <- gsub('\\\\bb\\\\b', 'b_raw', stan_file[i])\n    }\n  }\n\n  # Final tidying of the Stan model for readability\n  unlink('base_gam_stan.txt')\n  stan_file <- readLines(textConnection(stan_file), n = -1)\n  clean_up <- vector()\n  for (x in 1:length(stan_file)) {\n    clean_up[x] <- stan_file[x - 1] == \"\" & stan_file[x] == \"\"\n  }\n  clean_up[is.na(clean_up)] <- FALSE\n  stan_file <- stan_file[!clean_up]\n\n  #### Modify the Stan data list ####\n  # Create matrix representing whether an observation was missing or not\n  y_observed <- matrix(NA, ncol = NCOL(jags_data$y), nrow = NROW(jags_data$y))\n  for (i in 1:dim(jags_data$y)[1]) {\n    for (s in 1:dim(jags_data$y)[2]) {\n      if (is.na(jags_data$y[i, s])) {\n        y_observed[i, s] = 0\n      } else {\n        y_observed[i, s] = 1\n      }\n    }\n  }\n\n  # Use -1 for any missing observations so Stan doesn't throw errors due to NAs\n  y <- jags_data$y\n  y[is.na(y)] <- -1\n\n  # The data list for Stan\n  stan_data <- jags_data\n  stan_data$y <- y\n  stan_data$y_observed <- y_observed\n  stan_data$X <- t(stan_data$X)\n  stan_data$total_obs <- NCOL(stan_data$X)\n  stan_data$num_basis <- NROW(stan_data$X)\n\n  if (\n    any(grepl('// priors for smoothing parameters', stan_file, fixed = TRUE))\n  ) {\n    if ('L' %in% names(jags_data)) {\n      stan_data$lambda_links <- jags_data$L\n      stan_data$L <- NULL\n      stan_data$n_raw_sp <- NCOL(stan_data$lambda_links)\n      stan_data$n_sp <- NROW(stan_data$lambda_links)\n    } else {\n      stan_data$n_sp <- as.numeric(sub(\n        '\\\\) \\\\{',\n        '',\n        sub(\n          'for \\\\(i in 1\\\\:',\n          '',\n          jags_file[grep('lambda\\\\[i\\\\] ~ ', trimws(jags_file)) - 1]\n        )\n      ))\n    }\n  }\n\n  # Add discontiguous index values if required\n  if (add_idxs) {\n    names(idx_vals) <- paste0('idx', seq_len(length(idx_vals)))\n    stan_data <- append(stan_data, idx_vals)\n  }\n\n  # Add parametric prior means and precisions if required\n  # if('p_taus' %in% names(jags_data)){\n  #   stan_data$p_coefs <- array(jags_data$p_coefs, dim = length(jags_data$p_taus))\n  #   stan_data$p_taus <- array(jags_data$p_taus, dim = length(jags_data$p_taus))\n  # }\n\n  # Add bounds if required\n  if (!is.null(upper_bounds)) {\n    stan_data$U <- upper_bounds\n  }\n\n  return(list(\n    stan_file = stan_file,\n    model_data = stan_data,\n    smooths_included = smooths_included\n  ))\n}\n"
  },
  {
    "path": "R/add_trend_lines.R",
    "content": "#' Latent trend model file modifications\n#'\n#'\n#' @noRd\n#' @param model_file A template `JAGS` or `Stan` model file to be modified\n#' @param stan Logical (convert existing `JAGS` model to a `Stan` model?)\n#' @param use_lv Logical (use latent variable trends or not)\n#' @param trend_model The type of trend model to be added to the model file\n#' @param drift Logical (add drift or not)\n#' @return A modified `JAGS` or `Stan` model file\nadd_trend_lines = function(\n  model_file,\n  stan = FALSE,\n  use_lv,\n  trend_model,\n  drift\n) {\n  if (use_lv & trend_model == 'None') {\n    trend_model <- 'RW'\n  }\n\n  # Add in necessary trend structure\n  if (stan) {\n    if (trend_model == 'None') {\n      model_file <- model_file[\n        -c(\n          (grep('// raw basis', model_file) + 3):(grep(\n            '// raw basis',\n            model_file\n          ) +\n            7)\n        )\n      ]\n      model_file <- model_file[\n        -c(\n          (grep('// priors for latent trend', model_file)):(grep(\n            '// priors for latent trend',\n            model_file\n          ) +\n            2)\n        )\n      ]\n      model_file <- model_file[\n        -c(\n          (grep('// trend estimates', model_file)):(grep(\n            '// trend estimates',\n            model_file\n          ) +\n            3)\n        )\n      ]\n      model_file <- model_file[\n        -c(\n          (grepws('trend[2:n', model_file, fixed = T) - 1):(grepws(\n            'trend[2:n',\n            model_file,\n            fixed = T\n          ) +\n            1)\n        )\n      ]\n\n      model_file[grepws('y[i, s] ~', model_file, fixed = T)] <-\n        'y[i, s] ~ poisson_log(eta[ytimes[i, s]]);'\n\n      model_file[grepws('ypred[i, s] =', model_file, fixed = T)] <-\n        \"ypred[i, s] = poisson_log_rng(eta[ytimes[i, s]]);\"\n\n      model_file <- model_file[\n        -c(\n          (grepws('tau[s] = pow(sigma[s], -2.0);', model_file, fixed = TRUE) -\n            1):(grepws(\n            'tau[s] = pow(sigma[s], -2.0);',\n            model_file,\n            fixed = TRUE\n          ) +\n            1)\n        )\n      ]\n      model_file <- model_file[\n        -grepws('vector[n_series] tau', model_file, fixed = T)\n      ]\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (trend_model == 'GP') {\n      hilbert_approx = T\n      if (hilbert_approx) {\n        if (use_lv) {\n          model_file <- model_file[\n            -c(\n              (grep('// raw basis', model_file) + 3):(grep(\n                '// raw basis',\n                model_file\n              ) +\n                5)\n            )\n          ]\n\n          model_file <- model_file[\n            -c(\n              (grep('// dynamic factor estimates', model_file)):(grep(\n                '// dynamic factor estimates',\n                model_file\n              ) +\n                8)\n            )\n          ]\n\n          model_file[grep('transformed data {', model_file, fixed = TRUE)] <-\n            paste0(\n              'transformed data {\\n',\n              'vector<lower=1>[n] times;\\n',\n              'vector[n] times_cent;\\n',\n              'real mean_times;\\n',\n              'real<lower=0> boundary;\\n',\n              'int<lower=1> num_gp_basis;\\n',\n              'num_gp_basis = min(20, n);\\n',\n              'matrix[n, num_gp_basis] gp_phi;\\n\\n',\n              'for (t in 1:n){\\n',\n              'times[t] = t;\\n',\n              '}\\n\\n',\n              'mean_times = mean(times);\\n',\n              'times_cent = times - mean_times;\\n',\n              'boundary = (5.0/4) * (max(times_cent) - min(times_cent));\\n',\n              'for (m in 1:num_gp_basis){\\n',\n              'gp_phi[,m] = phi_SE(boundary, m, times_cent);\\n',\n              '}\\n'\n            )\n\n          model_file[grep('##insert data', model_file) - 1] <-\n            paste0(\n              'functions {\\n',\n              '/* Spectral density GP eigenvalues*/\\n',\n              '/* see Riutort-Mayol et al 2023 for details (https://doi.org/10.1007/s11222-022-10167-2)*/\\n',\n              'real lambda_gp(real L, int m) {\\n',\n              'real lam;\\n',\n              'lam = ((m*pi())/(2*L))^2;\\n',\n              'return lam;\\n',\n              '}\\n\\n',\n              '/* Spectral density GP eigenfunctions*/\\n',\n              '/* see Riutort-Mayol et al 2023 for details (https://doi.org/10.1007/s11222-022-10167-2)*/\\n',\n              'vector phi_SE(real L, int m, vector x) {\\n',\n              'vector[rows(x)] fi;\\n',\n              'fi = 1/sqrt(L) * sin(m*pi()/(2*L) * (x+L));\\n',\n              'return fi;\\n',\n              '}\\n\\n',\n              '/* Spectral density squared exponential Gaussian Process*/\\n',\n              '/* see Riutort-Mayol et al 2023 for details (https://doi.org/10.1007/s11222-022-10167-2)*/\\n',\n              'real spd_SE(real alpha, real rho, real w) {\\n',\n              'real S;\\n',\n              'S = (alpha^2) * sqrt(2*pi()) * rho * exp(-0.5*(rho^2)*(w^2));\\n',\n              'return S;\\n',\n              '}\\n}\\n'\n            )\n\n          model_file <- readLines(textConnection(model_file), n = -1)\n\n          model_file[\n            grep('// dynamic factor lower triangle', model_file) + 3\n          ] <-\n            paste0(\n              '// gp parameters\\n',\n              'vector<lower=0>[n_lv] rho_gp;\\n\\n',\n              '// gp coefficient weights\\n',\n              'matrix[num_gp_basis, n_lv] b_gp;\\n',\n              '// smoothing parameters\\n'\n            )\n\n          model_file[\n            grep('vector[total_obs] eta;', model_file, fixed = TRUE) + 1\n          ] <-\n            paste0(\n              '\\n// gp spectral densities\\n',\n              'matrix[n, n_lv] LV_raw;\\n',\n              'matrix[num_gp_basis, n_lv] diag_SPD;\\n',\n              'matrix[num_gp_basis, n_lv] SPD_beta;\\n'\n            )\n\n          model_file[grep('eta = to_vector', model_file) + 1] <-\n            paste0(\n              '\\n// gp LV estimates',\n              '\\nfor (m in 1:num_gp_basis){\\n',\n              'for (s in 1:n_lv){\\n',\n              'diag_SPD[m, s] = sqrt(spd_SE(0.25, rho_gp[s], sqrt(lambda_gp(boundary, m))));\\n',\n              '}\\n}\\n',\n              'SPD_beta = diag_SPD .* b_gp;\\n',\n              'LV_raw = gp_phi * SPD_beta;\\n}\\n'\n            )\n\n          rho_line <- 'rho_gp ~ inv_gamma(1.499007, 5.670433);\\n'\n\n          model_file[\n            grep('// priors for dynamic factor loading', model_file) - 1\n          ] <-\n            paste0(\n              '\\n// priors for gp parameters\\n',\n              'for (s in 1:n_lv){\\n',\n              'b_gp[1:num_gp_basis, s] ~ normal(0, 1);\\n',\n              '}\\n',\n              rho_line\n            )\n\n          model_file <- readLines(textConnection(model_file), n = -1)\n\n          model_file[grep('vector[n_lv] penalty;', model_file, fixed = TRUE)] <-\n            'vector[n_lv] alpha_gp;'\n          model_file[grep(\n            'penalty = rep_vector(100.0, n_lv);',\n            model_file,\n            fixed = TRUE\n          )] <-\n            'alpha_gp = rep_vector(0.25, n_lv);'\n\n          model_file <- model_file[\n            -c(\n              (grep('// derived latent trends', model_file)):(grep(\n                '// derived latent trends',\n                model_file\n              ) +\n                5)\n            )\n          ]\n\n          model_file[grep(\n            'LV_raw = gp_phi * SPD_beta;',\n            model_file,\n            fixed = TRUE\n          )] <-\n            paste0(\n              'LV_raw = gp_phi * SPD_beta;\\n',\n              '// derived latent trends\\n',\n              'for (i in 1:n){\\n',\n              'for (s in 1:n_series){\\n',\n              'trend[i, s] = dot_product(lv_coefs_raw[s,], LV_raw[i,1:n_lv]);\\n',\n              '}\\n}\\n'\n            )\n\n          model_file <- readLines(textConnection(model_file), n = -1)\n        } else {\n          model_file <- model_file[\n            -c(\n              (grep('// raw basis', model_file) + 3):(grep(\n                '// raw basis',\n                model_file\n              ) +\n                5)\n            )\n          ]\n\n          model_file <- model_file[\n            -c(\n              (grep('// priors for latent trend', model_file)):(grep(\n                '// priors for latent trend',\n                model_file\n              ) +\n                2)\n            )\n          ]\n\n          model_file <- model_file[\n            -c(\n              (grep('// trend estimates', model_file)):(grep(\n                '// trend estimates',\n                model_file\n              ) +\n                3)\n            )\n          ]\n          model_file <- model_file[\n            -c(\n              (grep('trend[2:n', model_file, fixed = T) - 1):(grep(\n                'trend[2:n',\n                model_file,\n                fixed = T\n              ) +\n                1)\n            )\n          ]\n          model_file <- model_file[\n            -c(\n              (grep('tau[s] = pow(sigma[s], -2.0);', model_file, fixed = TRUE) -\n                1):(grep(\n                'tau[s] = pow(sigma[s], -2.0);',\n                model_file,\n                fixed = TRUE\n              ) +\n                1)\n            )\n          ]\n          model_file <- model_file[\n            -grep('vector[n_series] tau', model_file, fixed = T)\n          ]\n          model_file[grep('##insert data', model_file) + 1] <-\n            paste0(\n              'transformed data {\\n',\n              'vector<lower=1>[n] times;\\n',\n              'vector[n] times_cent;\\n',\n              'real mean_times;\\n',\n              'real<lower=0> boundary;\\n',\n              'int<lower=1> num_gp_basis;\\n',\n              'num_gp_basis = min(20, n);\\n',\n              'matrix[n, num_gp_basis] gp_phi;\\n\\n',\n              'for (t in 1:n){\\n',\n              'times[t] = t;\\n',\n              '}\\n\\n',\n              'mean_times = mean(times);\\n',\n              'times_cent = times - mean_times;\\n',\n              'boundary = (5.0/4) * (max(times_cent) - min(times_cent));\\n',\n              'for (m in 1:num_gp_basis){\\n',\n              'gp_phi[,m] = phi_SE(boundary, m, times_cent);\\n',\n              '}\\n}\\n\\n',\n              'parameters {'\n            )\n\n          model_file[grep('##insert data', model_file) - 1] <-\n            paste0(\n              'functions {\\n',\n              '/* Spectral density GP eigenvalues*/\\n',\n              '/* see Riutort-Mayol et al 2023 for details (https://doi.org/10.1007/s11222-022-10167-2)*/\\n',\n              'real lambda_gp(real L, int m) {\\n',\n              'real lam;\\n',\n              'lam = ((m*pi())/(2*L))^2;\\n',\n              'return lam;\\n',\n              '}\\n\\n',\n              '/* Spectral density GP eigenfunctions*/\\n',\n              '/* see Riutort-Mayol et al 2023 for details (https://doi.org/10.1007/s11222-022-10167-2)*/\\n',\n              'vector phi_SE(real L, int m, vector x) {\\n',\n              'vector[rows(x)] fi;\\n',\n              'fi = 1/sqrt(L) * sin(m*pi()/(2*L) * (x+L));\\n',\n              'return fi;\\n',\n              '}\\n\\n',\n              '/* Spectral density squared exponential Gaussian Process*/\\n',\n              '/* see Riutort-Mayol et al 2023 for details (https://doi.org/10.1007/s11222-022-10167-2)*/\\n',\n              'real spd_SE(real alpha, real rho, real w) {\\n',\n              'real S;\\n',\n              'S = (alpha^2) * sqrt(2*pi()) * rho * exp(-0.5*(rho^2)*(w^2));\\n',\n              'return S;\\n',\n              '}\\n}\\n'\n            )\n\n          model_file[grep('// latent trends', model_file) + 2] <-\n            paste0(\n              '// gp parameters\\n',\n              'vector<lower=0>[n_series] alpha_gp;\\n',\n              'vector<lower=0>[n_series] rho_gp;\\n\\n',\n              '// gp coefficient weights\\n',\n              'matrix[num_gp_basis, n_series] b_gp;\\n'\n            )\n\n          model_file <- model_file[\n            -c(\n              grep('// latent trends', model_file):(grep(\n                '// latent trends',\n                model_file\n              ) +\n                1)\n            )\n          ]\n\n          model_file[\n            grep('vector[total_obs] eta;', model_file, fixed = TRUE) + 1\n          ] <-\n            paste0(\n              '\\n// gp spectral densities\\n',\n              'matrix[n, n_series] trend;\\n',\n              'matrix[num_gp_basis, n_series] diag_SPD;\\n',\n              'matrix[num_gp_basis, n_series] SPD_beta;\\n'\n            )\n\n          model_file[grep('eta = to_vector', model_file) + 1] <-\n            paste0(\n              '\\n// gp trend estimates',\n              '\\nfor (m in 1:num_gp_basis){\\n',\n              'for (s in 1:n_series){\\n',\n              'diag_SPD[m, s] = sqrt(spd_SE(alpha_gp[s], rho_gp[s], sqrt(lambda_gp(boundary, m))));\\n',\n              '}\\n}\\n',\n              'SPD_beta = diag_SPD .* b_gp;\\n',\n              'trend = gp_phi * SPD_beta;\\n}\\n'\n            )\n\n          rho_line <- 'rho_gp ~ inv_gamma(1.499007, 5.670433);\\n'\n          alpha_line <- 'alpha_gp ~ normal(0, 0.5);\\n'\n\n          model_file[grep('// likelihood functions', model_file) - 1] <-\n            paste0(\n              '\\n// priors for gp parameters\\n',\n              'for (s in 1:n_series){\\n',\n              'b_gp[1:num_gp_basis, s] ~ normal(0, 1);\\n',\n              '}\\n',\n              alpha_line,\n              rho_line\n            )\n\n          model_file <- readLines(textConnection(model_file), n = -1)\n        }\n\n        # If not Hilbert approx\n      } else {\n        model_file <- model_file[\n          -c(\n            (grep('// raw basis', model_file) + 3):(grep(\n              '// raw basis',\n              model_file\n            ) +\n              5)\n          )\n        ]\n\n        model_file <- model_file[\n          -c(\n            (grep('// priors for latent trend', model_file)):(grep(\n              '// priors for latent trend',\n              model_file\n            ) +\n              2)\n          )\n        ]\n\n        model_file <- model_file[\n          -c(\n            (grep('// trend estimates', model_file)):(grep(\n              '// trend estimates',\n              model_file\n            ) +\n              3)\n          )\n        ]\n        model_file <- model_file[\n          -c(\n            (grep('trend[2:n', model_file, fixed = T) - 1):(grep(\n              'trend[2:n',\n              model_file,\n              fixed = T\n            ) +\n              1)\n          )\n        ]\n        model_file <- model_file[\n          -c(\n            (grep('tau[s] = pow(sigma[s], -2.0);', model_file, fixed = TRUE) -\n              1):(grep(\n              'tau[s] = pow(sigma[s], -2.0);',\n              model_file,\n              fixed = TRUE\n            ) +\n              1)\n          )\n        ]\n        model_file <- model_file[\n          -grep('vector[n_series] tau', model_file, fixed = T)\n        ]\n        model_file[grep('##insert data', model_file) + 1] <-\n          paste0(\n            'transformed data {\\n',\n            'real times[n];\\n',\n            'for (t in 1:n)\\n',\n            'times[t] = t;\\n',\n            '}\\n\\n',\n            'parameters {'\n          )\n\n        model_file[grep('// latent trends', model_file) + 1] <-\n          paste0(\n            'vector<lower=0>[n_series] alpha_gp;\\n',\n            'vector<lower=0>[n_series] rho_gp;\\n',\n            'vector[n] gp_std;\\n'\n          )\n\n        model_file[grep('// basis coefficients', model_file) + 2] <-\n          paste0(\n            '\\n\\n// gp estimates\\n',\n            'matrix[n, n_series] trend;\\n',\n            'for (s in 1:n_series) {\\n',\n            '// gp covariance matrices\\n',\n            'matrix[n, n] cov;\\n',\n            'matrix[n, n] L_cov;\\n',\n            'cov = cov_exp_quad(times, alpha_gp[s], rho_gp[s]) + diag_matrix(rep_vector(1e-10, n));\\n',\n            'L_cov = cholesky_decompose(cov);\\n',\n            '// non-centred parameterisation\\n',\n            'trend[1:n, s] = to_vector(L_cov * gp_std);\\n',\n            '}\\n'\n          )\n\n        model_file[\n          grep('// priors for smoothing parameters', model_file) + 2\n        ] <-\n          paste0(\n            '\\n// priors for gp parameters\\n',\n            'to_vector(gp_std) ~ normal(0, 1);\\n',\n            'alpha_gp ~ normal(0, 0.5);\\n',\n            'rho_gp ~ inv_gamma(1.499007, 5.670433);\\n'\n          )\n\n        model_file <- readLines(textConnection(model_file), n = -1)\n      }\n    }\n\n    if (trend_model == 'RW') {\n      if (drift) {\n        if (use_lv) {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent factor drift terms\\nvector[n_lv] drift;\\n'\n            )\n          model_file[grep('LV_raw[1, j] ~ ', model_file, fixed = T)] <-\n            \"LV_raw[1, j] ~ normal(0, 0.1);\"\n\n          model_file[grep('// dynamic factor estimates', model_file) + 6] <-\n            paste0(\n              'LV_raw[2:n, j] ~ normal(drift[j]*(n - 1) + LV_raw[1:(n - 1), j], 0.1);'\n            )\n        } else {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent trend drift terms\\nvector[n_series] drift;\\n'\n            )\n          model_file[grep('trend[1, s] ~ ', model_file, fixed = T)] <-\n            \"trend[1, s] ~ normal(0, sigma[s]);\"\n\n          model_file[grep('// trend estimates', model_file) + 6] <-\n            paste0(\n              'trend[2:n, s] ~ normal(drift[s]*(n - 1) + trend[1:(n - 1), s], sigma[s]);'\n            )\n        }\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0('\\n// priors for trend parameters\\ndrift ~ normal(0, 0.1);\\n')\n\n        model_file <- readLines(textConnection(model_file), n = -1)\n      }\n    }\n\n    if (trend_model == 'CAR1') {\n      if (use_lv) {\n        model_file[grep('// raw basis', model_file) + 1] <-\n          paste0(\n            'row_vector[num_basis] b_raw;\\n\\n// latent factor AR1 terms\\nvector<lower=0,upper=1>[n_lv] ar1;'\n          )\n\n        model_file[grep('// dynamic factor estimates', model_file) + 6] <-\n          paste0('LV_raw[2:n, j] ~ normal(ar1[j] * LV_raw[1:(n - 1), j], 0.1);')\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0('\\n// priors for AR parameters\\nar1 ~ std_normal();\\n')\n      } else {\n        model_file[grep('// raw basis', model_file) + 1] <-\n          paste0(\n            'row_vector[num_basis] b_raw;\\n\\n// latent trend AR1 terms\\nvector<lower=0,upper=1>[n_series] ar1;'\n          )\n\n        model_file[grep('// trend estimates', model_file) + 6] <-\n          paste0(\n            'trend[2:n, s] ~ normal(ar1[s] * trend[1:(n - 1), s], sigma[s]);'\n          )\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0('\\n// priors for AR parameters\\nar1 ~ std_normal();\\n')\n      }\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (trend_model == 'AR1') {\n      if (drift) {\n        if (use_lv) {\n          model_file[grepws('// raw basis', model_file) + 1] <-\n            paste0(\n              c(\n                'row_vector[num_basis] b_raw;\\n\\n// latent factor AR1 terms\\nvector<lower=-1,upper=1>[n_lv] ar1;\\n\\n'\n              ),\n              '// latent factor drift terms\\nvector[n_lv] drift;'\n            )\n\n          model_file[grepws('LV_raw[1, j] ~ ', model_file, fixed = T)] <-\n            \"LV_raw[1, j] ~ normal(0, 0.1);\"\n\n          model_file[grepws('// dynamic factor estimates', model_file) + 6] <-\n            paste0(\n              'LV_raw[2:n, j] ~ normal(drift[j]*(n - 1) + ar1[j] * LV_raw[1:(n - 1), j], 0.1);'\n            )\n        } else {\n          model_file[grepws('// raw basis', model_file) + 1] <-\n            paste0(\n              c(\n                'row_vector[num_basis] b_raw;\\n\\n// latent trend AR1 terms\\nvector<lower=-1,upper=1>[n_series] ar1;\\n\\n'\n              ),\n              '// latent trend drift terms\\nvector[n_series] drift;'\n            )\n\n          model_file[grepws('trend[1, s] ~ ', model_file, fixed = T)] <-\n            \"trend[1, s] ~ normal(0, sigma[s]);\"\n\n          model_file[grep('// trend estimates', model_file) + 6] <-\n            paste0(\n              'trend[2:n, s] ~ normal(drift[s]*(n - 1) + ar1[s] * trend[1:(n - 1), s], sigma[s]);'\n            )\n        }\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0(\n            '\\n// priors for AR parameters\\nar1 ~ std_normal();\\ndrift ~ std_normal();\\n'\n          )\n      } else {\n        if (use_lv) {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent factor AR1 terms\\nvector<lower=-1,upper=1>[n_lv] ar1;'\n            )\n\n          model_file[grep('// dynamic factor estimates', model_file) + 6] <-\n            paste0(\n              'LV_raw[2:n, j] ~ normal(ar1[j] * LV_raw[1:(n - 1), j], 0.1);'\n            )\n\n          model_file[grep('model \\\\{', model_file) + 2] <-\n            paste0('\\n// priors for AR parameters\\nar1 ~ std_normal();\\n')\n        } else {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent trend AR1 terms\\nvector<lower=-1,upper=1>[n_series] ar1;'\n            )\n\n          model_file[grep('// trend estimates', model_file) + 6] <-\n            paste0(\n              'trend[2:n, s] ~ normal(ar1[s] * trend[1:(n - 1), s], sigma[s]);'\n            )\n\n          model_file[grep('model \\\\{', model_file) + 2] <-\n            paste0('\\n// priors for AR parameters\\nar1 ~ std_normal();\\n')\n        }\n      }\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (trend_model == 'AR2') {\n      if (drift) {\n        if (use_lv) {\n          model_file[grepws('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent factor AR1 terms\\nvector<lower=-1,upper=1>[n_lv] ar1;\\n\\n',\n              '// latent factor AR2 terms\\nvector<lower=-1,upper=1>[n_lv] ar2;\\n\\n',\n              '// latent factor drift terms\\nvector[n_lv] drift;'\n            )\n\n          model_file[grepws('LV_raw[1, j] ~ ', model_file, fixed = T)] <-\n            \"LV_raw[1, j] ~ normal(0, 0.1);\"\n\n          model_file <- model_file[\n            -(grep('// dynamic factor estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// dynamic factor estimates', model_file) + 5] <-\n            paste0(\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[2, j] ~ normal(drift[j] + LV_raw[1, j] * ar1[j], 0.1);\\n',\n              '}\\n\\n',\n              'for (i in 3:n) {\\n',\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[i, j] ~ normal(drift[j]*(i - 1) + ar1[j] * LV_raw[i - 1, j] + ar2[j] * LV_raw[i - 2, j], 0.1);\\n',\n              '}\\n}\\n'\n            )\n        } else {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent trend AR1 terms\\nvector<lower=-1,upper=1>[n_series] ar1;\\n\\n',\n              '// latent trend AR2 terms\\nvector<lower=-1,upper=1>[n_series] ar2;\\n\\n',\n              '// latent trend drift terms\\nvector[n_series] drift;'\n            )\n\n          model_file[grepws('trend[1, s] ~ ', model_file, fixed = T)] <-\n            \"trend[1, s] ~ normal(0, sigma[s]);\"\n\n          model_file <- model_file[\n            -(grep('// trend estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// trend estimates', model_file) + 5] <-\n            paste0(\n              'for (s in 1:n_series) {\\n',\n              'trend[2, s] ~ normal(drift[s] + trend[1, s] * ar1[s], sigma[s]);\\n',\n              '}\\n\\n',\n              'for (i in 3:n) {\\n',\n              'for (s in 1:n_series) {\\n',\n              'trend[i, s] ~ normal(drift[s]*(i - 1) + ar1[s] * trend[i - 1, s] + ar2[s] * trend[i - 2, s], sigma[s]);\\n',\n              '}\\n}\\n'\n            )\n        }\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0(\n            '\\n// priors for AR parameters\\nar1 ~ std_normal();\\nar2 ~ std_normal();\\ndrift ~ std_normal();\\n'\n          )\n      } else {\n        if (use_lv) {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent factor AR1 terms\\nvector<lower=-1,upper=1>[n_lv] ar1;\\n\\n',\n              '// latent factor AR2 terms\\nvector<lower=-1,upper=1>[n_lv] ar2;'\n            )\n          model_file[grep('// dynamic factor estimates', model_file) + 2] <-\n            paste0('LV_raw[1, j] ~ normal(0, 0.1);')\n\n          model_file <- model_file[\n            -(grep('// dynamic factor estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// dynamic factor estimates', model_file) + 5] <-\n            paste0(\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[2, j] ~ normal(LV_raw[1, j] * ar1[j], 0.1);\\n',\n              '}\\n\\n',\n              'for (i in 3:n) {\\n',\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[i, j] ~ normal(ar1[j] * LV_raw[i - 1, j] + ar2[j] * LV_raw[i - 2, j], 0.1);\\n',\n              '}\\n}\\n'\n            )\n        } else {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent trend AR1 terms\\nvector<lower=-1,upper=1>[n_series] ar1;\\n\\n',\n              '// latent trend AR2 terms\\nvector<lower=-1,upper=1>[n_series] ar2;'\n            )\n          model_file[grep('// trend estimates', model_file) + 2] <-\n            paste0('trend[1, s] ~ normal(0, sigma[s]);')\n\n          model_file <- model_file[\n            -(grep('// trend estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// trend estimates', model_file) + 5] <-\n            paste0(\n              'for (s in 1:n_series) {\\n',\n              'trend[2, s] ~ normal(trend[1, s] * ar1[s], sigma[s]);\\n',\n              '}\\n\\n',\n              'for (i in 3:n) {\\n',\n              'for (s in 1:n_series) {\\n',\n              'trend[i, s] ~ normal(ar1[s] * trend[i - 1, s] + ar2[s] * trend[i - 2, s], sigma[s]);\\n',\n              '}\\n}\\n'\n            )\n        }\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0(\n            '\\n// priors for AR parameters\\nar1 ~ std_normal();\\nar2 ~ std_normal();\\n'\n          )\n      }\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (trend_model == 'AR3') {\n      if (drift) {\n        if (use_lv) {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent factor AR1 terms\\nvector<lower=-1,upper=1>[n_lv] ar1;\\n\\n',\n              '// latent factor AR2 terms\\nvector<lower=-1,upper=1>[n_lv] ar2;\\n\\n',\n              '// latent factor AR3 terms\\nvector<lower=-1,upper=1>[n_lv] ar3;\\n\\n',\n              '// latent factor drift terms\\nvector[n_lv] drift;'\n            )\n\n          model_file[grep('LV_raw[1, s] ~ ', model_file, fixed = T)] <-\n            \"LV_raw[1, s] ~ normal(0, 0.1);\"\n\n          model_file <- model_file[\n            -(grep('// dynamic factor estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// dynamic factor estimates', model_file) + 5] <-\n            paste0(\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[2, j] ~ normal(drift[j] + LV_raw[1, j] * ar1[j], 0.1);\\n',\n              '}\\n\\n',\n\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[3, j] ~ normal(drift[j]*2 + LV_raw[2, j] * ar1[j] + LV_raw[1, j] * ar2[j], 0.1);\\n',\n              '}\\n\\n',\n\n              'for (i in 4:n) {\\n',\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[i, j] ~ normal(drift[j]*(i - 1) + ar1[j] * LV_raw[i - 1, j] + ar2[j] * LV_raw[i - 2, j] + ar3[j] * LV_raw[i - 3, j], 0.1);\\n',\n              '}\\n}\\n'\n            )\n        } else {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent trend AR1 terms\\nvector<lower=-1,upper=1>[n_series] ar1;\\n\\n',\n              '// latent trend AR2 terms\\nvector<lower=-1,upper=1>[n_series] ar2;\\n\\n',\n              '// latent trend AR3 terms\\nvector<lower=-1,upper=1>[n_series] ar3;\\n\\n',\n              '// latent trend drift terms\\nvector[n_series] drift;'\n            )\n\n          model_file[grep('trend[1, s] ~ ', model_file, fixed = T)] <-\n            \"trend[1, s] ~ normal(0, sigma[s]);\"\n\n          model_file <- model_file[\n            -(grep('// trend estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// trend estimates', model_file) + 5] <-\n            paste0(\n              'for (s in 1:n_series) {\\n',\n              'trend[2, s] ~ normal(drift[s] + trend[1, s] * ar1[s], sigma[s]);\\n',\n              '}\\n\\n',\n\n              'for (s in 1:n_series) {\\n',\n              'trend[3, s] ~ normal(drift[s]*2 + trend[2, s] * ar1[s] + trend[1, s] * ar2[s], sigma[s]);\\n',\n              '}\\n\\n',\n\n              'for (i in 4:n) {\\n',\n              'for (s in 1:n_series) {\\n',\n              'trend[i, s] ~ normal(drift[s]*(i - 1) + ar1[s] * trend[i - 1, s] + ar2[s] * trend[i - 2, s] + ar3[s] * trend[i - 3, s], sigma[s]);\\n',\n              '}\\n}\\n'\n            )\n        }\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0(\n            '\\n// priors for AR parameters\\nar1 ~ std_normal();\\nar2 ~ std_normal();\\nar3 ~ std_normal();\\n',\n            'drift ~ std_normal();\\n'\n          )\n      } else {\n        if (use_lv) {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent factor AR1 terms\\nvector<lower=-1,upper=1>[n_lv] ar1;\\n\\n',\n              '// latent factor AR2 terms\\nvector<lower=-1,upper=1>[n_lv] ar2;\\n\\n',\n              '// latent factor AR3 terms\\nvector<lower=-1,upper=1>[n_lv] ar3;'\n            )\n          model_file[grep('// dynamic factor estimates', model_file) + 2] <-\n            paste0('LV_raw[1, j] ~ normal(0, 0.1);')\n\n          model_file <- model_file[\n            -(grep('// dynamic factor estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// dynamic factor estimates', model_file) + 5] <-\n            paste0(\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[2, j] ~ normal(LV_raw[1, j] * ar1[j], 0.1);\\n',\n              '}\\n\\n',\n\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[3, j] ~ normal(LV_raw[2, j] * ar1[j] + LV_raw[1, j] * ar2[j], 0.1);\\n',\n              '}\\n\\n',\n\n              'for (i in 4:n) {\\n',\n              'for (j in 1:n_lv) {\\n',\n              'LV_raw[i, j] ~ normal(ar1[j] * LV_raw[i - 1, j] + ar2[j] * LV_raw[i - 2, j] + ar3[j] * LV_raw[i - 3, j], 0.1);\\n',\n              '}\\n}\\n'\n            )\n        } else {\n          model_file[grep('// raw basis', model_file) + 1] <-\n            paste0(\n              'row_vector[num_basis] b_raw;\\n\\n// latent trend AR1 terms\\nvector<lower=-1,upper=1>[n_series] ar1;\\n\\n',\n              '// latent trend AR2 terms\\nvector<lower=-1,upper=1>[n_series] ar2;\\n\\n',\n              '// latent trend AR3 terms\\nvector<lower=-1,upper=1>[n_series] ar3;'\n            )\n          model_file[grep('// trend estimates', model_file) + 2] <-\n            paste0('trend[1, s] ~ normal(0, sigma[s]);')\n\n          model_file <- model_file[\n            -(grep('// trend estimates', model_file) + 5:7)\n          ]\n          model_file[grep('// trend estimates', model_file) + 5] <-\n            paste0(\n              'for (s in 1:n_series) {\\n',\n              'trend[2, s] ~ normal(trend[1, s] * ar1[s], sigma[s]);\\n',\n              '}\\n\\n',\n\n              'for (s in 1:n_series) {\\n',\n              'trend[3, s] ~ normal(trend[2, s] * ar1[s] + trend[1, s] * ar2[s], sigma[s]);\\n',\n              '}\\n\\n',\n\n              'for (i in 4:n) {\\n',\n              'for (s in 1:n_series) {\\n',\n              'trend[i, s] ~ normal(ar1[s] * trend[i - 1, s] + ar2[s] * trend[i - 2, s] + ar3[s] * trend[i - 3, s], sigma[s]);\\n',\n              '}\\n}\\n'\n            )\n        }\n\n        model_file[grep('model \\\\{', model_file) + 2] <-\n          paste0(\n            '\\n// priors for AR parameters\\nar1 ~ std_normal();\\nar2 ~ std_normal();\\nar3 ~ std_normal();\\n'\n          )\n      }\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n  } else {\n    # Modify the JAGS model\n    if (trend_model == 'None') {\n      model_file[grep(\n        'mus\\\\[i, s\\\\] <- exp',\n        model_file\n      )] <- 'mus[i, s] <- exp(eta[ytimes[i, s]])'\n      model_file <- model_file[\n        -c(\n          grep('## trend estimates', model_file):(grep(\n            '## trend estimates',\n            model_file\n          ) +\n            27)\n        )\n      ]\n    }\n\n    if (use_lv) {\n      if (trend_model == 'RW') {\n        model_file <- model_file[\n          -c(\n            (grep('## latent factors evolve', model_file) + 6):(grep(\n              '## latent factors evolve',\n              model_file\n            ) +\n              19)\n          )\n        ]\n\n        if (drift) {\n          model_file[grep('## latent factors evolve', model_file) + 5] <-\n            '\\nfor (i in 2:n) {\\nfor (j in 1:n_lv){\\nLV_raw[i, j] ~ dnorm(drift[j]*(n - 1) + LV_raw[i - 1, j], penalty[j])\\n}\\n}\\n'\n        } else {\n          model_file[grep('## latent factors evolve', model_file) + 5] <-\n            '\\nfor (i in 2:n) {\\nfor (j in 1:n_lv){\\nLV_raw[i, j] ~ dnorm(LV_raw[i - 1, j], penalty[j])\\n}\\n}\\n'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n\n        model_file <- readLines(textConnection(model_file), n = -1)\n        model_file <- model_file[\n          -c(\n            (grep('## AR components', model_file)):(grep(\n              '## AR components',\n              model_file\n            ) +\n              5)\n          )\n        ]\n      }\n\n      if (trend_model == 'AR1') {\n        model_file <- model_file[\n          -c(\n            (grep('## latent factors evolve', model_file) + 6):(grep(\n              '## latent factors evolve',\n              model_file\n            ) +\n              12)\n          )\n        ]\n        model_file[grep('## latent factors evolve', model_file) + 7] <-\n          'for (i in 2:n) {'\n        model_file <- model_file[\n          -c(\n            (grep('## latent factors evolve', model_file) + 9):(grep(\n              '## latent factors evolve',\n              model_file\n            ) +\n              10)\n          )\n        ]\n\n        if (drift) {} else {\n          model_file[grep('## latent factors evolve', model_file) + 9] <-\n            'LV_raw[i, j] ~ dnorm(ar1[j]*LV_raw[i - 1, j], penalty[j])\\n}'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n\n        model_file <- readLines(textConnection(model_file), n = -1)\n        model_file <- model_file[-grep('ar2\\\\[s\\\\] ~', model_file)]\n        model_file <- model_file[-grep('ar3\\\\[s\\\\] ~', model_file)]\n      }\n\n      if (trend_model == 'AR2') {\n        model_file <- model_file[\n          -c(\n            (grep('## latent factors evolve', model_file) + 10):(grep(\n              '## latent factors evolve',\n              model_file\n            ) +\n              12)\n          )\n        ]\n        model_file[grep('## latent factors evolve', model_file) + 11] <-\n          'for (i in 3:n) {'\n\n        if (drift) {\n          model_file[grep('## latent factors evolve', model_file) + 14] <-\n            'ar2[j]*LV_raw[i - 2, j], penalty[j])'\n        } else {\n          model_file[grep('## latent factors evolve', model_file) + 7] <-\n            'LV_raw[2, j] ~ dnorm(ar1[j]*LV_raw[1, j], penalty[j])'\n          model_file[grep('## latent factors evolve', model_file) + 13] <-\n            'LV_raw[i, j] ~ dnorm(ar1[j]*LV_raw[i - 1, j] +'\n          model_file[grep('## latent factors evolve', model_file) + 14] <-\n            'ar2[j]*LV_raw[i - 2, j], penalty[j])'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n        model_file <- model_file[-grep('ar3\\\\[s\\\\] ~', model_file)]\n      }\n\n      if (trend_model == 'AR3') {\n        if (drift) {} else {\n          model_file[grep('## latent factors evolve', model_file) + 7] <-\n            'LV_raw[2, j] ~ dnorm(ar1[j]*LV_raw[1, j], penalty[j])'\n          model_file[grep('## latent factors evolve', model_file) + 11] <-\n            'LV_raw[3, j] ~ dnorm(ar1[j]*LV_raw[2, j] + ar2[j]*LV_raw[1, j], penalty[j])'\n          model_file[grep('## latent factors evolve', model_file) + 16] <-\n            'LV_raw[i, j] ~ dnorm(ar1[j]*LV_raw[i - 1, j] +'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n      }\n    }\n\n    if (!use_lv) {\n      if (trend_model == 'RW') {\n        model_file <- model_file[\n          -c(\n            (grep('## trend estimates', model_file) + 4):(grep(\n              '## trend estimates',\n              model_file\n            ) +\n              17)\n          )\n        ]\n\n        if (drift) {\n          model_file[grep('## trend estimates', model_file) + 2] <-\n            \"trend[1, s] ~ dnorm(drift[s], tau[s])\"\n\n          model_file[grep('## trend estimates', model_file) + 4] <-\n            '\\nfor (i in 2:n) {\\nfor (s in 1:n_series){\\ntrend[i, s] ~ dnorm(drift[s]*(i - 1) + trend[i - 1, s], tau[s])\\n}\\n}\\n'\n        } else {\n          model_file[grep('## trend estimates', model_file) + 4] <-\n            '\\nfor (i in 2:n) {\\nfor (s in 1:n_series){\\ntrend[i, s] ~ dnorm(trend[i - 1, s], tau[s])\\n}\\n}\\n'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n\n        model_file <- readLines(textConnection(model_file), n = -1)\n        model_file <- model_file[-grep('ar1\\\\[s\\\\] ~', model_file)]\n        model_file <- model_file[-grep('ar2\\\\[s\\\\] ~', model_file)]\n        model_file <- model_file[-grep('ar3\\\\[s\\\\] ~', model_file)]\n      }\n\n      if (trend_model == 'AR1') {\n        model_file <- model_file[\n          -c(\n            (grep('## trend estimates', model_file) + 4):(grep(\n              '## trend estimates',\n              model_file\n            ) +\n              17)\n          )\n        ]\n\n        if (drift) {\n          model_file[grep('## trend estimates', model_file) + 2] <-\n            \"trend[1, s] ~ dnorm(drift[s], tau[s])\"\n\n          model_file[grep('## trend estimates', model_file) + 4] <-\n            '\\nfor (i in 2:n) {\\nfor (s in 1:n_series){\\ntrend[i, s] ~ dnorm(drift[s]*(i - 1) + ar1[s]*trend[i - 1, s], tau[s])\\n}\\n}\\n'\n        } else {\n          model_file[grep('## trend estimates', model_file) + 4] <-\n            '\\nfor (i in 2:n) {\\nfor (s in 1:n_series){\\ntrend[i, s] ~ dnorm(ar1[s]*trend[i - 1, s], tau[s])\\n}\\n}\\n'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n\n        model_file <- readLines(textConnection(model_file), n = -1)\n        model_file <- model_file[-grep('ar2\\\\[s\\\\] ~', model_file)]\n        model_file <- model_file[-grep('ar3\\\\[s\\\\] ~', model_file)]\n      }\n\n      if (trend_model == 'AR2') {\n        model_file <- model_file[\n          -c(\n            (grep('## trend estimates', model_file) + 9):(grep(\n              '## trend estimates',\n              model_file\n            ) +\n              17)\n          )\n        ]\n\n        if (drift) {\n          model_file[grep('## trend estimates', model_file) + 2] <-\n            \"trend[1, s] ~ dnorm(drift[s], tau[s])\"\n\n          model_file[grep('## trend estimates', model_file) + 9] <-\n            '\\nfor (i in 3:n) {\\nfor (s in 1:n_series){\\ntrend[i, s] ~ dnorm(drift[s]*(i - 1) + ar1[s]*trend[i - 1, s] + ar2[s]*trend[i - 2, s], tau[s])\\n}\\n}\\n'\n        } else {\n          model_file[grep('## trend estimates', model_file) + 6] <-\n            'trend[2, s] ~ dnorm(ar1[s]*trend[1, s], tau[s])'\n          model_file[grep('## trend estimates', model_file) + 9] <-\n            '\\nfor (i in 3:n) {\\nfor (s in 1:n_series){\\ntrend[i, s] ~ dnorm(ar1[s]*trend[i - 1, s] + ar2[s]*trend[i - 2, s], tau[s])\\n}\\n}\\n'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n        model_file <- model_file[-grep('ar3\\\\[s\\\\] ~', model_file)]\n      }\n\n      if (trend_model == 'AR3') {\n        if (drift) {\n          model_file[grep('## trend estimates', model_file) + 2] <-\n            \"trend[1, s] ~ dnorm(drift[s], tau[s])\"\n        } else {\n          model_file[grep('## trend estimates', model_file) + 6] <-\n            'trend[2, s] ~ dnorm(ar1[s]*trend[1, s], tau[s])'\n          model_file[grep('## trend estimates', model_file) + 10] <-\n            'trend[3, s] ~ dnorm(ar1[s]*trend[2, s] + ar2[s]*trend[1, s], tau[s])'\n          model_file[grep('## trend estimates', model_file) + 15] <-\n            'trend[i, s] ~ dnorm(ar1[s]*trend[i - 1, s] + ar2[s]*trend[i - 2, s] + ar3[s]*trend[i - 3, s], tau[s])'\n          model_file <- model_file[-grep('drift\\\\[s\\\\] ~', model_file)]\n        }\n        model_file <- readLines(textConnection(model_file), n = -1)\n      }\n    }\n  }\n\n  return(model_file)\n}\n"
  },
  {
    "path": "R/add_tweedie_lines.R",
    "content": "#' Tweedie JAGS modifications\n#'\n#'\n#' @param model_file A template `JAGS` model file to be modified\n#' @param upper_bounds Optional upper bounds for the truncated observation likelihood\n#' @return A modified `JAGS` model file\n#' @noRd\nadd_tweedie_lines = function(model_file, upper_bounds) {\n  rate_begin <- grep('rate\\\\[i, s\\\\] <- ', model_file)\n  rate_end <- rate_begin + 1\n  model_file <- model_file[-c(rate_begin:rate_end)]\n\n  odis_begin <- grep('phi\\\\[s\\\\] <- ', model_file) - 4\n  odis_end <- odis_begin + 7\n  model_file <- model_file[-c(odis_begin:odis_end)]\n\n  if (missing(upper_bounds)) {\n    model_file[grep(\n      'y\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  y[i, s] ~ dpois(linpred[i, s])\\n  linpred[i, s] ~'\n    model_file[grep(\n      'ypred\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  ypred[i, s] ~ dpois(linpred[i, s])'\n  } else {\n    model_file[grep(\n      'y\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  y[i, s] ~ dpois(linpred[i, s])T(, upper_bound[s])\\n  linpred[i, s] ~'\n    model_file[grep(\n      'ypred\\\\[i, s\\\\] ~',\n      model_file\n    )] <- '  ypred[i, s] ~ dpois(linpred[i, s])T(, upper_bound[s])'\n  }\n\n  model_file <- readLines(textConnection(model_file), n = -1)\n  model_file[grep(\n    'linpred\\\\[i, s\\\\] ~',\n    model_file\n  )] <- '  linpred[i, s] ~ dgamma(shape[i, s, y_ind[i, s]], rate[i, s])\\n  twlambda[i, s] <-'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'twlambda\\\\[i, s\\\\] <-',\n    model_file\n  )] <- '  twlambda[i, s] <- pow(mus[i, s], 2 - p) / (phi[s] * (2 - p))\\n  N_pois[i, s] ~'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'N_pois\\\\[i, s\\\\] ~',\n    model_file\n  )] <- '  N_pois[i, s] ~ dpois(twlambda[i, s])T(1,)\\n  shape[i, s, 1] <-'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'shape\\\\[i, s, 1\\\\] <-',\n    model_file\n  )] <- '  shape[i, s, 1] <- N_pois[i, s] * ((2 - p) / (p - 1))\\n  shape[i, s, 2] <-'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'shape\\\\[i, s, 2\\\\] <-',\n    model_file\n  )] <- '  shape[i, s, 2] <- 1\\n  rate[i, s] <-'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'rate\\\\[i, s\\\\] <-',\n    model_file\n  )] <- '  rate[i, s] <- 1 / (phi[s] * (p - 1) * pow(mus[i, s], p - 1))\\n  pois_draw[i, s] ~'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'pois_draw\\\\[i, s\\\\] ~',\n    model_file\n  )] <- '  pois_draw[i, s] ~ dpois(mus[i, s])\\n  is_zero[i, s] <-'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'is_zero\\\\[i, s\\\\] <-',\n    model_file\n  )] <- '  is_zero[i, s] <- equals(pois_draw[i, s], 0)\\n  y_ind[i, s] <-'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  model_file[grep(\n    'y_ind\\\\[i, s\\\\] <-',\n    model_file\n  )] <- '  y_ind[i, s] <- is_zero[i, s] + 1'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  yind_begin <- grep('y_ind\\\\[i, s\\\\] <-', model_file)\n  prior_line <- yind_begin + 2\n  model_file[\n    prior_line\n  ] <- '}\\n\\n## Tweedie power and overdispersion parameters\\np <- 1.5\\nfor (s in 1:n_series) {\\n phi_raw[s] ~ dnorm(0, 2)T(-3.5, 3.5);\\n phi[s] <- exp(phi_raw[s])\\n}'\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  return(model_file)\n}\n"
  },
  {
    "path": "R/all_neon_tick_data.R",
    "content": "#' NEON Amblyomma and Ixodes tick abundance survey data\n#'\n#' A dataset containing timeseries of Amblyomma americanum and Ixodes scapularis nymph abundances at NEON sites\n#'\n#' @format A tibble/dataframe containing covariate information alongside the main fields of:\n#' \\describe{\n#' \\item{Year}{Year of sampling}\n#' \\item{epiWeek}{Epidemiological week of sampling}\n#'   \\item{plot_ID}{NEON plot ID for survey location}\n#'   \\item{siteID}{NEON site ID for survey location}\n#'   \\item{amblyomma_americanum}{Counts of A. americanum nymphs}\n#'   \\item{ixodes_scapularis}{Counts of I. scapularis nymphs}\n#' }\n#' @source \\url{https://www.neonscience.org/data}\n\"all_neon_tick_data\"\n"
  },
  {
    "path": "R/as.data.frame.mvgam.R",
    "content": "#' @title Extract posterior draws from fitted \\pkg{mvgam} objects\n#'\n#' @name mvgam_draws\n#'\n#' @description\n#' Extract posterior draws in conventional formats as data.frames, matrices,\n#' or arrays.\n#'\n#' @param x \\code{list} object of class `mvgam`\n#'\n#' @param variable A character specifying which parameters to extract. Can\n#' either be one of the following options:\n#' \\itemize{\n#'   \\item `obs_params` (other parameters specific to the observation model,\n#'   such as overdispersions for negative binomial models or observation error\n#'   SD for gaussian / student-t models)\n#'   \\item `betas` (beta coefficients from the GAM observation model linear\n#'   predictor; default)\n#'   \\item `smooth_params` (smoothing parameters from the GAM observation model)\n#'   \\item `linpreds` (estimated linear predictors on whatever link scale was\n#'   used in the model)\n#'   \\item `trend_params` (parameters governing the trend dynamics, such as AR\n#'   parameters, trend SD parameters or Gaussian Process parameters)\n#'   \\item `trend_betas` (beta coefficients from the GAM latent process model\n#'   linear predictor; only available if a `trend_formula` was supplied in the\n#'   original model)\n#'   \\item `trend_smooth_params` (process model GAM smoothing parameters; only\n#'   available if a `trend_formula` was supplied in the original model)\n#'   \\item `trend_linpreds` (process model linear predictors on the identity\n#'   scale; only available if a `trend_formula` was supplied in the original\n#'   model)\n#' }\n#' OR can be a character vector providing the variables to extract.\n#'\n#' @param regex Logical. If not using one of the prespecified options for\n#' extractions, should `variable` be treated as a (vector of) regular\n#' expressions? Any variable in `x` matching at least one of the regular\n#' expressions will be selected. Defaults to `FALSE`.\n#'\n#' @param use_alias Logical. If more informative names for parameters are\n#' available (i.e. for beta coefficients `b` or for smoothing parameters `rho`),\n#' replace the uninformative names with the more informative alias. Defaults to\n#' `TRUE`.\n#'\n#' @param inc_warmup Should warmup draws be included? Defaults to \\code{FALSE}.\n#'\n#' @param row.names Ignored\n#'\n#' @param optional Ignored\n#'\n#' @param ... Ignored\n#'\n#' @return A `data.frame`, `matrix`, or `array` containing the posterior draws.\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' sim <- sim_mvgam(family = Gamma())\n#'\n#' mod1 <- mvgam(\n#'   y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(),\n#'   data = sim$data_train,\n#'   family = Gamma(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' beta_draws_df <- as.data.frame(mod1, variable = 'betas')\n#' head(beta_draws_df)\n#' str(beta_draws_df)\n#'\n#' beta_draws_mat <- as.matrix(mod1, variable = 'betas')\n#' head(beta_draws_mat)\n#' str(beta_draws_mat)\n#'\n#' shape_pars <- as.matrix(mod1, variable = 'shape', regex = TRUE)\n#' head(shape_pars)\n#' }\nNULL\n\n#'@rdname mvgam_draws\n#'@export\nas.data.frame.mvgam = function(\n  x,\n  row.names = NULL,\n  optional = TRUE,\n  variable = 'betas',\n  use_alias = TRUE,\n  regex = FALSE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  post <- as.data.frame(dummy, variable = extract_pars$to_extract)\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      colnames(post) <- extract_pars$newnames\n    }\n  }\n\n  return(post)\n}\n\n#'@rdname mvgam_draws\n#'@export\nas.matrix.mvgam = function(\n  x,\n  variable = 'betas',\n  regex = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  post <- as.matrix(dummy, variable = extract_pars$to_extract)\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      colnames(post) <- extract_pars$newnames\n    }\n  }\n\n  return(post)\n}\n\n#'@rdname mvgam_draws\n#'@export\nas.array.mvgam = function(\n  x,\n  variable = 'betas',\n  regex = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  post <- as.array(dummy, variable = extract_pars$to_extract)\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      dimnames(post)$variable <- extract_pars$newnames\n    }\n  }\n\n  return(post)\n}\n\n#' @rdname mvgam_draws\n#' @method as_draws mvgam\n#' @export\nas_draws.mvgam <- function(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  # Extract\n  post <- as_draws_list(\n    dummy,\n    variable = extract_pars$to_extract,\n    regex = FALSE,\n    inc_warmup = inc_warmup,\n    ...\n  )\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      for (chain in seq_along(post)) {\n        names(post[[chain]]) <- extract_pars$newnames\n      }\n    }\n  }\n  return(post)\n}\n\n#' @export\n#' @importFrom posterior as_draws\nposterior::as_draws\n\n#' @rdname mvgam_draws\n#' @method as_draws_matrix mvgam\n#' @export\nas_draws_matrix.mvgam <- function(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  # Extract\n  post <- as_draws_matrix(\n    dummy,\n    variable = extract_pars$to_extract,\n    regex = FALSE,\n    inc_warmup = inc_warmup,\n    ...\n  )\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      colnames(post) <- extract_pars$newnames\n    }\n  }\n\n  return(post)\n}\n\n#' @export\n#' @importFrom posterior as_draws_matrix\nposterior::as_draws_matrix\n\n#' @rdname mvgam_draws\n#' @method as_draws_df mvgam\n#' @export\nas_draws_df.mvgam <- function(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  # Extract\n  post <- as_draws_df(\n    dummy,\n    variable = extract_pars$to_extract,\n    regex = FALSE,\n    inc_warmup = inc_warmup,\n    ...\n  )\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      colnames(post)[1:length(extract_pars$newnames)] <- extract_pars$newnames\n    }\n  }\n\n  return(post)\n}\n\n#' @export\n#' @importFrom posterior as_draws_df\nposterior::as_draws_df\n\n#' @rdname mvgam_draws\n#' @method as_draws_array mvgam\n#' @export\nas_draws_array.mvgam <- function(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  # Extract\n  post <- as_draws_array(\n    dummy,\n    variable = extract_pars$to_extract,\n    regex = FALSE,\n    inc_warmup = inc_warmup,\n    ...\n  )\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      dimnames(post)$variable <- extract_pars$newnames\n    }\n  }\n\n  return(post)\n}\n\n#' @export\n#' @importFrom posterior as_draws_array\nposterior::as_draws_array\n\n#' @rdname mvgam_draws\n#' @method as_draws_list mvgam\n#' @export\nas_draws_list.mvgam <- function(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n  # Extract\n  post <- as_draws_list(\n    dummy,\n    variable = extract_pars$to_extract,\n    regex = FALSE,\n    inc_warmup = inc_warmup,\n    ...\n  )\n\n  # Rename if needed\n  if (use_alias) {\n    if (!is.null(extract_pars$newnames)) {\n      for (chain in seq_along(post)) {\n        names(post[[chain]]) <- extract_pars$newnames\n      }\n    }\n  }\n\n  return(post)\n}\n\n#' @export\n#' @importFrom posterior as_draws_list\nposterior::as_draws_list\n\n#' @rdname mvgam_draws\n#' @method as_draws_rvars mvgam\n#' @export\nas_draws_rvars.mvgam <- function(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  ...\n) {\n  # Check variable and get more informative names if applicable\n  extract_pars <- validate_variables(x, variable = variable, regex = regex)\n\n  # Create a slim brmsfit object and use brms machinery to do extraction\n  dummy <- structure(list(fit = x$model_output), class = 'brmsfit')\n\n  # Extract (can't rename rvars due to the way it is structured)\n  post <- as_draws_rvars(\n    dummy,\n    variable = extract_pars$to_extract,\n    regex = FALSE,\n    inc_warmup = inc_warmup,\n    ...\n  )\n  return(post)\n}\n\n#' @export\n#' @importFrom posterior as_draws_rvars\nposterior::as_draws_rvars\n\n#'@noRd\nvalidate_variables = function(x, variable, regex = FALSE) {\n  # Get a string of all possible variables to extract\n  all_vars <- variables(x)\n  all_orig_vars <- unlist(purrr::map(all_vars, 'orig_name'))\n  all_alias_vars <- unlist(purrr::map(all_vars, 'alias'))\n\n  all_orig_walias <- all_orig_vars[!is.na(all_alias_vars)]\n  all_alias_vars <- all_alias_vars[!is.na(all_alias_vars)]\n\n  # All possible var sets to extract\n  extract_choices = c(\n    \"obs_params\",\n    \"betas\",\n    \"smooth_params\",\n    \"linpreds\",\n    \"trend_params\",\n    \"trend_betas\",\n    \"trend_smooth_params\",\n    \"trend_linpreds\",\n    all_orig_vars,\n    all_alias_vars\n  )\n\n  if (variable[1] == 'obs_params') {\n    to_extract <- family_param_info(x$family)$param_names\n    newnames <- NULL\n  }\n\n  if (variable[1] == 'betas') {\n    to_extract <- 'b'\n    newnames <- names(coef(x$mgcv_model))\n  }\n\n  if (variable[1] == 'smooth_params') {\n    if (is.null(all_vars$observation_smoothpars)) {\n      stop(\n        'No observation-level smooth parameters in model; no smooth_params to extract',\n        call. = FALSE\n      )\n    }\n    to_extract <- 'rho'\n    newnames <- paste0(x$sp_names, '_rho')\n  }\n\n  if (variable[1] == 'linpreds') {\n    to_extract <- 'mus'\n    newnames <- NULL\n  }\n\n  if (variable[1] == 'trend_params') {\n    to_extract <- trend_par_names(\n      attr(x$model_data, 'trend_model'),\n      x$use_lv,\n      x$drift\n    )\n\n    to_extract <- to_extract[\n      !to_extract %in% c('tau', 'trend', 'LV', 'penalty', 'lv_coefs')\n    ]\n\n    # Determine which other trend params to include\n    included <- vector(length = length(to_extract))\n    for (i in 1:length(to_extract)) {\n      # Check if it can be extracted\n      suppressWarnings(\n        estimates <- try(\n          mcmc_chains(x$model_output, params = to_extract[i]),\n          silent = TRUE\n        )\n      )\n\n      if (inherits(estimates, 'try-error')) {\n        included[i] <- FALSE\n      } else {\n        included[i] <- TRUE\n      }\n    }\n    to_extract <- to_extract[included]\n\n    newnames <- NULL\n  }\n\n  if (variable[1] == 'trend_betas') {\n    if (is.null(x$trend_call)) {\n      stop(\n        'No trend_formula supplied to model; no trend_betas to extract',\n        call. = FALSE\n      )\n    }\n    to_extract <- 'b_trend'\n    newnames <- paste0(names(coef(x$trend_mgcv_model)), '_trend')\n  }\n\n  if (variable[1] == \"trend_smooth_params\") {\n    if (is.null(all_vars$trend_smoothpars)) {\n      stop(\n        'No smoothing parameters included in trend-level model',\n        call. = FALSE\n      )\n    }\n\n    to_extract <- 'rho_trend'\n    newnames <- paste0(\n      unlist(purrr::map(x$trend_mgcv_model$smooth, 'label')),\n      '_rho_trend'\n    )\n  }\n\n  if (variable[1] == 'trend_linpreds') {\n    if (is.null(x$trend_call)) {\n      stop(\n        'No trend_formula supplied to model; no trend_linpreds to extract',\n        call. = FALSE\n      )\n    }\n    to_extract <- 'trend_mus'\n    newnames <- NULL\n  }\n\n  # If not one of the standard subsets, get aliases for the chosen variable(s)\n  if (\n    !variable[1] %in%\n      c(\n        \"obs_params\",\n        \"betas\",\n        \"smooth_params\",\n        \"linpreds\",\n        \"trend_params\",\n        \"trend_betas\",\n        \"trend_smooth_params\",\n        \"trend_linpreds\"\n      )\n  ) {\n    if (regex) {\n      vars_to_extract <- vector(mode = 'list')\n      names_to_use <- vector(mode = 'list')\n      for (i in 1:length(variable)) {\n        if (!any(grepl(variable[i], extract_choices))) {\n          vars_to_extract[[i]] <- NA\n          names_to_use[[i]] <- NA\n        } else {\n          if (any(grepl(variable[i], all_alias_vars))) {\n            vars_to_extract[[i]] <- unname(unlist(purrr::map(\n              all_vars,\n              'orig_name'\n            ))[\n              grepl(variable[i], unlist(purrr::map(all_vars, 'alias')))\n            ])\n\n            names_to_use[[i]] <- unname(unlist(purrr::map(all_vars, 'alias'))[\n              grepl(variable[i], unlist(purrr::map(all_vars, 'alias')))\n            ])\n          } else {\n            vars_to_extract[[i]] <- unname(unlist(purrr::map(\n              all_vars,\n              'orig_name'\n            ))[\n              grepl(variable[i], unlist(purrr::map(all_vars, 'orig_name')))\n            ])\n\n            names_to_use[[i]] <- unname(unlist(purrr::map(all_vars, 'alias'))[\n              grepl(variable[i], unlist(purrr::map(all_vars, 'orig_name')))\n            ])\n          }\n        }\n      }\n    } else {\n      vars_to_extract <- vector(mode = 'list')\n      names_to_use <- vector(mode = 'list')\n      for (i in 1:length(variable)) {\n        if (!any(extract_choices == variable[i])) {\n          vars_to_extract[[i]] <- NA\n          names_to_use[[i]] <- NA\n        } else {\n          if (any(all_alias_vars == variable[i])) {\n            vars_to_extract[[i]] <- unname(all_orig_walias[\n              which(all_alias_vars == variable[i])\n            ])\n            names_to_use[[i]] <- variable[i]\n          } else {\n            vars_to_extract[[i]] <- unname(unlist(purrr::map(\n              all_vars,\n              'orig_name'\n            ))[\n              which(all_orig_vars == variable[i])\n            ])\n            names_to_use[[i]] <- unname(unlist(purrr::map(all_vars, 'alias'))[\n              which(all_orig_vars == variable[i])\n            ])\n          }\n        }\n      }\n    }\n\n    vars_to_extract <- unlist(vars_to_extract)\n    names_to_use <- unlist(names_to_use)\n    names_to_use[is.na(names_to_use)] <- vars_to_extract[is.na(names_to_use)]\n\n    if (all(is.na(vars_to_extract))) {\n      stop(\n        'could not find any variables matching the supplied patterns',\n        call. = FALSE\n      )\n    }\n\n    to_extract <- vars_to_extract[!is.na(vars_to_extract)]\n    newnames <- names_to_use[!is.na(names_to_use)]\n  }\n\n  return(list(to_extract = to_extract, newnames = newnames))\n}\n"
  },
  {
    "path": "R/backends.R",
    "content": "#### Helper functions for preparing and manipulating Stan models ####\n# All functions were modified from `brms` source code and so all credit must\n# go to the `brms` development team\n\n#' parse Stan model code with cmdstanr\n#' @param model Stan model code\n#' @return validated Stan model code\n#' @noRd\n.model_cmdstanr <- function(model_file, threads = 1, silent = 1, ...) {\n  if (silent < 2) {\n    message('Compiling Stan program using cmdstanr')\n    message()\n  }\n\n  if (cmdstanr::cmdstan_version() < \"2.26.0\") {\n    warning(\n      'Your version of Cmdstan is < 2.26.0; some mvgam models may not work properly!'\n    )\n  }\n\n  temp_file <- cmdstanr::write_stan_file(model_file)\n\n  if (cmdstanr::cmdstan_version() >= \"2.29.0\") {\n    if (threads > 1) {\n      out <- eval_silent(\n        cmdstanr::cmdstan_model(\n          temp_file,\n          stanc_options = list('O1'),\n          cpp_options = list(stan_threads = TRUE),\n          ...\n        ),\n        type = \"message\",\n        try = TRUE,\n        silent = silent > 0L\n      )\n    } else {\n      out <- eval_silent(\n        cmdstanr::cmdstan_model(temp_file, stanc_options = list('O1'), ...),\n        type = \"message\",\n        try = TRUE,\n        silent = silent > 0L\n      )\n    }\n  } else {\n    if (threads > 1) {\n      out <- eval_silent(\n        cmdstanr::cmdstan_model(\n          temp_file,\n          cpp_options = list(stan_threads = TRUE),\n          ...\n        ),\n        type = \"message\",\n        try = TRUE,\n        silent = silent\n      )\n    } else {\n      out <- eval_silent(\n        cmdstanr::cmdstan_model(temp_file, ...),\n        type = \"message\",\n        try = TRUE,\n        silent = silent\n      )\n    }\n  }\n\n  return(out)\n}\n\n#' fit Stan model with cmdstanr using HMC sampling or variational inference\n#' @importFrom brms read_csv_as_stanfit\n#' @param model a compiled Stan model\n#' @param data named list to be passed to Stan as data\n#' @return a fitted Stan model\n#' @noRd\n.sample_model_cmdstanr <- function(\n  model,\n  algorithm = 'sampling',\n  prior_simulation = FALSE,\n  data,\n  chains = 4,\n  parallel = TRUE,\n  silent = 1L,\n  max_treedepth,\n  adapt_delta,\n  threads = 1,\n  burnin,\n  samples,\n  param = param,\n  save_all_pars = FALSE,\n  ...\n) {\n  if (algorithm == 'pathfinder') {\n    if (cmdstanr::cmdstan_version() < \"2.33\") {\n      stop(\n        'Your version of Cmdstan is < 2.33; the \"pathfinder\" algorithm is not available',\n        call. = FALSE\n      )\n    }\n\n    if (utils::packageVersion('cmdstanr') < '0.6.1.9000') {\n      stop(\n        'Your version of cmdstanr is < 0.6.1.9000; the \"pathfinder\" algorithm is not available',\n        call. = FALSE\n      )\n    }\n  }\n\n  # Construct cmdstanr sampling arguments\n  args <- nlist(data = data)\n  dots <- list(...)\n  args[names(dots)] <- dots\n\n  if (prior_simulation) {\n    burnin <- 200\n  }\n\n  # do the actual sampling\n  if (silent < 2) {\n    message(\"Start sampling\")\n  }\n\n  if (algorithm == 'sampling') {\n    c(args) <- nlist(\n      chains = chains,\n      refresh = 100,\n      max_treedepth,\n      adapt_delta,\n      diagnostics = NULL,\n      iter_sampling = samples,\n      iter_warmup = burnin,\n      show_messages = silent < 2\n    )\n\n    if (utils::packageVersion('cmdstanr') >= '0.7.0') {\n      c(args) <- nlist(show_exceptions = silent == 0)\n    }\n\n    if (parallel) {\n      c(args) <- nlist(\n        parallel_chains = min(c(chains, parallel::detectCores() - 1))\n      )\n    }\n\n    if (threads > 1) {\n      c(args) <- nlist(threads_per_chain = threads)\n    }\n\n    out <- do_call(model$sample, args)\n  } else if (algorithm %in% c(\"fullrank\", \"meanfield\")) {\n    c(args) <- nlist(\n      algorithm = algorithm,\n      refresh = 500,\n      output_samples = samples\n    )\n    if (threads > 1) {\n      c(args) <- nlist(threads = threads)\n    }\n\n    out <- do_call(model$variational, args)\n  } else if (algorithm %in% c(\"laplace\")) {\n    c(args) <- nlist(refresh = 500, draws = samples)\n    if (threads > 1) {\n      c(args) <- nlist(threads = threads)\n    }\n\n    out <- do_call(model$laplace, args)\n  } else if (algorithm %in% c(\"pathfinder\")) {\n    c(args) <- nlist(refresh = 500, draws = samples)\n    if (threads > 1) {\n      c(args) <- nlist(num_threads = threads)\n    }\n\n    out <- do_call(model$pathfinder, args)\n  } else {\n    stop(\"Algorithm '\", algorithm, \"' is not supported.\", call. = FALSE)\n  }\n\n  if (algorithm %in% c('meanfield', 'fullrank', 'laplace', 'pathfinder')) {\n    param <- param[!param %in% 'lp__']\n  }\n\n  # Convert model files to stan_fit class for consistency\n  repair_names <- function(x) {\n    x <- sub(\"\\\\.\", \"[\", x)\n    x <- gsub(\"\\\\.\", \",\", x)\n    x[grep(\"\\\\[\", x)] <- paste0(x[grep(\"\\\\[\", x)], \"]\")\n    x\n  }\n\n  if (save_all_pars) {\n    out_gam_mod <- brms::read_csv_as_stanfit(\n      out$output_files(),\n      algorithm = algorithm\n    )\n  } else {\n    # Exclude certain pars and transformed_pars that are never needed\n    # for mvgam post-processing\n    metadata <- cmdstanr::read_cmdstan_csv(\n      files = out$output_files(),\n      variables = \"\",\n      sampler_diagnostics = \"\"\n    )\n    all_vars <- metadata$metadata$variables\n    out_gam_mod <- brms::read_csv_as_stanfit(\n      out$output_files(),\n      variables = all_vars,\n      exclude = c(\n        'trend_raw',\n        'b_raw',\n        'b_raw_trend',\n        'p',\n        'eta',\n        'phi_vec',\n        'nu_vec',\n        'sigma_obs_vec',\n        'shape_vec',\n        'phi_inv',\n        'lv_coefs_raw',\n        'L_Sigma',\n        'L_Omega',\n        'L_Sigma_group',\n        'Sigma_group',\n        'Gamma',\n        'Gamma_group',\n        'A_group',\n        'L_deviation_group',\n        'L_Omega_group',\n        'sub_error'\n      ),\n      algorithm = algorithm\n    )\n  }\n\n  out_gam_mod <- repair_stanfit(out_gam_mod)\n\n  if (algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')) {\n    out_gam_mod@sim$iter <- samples\n    out_gam_mod@sim$thin <- 1\n    out_gam_mod@stan_args[[1]]$method <- 'sampling'\n  }\n\n  return(out_gam_mod)\n}\n\n#' fit Stan model with rstan\n#' @param model a compiled Stan model\n#' @param sdata named list to be passed to Stan as data\n#' @return a fitted Stan model\n#' @noRd\n.sample_model_rstan <- function(\n  model,\n  algorithm = 'sampling',\n  prior_simulation = FALSE,\n  data,\n  chains = 4,\n  parallel = TRUE,\n  silent = 1L,\n  max_treedepth,\n  adapt_delta,\n  threads = 1,\n  burnin,\n  samples,\n  thin,\n  ...\n) {\n  if (rstan::stan_version() < \"2.26.0\") {\n    warning(\n      'Your version of Stan is < 2.26.0; some mvgam models may not work properly!'\n    )\n  }\n\n  if (algorithm == 'pathfinder') {\n    stop(\n      'The \"pathfinder\" algorithm is not yet available in rstan',\n      call. = FALSE\n    )\n  }\n\n  if (algorithm == 'laplace') {\n    stop('The \"laplace\" algorithm is not yet available in rstan', call. = FALSE)\n  }\n\n  # Set up parallel cores\n  mc_cores_def <- getOption('mc.cores')\n  options(mc.cores = parallel::detectCores())\n  on.exit(options(mc.cores = mc_cores_def))\n\n  # Fit the model in rstan using custom control parameters\n  if (threads > 1) {\n    if (utils::packageVersion(\"rstan\") >= \"2.26\") {\n      threads_per_chain_def <- rstan::rstan_options(\"threads_per_chain\")\n      on.exit(rstan::rstan_options(threads_per_chain = threads_per_chain_def))\n      rstan::rstan_options(threads_per_chain = threads)\n    } else {\n      stop(\n        \"Threading is not supported by backend 'rstan' version \",\n        utils::packageVersion(\"rstan\"),\n        \".\",\n        call. = FALSE\n      )\n    }\n  }\n\n  # Compile the model\n  if (silent < 2L) {\n    message('Compiling Stan program using rstan')\n    message()\n  }\n\n  stan_mod <- eval_silent(\n    rstan::stan_model(model_code = model, verbose = silent < 1L),\n    type = \"message\",\n    try = TRUE,\n    silent = silent >= 1L\n  )\n\n  # Construct rstan sampling arguments\n  args <- nlist(object = stan_mod, data = data)\n  dots <- list(...)\n  args[names(dots)] <- dots\n\n  if (samples <= burnin) {\n    samples <- burnin + samples\n  }\n\n  # do the actual sampling\n  if (silent < 2) {\n    message(\"Start sampling\")\n  }\n\n  if (algorithm %in% c(\"sampling\", \"fixed_param\")) {\n    stan_control <- list(\n      max_treedepth = max_treedepth,\n      adapt_delta = adapt_delta\n    )\n    if (prior_simulation) {\n      burnin = 200\n      samples = 700\n    }\n    if (parallel) {\n      c(args) <- nlist(cores = min(c(chains, parallel::detectCores() - 1)))\n    } else {\n      # Explicitly set cores = 1 if parallel = FALSE (#113)\n      c(args) <- nlist(cores = 1)\n    }\n\n    c(args) <- nlist(\n      warmup = burnin,\n      iter = samples,\n      chains = chains,\n      control = stan_control,\n      show_messages = silent < 1L,\n      verbose = FALSE,\n      thin = thin,\n      pars = NA,\n      refresh = 100,\n      save_warmup = FALSE\n    )\n\n    out <- do_call(rstan::sampling, args)\n  } else if (algorithm %in% c(\"fullrank\", \"meanfield\")) {\n    c(args) <- nlist(algorithm, output_samples = samples, pars = NA)\n    out <- do_call(rstan::vb, args)\n  } else {\n    stop(\"Algorithm '\", algorithm, \"' is not supported.\", call. = FALSE)\n  }\n\n  out <- repair_stanfit(out)\n  return(out)\n}\n\n#' @noRd\n.autoformat <- function(\n  stan_file,\n  overwrite_file = TRUE,\n  backend = 'cmdstanr',\n  silent = TRUE\n) {\n  # Can make LV models slightly more efficient by not filling in zeros in a loop\n  if (any(grepl('lv_coefs_raw[i, j] = 0;', stan_file, fixed = TRUE))) {\n    starts <- grepws('lv_coefs_raw[i, j] = 0;', stan_file) - 2\n    ends <- grepws('lv_coefs_raw[i, j] = 0;', stan_file) + 2\n    stan_file <- stan_file[-c(starts:ends)]\n    stan_file[grepws('matrix[n_series, n_lv] lv_coefs_raw;', stan_file)] <-\n      'matrix[n_series, n_lv] lv_coefs_raw = rep_matrix(0, n_series, n_lv);'\n  }\n\n  # No need to fill lv_coefs in each iteration if this is a\n  # trend_formula model\n  if (\n    any(grepl('lv_coefs = Z;', stan_file, fixed = TRUE)) &\n      !any(grepl('vector[n_lv] LV[n];', stan_file, fixed = TRUE))\n  ) {\n    stan_file <- stan_file[-grep('lv_coefs = Z;', stan_file, fixed = TRUE)]\n    stan_file <- stan_file[\n      -grep('matrix[n_series, n_lv] lv_coefs;', stan_file, fixed = TRUE)\n    ]\n    stan_file[grep(\n      'trend[i, s] = dot_product(lv_coefs[s,], LV[i,]);',\n      stan_file,\n      fixed = TRUE\n    )] <-\n      'trend[i, s] = dot_product(Z[s,], LV[i,]);'\n\n    stan_file[grep('// posterior predictions', stan_file, fixed = TRUE) - 1] <-\n      paste0(\n        stan_file[\n          grep('// posterior predictions', stan_file, fixed = TRUE) - 1\n        ],\n        '\\n',\n        'matrix[n_series, n_lv] lv_coefs = Z;'\n      )\n    stan_file <- readLines(textConnection(stan_file), n = -1)\n  }\n\n  if (backend == 'rstan' & rstan::stan_version() < '2.29.0') {\n    # normal_id_glm became available in 2.29.0; this needs to be replaced\n    # with the older non-glm version\n    if (any(grepl('normal_id_glm', stan_file, fixed = TRUE))) {\n      if (\n        any(grepl(\"flat_ys ~ normal_id_glm(flat_xs,\", stan_file, fixed = TRUE))\n      ) {\n        start <- grep(\n          \"flat_ys ~ normal_id_glm(flat_xs,\",\n          stan_file,\n          fixed = TRUE\n        )\n        end <- start + 2\n        stan_file <- stan_file[-c((start + 1):(start + 2))]\n        stan_file[start] <- 'flat_ys ~ normal(flat_xs * b, flat_sigma_obs);'\n      }\n    }\n  }\n\n  # Old ways of specifying arrays have been converted to errors in\n  # the latest version of Cmdstan (2.32.0); this coincides with\n  # a decision to stop automatically replacing these deprecations with\n  # the canonicalizer, so we have no choice but to replace the old\n  # syntax with this ugly bit of code\n\n  # rstan dependency in Description should mean that updates should\n  # always happen (mvgam depends on rstan >= 2.29.0)\n  update_code <- TRUE\n\n  # Tougher if using cmdstanr\n  if (backend == 'cmdstanr') {\n    if (cmdstanr::cmdstan_version() < \"2.32.0\") {\n      # If the autoformat options from cmdstanr are available,\n      # make use of them to update any deprecated array syntax\n      update_code <- FALSE\n    }\n  }\n\n  if (update_code) {\n    # Data modifications\n    stan_file[grep(\n      \"int<lower=0> ytimes[n, n_series]; // time-ordered matrix (which col in X belongs to each [time, series] observation?)\",\n      stan_file,\n      fixed = TRUE\n    )] <-\n      'array[n, n_series] int<lower=0> ytimes;  // time-ordered matrix (which col in X belongs to each [time, series] observation?)'\n\n    stan_file[grep(\n      \"int<lower=0> flat_ys[n_nonmissing]; // flattened nonmissing observations\",\n      stan_file,\n      fixed = TRUE\n    )] <-\n      'array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations'\n\n    stan_file[grep(\n      \"int<lower=0> obs_ind[n_nonmissing]; // indices of nonmissing observations\",\n      stan_file,\n      fixed = TRUE\n    )] <-\n      \"array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations\"\n\n    if (\n      any(grepl(\n        'int<lower=0> ytimes_trend[n, n_lv]; // time-ordered matrix for latent states',\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grep(\n        \"int<lower=0> ytimes_trend[n, n_lv]; // time-ordered matrix for latent states\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[n, n_lv] int ytimes_trend;\"\n    }\n\n    if (\n      any(\n        grepl('int idx', stan_file) &\n          grepl('// discontiguous index values', stan_file, fixed = TRUE)\n      )\n    ) {\n      lines_replace <- which(\n        grepl('int idx', stan_file) &\n          grepl('// discontiguous index values', stan_file, fixed = TRUE)\n      )\n      for (i in lines_replace) {\n        split_line <- strsplit(stan_file[i], ' ')[[1]]\n\n        idxnum <- gsub(\n          ';',\n          '',\n          gsub(\"\\\\s*\\\\[[^\\\\]+\\\\]\", \"\", as.character(split_line[2]))\n        )\n        idx_length <- gsub(\n          \"\\\\]\",\n          \"\",\n          gsub(\n            \"\\\\[\",\n            \"\",\n            regmatches(split_line[2], gregexpr(\"\\\\[.*?\\\\]\", split_line[2]))[[1]]\n          )\n        )\n\n        stan_file[i] <-\n          paste0(\n            'array[',\n            idx_length,\n            '] int ',\n            idxnum,\n            '; // discontiguous index values'\n          )\n      }\n    }\n\n    if (\n      any(grepl(\n        'int<lower=0> cap[total_obs]; // upper limits of latent abundances',\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grep(\n        'int<lower=0> cap[total_obs]; // upper limits of latent abundances',\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[total_obs] int<lower=0> cap; // upper limits of latent abundances'\n\n      stan_file[grep(\n        'int flat_caps[n_nonmissing];',\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[n_nonmissing] int flat_caps;'\n    }\n\n    # Model modifications\n    if (any(grepl('real flat_phis[n_nonmissing];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\n        \"real flat_phis[n_nonmissing];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[n_nonmissing] real flat_phis;\"\n    }\n\n    # n-mixture modifications\n    if (\n      any(grepl(\n        'real p_ub = poisson_cdf(max_k, lambda);',\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grep(\n        'real p_ub = poisson_cdf(max_k, lambda);',\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'real p_ub = poisson_cdf(max_k | lambda);'\n    }\n\n    # trend_formula modifications\n    if (\n      any(\n        grepl('int trend_rand_idx', stan_file) &\n          grepl('// trend random effect indices', stan_file, fixed = TRUE)\n      )\n    ) {\n      lines_replace <- which(\n        grepl('int trend_rand_idx', stan_file) &\n          grepl('// trend random effect indices', stan_file, fixed = TRUE)\n      )\n      for (i in lines_replace) {\n        split_line <- strsplit(stan_file[i], ' ')[[1]]\n\n        trend_idxnum <- gsub(\n          ';',\n          '',\n          gsub(\"\\\\s*\\\\[[^\\\\]+\\\\]\", \"\", as.character(split_line[2]))\n        )\n        idx_length <- gsub(\n          \"\\\\]\",\n          \"\",\n          gsub(\n            \"\\\\[\",\n            \"\",\n            regmatches(split_line[2], gregexpr(\"\\\\[.*?\\\\]\", split_line[2]))[[1]]\n          )\n        )\n\n        stan_file[i] <-\n          paste0(\n            'array[',\n            idx_length,\n            '] int ',\n            trend_idxnum,\n            '; // trend random effect indices'\n          )\n      }\n    }\n\n    if (\n      any(\n        grepl('int trend_idx', stan_file) &\n          grepl('// discontiguous index values', stan_file, fixed = TRUE)\n      )\n    ) {\n      lines_replace <- which(\n        grepl('int trend_idx', stan_file) &\n          grepl('// discontiguous index values', stan_file, fixed = TRUE)\n      )\n      for (i in lines_replace) {\n        split_line <- strsplit(stan_file[i], ' ')[[1]]\n\n        trend_idxnum <- gsub(\n          ';',\n          '',\n          gsub(\"\\\\s*\\\\[[^\\\\]+\\\\]\", \"\", as.character(split_line[2]))\n        )\n        idx_length <- gsub(\n          \"\\\\]\",\n          \"\",\n          gsub(\n            \"\\\\[\",\n            \"\",\n            regmatches(split_line[2], gregexpr(\"\\\\[.*?\\\\]\", split_line[2]))[[1]]\n          )\n        )\n\n        stan_file[i] <-\n          paste0(\n            'array[',\n            idx_length,\n            '] int ',\n            trend_idxnum,\n            '; // discontiguous index values'\n          )\n      }\n    }\n\n    if (any(grepl('vector[n_series] trend_raw[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\n        \"vector[n_series] trend_raw[n];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[n] vector[n_series] trend_raw;\"\n    }\n\n    if (any(grepl('vector[n_lv] error[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_lv] error[n];\", stan_file, fixed = TRUE)] <-\n        \"array[n] vector[n_lv] error;\"\n    }\n\n    if (any(grepl('vector[n_series] error[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_series] error[n];\", stan_file, fixed = TRUE)] <-\n        \"array[n] vector[n_series] error;\"\n    }\n\n    if (any(grepl('vector[n_lv] LV[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_lv] LV[n];\", stan_file, fixed = TRUE)] <-\n        \"array[n] vector[n_lv] LV;\"\n    }\n\n    if (any(grepl('vector[n_series] mu[n - 1];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_series] mu[n - 1];\", stan_file, fixed = TRUE)] <-\n        \"array[n - 1] vector[n_series] mu;\"\n    }\n\n    if (any(grepl('vector[n_lv] mu[n - 1];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_lv] mu[n - 1];\", stan_file, fixed = TRUE)] <-\n        \"array[n - 1] vector[n_lv] mu;\"\n    }\n\n    if (any(grepl('vector[n_series] mu[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_series] mu[n];\", stan_file, fixed = TRUE)] <-\n        \"array[n] vector[n_series] mu;\"\n    }\n\n    if (any(grepl('vector[n_lv] mu[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_lv] mu[n];\", stan_file, fixed = TRUE)] <-\n        \"array[n] vector[n_lv] mu;\"\n    }\n    # Generated quantity modifications\n    if (\n      any(grepl(\n        'real<lower=0,upper=1> ypred[n, n_series];',\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grep(\n        \"real<lower=0,upper=1> ypred[n, n_series];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[n, n_series] real<lower=0,upper=1> ypred;\"\n    }\n\n    if (\n      any(grepl('real<lower=0> ypred[n, n_series];', stan_file, fixed = TRUE))\n    ) {\n      stan_file[grep(\n        \"real<lower=0> ypred[n, n_series];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[n, n_series] real<lower=0> ypred;\"\n    }\n\n    # ARMA model modifications\n    if (any(grepl('vector[n_series] epsilon[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\n        \"vector[n_series] epsilon[n];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[n] vector[n_series] epsilon;\"\n    }\n\n    if (any(grepl('vector[n_lv] epsilon[n];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"vector[n_lv] epsilon[n];\", stan_file, fixed = TRUE)] <-\n        \"array[n] vector[n_lv] epsilon;\"\n    }\n\n    # VARMA model modifications\n    if (\n      any(grepl('matrix[n_series, n_series] P[1];', stan_file, fixed = TRUE))\n    ) {\n      stan_file[grep(\n        \"matrix[n_series, n_series] P[1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[1] matrix[n_series, n_series] P;\"\n\n      stan_file[grep(\n        \"matrix[n_series, n_series] phiGamma[2, 1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[2, 1] matrix[n_series, n_series] phiGamma;\"\n    }\n\n    if (\n      any(grepl(\n        'matrix initial_joint_var(matrix Sigma, matrix[] phi, matrix[] theta) {',\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grep(\n        \"matrix initial_joint_var(matrix Sigma, matrix[] phi, matrix[] theta) {\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"matrix initial_joint_var(matrix Sigma, array[] matrix phi, array[] matrix theta) {\"\n    }\n\n    if (any(grepl('matrix[n_lv, n_lv] P[1];', stan_file, fixed = TRUE))) {\n      stan_file[grep(\"matrix[n_lv, n_lv] P[1];\", stan_file, fixed = TRUE)] <-\n        \"array[1] matrix[n_lv, n_lv] P;\"\n\n      stan_file[grep(\"matrix[n_lv, n_lv] R[1];\", stan_file, fixed = TRUE)] <-\n        \"array[1] matrix[n_lv, n_lv] R;\"\n\n      stan_file[grep(\n        \"matrix[n_lv, n_lv] A_init[1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[1] matrix[n_lv, n_lv] A_init;\"\n\n      stan_file[grep(\n        \"matrix[n_lv, n_lv] theta_init[1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[1] matrix[n_lv, n_lv] theta_init;\"\n    }\n\n    if (\n      any(grepl('matrix[n_series, n_series] R[1];', stan_file, fixed = TRUE))\n    ) {\n      stan_file[grep(\n        \"matrix[n_series, n_series] R[1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[1] matrix[n_series, n_series] R;\"\n\n      stan_file[grep(\n        \"matrix[n_series, n_series] A_init[1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[1] matrix[n_series, n_series] A_init;\"\n\n      stan_file[grep(\n        \"matrix[n_series, n_series] theta_init[1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[1] matrix[n_series, n_series] theta_init;\"\n    }\n\n    if (\n      any(grepl(\n        'matrix[] rev_mapping(matrix[] P, matrix Sigma) {',\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grep(\n        \"matrix[] rev_mapping(matrix[] P, matrix Sigma) {\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[] matrix rev_mapping(array[] matrix P, matrix Sigma) {\"\n\n      stan_file[grep(\n        \"matrix[m, m] phi_for[p, p];   matrix[m, m] phi_rev[p, p];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[p, p] matrix[m, m] phi_for;   array[p, p] matrix[m, m] phi_rev;'\n\n      stan_file[grep(\n        \"matrix[m, m] Sigma_for[p+1];  matrix[m, m] Sigma_rev[p+1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[p+1] matrix[m, m] Sigma_for;   array[p+1] matrix[m, m] Sigma_rev;'\n\n      stan_file[grep(\n        \"matrix[m, m] S_for_list[p+1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[p+1] matrix[m, m] S_for_list;'\n    }\n\n    # VAR model modifications\n    if (\n      any(grepl('matrix[n_lv, n_lv] phiGamma[2, 1];', stan_file, fixed = TRUE))\n    ) {\n      stan_file[grep(\n        'matrix[n_lv, n_lv] phiGamma[2, 1];',\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[2, 1] matrix[n_lv, n_lv] phiGamma;'\n    }\n\n    if (\n      any(grepl(\n        'matrix[,] rev_mapping(matrix[] P, matrix Sigma) {',\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grep(\n        \"matrix[,] rev_mapping(matrix[] P, matrix Sigma) {\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[,] matrix rev_mapping(array[] matrix P, matrix Sigma) {\"\n\n      stan_file[grep(\n        \"matrix[m, m] phi_for[p, p];   matrix[m, m] phi_rev[p, p];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[p, p] matrix[m, m] phi_for;   array[p, p] matrix[m, m] phi_rev;'\n\n      stan_file[grep(\n        \"matrix[m, m] Sigma_for[p+1];  matrix[m, m] Sigma_rev[p+1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[p+1] matrix[m, m] Sigma_for;   array[p+1] matrix[m, m] Sigma_rev;'\n\n      stan_file[grep(\n        \"matrix[m, m] S_for_list[p+1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[p+1] matrix[m, m] S_for_list;'\n\n      stan_file[grep(\n        \"matrix[m, m] Gamma_trans[p+1];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[p+1] matrix[m, m] Gamma_trans;'\n\n      stan_file[grep(\n        \"matrix[m, m] phiGamma[2, p];\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        'array[2, p] matrix[m, m] phiGamma;'\n    }\n\n    if (\n      any(grepl(\n        \"real partial_log_lik(int[] seq, int start, int end,\",\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grepl(\n        \"real partial_log_lik(int[] seq, int start, int end,\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"real partial_log_lik(array[] int seq, int start, int end,\"\n    }\n\n    if (\n      any(grepl(\n        \"data vector Y, vector mu, real[] shape) {\",\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grepl(\n        \"data vector Y, vector mu, real[] shape) {\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"data vector Y, vector mu, array[] real shape) {\"\n    }\n\n    if (\n      any(grepl(\n        \"int<lower=1> seq[n_nonmissing]; // an integer sequence for reduce_sum slicing\",\n        stan_file,\n        fixed = TRUE\n      ))\n    ) {\n      stan_file[grepl(\n        \"int<lower=1> seq[n_nonmissing]; // an integer sequence for reduce_sum slicing\",\n        stan_file,\n        fixed = TRUE\n      )] <-\n        \"array[n_nonmissing] int<lower=1> seq; // an integer sequence for reduce_sum slicing\"\n    }\n  }\n\n  if (backend == 'rstan') {\n    options(stanc.allow_optimizations = TRUE, stanc.auto_format = TRUE)\n\n    out <- eval_silent(\n      rstan::stanc(model_code = stan_file),\n      type = \"message\",\n      try = TRUE,\n      silent = silent\n    )\n    out <- out$model_code\n  } else {\n    stan_file <- cmdstanr::write_stan_file(stan_file)\n\n    cmdstan_mod <- eval_silent(\n      cmdstanr::cmdstan_model(stan_file, compile = FALSE),\n      type = \"message\",\n      try = TRUE,\n      silent = silent\n    )\n    out <- utils::capture.output(\n      cmdstan_mod$format(\n        max_line_length = 80,\n        canonicalize = TRUE,\n        overwrite_file = overwrite_file,\n        backup = FALSE\n      )\n    )\n    out <- paste0(out, collapse = \"\\n\")\n  }\n  return(out)\n}\n\n#' @noRd\nrepair_stanfit <- function(x) {\n  if (!length(x@sim$fnames_oi)) {\n    # nothing to rename\n    return(x)\n  }\n  # the posterior package cannot deal with non-unique parameter names\n  # this case happens rarely but might happen when sample_prior = \"yes\"\n  x@sim$fnames_oi <- make.unique(as.character(x@sim$fnames_oi), \"__\")\n  for (i in seq_along(x@sim$samples)) {\n    # stanfit may have renamed dimension suffixes (#1218)\n    if (length(x@sim$samples[[i]]) == length(x@sim$fnames_oi)) {\n      names(x@sim$samples[[i]]) <- x@sim$fnames_oi\n    }\n  }\n  x\n}\n\n#' @noRd\nrepair_variable_names <- function(x) {\n  x <- sub(\"\\\\.\", \"[\", x)\n  x <- gsub(\"\\\\.\", \",\", x)\n  x[grep(\"\\\\[\", x)] <- paste0(x[grep(\"\\\\[\", x)], \"]\")\n  x\n}\n\n#' @noRd\nseq_rows = function(x) {\n  seq_len(NROW(x))\n}\n\n#' @noRd\nis_equal <- function(x, y, check.attributes = FALSE, ...) {\n  isTRUE(all.equal(x, y, check.attributes = check.attributes, ...))\n}\n\n\n#' @noRd\nulapply <- function(X, FUN, ..., recursive = TRUE, use.names = TRUE) {\n  unlist(lapply(X, FUN, ...), recursive, use.names)\n}\n"
  },
  {
    "path": "R/compute_edf.R",
    "content": "#' Compute approximate EDFs of smooths\n#' @importFrom stats fitted\n#'@noRd\ncompute_edf = function(\n  mgcv_model,\n  object,\n  rho_names,\n  sigma_raw_names,\n  conservative = FALSE\n) {\n  if (length(mgcv_model$smooth) > 0) {\n    smooth_labs <- do.call(\n      rbind,\n      lapply(seq_along(mgcv_model$smooth), function(x) {\n        data.frame(\n          label = mgcv_model$smooth[[x]]$label,\n          term = paste(mgcv_model$smooth[[x]]$term, collapse = ','),\n          class = class(mgcv_model$smooth[[x]])[1]\n        )\n      })\n    )\n\n    # Find the best overall posterior draw\n    if (object$family == 'nmix') {\n      best_draw <- 1\n    } else {\n      liks <- logLik(object, include_forecast = FALSE)\n      best_draw <- which.max(rowMeans(liks, na.rm = TRUE))\n    }\n\n    # Extract smoothing parameters\n    sp_names <- names(mgcv_model$sp)\n    rho_sp <- vector()\n    random_sp <- vector()\n\n    if (!all(smooth_labs$class == 'random.effect')) {\n      rho_estimates <- mcmc_chains(object$model_output, rho_names)[best_draw, ]\n      rho_sp <- rho_estimates\n      names(rho_sp) <- paste0(sp_names[1:length(rho_estimates)], '_', rho_names)\n    }\n\n    if (any(smooth_labs$class == 'random.effect')) {\n      if (length(rho_sp) > 0) {\n        rho_sp <- rho_sp[-which(smooth_labs$class == 'random.effect')]\n      }\n\n      pop_sd_estimates <- mcmc_chains(object$model_output, sigma_raw_names)[\n        best_draw,\n      ]\n      random_sp <- pop_sd_estimates\n      if (rho_names == 'rho_trend') {\n        names(random_sp) <- paste0(\n          'sd(',\n          sp_names[which(smooth_labs$class == 'random.effect')],\n          ')_trend'\n        )\n      } else {\n        names(random_sp) <- paste0(\n          'sd(',\n          sp_names[which(smooth_labs$class == 'random.effect')],\n          ')'\n        )\n      }\n      names(random_sp) <- gsub('s\\\\(', '', names(random_sp))\n      names(random_sp) <- gsub('\\\\))', ')', names(random_sp))\n    }\n\n    mgcv_model$sp <- exp(c(rho_sp, random_sp))\n\n    # Compute estimated degrees of freedom based on edf.type = 1 from\n    # https://github.com/cran/mgcv/blob/master/R/jagam.r\n    # using Simon Wood's example calculation\n    X <- predict(mgcv_model, type = 'lpmatrix')\n    if (rho_names == 'rho_trend') {\n      bs <- mcmc_chains(object$model_output, 'b_trend')[best_draw, ]\n    } else {\n      bs <- mcmc_chains(object$model_output, 'b')[best_draw, ]\n    }\n\n    eta <- X %*% bs\n\n    if (rho_names == 'rho_trend') {\n      # trend models use Gaussian family; expectations are simply the trend_mus\n      mu <- mcmc_chains(object$model_output, 'trend_mus')[\n        best_draw,\n        1:length(eta)\n      ]\n    } else {\n      # observation models may vary in their response family; need to compute\n      # the expectations\n      mu <- fitted(object, summary = FALSE)[best_draw, 1:length(eta)]\n    }\n\n    # Calculate variance using family's mean-variance relationship\n    mu_variance <- predict(\n      object,\n      process_error = FALSE,\n      type = 'variance',\n      summary = FALSE\n    )[best_draw, ]\n    if (length(mu_variance) > 1) {\n      mu_variance <- mu_variance[1:length(eta)]\n    }\n    if (any(mu_variance == 0)) {\n      mu_variance[which(mu_variance == 0)] <-\n        mu[which(mu_variance == 0)]\n    }\n\n    if (!conservative) {\n      w <- as.numeric(mgcv_model$family$mu.eta(as.vector(eta))^2 / mu_variance)\n      XWX <- t(X) %*% (w * X)\n    } else {\n      XWX <- t(X) %*% X\n    }\n\n    lambda <- mgcv_model$sp\n    XWXS <- XWX\n\n    for (i in 1:length(lambda)) {\n      ind <- mgcv_model$off[i]:(mgcv_model$off[i] + ncol(mgcv_model$S[[i]]) - 1)\n      XWXS[ind, ind] <- XWXS[ind, ind] + mgcv_model$S[[i]] * lambda[i]\n    }\n    suppressWarnings(edf <- try(diag(solve(XWXS, XWX)), silent = TRUE))\n    if (inherits(edf, 'try-error')) {\n      edf <- mgcv_model$edf\n      names(edf) <- names(coef(mgcv_model))\n    }\n    mgcv_model$edf <- edf\n    mgcv_model$edf1 <- edf\n    mgcv_model$edf2 <- edf\n  }\n\n  # Add frequentist version of parameter covariance estimators\n  # for calculation of smooth term p-values;\n  # rV <- mroot(mgcv_model$Vp)\n  # V <- tcrossprod(rV)\n  # XWX <- crossprod(mgcv_model$R)\n  # Ve_hat <- V %*% XWX\n  # mgcv_model$Ve <- Ve_hat %*% V\n\n  mgcv_model$Ve <- mgcv_model$Vp\n  return(mgcv_model)\n}\n"
  },
  {
    "path": "R/conditional_effects.R",
    "content": "#' Display conditional effects of predictors for \\pkg{mvgam} models\n#'\n#' Display conditional effects of one or more numeric and/or categorical\n#' predictors in models of class `mvgam` and `jsdgam`, including two-way\n#' interaction effects.\n#'\n#' @importFrom ggplot2 scale_colour_discrete scale_fill_discrete theme_classic\n#' @importFrom graphics plot\n#' @importFrom grDevices devAskNewPage\n#'\n#' @inheritParams brms::conditional_effects.brmsfit\n#' @inheritParams brms::plot.brms_conditional_effects\n#'\n#' @param x Object of class `mvgam`, `jsdgam` or `mvgam_conditional_effects`\n#'\n#' @param points `Logical`. Indicates if the original data points should be\n#'   added, but only if `type == 'response'`. Default is `TRUE`.\n#'\n#' @param rug `Logical`. Indicates if displays tick marks should be plotted on\n#'   the axes to mark the distribution of raw data, but only if\n#'   `type == 'response'`. Default is `TRUE`.\n#'\n#' @param ask `Logical`. Indicates if the user is prompted before a new page is\n#'   plotted. Only used if plot is `TRUE`. Default is `FALSE`.\n#'\n#' @param type `character` specifying the scale of predictions. When this has\n#'   the value \\code{link} the linear predictor is calculated on the link\n#'   scale. If \\code{expected} is used (the default), predictions reflect the\n#'   expectation of the response (the mean) but ignore uncertainty in the\n#'   observation process. When \\code{response} is used, the predictions take\n#'   uncertainty in the observation process into account to return predictions\n#'   on the outcome scale. Two special cases are also allowed: type `latent_N`\n#'   will return the estimated latent abundances from an N-mixture distribution,\n#'   while type `detection` will return the estimated detection probability from\n#'   an N-mixture distribution.\n#'\n#' @param ... other arguments to pass to \\code{\\link[marginaleffects]{plot_predictions}}\n#'\n#' @return `conditional_effects` returns an object of class\n#'   \\code{mvgam_conditional_effects} which is a named list with one slot per\n#'   effect containing a \\code{\\link[ggplot2]{ggplot}} object, which can be\n#'   further customized using the \\pkg{ggplot2} package. The corresponding\n#'   `plot` method will draw these plots in the active graphic device.\n#'\n#' @details This function acts as a wrapper to the more flexible\n#'   \\code{\\link[marginaleffects]{plot_predictions}}. When creating\n#'   \\code{conditional_effects} for a particular predictor (or interaction of\n#'   two predictors), one has to choose the values of all other predictors to\n#'   condition on. By default, the mean is used for continuous variables and the\n#'   reference category is used for factors. Use\n#'   \\code{\\link[marginaleffects]{plot_predictions}} to change these and create\n#'   more bespoke conditional effects plots.\n#'\n#' @name conditional_effects.mvgam\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso \\code{\\link[marginaleffects]{plot_predictions}},\n#'   \\code{\\link[marginaleffects]{plot_slopes}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data\n#' simdat <- sim_mvgam(\n#'   family = poisson(),\n#'   seasonality = 'hierarchical'\n#' )\n#'\n#' # Fit a model\n#' mod <- mvgam(\n#'   y ~ s(season, by = series, k = 5) + year:series,\n#'   family = poisson(),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot all main effects on the response scale\n#' conditional_effects(mod)\n#'\n#' # Change the prediction interval to 70% using plot_predictions() argument\n#' # 'conf_level'\n#' conditional_effects(mod, conf_level = 0.7)\n#'\n#' # Plot all main effects on the link scale\n#' conditional_effects(mod, type = 'link')\n#'\n#' # Works the same for smooth terms, including smooth interactions\n#' set.seed(0)\n#' dat <- mgcv::gamSim(1, n = 200, scale = 2)\n#' mod <- mvgam(\n#'   y ~ te(x0, x1, k = 5) + s(x2, k = 6) + s(x3, k = 6),\n#'   data = dat,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#' conditional_effects(mod)\n#' conditional_effects(mod, conf_level = 0.5, type = 'link')\n#'\n#' # ggplot objects can be modified and combined with the help of many\n#' # additional packages. Here is an example using the patchwork package\n#'\n#' # Simulate some nonlinear data\n#' dat <- mgcv::gamSim(1, n = 200, scale = 2)\n#' mod <- mvgam(\n#'   y ~ s(x1, bs = 'moi') + te(x0, x2),\n#'   data = dat,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract the list of ggplot conditional_effect plots\n#' m <- plot(conditional_effects(mod), plot = FALSE)\n#'\n#' # Add custom labels and arrange plots together using patchwork::wrap_plots()\n#' library(patchwork)\n#' library(ggplot2)\n#' wrap_plots(\n#'   m[[1]] + labs(title = 's(x1, bs = \"moi\")'),\n#'   m[[2]] + labs(title = 'te(x0, x2)')\n#' )\n#' }\n#'\n#' @export\nconditional_effects.mvgam = function(\n  x,\n  effects = NULL,\n  type = 'expected',\n  points = FALSE,\n  rug = FALSE,\n  ...\n) {\n  use_def_effects <- is.null(effects)\n  type <- match.arg(\n    type,\n    c('response', 'link', 'detection', 'latent_N', 'expected')\n  )\n\n  if (type == 'response') {\n    if (points) {\n      points <- 0.5\n    } else {\n      points <- 0\n    }\n  } else {\n    points <- 0\n    rug <- FALSE\n  }\n\n  # Can't plot points or rugs with binomial models due to the\n  # cbind syntax\n  if (rug) {\n    if (x$family %in% c('binomial', 'beta_binomial')) {\n      rug <- FALSE\n      message('Cannot show observation rug for binomial models')\n    }\n  }\n\n  if (points) {\n    if (x$family %in% c('binomial', 'beta_binomial')) {\n      points <- 0\n      message('Cannot show observation points for binomial models')\n    }\n  }\n\n  if (use_def_effects) {\n    # Get all term labels in the model\n    termlabs <- attr(terms(formula(x), keep.order = TRUE), 'term.labels')\n    #termlabs <- unlist(find_predictors(x), use.names = FALSE)\n    if (!is.null(x$trend_call)) {\n      termlabs <- c(\n        termlabs,\n        gsub(\n          'trend',\n          'series',\n          attr(\n            terms(formula(x, trend_effects = TRUE), keep.order = TRUE),\n            'term.labels'\n          )\n        )\n      )\n    }\n\n    # Find all possible (up to 2-way) plot conditions\n    cond_labs <- purrr::flatten(lapply(termlabs, function(i) {\n      split_termlabs(i)\n    }))\n  } else {\n    cond_labs <- strsplit(as.character(effects), split = \":\")\n  }\n\n  if (any(lengths(cond_labs) > 3L)) {\n    stop(\n      \"To display interactions of order higher than 3 \",\n      \"please use plot_predictions()\",\n      call. = FALSE\n    )\n  }\n\n  if (length(cond_labs) > 0) {\n    # Make the plot data with plot_predictions\n    out <- list()\n    for (i in seq_along(cond_labs)) {\n      if (length(cond_labs[[i]]) == 1) {\n        out[[i]] <- plot_predictions(\n          x,\n          condition = cond_labs[[i]],\n          draw = TRUE,\n          type = type,\n          points = points,\n          rug = rug,\n          ...\n        ) +\n          scale_fill_discrete(label = roundlabs) +\n          scale_colour_discrete(label = roundlabs) +\n          theme_classic()\n      }\n\n      if (length(cond_labs[[i]]) == 2) {\n        out[[i]] <- plot_predictions(\n          x,\n          condition = c(cond_labs[[i]][1], cond_labs[[i]][2]),\n          draw = TRUE,\n          type = type,\n          points = points,\n          rug = rug,\n          ...\n        ) +\n          scale_fill_discrete(label = roundlabs) +\n          scale_colour_discrete(label = roundlabs) +\n          theme_classic()\n      }\n\n      if (length(cond_labs[[i]]) == 3) {\n        out[[i]] <- plot_predictions(\n          x,\n          condition = c(\n            cond_labs[[i]][1],\n            cond_labs[[i]][2],\n            cond_labs[[i]][3]\n          ),\n          draw = TRUE,\n          type = type,\n          points = points,\n          rug = rug,\n          ...\n        ) +\n          scale_fill_discrete(label = roundlabs) +\n          scale_colour_discrete(label = roundlabs) +\n          theme_classic()\n      }\n    }\n  } else {\n    out <- NULL\n  }\n\n  class(out) <- 'mvgam_conditional_effects'\n  return(out)\n}\n\n#' @export\n#' @importFrom brms conditional_effects\nbrms::conditional_effects\n\n#' @rdname conditional_effects.mvgam\n#' @export\nplot.mvgam_conditional_effects = function(x, plot = TRUE, ask = FALSE, ...) {\n  out <- x\n  for (i in seq_along(out)) {\n    if (plot) {\n      plot(out[[i]])\n      if (i == 1) {\n        devAskNewPage(ask = ask)\n      }\n    }\n  }\n  invisible(out)\n}\n\n#' A helper function so ggplot2 labels in the legend don't have\n#' ridiculous numbers of digits for numeric bins\n#' @noRd\ndecimalplaces <- function(x) {\n  x <- as.numeric(x)\n  if (abs(x - round(x)) > .Machine$double.eps^0.5) {\n    nchar(strsplit(sub('0+$', '', as.character(x)), \".\", fixed = TRUE)[[1]][[\n      2\n    ]])\n  } else {\n    return(0)\n  }\n}\n\n#' A helper function so ggplot2 labels in the legend don't have\n#' ridiculous numbers of digits for numeric bins\n#' @noRd\nroundlabs = function(x) {\n  if (all(suppressWarnings(is.na(as.numeric(x))))) {\n    out <- x\n  } else if (all(sapply(x, decimalplaces) == 0)) {\n    out <- x\n  } else if (all(sapply(x, decimalplaces) <= 1)) {\n    out <- sprintf(\"%.1f\", as.numeric(x))\n  } else {\n    out <- sprintf(\"%.4f\", as.numeric(x))\n  }\n  out\n}\n\n#' @rdname conditional_effects.mvgam\n#' @export\nprint.mvgam_conditional_effects <- function(x, ...) {\n  plot(x, ...)\n}\n\n#' @noRd\nsplit_termlabs = function(lab) {\n  out <- list()\n  if (grepl(':', lab, fixed = TRUE)) {\n    out[[1]] <- strsplit(lab, ':')[[1]]\n  } else if (grepl('*', lab, fixed = TRUE)) {\n    out[[1]] <- strsplit(lab, '\\\\*')[[1]]\n  } else if (\n    grepl('s(', lab, fixed = TRUE) |\n      grepl('gp(', lab, fixed = TRUE) |\n      grepl('te(', lab, fixed = TRUE) |\n      grepl('t2(', lab, fixed = TRUE) |\n      grepl('ti(', lab, fixed = TRUE)\n  ) {\n    term_struc <- eval(rlang::parse_expr(lab))\n    term_struc$by <- if (term_struc$by == 'NA') {\n      NULL\n    } else {\n      term_struc$by\n    }\n    if (length(term_struc$term) <= 2) {\n      out[[1]] <- c(all.vars(parse(text = term_struc$term)), term_struc$by)\n    }\n    if (length(term_struc$term) == 3) {\n      out[[1]] <- c(all.vars(parse(text = term_struc$term[1:2])), term_struc$by)\n      out[[2]] <- c(\n        all.vars(parse(text = term_struc$term[c(1, 3)])),\n        term_struc$by\n      )\n      out[[3]] <- c(\n        all.vars(parse(text = term_struc$term[c(2, 3)])),\n        term_struc$by\n      )\n    }\n\n    if (length(term_struc$term) == 4) {\n      out[[1]] <- c(all.vars(parse(text = term_struc$term[1:2])), term_struc$by)\n      out[[2]] <- c(\n        all.vars(parse(text = term_struc$term[c(1, 3)])),\n        term_struc$by\n      )\n      out[[3]] <- c(\n        all.vars(parse(text = term_struc$term[c(1, 4)])),\n        term_struc$by\n      )\n      out[[4]] <- c(\n        all.vars(parse(text = term_struc$term[c(2, 3)])),\n        term_struc$by\n      )\n      out[[5]] <- c(\n        all.vars(parse(text = term_struc$term[c(2, 4)])),\n        term_struc$by\n      )\n    }\n  } else if (grepl('dynamic(', lab, fixed = TRUE)) {\n    term_struc <- eval(rlang::parse_expr(lab))\n    out[[1]] <- c('time', all.vars(parse(text = term_struc$term[c(2, 4)])))\n  } else {\n    out[[1]] <- lab\n  }\n\n  return(out)\n}\n"
  },
  {
    "path": "R/cpp_funs.R",
    "content": "#' @useDynLib mvgam, .registration = TRUE\n#' @importFrom Rcpp evalCpp\nNULL\n"
  },
  {
    "path": "R/data_grids.R",
    "content": "#' Get data objects into correct order in case it is not already\n#'@noRd\nsort_data = function(data, series_time = FALSE) {\n  if (inherits(data, 'list')) {\n    data_arranged <- data\n    if (series_time) {\n      temp_dat = data.frame(\n        time = data$index..time..index,\n        series = data$series\n      ) %>%\n        dplyr::mutate(index = dplyr::row_number()) %>%\n        dplyr::arrange(series, time)\n    } else {\n      temp_dat = data.frame(\n        time = data$index..time..index,\n        series = data$series\n      ) %>%\n        dplyr::mutate(index = dplyr::row_number()) %>%\n        dplyr::arrange(time, series)\n    }\n\n    data_arranged <- lapply(data, function(x) {\n      if (is.matrix(x)) {\n        matrix(x[temp_dat$index, ], ncol = NCOL(x))\n      } else {\n        x[temp_dat$index]\n      }\n    })\n    names(data_arranged) <- names(data)\n  } else {\n    if (series_time) {\n      data_arranged <- data %>%\n        dplyr::arrange(series, index..time..index)\n    } else {\n      data_arranged <- data %>%\n        dplyr::arrange(index..time..index, series)\n    }\n  }\n\n  return(data_arranged)\n}\n\n#' Create prediction grids, mostly for simple plotting functions\n#'@noRd\ndata_grid = function(..., newdata) {\n  dots <- list(...)\n  vars <- names(dots)\n\n  # Validate that vars exist in supplied data\n  for (i in seq_along(vars)) {\n    if (!exists(vars[i], newdata)) {\n      stop(paste0('Variable ', vars[i], ' not found in newdata'), call. = FALSE)\n    }\n  }\n\n  # Create sample dummy dataframe to get the prediction grid, ensuring\n  # factors are preserved\n  newdat_grid <- data.frame(do.call(\n    cbind.data.frame,\n    lapply(vars, function(x) {\n      newdata[[x]]\n    })\n  ))\n  colnames(newdat_grid) <- vars\n\n  # Use the supplied conditions for making the datagrid\n  newdat_grid <- marginaleffects::datagrid(..., newdata = newdat_grid)\n\n  # Now replicate the first observation for all other variables\n  if (inherits(newdata, 'list')) {\n    newdat_full <- lapply(seq_along(newdata), function(x) {\n      if (names(newdata)[x] %in% vars) {\n        newdat_grid[[names(newdata)[x]]]\n      } else {\n        if (is.matrix(newdata[[x]])) {\n          t(replicate(NROW(newdat_grid), newdata[[x]][1, ]))\n        } else {\n          if (is.factor(newdata[[x]])) {\n            factor(\n              rep(newdata[[x]][1], NROW(newdat_grid)),\n              levels = levels(newdata[[x]])\n            )\n          } else {\n            rep(newdata[[x]][1], NROW(newdat_grid))\n          }\n        }\n      }\n    })\n    names(newdat_full) <- names(newdata)\n  } else {\n    newdat_full <-\n      dplyr::bind_cols(\n        newdat_grid,\n        data.frame(\n          newdata %>%\n            dplyr::select(!vars) %>%\n            dplyr::slice_head(n = 1)\n        )\n      )\n  }\n\n  return(newdat_full)\n}\n"
  },
  {
    "path": "R/dynamic.R",
    "content": "#' Defining dynamic coefficients in \\pkg{mvgam} formulae\n#'\n#' Set up time-varying (dynamic) coefficients for use in \\pkg{mvgam} models.\n#' Currently, only low-rank Gaussian Process smooths are available for\n#' estimating the dynamics of the time-varying coefficient.\n#'\n#' @importFrom stats terms formula reformulate\n#'\n#' @param variable The variable that the dynamic smooth will be a function of\n#'\n#' @param k Optional number of basis functions for computing approximate GPs.\n#'   If missing, `k` will be set as large as possible to accurately estimate\n#'   the nonlinear function.\n#'\n#' @param stationary Logical. If \\code{TRUE} (the default) and `rho` is\n#'   supplied, the latent Gaussian Process smooth will not have a linear trend\n#'   component. If \\code{FALSE}, a linear trend in the covariate is added to\n#'   the Gaussian Process smooth. Leave at \\code{TRUE} if you do not believe\n#'   the coefficient is evolving with much trend, as the linear component of\n#'   the basis functions can be hard to penalize to zero. This sometimes causes\n#'   divergence issues in `Stan`. See \\code{\\link[mgcv]{gp.smooth}} for\n#'   details. Ignored if `rho` is missing (in which case a Hilbert space\n#'   approximate GP is used).\n#'\n#' @param rho Either a positive numeric stating the length scale to be used for\n#'   approximating the squared exponential Gaussian Process smooth (see\n#'   \\code{\\link[mgcv]{gp.smooth}} for details) or missing, in which case the\n#'   length scale will be estimated by setting up a Hilbert space approximate GP.\n#'\n#' @param scale Logical; If `TRUE` (the default) and `rho` is missing,\n#'   predictors are scaled so that the maximum Euclidean distance between two\n#'   points is `1`. This often improves sampling speed and convergence. Scaling\n#'   also affects the estimated length-scale parameters in that they resemble\n#'   those of scaled predictors (not of the original predictors) if scale is\n#'   `TRUE`.\n#'\n#' @details \\code{mvgam} currently sets up dynamic coefficients as low-rank\n#'   squared exponential Gaussian Process smooths via the call\n#'   \\code{s(time, by = variable, bs = \"gp\", m = c(2, rho, 2))}. These smooths,\n#'   if specified with reasonable values for the length scale parameter, will\n#'   give more realistic out of sample forecasts than standard splines such as\n#'   thin plate or cubic. But the user must set the value for `rho`, as there\n#'   is currently no support for estimating this value in \\code{mgcv}. This may\n#'   not be too big of a problem, as estimating latent length scales is often\n#'   difficult anyway. The \\code{rho} parameter should be thought of as a prior\n#'   on the smoothness of the latent dynamic coefficient function (where higher\n#'   values of \\code{rho} lead to smoother functions with more temporal\n#'   covariance structure). Values of \\code{k} are set automatically to ensure\n#'   enough basis functions are used to approximate the expected wiggliness of\n#'   the underlying dynamic function (\\code{k} will increase as \\code{rho}\n#'   decreases).\n#'\n#' @rdname dynamic\n#'\n#' @return a `list` object for internal usage in 'mvgam'\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate a time-varying coefficient\n#' # (as a Gaussian Process with length scale = 10)\n#' set.seed(1111)\n#' N <- 200\n#'\n#' # A function to simulate from a squared exponential Gaussian Process\n#' sim_gp <- function(N, c, alpha, rho) {\n#'   Sigma <- alpha ^ 2 *\n#'     exp(-0.5 * ((outer(1:N, 1:N, \"-\") / rho) ^ 2)) +\n#'     diag(1e-9, N)\n#'   c + mgcv::rmvn(1, mu = rep(0, N), V = Sigma)\n#' }\n#'\n#' beta <- sim_gp(alpha = 0.75, rho = 10, c = 0.5, N = N)\n#' plot(\n#'   beta, type = 'l', lwd = 3, bty = 'l',\n#'   xlab = 'Time', ylab = 'Coefficient', col = 'darkred'\n#' )\n#'\n#' # Simulate the predictor as a standard normal\n#' predictor <- rnorm(N, sd = 1)\n#'\n#' # Simulate a Gaussian outcome variable\n#' out <- rnorm(N, mean = 4 + beta * predictor, sd = 0.25)\n#' time <- seq_along(predictor)\n#' plot(\n#'   out, type = 'l', lwd = 3, bty = 'l',\n#'   xlab = 'Time', ylab = 'Outcome', col = 'darkred'\n#' )\n#'\n#' # Gather into a data.frame and fit a dynamic coefficient model\n#' data <- data.frame(out, predictor, time)\n#'\n#' # Split into training and testing\n#' data_train <- data[1:190, ]\n#' data_test <- data[191:200, ]\n#'\n#' # Fit a model using the dynamic function\n#' mod <- mvgam(\n#'   out ~\n#'     # mis-specify the length scale slightly as this\n#'     # won't be known in practice\n#'     dynamic(predictor, rho = 8, stationary = TRUE),\n#'   family = gaussian(),\n#'   data = data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Inspect the summary\n#' summary(mod)\n#'\n#' # Plot the time-varying coefficient estimates\n#' plot(mod, type = 'smooths')\n#'\n#' # Extrapolate the coefficient forward in time\n#' plot_mvgam_smooth(mod, smooth = 1, newdata = data)\n#' abline(v = 190, lty = 'dashed', lwd = 2)\n#'\n#' # Overlay the true simulated time-varying coefficient\n#' lines(beta, lwd = 2.5, col = 'white')\n#' lines(beta, lwd = 2)\n#' }\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\ndynamic = function(variable, k, rho = 5, stationary = TRUE, scale = TRUE) {\n  # Check that only one variable is supplied\n  vars <- as.list(substitute(list(variable)))[-1]\n  if (length(vars) > 1) {\n    stop(\"dynamic() can only handle one term at a time.\")\n  }\n  term <- deparse(vars[[1]])\n  if (term[1] == \".\") {\n    stop(\"dynamic(.) not supported.\")\n  }\n\n  # Check rho\n  if (missing(rho)) {\n    rho <- NULL\n  } else {\n    if (rho <= 0) {\n      stop(\n        'Argument \"rho\" in dynamic() must be a positive value',\n        call. = FALSE\n      )\n    }\n  }\n\n  # Check k\n  if (missing(k)) {\n    k <- NULL\n  } else {\n    validate_pos_integer(k)\n  }\n\n  # Gather into a structured list and return\n  term <- attr(terms(reformulate(term)), \"term.labels\")\n  out <- list(\n    term = term,\n    rho = rho,\n    k = k,\n    stationary = stationary,\n    scale = scale\n  )\n  class(out) <- \"dyncoef.spec\"\n  return(out)\n}\n"
  },
  {
    "path": "R/ensemble.R",
    "content": "#' Combine forecasts from \\pkg{mvgam} models into evenly weighted ensembles\n#'\n#' Generate evenly weighted ensemble forecast distributions from\n#' \\code{mvgam_forecast} objects.\n#'\n#' @name ensemble.mvgam_forecast\n#'\n#' @param object \\code{list} object of class \\code{mvgam_forecast}.\n#'   See [forecast.mvgam()]\n#'\n#' @param ... More \\code{mvgam_forecast} objects.\n#'\n#' @details It is widely recognised in the forecasting literature that\n#'   combining forecasts from different models often results in improved\n#'   forecast accuracy. The simplest way to create an ensemble is to use\n#'   evenly weighted combinations of forecasts from the different models.\n#'   This is straightforward to do in a Bayesian setting with \\pkg{mvgam} as\n#'   the posterior MCMC draws contained in each \\code{mvgam_forecast} object\n#'   will already implicitly capture correlations among the temporal posterior\n#'   predictions.\n#'\n#' @return An object of class \\code{mvgam_forecast} containing the ensemble\n#'   predictions. This object can be readily used with the supplied S3\n#'   functions \\code{plot} and \\code{score}.\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso \\code{\\link{plot.mvgam_forecast}},\n#'   \\code{\\link{score.mvgam_forecast}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some series and fit a few competing dynamic models\n#' set.seed(1)\n#' simdat <- sim_mvgam(\n#'   n_series = 1,\n#'   prop_trend = 0.6,\n#'   mu = 1\n#' )\n#'\n#' plot_mvgam_series(\n#'   data = simdat$data_train,\n#'   newdata = simdat$data_test\n#' )\n#'\n#' m1 <- mvgam(\n#'   y ~ 1,\n#'   trend_formula = ~ time +\n#'     s(season, bs = 'cc', k = 9),\n#'   trend_model = AR(p = 1),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   newdata = simdat$data_test,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' m2 <- mvgam(\n#'   y ~ time,\n#'   trend_model = RW(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   newdata = simdat$data_test,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Calculate forecast distributions for each model\n#' fc1 <- forecast(m1)\n#' fc2 <- forecast(m2)\n#'\n#' # Generate the ensemble forecast\n#' ensemble_fc <- ensemble(fc1, fc2)\n#'\n#' # Plot forecasts\n#' plot(fc1)\n#' plot(fc2)\n#' plot(ensemble_fc)\n#'\n#' # Score forecasts\n#' score(fc1)\n#' score(fc2)\n#' score(ensemble_fc)\n#' }\n#'\n#' @export\nensemble <- function(object, ...) {\n  UseMethod(\"ensemble\", object)\n}\n\n#'@rdname ensemble.mvgam_forecast\n#'\n#'@method ensemble mvgam_forecast\n#'\n#'@param ndraws Positive integer specifying the number of draws to use from each\n#'forecast distribution for creating the ensemble. If some of the ensemble members have\n#'fewer draws than `ndraws`, their forecast distributions will be resampled with replacement\n#'to achieve the correct number of draws\n#'\n#'@export\nensemble.mvgam_forecast <- function(object, ..., ndraws = 5000) {\n  models <- split_fc_dots(object, ..., model_names = NULL)\n  n_models <- length(models)\n\n  # Check that series names and key dimensions match for all forecasts\n  allsame <- function(x) length(unique(x)) == 1\n  if (!allsame(purrr::map(models, 'series_names'))) {\n    stop('Names of series must match for all forecast objects.', call. = FALSE)\n  }\n\n  if (!allsame(lapply(models, function(x) length(x$forecasts)))) {\n    stop(\n      'The number of forecast distributions must match for all forecast objects.',\n      call. = FALSE\n    )\n  }\n\n  if (!allsame(lapply(models, function(x) length(x$test_observations)))) {\n    stop('Validation data must match for all forecast objects.', call. = FALSE)\n  }\n\n  if (\n    !allsame(lapply(models, function(x) {\n      unlist(lapply(x$forecasts, function(y) dim(y)[2]), use.names = FALSE)\n    }))\n  ) {\n    stop(\n      'Forecast horizons must match for all forecast objects.',\n      call. = FALSE\n    )\n  }\n\n  validate_pos_integer(ndraws)\n\n  # End of checks; now proceed with ensembling\n  n_series <- length(models[[1]]$series_names)\n\n  # Calculate total number of forecast draws to sample from for each model\n  n_mod_draws <- lapply(seq_len(n_models), function(x) {\n    NROW(models[[x]]$forecasts[[1]])\n  })\n\n  # Calculate model weights (only option at the moment is even weighting,\n  # but this may be relaxed in future)\n  mod_weights <- data.frame(\n    mod = paste0('mod', 1:n_models),\n    orig_weight = 1 / n_models,\n    ndraws = unlist(n_mod_draws, use.names = FALSE)\n  ) %>%\n    # Adjust weights by the number of draws available per\n    # forecast, ensuring that models with fewer draws aren't\n    # under-represented in the final weighted ensemble\n    dplyr::mutate(weight = (orig_weight / ndraws) * 100) %>%\n    dplyr::mutate(mod = as.factor(mod)) %>%\n    dplyr::select(mod, weight)\n\n  # Create draw indices\n  mod_inds <- as.factor(unlist(\n    lapply(seq_len(n_models), function(x) {\n      rep(paste0('mod', x), NROW(models[[x]]$forecasts[[1]]))\n    }),\n    use.names = FALSE\n  ))\n  all_draw_inds <- 1:sum(unlist(n_mod_draws, use.names = FALSE))\n  mod_inds_draws <- split(all_draw_inds, mod_inds)\n\n  # Add model-specific weights to the draw indices\n  draw_weights <- data.frame(draw = all_draw_inds, mod = mod_inds) %>%\n    dplyr::left_join(mod_weights, by = 'mod')\n\n  # Perform multinomial sampling using draw-specific weights\n  fc_draws <- sample(\n    all_draw_inds,\n    size = ndraws,\n    replace = max(all_draw_inds) < ndraws,\n    prob = draw_weights$weight\n  )\n\n  # Create weighted ensemble hindcasts and forecasts\n  ens_hcs <- lapply(seq_len(n_series), function(series) {\n    all_hcs <- do.call(rbind, lapply(models, function(x) x$hindcasts[[series]]))\n    all_hcs[fc_draws, ]\n  })\n\n  ens_fcs <- lapply(seq_len(n_series), function(series) {\n    all_fcs <- do.call(rbind, lapply(models, function(x) x$forecasts[[series]]))\n    all_fcs[fc_draws, ]\n  })\n\n  # Initiate the ensemble forecast object\n  ens_fc <- models[[1]]\n\n  # Add in hindcasts and forecasts\n  ens_fc$hindcasts <- ens_hcs\n  ens_fc$forecasts <- ens_fcs\n  names(ens_fc$hindcasts) <- names(models[[1]]$hindcasts)\n  names(ens_fc$forecasts) <- names(models[[1]]$forecasts)\n\n  # Return\n  return(ens_fc)\n}\n\n#'@noRd\nsplit_fc_dots = function(x, ..., model_names = NULL, other = TRUE) {\n  dots <- list(x, ...)\n  names <- substitute(list(x, ...), env = parent.frame())[-1]\n  names <- ulapply(names, deparse)\n\n  if (!is.null(model_names)) {\n    names <- model_names\n  }\n\n  if (length(names)) {\n    if (!length(names(dots))) {\n      names(dots) <- names\n    } else {\n      has_no_name <- !nzchar(names(dots))\n      names(dots)[has_no_name] <- names[has_no_name]\n    }\n  }\n  is_mvgam_fc <- unlist(lapply(dots, function(y) inherits(y, 'mvgam_forecast')))\n  models <- dots[is_mvgam_fc]\n  out <- dots[!is_mvgam_fc]\n\n  if (length(out)) {\n    stop(\n      \"Only mvgam_forecast objects can be passed to '...' for this method.\",\n      call. = FALSE\n    )\n  }\n  models\n}\n"
  },
  {
    "path": "R/evaluate_mvgams.R",
    "content": "#' Evaluate forecasts from fitted \\pkg{mvgam} objects\n#'\n#' @importFrom graphics barplot boxplot axis\n#' @importFrom stats quantile ecdf median predict\n#' @importFrom grDevices devAskNewPage\n#' @importFrom utils lsf.str\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}\n#'\n#' @param n_samples \\code{integer} specifying the number of samples to generate\n#'   from the model's posterior distribution\n#'\n#' @param eval_timepoint \\code{integer} indexing the timepoint that represents\n#'   our last 'observed' set of outcome data\n#'\n#' @param fc_horizon \\code{integer} specifying the length of the forecast\n#'   horizon for evaluating forecasts\n#'\n#' @param n_cores Deprecated. Parallel processing is no longer supported\n#'\n#' @param score \\code{character} specifying the type of ranked probability score\n#'   to use for evaluation. Options are: `variogram`, `drps` or `crps`\n#'\n#' @param log \\code{logical}. Should the forecasts and truths be logged prior\n#'   to scoring? This is often appropriate for comparing performance of models\n#'   when series vary in their observation ranges\n#'\n#' @param weights optional \\code{vector} of weights (where\n#'   \\code{length(weights) == n_series}) for weighting pairwise correlations\n#'   when evaluating the variogram score for multivariate forecasts. Useful for\n#'   down-weighting series that have larger magnitude observations or that are\n#'   of less interest when forecasting. Ignored if \\code{score != 'variogram'}\n#'\n#' @details `eval_mvgam` may be useful when both repeated fitting of a model\n#'   using \\code{\\link{update.mvgam}} for exact leave-future-out cross-validation\n#'   and approximate leave-future-out cross-validation using \\code{\\link{lfo_cv}}\n#'   are impractical. The function generates a set of samples representing fixed\n#'   parameters estimated from the full \\code{mvgam} model and latent trend states\n#'   at a given point in time. The trends are rolled forward a total of\n#'   \\code{fc_horizon} timesteps according to their estimated state space dynamics\n#'   to generate an 'out-of-sample' forecast that is evaluated against the true\n#'   observations in the horizon window. This function therefore simulates a\n#'   situation where the model's parameters had already been estimated but we have\n#'   only observed data up to the evaluation timepoint and would like to generate\n#'   forecasts from the latent trends that have been observed up to that timepoint.\n#'   Evaluation involves calculating an appropriate Rank Probability Score and a\n#'   binary indicator for whether or not the true value lies within the forecast's\n#'   90% prediction interval\n#'\n#'   `roll_eval_mvgam` sets up a sequence of evaluation timepoints along a rolling\n#'   window and iteratively calls \\code{eval_mvgam} to evaluate 'out-of-sample'\n#'   forecasts. Evaluation involves calculating the Rank Probability Scores and a\n#'   binary indicator for whether or not the true value lies within the forecast's\n#'   90% prediction interval\n#'\n#'   `compare_mvgams` automates the evaluation to compare two fitted models using\n#'   rolling window forecast evaluation and provides a series of summary plots to\n#'   facilitate model selection. It is essentially a wrapper for\n#'   \\code{roll_eval_mvgam}\n#'\n#' @return For `eval_mvgam`, a \\code{list} object containing information on\n#'   specific evaluations for each series (if using `drps` or `crps` as the score)\n#'   or a vector of scores when using `variogram`.\n#'\n#'   For `roll_eval_mvgam`, a \\code{list} object containing information on specific\n#'   evaluations for each series as well as a total evaluation summary (taken by\n#'   summing the forecast score for each series at each evaluation and averaging\n#'   the coverages at each evaluation)\n#'\n#'   For `compare_mvgams`, a series of plots comparing forecast Rank Probability\n#'   Scores for each competing model. A lower score is preferred. Note however\n#'   that it is possible to select a model that ultimately would perform poorly\n#'   in true out-of-sample forecasting. For example if a wiggly smooth function\n#'   of 'year' is included in the model then this function will be learned prior\n#'   to evaluating rolling window forecasts, and the model could generate very\n#'   tight predictions as a result. But when forecasting ahead to timepoints that\n#'   the model has not seen (i.e. next year), the smooth function will end up\n#'   extrapolating, sometimes in very strange and unexpected ways. It is therefore\n#'   recommended to only use smooth functions for covariates that are adequately\n#'   measured in the data (i.e. 'seasonality', for example) to reduce possible\n#'   extrapolation of smooths and let the latent trends in the \\code{mvgam} model\n#'   capture any temporal dependencies in the data. These trends are time series\n#'   models and so will provide much more stable forecasts\n#'\n#' @seealso \\code{\\link{forecast}}, \\code{\\link{score}}, \\code{\\link{lfo_cv}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate from a Poisson-AR2 model with a seasonal smooth\n#' set.seed(1)\n#' dat <- sim_mvgam(\n#'   T = 75,\n#'   n_series = 1,\n#'   prop_trend = 0.75,\n#'   trend_model = AR(p = 2),\n#'   family = poisson()\n#' )\n#'\n#' # Fit an appropriate model\n#' mod_ar2 <- mvgam(\n#'   formula = y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(p = 2),\n#'   family = poisson(),\n#'   data = dat$data_train,\n#'   newdata = dat$data_test,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Fit a less appropriate model\n#' mod_rw <- mvgam(\n#'   formula = y ~ 1,\n#'   trend_model = RW(),\n#'   family = poisson(),\n#'   data = dat$data_train,\n#'   newdata = dat$data_test,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Compare Discrete Ranked Probability Scores for the testing period\n#' fc_ar2 <- forecast(mod_ar2)\n#' fc_rw <- forecast(mod_rw)\n#' score_ar2 <- score(\n#'   object = fc_ar2,\n#'   score = 'drps'\n#' )\n#' score_rw <- score(\n#'   object = fc_rw,\n#'   score = 'drps'\n#' )\n#' sum(score_ar2$series_1$score)\n#' sum(score_rw$series_1$score)\n#'\n#' # Use rolling evaluation for approximate comparisons of 3-step ahead\n#' # forecasts across the training period\n#' compare_mvgams(\n#'   model1 = mod_ar2,\n#'   model2 = mod_rw,\n#'   fc_horizon = 3,\n#'   n_samples = 1000,\n#'   n_evaluations = 5\n#' )\n#'\n#' # A more appropriate comparison would be to use approximate\n#' # leave-future-out CV to compare forecasts (see ?mvgam::lfo_cv())\n#' }\n#' @name evaluate_mvgams\nNULL\n\n#' @rdname evaluate_mvgams\n#' @export\neval_mvgam = function(\n  object,\n  n_samples = 5000,\n  eval_timepoint = 3,\n  fc_horizon = 3,\n  n_cores = 1,\n  score = 'drps',\n  log = FALSE,\n  weights\n) {\n  # Check arguments\n  if (!(inherits(object, 'mvgam'))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  if (attr(object$model_data, 'trend_model') == 'None') {\n    stop(\n      'cannot compute rolling forecasts for mvgams that have no trend model',\n      call. = FALSE\n    )\n  }\n\n  validate_pos_integer(fc_horizon)\n  validate_pos_integer(eval_timepoint)\n  validate_pos_integer(n_cores)\n  if (n_cores > 1L) {\n    message('argument \"n_cores\" is deprecated')\n  }\n  validate_pos_integer(n_samples)\n\n  if (eval_timepoint < 3) {\n    stop('argument \"eval_timepoint\" must be >= 3', call. = FALSE)\n  }\n\n  #### 1. Prepare the data at the right timepoint ####\n  data_train <- object$obs_data\n  n_series <- NCOL(object$ytimes)\n\n  # Check evaluation timepoint\n  if (inherits(object$obs_data, 'list')) {\n    all_times <- (data.frame(time = object$obs_data$time) %>%\n      dplyr::select(time) %>%\n      dplyr::distinct() %>%\n      dplyr::arrange(time) %>%\n      dplyr::mutate(time = dplyr::row_number())) %>%\n      dplyr::pull(time)\n  } else {\n    all_times <- (object$obs_data %>%\n      dplyr::select(time) %>%\n      dplyr::distinct() %>%\n      dplyr::arrange(time) %>%\n      dplyr::mutate(time = dplyr::row_number())) %>%\n      dplyr::pull(time)\n  }\n\n  if (!eval_timepoint %in% all_times) {\n    stop('Evaluation timepoint does not exist in original training data')\n  }\n\n  # Filter training data to correct point (just following evaluation timepoint)\n  data.frame(time = object$obs_data$time, series = object$obs_data$series) %>%\n    dplyr::mutate(row_number = dplyr::row_number()) %>%\n    dplyr::left_join(\n      data.frame(time = object$obs_data$time, series = object$obs_data$series),\n      by = c('time', 'series')\n    ) %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::filter(\n      time > (eval_timepoint) &\n        time <= (eval_timepoint + fc_horizon)\n    ) %>%\n    dplyr::pull(row_number) -> assim_rows\n\n  if (inherits(object$obs_data, 'list')) {\n    data_assim <- lapply(object$obs_data, function(x) {\n      if (is.matrix(x)) {\n        matrix(x[assim_rows, ], ncol = NCOL(x))\n      } else {\n        x[assim_rows]\n      }\n    })\n  } else {\n    object$obs_data[assim_rows, ] -> data_assim\n  }\n\n  #### 2. Generate the forecast distribution ####\n  draw_fcs <- forecast_draws(\n    object = object,\n    type = 'response',\n    series = 'all',\n    data_test = data_assim,\n    n_samples = n_samples,\n    ending_time = eval_timepoint,\n    n_cores = n_cores\n  )\n\n  if (missing(weights)) {\n    weights <- rep(1, NCOL(object$ytimes))\n  }\n\n  # Final forecast distribution\n  series_fcs <- lapply(seq_len(n_series), function(series) {\n    indexed_forecasts <- do.call(\n      rbind,\n      lapply(seq_along(draw_fcs), function(x) {\n        draw_fcs[[x]][[series]]\n      })\n    )\n    indexed_forecasts\n  })\n  names(series_fcs) <- levels(data_assim$series)\n\n  # If variogram score is chosen\n  if (score == 'variogram') {\n    # Get truths (out of sample) into correct format\n    truths <- do.call(\n      rbind,\n      lapply(seq_len(n_series), function(series) {\n        s_name <- levels(data_assim$series)[series]\n        data.frame(\n          series = data_assim$series,\n          y = data_assim$y,\n          time = data_assim$time\n        ) %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y)\n      })\n    )\n\n    series_score <- variogram_mcmc_object(\n      truths = truths,\n      fcs = series_fcs,\n      log = log,\n      weights = weights\n    )\n  }\n\n  # If not using variogram score\n  if (score != 'variogram') {\n    # Evaluate against the truth\n    series_truths <- lapply(seq_len(n_series), function(series) {\n      if (class(object$obs_data)[1] == 'list') {\n        data_assim[['y']][which(as.numeric(data_assim$series) == series)]\n      } else {\n        data_assim[which(as.numeric(data_assim$series) == series), 'y']\n      }\n    })\n\n    # Calculate score and interval coverage per series\n    if (\n      object$family %in%\n        c('poisson', 'negative binomial', 'binomial', 'beta_binomial')\n    ) {\n      series_score <- lapply(seq_len(n_series), function(series) {\n        DRPS <- data.frame(drps_mcmc_object(\n          as.vector(as.matrix(series_truths[[series]])),\n          series_fcs[[series]],\n          log = log\n        ))\n        colnames(DRPS) <- c('score', 'in_interval')\n        DRPS$eval_horizon <- seq(1, fc_horizon)\n        DRPS\n      })\n      names(series_score) <- levels(data_assim$series)\n    } else {\n      series_score <- lapply(seq_len(n_series), function(series) {\n        CRPS <- data.frame(crps_mcmc_object(\n          as.vector(as.matrix(series_truths[[series]])),\n          series_fcs[[series]],\n          log = log\n        ))\n\n        colnames(CRPS) <- c('score', 'in_interval')\n        if (log) {\n          CRPS$score <- log(CRPS$score + 0.0001)\n        }\n        CRPS$eval_horizon <- seq(1, fc_horizon)\n        CRPS\n      })\n      names(series_score) <- levels(data_assim$series)\n    }\n  }\n\n  return(series_score)\n}\n\n\n#' @param object \\code{list} object returned from \\code{mvgam}\n#'\n#' @param n_samples \\code{integer} specifying the number of samples to generate\n#'   from the model's posterior distribution\n#'\n#' @param evaluation_seq Optional \\code{integer sequence} specifying the exact\n#'   set of timepoints for evaluating the model's forecasts. This sequence\n#'   cannot have values \\code{<3} or\n#'   \\code{> max(training timepoints) - fc_horizon}\n#'\n#' @param n_evaluations \\code{integer} specifying the total number of\n#'   evaluations to perform (ignored if \\code{evaluation_seq} is supplied)\n#'\n#' @param fc_horizon \\code{integer} specifying the length of the forecast\n#'   horizon for evaluating forecasts\n#'\n#' @param n_cores Deprecated. Parallel processing is no longer supported\n#'\n#' @rdname evaluate_mvgams\n#'\n#' @export\nroll_eval_mvgam = function(\n  object,\n  n_evaluations = 5,\n  evaluation_seq,\n  n_samples = 5000,\n  fc_horizon = 3,\n  n_cores = 1,\n  score = 'drps',\n  log = FALSE,\n  weights\n) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  if (attr(object$model_data, 'trend_model') == 'None') {\n    stop(\n      'cannot compute rolling forecasts for mvgams that have no trend model',\n      call. = FALSE\n    )\n  }\n  validate_pos_integer(n_cores)\n  if (n_cores > 1L) {\n    message('argument \"n_cores\" is deprecated')\n  }\n  validate_pos_integer(n_evaluations)\n  validate_pos_integer(n_samples)\n  validate_pos_integer(fc_horizon)\n\n  # Generate time variable from training data\n  if (inherits(object$obs_data, 'list')) {\n    all_timepoints <- (data.frame(time = object$obs_data$index..time..index) %>%\n      dplyr::select(time) %>%\n      dplyr::distinct() %>%\n      dplyr::arrange(time) %>%\n      dplyr::mutate(time = dplyr::row_number())) %>%\n      dplyr::pull(time)\n  } else {\n    all_timepoints <- (object$obs_data %>%\n      dplyr::select(index..time..index) %>%\n      dplyr::distinct() %>%\n      dplyr::arrange(index..time..index) %>%\n      dplyr::mutate(time = dplyr::row_number())) %>%\n      dplyr::pull(time)\n  }\n\n  # Generate evaluation sequence if not supplied\n  if (missing(evaluation_seq)) {\n    evaluation_seq <- floor(seq(\n      from = 3,\n      to = (max(all_timepoints) - fc_horizon),\n      length.out = n_evaluations\n    ))\n  }\n\n  # Check evaluation sequence\n  if (min(evaluation_seq) < 3) {\n    stop('Evaluation sequence cannot start before timepoint 3')\n  }\n\n  if (max(evaluation_seq) > (max(all_timepoints) - fc_horizon)) {\n    stop(\n      'Maximum of evaluation sequence is too large for fc_horizon evaluations'\n    )\n  }\n\n  # Loop across evaluation sequence and calculate evaluation metrics\n  if (missing(weights)) {\n    weights <- rep(1, NCOL(object$ytimes))\n  }\n\n  evals <- lapply(evaluation_seq, function(timepoint) {\n    eval_mvgam(\n      object = object,\n      n_samples = n_samples,\n      n_cores = 1,\n      eval_timepoint = timepoint,\n      fc_horizon = fc_horizon,\n      score = score,\n      log = log,\n      weights = weights\n    )\n  })\n\n  # Take sum of score at each evaluation point for multivariate models\n  sum_or_na = function(x) {\n    if (all(is.na(x))) {\n      NA\n    } else {\n      sum(x, na.rm = T)\n    }\n  }\n\n  if (score == 'variogram') {\n    eval_horizons <- do.call(\n      rbind,\n      lapply(seq_along(evals), function(x) {\n        data.frame(seq_along(evals[[x]]))\n      })\n    )\n\n    scores <- do.call(\n      rbind,\n      lapply(seq_along(evals), function(x) {\n        data.frame(evals[[x]])\n      })\n    )\n\n    evals_df <- data.frame(\n      score = scores,\n      eval_horizon = eval_horizons,\n      in_interval = NA\n    )\n    colnames(evals_df) <- c('score', 'eval_horizon', 'in_interval')\n\n    # Calculate summary statistics for each series\n    out <- list(\n      sum_score = sum_or_na(evals_df$score),\n      score_summary = summary(evals_df$score),\n      score_horizon_summary = evals_df %>%\n        dplyr::group_by(eval_horizon) %>%\n        dplyr::summarise(median_score = median(score, na.rm = T)),\n      interval_coverage = NA,\n      series_evals = NA,\n      all_scores = evals_df\n    )\n  } else {\n    evals_df <- do.call(rbind, do.call(rbind, evals)) %>%\n      dplyr::group_by(eval_horizon) %>%\n      dplyr::summarise(\n        score = sum_or_na(score),\n        in_interval = mean(in_interval, na.rm = T)\n      )\n\n    # Calculate summary statistics for each series\n    tidy_evals <- lapply(\n      seq_len(length(levels(object$obs_data$series))),\n      function(series) {\n        all_evals <- do.call(\n          rbind,\n          purrr::map(evals, levels(object$obs_data$series)[series])\n        )\n        list(\n          sum_drps = sum_or_na(all_evals$score),\n          score_summary = summary(all_evals$score),\n          score_horizon_summary = all_evals %>%\n            dplyr::group_by(eval_horizon) %>%\n            dplyr::summarise(median_score = mean(score, na.rm = T)),\n          interval_coverage = mean(all_evals$in_interval, na.rm = T),\n          all_scores = all_evals\n        )\n      }\n    )\n    names(tidy_evals) <- levels(object$obs_data$series)\n\n    out <- list(\n      sum_score = sum_or_na(evals_df$score),\n      score_summary = summary(evals_df$score),\n      score_horizon_summary = evals_df %>%\n        dplyr::group_by(eval_horizon) %>%\n        dplyr::summarise(median_score = median(score, na.rm = T)),\n      interval_coverage = mean(evals_df$in_interval, na.rm = T),\n      series_evals = tidy_evals\n    )\n  }\n\n  # Return score summary statistics\n  return(out)\n}\n\n\n#' @param model1 \\code{list} object returned from \\code{mvgam} representing\n#'   the first model to be evaluated\n#'\n#' @param model2 \\code{list} object returned from \\code{mvgam} representing\n#'   the second model to be evaluated\n#'\n#' @param n_samples \\code{integer} specifying the number of samples to generate\n#'   from the model's posterior distribution\n#'\n#' @param fc_horizon \\code{integer} specifying the length of the forecast\n#'   horizon for evaluating forecasts\n#'\n#' @param n_evaluations \\code{integer} specifying the total number of\n#'   evaluations to perform\n#'\n#' @param n_cores Deprecated. Parallel processing is no longer supported\n#'\n#' @rdname evaluate_mvgams\n#'\n#' @export\ncompare_mvgams = function(\n  model1,\n  model2,\n  n_samples = 1000,\n  fc_horizon = 3,\n  n_evaluations = 10,\n  n_cores = 1,\n  score = 'drps',\n  log = FALSE,\n  weights\n) {\n  # Check arguments\n  if (!(inherits(model1, \"mvgam\"))) {\n    stop('argument \"model1\" must be of class \"mvgam\"')\n  }\n\n  if (!(inherits(model2, \"mvgam\"))) {\n    stop('argument \"model2\" must be of class \"mvgam\"')\n  }\n\n  if (attr(model2$model_data, 'trend_model') == 'None') {\n    stop(\n      'cannot compare rolling forecasts for mvgams that have no trend model',\n      call. = FALSE\n    )\n  }\n\n  if (attr(model1$model_data, 'trend_model') == 'None') {\n    stop(\n      'cannot compare rolling forecasts for mvgams that have no trend model',\n      call. = FALSE\n    )\n  }\n\n  validate_pos_integer(n_evaluations)\n  validate_pos_integer(fc_horizon)\n  validate_pos_integer(n_cores)\n  if (n_cores > 1L) {\n    message('argument \"n_cores\" is deprecated')\n  }\n  validate_pos_integer(n_samples)\n\n  # Evaluate the two models\n  if (missing(weights)) {\n    weights <- rep(1, NCOL(model1$ytimes))\n  }\n\n  mod1_eval <- roll_eval_mvgam(\n    model1,\n    n_samples = n_samples,\n    fc_horizon = fc_horizon,\n    n_cores = n_cores,\n    n_evaluations = n_evaluations,\n    score = score,\n    log = log,\n    weights = weights\n  )\n  mod2_eval <- roll_eval_mvgam(\n    model2,\n    n_samples = n_samples,\n    fc_horizon = fc_horizon,\n    n_cores = n_cores,\n    n_evaluations = n_evaluations,\n    score = score,\n    log = log,\n    weights = weights\n  )\n\n  # Generate a simple summary of forecast scores for each model\n  model_summary <- rbind(mod1_eval$score_summary, mod2_eval$score_summary)\n  rownames(model_summary) <- c('Model 1', 'Model 2')\n  cat('RPS summaries per model (lower is better)\\n')\n  print(model_summary)\n\n  # Print 90% interval coverages for each model\n  if (score != 'variogram') {\n    cat('\\n90% interval coverages per model (closer to 0.9 is better)\\n')\n    cat('Model 1', mod1_eval$interval_coverage, '\\n')\n    cat('Model 2', mod2_eval$interval_coverage)\n  }\n\n  # Set up plotting loop and return summary plots of DRPS\n  ask <- TRUE\n\n  for (i in 1:3) {\n    if (i == 1) {\n      barplot(\n        c('model 1' = mod1_eval$sum_score, 'model 2' = mod2_eval$sum_score),\n        col = c(\"#B97C7C\", \"#7C0000\"),\n        border = NA,\n        ylab = 'Sum RPS (lower is better)',\n        lwd = 2\n      )\n    } else if (i == 2) {\n      boxplot(\n        list(\n          'model 1' = mod1_eval$score_summary,\n          'model 2' = mod2_eval$score_summary\n        ),\n        border = c(\"#B97C7C\", \"#7C0000\"),\n        ylab = 'Sum RPS per evaluation',\n        axes = FALSE\n      )\n      axis(side = 2, lwd = 2)\n      axis(side = 1, at = c(1, 2), labels = c('model 1', 'model 2'), lwd = 0)\n    } else {\n      plot_dat <- rbind(\n        mod1_eval$score_horizon_summary$median_score,\n        mod2_eval$score_horizon_summary$median_score\n      )\n      colnames(plot_dat) <- seq(1:NCOL(plot_dat))\n\n      ylim = c(\n        min(0, min(plot_dat, na.rm = TRUE)),\n        max(plot_dat, na.rm = T) * 1.4\n      )\n\n      barplot(\n        plot_dat,\n        ylim = ylim,\n        beside = T,\n        xlab = 'Forecast horizon',\n        ylab = 'Median RPS',\n        col = c(\"#B97C7C\", \"#7C0000\"),\n        lwd = 2,\n        border = NA,\n        legend.text = c('Model 1', 'Model 2'),\n        args.legend = list(x = \"top\", ncol = 2, border = NA, bty = 'n')\n      )\n    }\n\n    if (ask) {\n      oask <- devAskNewPage(TRUE)\n      on.exit(devAskNewPage(oask))\n      ask <- FALSE\n    }\n  }\n  invisible()\n}\n\n#' @noRd\ncrps_edf <- function(y, dat, w = NULL) {\n  if (is.null(w)) {\n    c_1n <- 1 / length(dat)\n    x <- sort(dat)\n    a <- seq.int(0.5 * c_1n, 1 - 0.5 * c_1n, length.out = length(dat))\n    f <- function(s) 2 * c_1n * sum(((s < x) - a) * (x - s))\n  } else {\n    if (!identical(length(dat), length(w)) || any(w < 0, na.rm = TRUE)) {\n      return(rep(NaN, length(y)))\n    }\n    ord <- order(dat)\n    x <- dat[ord]\n    w <- w[ord]\n    p <- cumsum(w)\n    P <- p[length(p)]\n    a <- (p - 0.5 * w) / P\n    f <- function(s) 2 / P * sum(w * ((s < x) - a) * (x - s))\n  }\n  sapply(y, f)\n}\n\n# Compute CRPS\n# code borrowed from scoringRules: https://github.com/FK83/scoringRules/blob/master/R/scores_sample_univ.R\n#' @noRd\ncrps_score <- function(\n  truth,\n  fc,\n  method = \"edf\",\n  w = NULL,\n  interval_width = 0.9,\n  log = FALSE\n) {\n  if (log) {\n    truth <- log(truth + 0.001)\n    fc <- log(fc + 0.001)\n  }\n\n  if (identical(length(truth), 1L) && is.vector(fc)) {\n    score <- crps_edf(truth, fc, w)\n  } else {\n    score <- sapply(\n      seq_along(truth),\n      function(i) crps_edf(truth[i], fc[i, ], w[i, ])\n    )\n  }\n\n  # Is value within empirical interval?\n  interval <- quantile(\n    fc,\n    probs = c(\n      (1 - interval_width) / 2,\n      (interval_width + (1 - interval_width) / 2)\n    ),\n    na.rm = TRUE\n  )\n  in_interval <- ifelse(truth <= interval[2] & truth >= interval[1], 1, 0)\n  return(c(score, in_interval))\n}\n\n\n# Compute DRPS\n#' @noRd\ndrps_score <- function(truth, fc, interval_width = 0.9, log = FALSE) {\n  if (log) {\n    truth <- log(truth + 0.001)\n    fc <- log(fc + 0.001)\n    nsum <- max(c(truth, fc), na.rm = TRUE) + 5\n  } else {\n    nsum <- max(\n      c(truth, quantile(fc, probs = 0.99, na.rm = TRUE)),\n      na.rm = TRUE\n    ) +\n      1000\n  }\n\n  Fy = ecdf(fc)\n  ysum <- 0:nsum\n  indicator <- ifelse(ysum - truth >= 0, 1, 0)\n  score <- sum((indicator - Fy(ysum))^2)\n\n  # Is value within empirical interval?\n  interval <- quantile(\n    fc,\n    probs = c(\n      (1 - interval_width) / 2,\n      (interval_width + (1 - interval_width) / 2)\n    ),\n    na.rm = TRUE\n  )\n  in_interval <- ifelse(truth <= interval[2] & truth >= interval[1], 1, 0)\n  return(c(score, in_interval))\n}\n\n# Compute the scaled interval score\n#' @noRd\nsis_score <- function(truth, fc, interval_width = 0.9, log = FALSE) {\n  if (log) {\n    truth <- log(truth + 0.001)\n    fc <- log(fc + 0.001)\n  }\n\n  lower_prob <- (1 - interval_width) / 2\n  upper_prob <- 1 - lower_prob\n  creds <- quantile(fc, probs = c(lower_prob, upper_prob), na.rm = TRUE)\n  cred_lower <- creds[1]\n  cred_upper <- creds[2]\n  alpha <- 2 / (2 * lower_prob)\n  cred_interval <- (cred_upper - cred_lower) / 2\n  err_up <- truth - cred_upper\n  err_low <- cred_lower - truth\n\n  # SIS\n  score <- 2 *\n    cred_interval +\n    alpha * err_up * (err_up > 0) +\n    alpha * err_low * (err_low > 0)\n\n  # Is value within empirical interval?\n  interval <- quantile(\n    fc,\n    probs = c(\n      (1 - interval_width) / 2,\n      (interval_width + (1 - interval_width) / 2)\n    ),\n    na.rm = TRUE\n  )\n  in_interval <- ifelse(truth <= interval[2] & truth >= interval[1], 1, 0)\n  return(c(score, in_interval))\n}\n\n# Compute the Brier score\n#' @noRd\nbrier_score <- function(truth, fc, interval_width = 0.9) {\n  score <- (truth - fc)^2\n  score <- sum(score) / length(score)\n\n  # Cannot evaluate coverage for binary truths\n  in_interval <- NA\n  return(c(score, in_interval))\n}\n\n#' Compute the multivariate energy score\n#' @noRd\nenergy_score <- function(truth, fc, log = FALSE) {\n  insight::check_if_installed(\n    \"scoringRules\",\n    reason = 'to calculate energy scores'\n  )\n\n  # es_sample can't handle any NAs\n  has_nas <- apply(fc, 2, function(x) any(is.na(x)))\n  fc <- fc[, !has_nas]\n  if (log) {\n    truth <- log(truth + 0.001)\n    fc <- log(fc + 0.001)\n  }\n  es <- scoringRules::es_sample(y = truth, dat = fc)\n  return(es)\n}\n\n#' Compute the variogram score, using the median pairwise difference\n#' from the forecast distribution (scoringRules::vs_sample uses the\n#' mean, which is not appropriate for skewed distributions)\n#' @noRd\nvariogram_score = function(truth, fc, log = FALSE, weights) {\n  if (log) {\n    truth <- log(truth + 0.001)\n    fc <- log(fc + 0.001)\n  }\n\n  # Use weight of 1 for each pairwise combination if no weights\n  # are supplied; else take the product of each pair of weights\n  if (missing(weights)) {\n    weights <- matrix(1, nrow = length(truth), ncol = length(truth))\n  } else {\n    weights <- outer(weights, weights, FUN = function(X, Y) {\n      (X + Y) / 2\n    })\n  }\n\n  out <- matrix(NA, length(truth), length(truth))\n  for (i in 1:length(truth)) {\n    for (j in 1:length(truth)) {\n      if (i == j) {\n        out[i, j] <- 0\n      } else {\n        v_fc <- quantile(abs(fc[i, ] - fc[j, ])^0.5, 0.5, na.rm = TRUE)\n        v_dat <- abs(truth[i] - truth[j])^0.5\n        out[i, j] <- 2 * weights[i, j] * ((v_dat - v_fc)^2)\n      }\n    }\n  }\n  # Divide by two as we have (inefficiently) computed each pairwise\n  # comparison twice\n  score <- sum(out) / 2\n}\n\n#' Compute the energy score on all observations in fc_horizon\n#' @noRd\nenergy_mcmc_object <- function(truths, fcs, log = FALSE, weights) {\n  fc_horizon <- length(fcs[[1]][1, ])\n  fcs_per_horizon <- lapply(seq_len(fc_horizon), function(horizon) {\n    do.call(\n      rbind,\n      lapply(seq_along(fcs), function(fc) {\n        fcs[[fc]][, horizon]\n      })\n    )\n  })\n\n  unlist(lapply(seq_len(fc_horizon), function(horizon) {\n    energy_score(\n      truth = truths[, horizon],\n      fc = fcs_per_horizon[[horizon]],\n      log = log\n    )\n  }))\n}\n\n#' Compute the Brier score on all observations in fc_horizon\n#' @noRd\nbrier_mcmc_object <- function(truth, fc, log = FALSE, weights) {\n  indices_keep <- which(!is.na(truth))\n  if (length(indices_keep) == 0) {\n    scores = data.frame(\n      'brier' = rep(NA, length(truth)),\n      'interval' = rep(NA, length(truth))\n    )\n  } else {\n    scores <- matrix(NA, nrow = length(truth), ncol = 2)\n    for (i in indices_keep) {\n      scores[i, ] <- brier_score(truth = as.vector(truth)[i], fc = fc[, i])\n    }\n  }\n  scores\n}\n\n#' Wrapper to calculate variogram score on all observations in fc_horizon\n#' @noRd\nvariogram_mcmc_object <- function(truths, fcs, log = FALSE, weights) {\n  fc_horizon <- length(fcs[[1]][1, ])\n  fcs_per_horizon <- lapply(seq_len(fc_horizon), function(horizon) {\n    do.call(\n      rbind,\n      lapply(seq_along(fcs), function(fc) {\n        fcs[[fc]][, horizon]\n      })\n    )\n  })\n\n  unlist(lapply(seq_len(fc_horizon), function(horizon) {\n    variogram_score(\n      truth = truths[, horizon],\n      fc = fcs_per_horizon[[horizon]],\n      log = log,\n      weights = weights\n    )\n  }))\n}\n\n# Wrapper to calculate DRPS scores on all observations in fc_horizon\n#' @noRd\ndrps_mcmc_object <- function(truth, fc, interval_width = 0.9, log = FALSE) {\n  indices_keep <- which(!is.na(truth))\n  if (length(indices_keep) == 0) {\n    scores = data.frame(\n      'drps' = rep(NA, length(truth)),\n      'interval' = rep(NA, length(truth))\n    )\n  } else {\n    scores <- matrix(NA, nrow = length(truth), ncol = 2)\n    for (i in indices_keep) {\n      scores[i, ] <- drps_score(\n        truth = as.vector(truth)[i],\n        fc = fc[, i],\n        interval_width,\n        log = log\n      )\n    }\n  }\n  scores\n}\n\n# Wrapper to calculate <SIS scores on all observations in fc_horizon\n#' @noRd\nsis_mcmc_object <- function(truth, fc, interval_width = 0.9, log = FALSE) {\n  indices_keep <- which(!is.na(truth))\n  if (length(indices_keep) == 0) {\n    scores = data.frame(\n      'sis' = rep(NA, length(truth)),\n      'interval' = rep(NA, length(truth))\n    )\n  } else {\n    scores <- matrix(NA, nrow = length(truth), ncol = 2)\n    for (i in indices_keep) {\n      scores[i, ] <- sis_score(\n        truth = as.vector(truth)[i],\n        fc = fc[, i],\n        interval_width,\n        log = log\n      )\n    }\n  }\n  scores\n}\n\n# Wrapper to calculate CRPS scores on all observations in fc_horizon\n#' @noRd\ncrps_mcmc_object <- function(truth, fc, interval_width = 0.9, log = FALSE) {\n  indices_keep <- which(!is.na(truth))\n  if (length(indices_keep) == 0) {\n    scores = data.frame(\n      'drps' = rep(NA, length(truth)),\n      'interval' = rep(NA, length(truth))\n    )\n  } else {\n    scores <- matrix(NA, nrow = length(truth), ncol = 2)\n    for (i in indices_keep) {\n      scores[i, ] <- crps_score(\n        truth = as.vector(truth)[i],\n        fc = fc[, i],\n        interval_width = interval_width,\n        log = log\n      )\n    }\n  }\n  scores\n}\n"
  },
  {
    "path": "R/families.R",
    "content": "#' Supported \\pkg{mvgam} families\n#'\n#' @importFrom stats make.link dgamma pgamma rgamma qnorm plnorm runif pbeta dlnorm dpois\n#' @importFrom stats pnorm ppois plogis gaussian poisson Gamma dnbinom rnbinom dnorm dbeta\n#' @importFrom stats binomial rbinom pbinom dbinom qbinom qlogis\n#' @importFrom brms lognormal student beta_binomial bernoulli rstudent_t qstudent_t dstudent_t\n#' @importFrom brms pstudent_t dbeta_binomial rbeta_binomial pbeta_binomial\n#' @importFrom mgcv betar nb\n#' @param link a specification for the family link function. At present these cannot\n#' be changed\n#'\n#' @param ... Arguments to be passed to the \\pkg{mgcv} version of the associated functions\n#'\n#' @details \\code{mvgam} currently supports the following standard observation families:\n#'\\itemize{\n#'   \\item \\code{\\link[stats]{gaussian}} with identity link, for real-valued data\n#'   \\item \\code{\\link[stats]{poisson}} with log-link, for count data\n#'   \\item \\code{\\link[stats]{Gamma}} with log-link, for non-negative real-valued data\n#'   \\item \\code{\\link[stats]{binomial}} with logit-link, for count data when the number\n#'   of trials is known (and must be supplied)\n#'   }\n#'\n#'In addition, the following extended families from the \\code{mgcv} and \\code{brms} packages are supported:\n#'\\itemize{\n#'   \\item \\code{\\link[mgcv]{betar}} with logit-link, for proportional data on `(0,1)`\n#'   \\item \\code{\\link[mgcv]{nb}} with log-link, for count data\n#'   \\item \\code{\\link[brms]{lognormal}} with identity-link, for non-negative real-valued data\n#'   \\item \\code{\\link[brms]{bernoulli}} with logit-link, for binary data\n#'   \\item \\code{\\link[brms]{beta_binomial}} with logit-link, as for `binomial()` but allows\n#'   for overdispersion\n#'   }\n#'\n#'Finally, \\code{mvgam} supports the three extended families described here:\n#'\\itemize{\n#'   \\item \\code{tweedie} with log-link, for count data (power parameter `p` fixed at `1.5`)\n#'   \\item `student_t()` (or \\code{\\link[brms]{student}}) with identity-link, for real-valued data\n#'   \\item \\code{nmix} for count data with imperfect detection modeled via a\n#'   State-Space N-Mixture model. The latent states are Poisson (with log link), capturing the 'true' latent\n#'   abundance, while the observation process is Binomial to account for imperfect detection. The\n#'   observation \\code{formula} in these models is used to set up a linear predictor for the detection\n#'   probability (with logit link). See the example below for a more detailed worked explanation\n#'   of the `nmix()` family\n#'   }\n#' Only `poisson()`, `nb()`, and `tweedie()` are available if\n#' using `JAGS`. All families, apart from `tweedie()`, are supported if\n#' using `Stan`.\n#'\n#' @name mvgam_families\n#'\n#' @return Objects of class `family`\n#'\n#' @details Note that currently it is not possible to change the default link\n#'\n#' functions in \\pkg{mvgam}, so any call to change these will be silently ignored\n#' @author Nicholas J Clark\n#'\nNULL\n\n#' @rdname mvgam_families\n#' @export\ntweedie = function(link = 'log') {\n  linktemp <- make.link('log')\n  structure(\n    list(\n      family = \"tweedie\",\n      link = 'log',\n      linkfun = linktemp$linkfun,\n      linkinv = linktemp$linkinv,\n      mu.eta = linktemp$mu.eta,\n      valideta = linktemp$valideta\n    ),\n    class = c(\"extended.family\", \"family\")\n  )\n}\n\n#' @rdname mvgam_families\n#' @export\nstudent_t = function(link = 'identity') {\n  linktemp <- make.link('identity')\n  structure(\n    list(\n      family = \"student\",\n      link = 'identity',\n      linkfun = linktemp$linkfun,\n      linkinv = linktemp$linkinv,\n      mu.eta = linktemp$mu.eta,\n      valideta = linktemp$valideta\n    ),\n    class = c(\"extended.family\", \"family\")\n  )\n}\n\n#' @rdname mvgam_families\n#' @export\nbetar = function(...) {\n  mgcv::betar(...)\n}\n\n#' @rdname mvgam_families\n#' @export\nnb = function(...) {\n  mgcv::nb(...)\n}\n\n#' @rdname mvgam_families\n#' @export\nlognormal = function(...) {\n  brms::lognormal(...)\n}\n\n#' @rdname mvgam_families\n#' @export\nstudent = function(...) {\n  brms::student(...)\n}\n\n#' @rdname mvgam_families\n#' @export\nbernoulli = function(...) {\n  brms::bernoulli(...)\n}\n\n#' @rdname mvgam_families\n#' @export\nbeta_binomial = function(...) {\n  brms::beta_binomial(...)\n}\n\n#' @rdname mvgam_families\n#'\n#' @examples\n#' \\dontrun{\n#' # =============================================================================\n#' # N-mixture Models\n#' # =============================================================================\n#' set.seed(999)\n#'\n#' # Simulate observations for species 1, which shows a declining trend and\n#' # 0.7 detection probability\n#' data.frame(\n#'   site = 1,\n#'   # five replicates per year; six years\n#'   replicate = rep(1:5, 6),\n#'   time = sort(rep(1:6, 5)),\n#'   species = 'sp_1',\n#'   # true abundance declines nonlinearly\n#'   truth = c(\n#'     rep(28, 5),\n#'     rep(26, 5),\n#'     rep(23, 5),\n#'     rep(16, 5),\n#'     rep(14, 5),\n#'     rep(14, 5)\n#'   ),\n#'   # observations are taken with detection prob = 0.7\n#'   obs = c(\n#'     rbinom(5, 28, 0.7),\n#'     rbinom(5, 26, 0.7),\n#'     rbinom(5, 23, 0.7),\n#'     rbinom(5, 15, 0.7),\n#'     rbinom(5, 14, 0.7),\n#'     rbinom(5, 14, 0.7)\n#'   )\n#' ) %>%\n#'   # add 'series' information, which is an identifier of site, replicate\n#'   # and species\n#'   dplyr::mutate(\n#'     series = paste0(\n#'       'site_', site,\n#'       '_', species,\n#'       '_rep_', replicate\n#'     ),\n#'     time = as.numeric(time),\n#'     # add a 'cap' variable that defines the maximum latent N to\n#'     # marginalize over when estimating latent abundance; in other words\n#'     # how large do we realistically think the true abundance could be?\n#'     cap = 80\n#'   ) %>%\n#'   dplyr::select(-replicate) -> testdat\n#'\n#' # Now add another species that has a different temporal trend and a\n#' # smaller detection probability (0.45 for this species)\n#' testdat <- testdat %>%\n#'   dplyr::bind_rows(\n#'     data.frame(\n#'       site = 1,\n#'       replicate = rep(1:5, 6),\n#'       time = sort(rep(1:6, 5)),\n#'       species = 'sp_2',\n#'       truth = c(\n#'         rep(4, 5),\n#'         rep(7, 5),\n#'         rep(15, 5),\n#'         rep(16, 5),\n#'         rep(19, 5),\n#'         rep(18, 5)\n#'       ),\n#'       obs = c(\n#'         rbinom(5, 4, 0.45),\n#'         rbinom(5, 7, 0.45),\n#'         rbinom(5, 15, 0.45),\n#'         rbinom(5, 16, 0.45),\n#'         rbinom(5, 19, 0.45),\n#'         rbinom(5, 18, 0.45)\n#'       )\n#'     ) %>%\n#'       dplyr::mutate(\n#'         series = paste0(\n#'           'site_', site,\n#'           '_', species,\n#'           '_rep_', replicate\n#'         ),\n#'         time = as.numeric(time),\n#'         cap = 50\n#'       ) %>%\n#'       dplyr::select(-replicate)\n#'   )\n#'\n#' # series identifiers\n#' testdat$species <- factor(\n#'   testdat$species,\n#'   levels = unique(testdat$species)\n#' )\n#' testdat$series <- factor(\n#'   testdat$series,\n#'   levels = unique(testdat$series)\n#' )\n#'\n#' # The trend_map to state how replicates are structured\n#' testdat %>%\n#'   # each unique combination of site*species is a separate process\n#'   dplyr::mutate(\n#'     trend = as.numeric(factor(paste0(site, species)))\n#'   ) %>%\n#'   dplyr::select(trend, series) %>%\n#'   dplyr::distinct() -> trend_map\n#' trend_map\n#'\n#' # Fit a model\n#' mod <- mvgam(\n#'   # the observation formula sets up linear predictors for\n#'   # detection probability on the logit scale\n#'   formula = obs ~ species - 1,\n#'\n#'   # the trend_formula sets up the linear predictors for\n#'   # the latent abundance processes on the log scale\n#'   trend_formula = ~ s(time, by = trend, k = 4) + species,\n#'\n#'   # the trend_map takes care of the mapping\n#'   trend_map = trend_map,\n#'\n#'   # nmix() family and data\n#'   family = nmix(),\n#'   data = testdat,\n#'\n#'   # priors can be set in the usual way\n#'   priors = c(\n#'     prior(std_normal(), class = b),\n#'     prior(normal(1, 1.5), class = Intercept_trend)\n#'   ),\n#'   chains = 2\n#' )\n#'\n#' # The usual diagnostics\n#' summary(mod)\n#'\n#' # Plotting conditional effects\n#' library(ggplot2)\n#'\n#' plot_predictions(\n#'   mod,\n#'   condition = 'species',\n#'   type = 'detection'\n#' ) +\n#'   ylab('Pr(detection)') +\n#'   ylim(c(0, 1)) +\n#'   theme_classic() +\n#'   theme(legend.position = 'none')\n#'\n#' # =============================================================================\n#' # Binomial Models\n#' # =============================================================================\n#'\n#' # Simulate two time series of Binomial trials\n#' trials <- sample(c(20:25), 50, replace = TRUE)\n#' x <- rnorm(50)\n#' detprob1 <- plogis(-0.5 + 0.9 * x)\n#' detprob2 <- plogis(-0.1 - 0.7 * x)\n#' dat <- rbind(\n#'   data.frame(\n#'     y = rbinom(n = 50, size = trials, prob = detprob1),\n#'     time = 1:50,\n#'     series = 'series1',\n#'     x = x,\n#'     ntrials = trials\n#'   ),\n#'   data.frame(\n#'     y = rbinom(n = 50, size = trials, prob = detprob2),\n#'     time = 1:50,\n#'     series = 'series2',\n#'     x = x,\n#'     ntrials = trials\n#'   )\n#' )\n#' dat <- dplyr::mutate(dat, series = as.factor(series))\n#' dat <- dplyr::arrange(dat, time, series)\n#'\n#' # Fit a model using the binomial() family; must specify observations\n#' # and number of trials in the cbind() wrapper\n#' mod <- mvgam(\n#'   cbind(y, ntrials) ~ series + s(x, by = series),\n#'   family = binomial(),\n#'   data = dat\n#' )\n#' summary(mod)\n#' }\n#'\n#' @export\nnmix = function(link = 'log') {\n  linktemp <- make.link('log')\n  structure(\n    list(\n      family = \"nmix\",\n      link = 'log',\n      linkfun = linktemp$linkfun,\n      linkinv = linktemp$linkinv,\n      mu.eta = linktemp$mu.eta,\n      valideta = linktemp$valideta\n    ),\n    class = c(\"extended.family\", \"family\")\n  )\n}\n\n#### Non-exported functions for performing family-specific tasks ####\n#' Family options in character format\n#' @noRd\nfamily_char_choices = function() {\n  c(\n    'negative binomial',\n    \"poisson\",\n    \"binomial\",\n    'beta_binomial',\n    \"bernoulli\",\n    \"nmix\",\n    \"tweedie\",\n    \"beta\",\n    \"gaussian\",\n    \"lognormal\",\n    \"student\",\n    \"Gamma\"\n  )\n}\n\n# Convert location / precision parameters to shape parameters for the beta distribution\n# Original author: Andrew Heiss (https://www.andrewheiss.com/blog/2021/11/08/beta-regression-guide/)\n#' @noRd\nbeta_shapes = function(mu, phi) {\n  return(list(shape1 = mu * phi, shape2 = (1 - mu) * phi))\n}\n\n# Calculate all possible Poisson log-densities for N-mixture simulation\n#' @noRd\npois_dens = function(min_cap, max_cap, lambdas) {\n  # Identify which indices share the exact same lambda AND\n  # k value so that we only need to run dpois once for each group\n  data.frame(lambdas, min_cap, max_cap) %>%\n    dplyr::group_by(lambdas) %>%\n    dplyr::summarise(\n      min_cap = min(min_cap, na.rm = TRUE),\n      max_cap = max(max_cap, na.rm = TRUE)\n    ) -> group_inds\n\n  l <- mapply(`:`, group_inds$min_cap, group_inds$max_cap)\n\n  data.frame(\n    k = unlist(l),\n    lambda = group_inds$lambdas[rep(1:nrow(group_inds), lengths(l))]\n  ) %>%\n    dplyr::mutate(pois_dens = dpois(k, lambda, log = TRUE)) -> all_ks\n\n  return(all_ks)\n}\n\n\n#' Generic prediction function\n#' @importFrom stats predict\n#' @param Xp A `mgcv` linear predictor matrix\n#' @param family \\code{character}. The `family` slot of the model's family argument\n#' @param betas Vector of regression coefficients of length `NCOL(Xp)`\n#' @param latent_lambdas Optional vector of latent abundance estimates, only used for N-Mixture models\n#' @param cap Optional vector of latent abundance maximum capacities, only used for N-Mixture models\n#' @param type Either `link`, `expected`, `response`, `variance`,\n#' `latent_N` (only applies to N-mixture distributions) or\n#' `detection` (only applies to N-mixture distributions)\n#' @param family_pars Additional arguments for each specific observation process (i.e.\n#' overdispersion parameter if `family == \"nb\"`)\n#' @param density logical. Rather than calculating a prediction, evaluate the log-likelihood.\n#' Use this option when particle filtering\n#' @param truth Observation to use for evaluating the likelihood (if `density == TRUE`)\n#' @details A generic prediction function that will make it easier to add new\n#' response distributions in future. Use `type = variance` for computing family-level\n#' variance as a function of the mean\n#' @noRd\nmvgam_predict = function(\n  Xp,\n  family,\n  betas,\n  latent_lambdas,\n  cap,\n  min_cap,\n  type = 'link',\n  family_pars,\n  density = FALSE,\n  truth = NULL\n) {\n  if (type == 'latent_N' & family != 'nmix') {\n    stop('\"latent_N\" type only available for N-mixture models', call. = FALSE)\n  }\n\n  if (type == 'detection' & family != 'nmix') {\n    stop('\"detection\" type only available for N-mixture models', call. = FALSE)\n  }\n\n  # Poisson-Binomial N-Mixture (requires family parameter\n  # 'cap' as well as 'latent_lambdas' argument)\n  if (family == 'nmix') {\n    insight::check_if_installed(\n      \"extraDistr\",\n      reason = 'to simulate from N-Mixture distributions'\n    )\n    insight::check_if_installed(\n      \"wrswoR\",\n      reason = 'to simulate from N-Mixture distributions'\n    )\n    # Calculate detection probability and convert to probability scale\n    p <- as.vector(\n      (matrix(Xp, ncol = NCOL(Xp)) %*%\n        betas) +\n        attr(Xp, 'model.offset')\n    )\n    p <- plogis(p)\n\n    # Latent mean of State vector\n    lambdas <- as.vector(latent_lambdas)\n\n    # User-specified cap on latent abundance\n    cap <- as.vector(cap)\n\n    if (type == 'detection') {\n      out <- p\n    } else if (type == 'link') {\n      # 'link' predictions are expectations of the latent abundance\n      out <- lambdas\n\n      if (density) {\n        out <- unlist(\n          lapply(seq_along(truth), function(i) {\n            if (is.na(truth[i])) {\n              output <- NA\n            } else {\n              ks <- truth[i]:cap[i]\n              lik_binom <- dbinom(truth[i], size = ks, prob = p[i], log = TRUE)\n              lik_poisson <- dpois(x = ks, lambda = lambdas[i], log = TRUE)\n              loglik <- lik_binom + lik_poisson\n              output <- log_sum_exp(loglik)\n            }\n            output\n          }),\n          use.names = FALSE\n        )\n      }\n    } else if (type == 'latent_N') {\n      if (missing(min_cap)) {\n        min_cap <- 0\n      }\n      min_cap <- as.vector(min_cap)\n      if (missing(truth)) {\n        out <- extraDistr::rtpois(\n          n = length(lambdas),\n          lambda = lambdas,\n          a = min_cap,\n          b = cap\n        )\n      } else {\n        # If true observed N is supplied, we can calculate the\n        # most likely latent N given the covariates and the estimated\n        # detection probability\n        out <- unlist(\n          lapply(seq_along(truth), function(i) {\n            if (is.na(truth[i])) {\n              output <- NA\n            } else {\n              ks <- min_cap[[i]]:cap[[i]]\n              lik <- exp(\n                dbinom(truth[[i]], size = ks, prob = p[[i]], log = TRUE) +\n                  dpois(x = ks, lambda = lambdas[i], log = TRUE)\n              )\n              probs <- lik / sum(lik)\n              probs[!is.finite(probs)] <- 0\n              output <- ks[wrswoR::sample_int_ccrank(\n                length(ks),\n                size = 1L,\n                prob = probs\n              )]\n            }\n            output\n          }),\n          use.names = FALSE\n        )\n      }\n    } else if (type == 'response') {\n      xpred <- extraDistr::rtpois(\n        n = length(lambdas),\n        lambda = lambdas,\n        b = cap\n      )\n      out <- rbinom(length(lambdas), size = xpred, prob = p)\n    } else if (type == 'variance') {\n      xpred <- extraDistr::rtpois(\n        n = length(lambdas),\n        lambda = lambdas,\n        b = cap\n      )\n\n      # Variance of a Binomial distribution using the\n      # weights convention from stats::glm()\n      mu <- p / xpred\n      out <- mu * (1 - mu)\n    } else {\n      # Expectations\n      xpred <- extraDistr::rtpois(\n        n = length(lambdas),\n        lambda = lambdas,\n        b = cap\n      )\n      out <- xpred * p\n    }\n  }\n\n  # Gaussian observations (requires family parameter 'sigma_obs')\n  if (family == 'gaussian') {\n    if (type %in% c('link', 'expected')) {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n      if (density) {\n        out <- dnorm(\n          truth,\n          mean = out,\n          sd = as.vector(family_pars$sigma_obs),\n          log = TRUE\n        )\n      }\n    } else if (type == 'variance') {\n      out <- rep.int(1, NROW(Xp))\n    } else {\n      out <- rnorm(\n        n = NROW(Xp),\n        mean = ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset'),\n        sd = as.vector(family_pars$sigma_obs)\n      )\n    }\n  }\n\n  # LogNormal observations (requires family parameter 'sigma_obs')\n  if (family == 'lognormal') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n      if (density) {\n        out <- dlnorm(\n          truth,\n          meanlog = out,\n          sdlog = as.vector(family_pars$sigma_obs),\n          log = TRUE\n        )\n      }\n    } else if (type == 'response') {\n      out <- rlnorm(\n        n = NROW(Xp),\n        meanlog = ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset'),\n        sdlog = as.vector(family_pars$sigma_obs)\n      )\n    } else if (type == 'variance') {\n      mu <- ((matrix(Xp, ncol = NCOL(Xp)) %*%\n        betas)) +\n        attr(Xp, 'model.offset')\n      sd <- as.vector(family_pars$sigma_obs)\n      out <- as.vector((exp((sd)^2) - 1) * exp((2 * mu + sd^2)))\n    } else {\n      mu <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n      out <- exp(mu + (as.vector(family_pars$sigma_obs)^2 / 2))\n    }\n  }\n\n  # Student-T observations (requires family parameters 'nu', 'sigma_obs')\n  if (family == 'student') {\n    if (type %in% c('link', 'expected')) {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n      if (density) {\n        out <- dstudent_t(\n          truth,\n          df = as.vector(family_pars$nu),\n          mu = out,\n          sigma = as.vector(family_pars$sigma_obs),\n          log = TRUE\n        )\n      }\n    } else if (type == 'variance') {\n      out <- as.vector(family_pars$sigma_obs)^2 *\n        as.vector(family_pars$nu) /\n        pmax(1.01, (as.vector(family_pars$nu) - 2))\n    } else {\n      out <- rstudent_t(\n        n = NROW(Xp),\n        df = family_pars$nu,\n        mu = ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset'),\n        sigma = as.vector(family_pars$sigma_obs)\n      )\n    }\n  }\n\n  # Poisson observations\n  if (family == 'poisson') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n      if (density) {\n        out <- dpois(truth, lambda = exp(out), log = TRUE)\n      }\n    } else if (type == 'response') {\n      out <- rpois(\n        n = NROW(Xp),\n        lambda = exp(\n          ((matrix(Xp, ncol = NCOL(Xp)) %*%\n            betas)) +\n            attr(Xp, 'model.offset')\n        )\n      )\n    } else if (type == 'variance') {\n      out <- exp(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      ))\n    } else {\n      out <- exp(as.vector(\n        ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset')\n      ))\n    }\n  }\n\n  # Bernoulli observations\n  if (family == 'bernoulli') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n\n      if (density) {\n        out <- dbinom(truth, prob = plogis(out), size = 1, log = TRUE)\n      }\n    } else if (type == 'response') {\n      out <- rbinom(\n        n = NROW(Xp),\n        prob = plogis(\n          ((matrix(Xp, ncol = NCOL(Xp)) %*%\n            betas)) +\n            attr(Xp, 'model.offset')\n        ),\n        size = 1\n      )\n    } else if (type == 'variance') {\n      mu <- plogis(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      ))\n      out <- mu * (1 - mu)\n    } else {\n      out <- plogis(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      ))\n    }\n  }\n\n  # Binomial observations (requires argument 'trials')\n  if (family == 'binomial') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n\n      if (density) {\n        out <- dbinom(\n          truth,\n          prob = plogis(out),\n          size = as.vector(family_pars$trials),\n          log = TRUE\n        )\n      }\n    } else if (type == 'response') {\n      out <- rbinom(\n        n = NROW(Xp),\n        prob = plogis(\n          ((matrix(Xp, ncol = NCOL(Xp)) %*%\n            betas)) +\n            attr(Xp, 'model.offset')\n        ),\n        size = as.vector(family_pars$trials)\n      )\n    } else if (type == 'variance') {\n      mu <- plogis(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )) /\n        as.vector(family_pars$trials)\n      out <- mu * (1 - mu)\n    } else {\n      out <- plogis(\n        ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset')\n      ) *\n        as.vector(family_pars$trials)\n    }\n  }\n\n  # Beta_Binomial observations (requires arguments 'trials' and 'phi')\n  if (family == 'beta_binomial') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n\n      if (density) {\n        out <- dbeta_binomial(\n          truth,\n          mu = plogis(out),\n          phi = as.vector(family_pars$phi),\n          size = as.vector(family_pars$trials),\n          log = TRUE\n        )\n      }\n    } else if (type == 'response') {\n      out <- rbeta_binomial(\n        n = NROW(Xp),\n        mu = plogis(\n          ((matrix(Xp, ncol = NCOL(Xp)) %*%\n            betas)) +\n            attr(Xp, 'model.offset')\n        ),\n        phi = as.vector(family_pars$phi),\n        size = as.vector(family_pars$trials)\n      )\n    } else if (type == 'variance') {\n      mu <- plogis(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      ))\n      # https://en.wikipedia.org/wiki/Beta-binomial_distribution\n      alpha <- mu * as.vector(family_pars$phi)\n      beta <- (1 - mu) * as.vector(family_pars$phi)\n      p <- 1 / (alpha + beta + 1)\n      n <- as.vector(family_pars$trials)\n      out <- ((n * p) * (1 - p)) * ((alpha + beta + n) / (alpha + beta + 1))\n    } else {\n      out <- as.vector(\n        plogis(\n          ((matrix(Xp, ncol = NCOL(Xp)) %*%\n            betas)) +\n            attr(Xp, 'model.offset')\n        ) *\n          as.vector(family_pars$trials)\n      )\n    }\n  }\n\n  # Negative Binomial observations (requires argument 'phi')\n  if (family == 'negative binomial') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n\n      if (density) {\n        out <- dnbinom(\n          truth,\n          mu = exp(out),\n          size = as.vector(family_pars$phi),\n          log = TRUE\n        )\n      }\n    } else if (type == 'response') {\n      out <- rnbinom(\n        n = NROW(Xp),\n        mu = exp(\n          ((matrix(Xp, ncol = NCOL(Xp)) %*%\n            betas)) +\n            attr(Xp, 'model.offset')\n        ),\n        size = as.vector(family_pars$phi)\n      )\n    } else if (type == 'variance') {\n      mu <- exp(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      ))\n      out <- mu + mu^2 / as.vector(family_pars$phi)\n    } else {\n      out <- as.vector(exp(\n        ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset')\n      ))\n    }\n  }\n\n  # Beta observations (requires argument 'phi')\n  if (family == 'beta') {\n    shape_pars <- beta_shapes(\n      mu = plogis(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )),\n      phi = as.vector(family_pars$phi)\n    )\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n\n      if (density) {\n        out <- dbeta(\n          truth,\n          shape1 = shape_pars$shape1,\n          shape2 = shape_pars$shape2,\n          log = TRUE\n        )\n      }\n    } else if (type == 'response') {\n      out <- rbeta(\n        n = NROW(Xp),\n        shape1 = shape_pars$shape1,\n        shape2 = shape_pars$shape2\n      )\n    } else if (type == 'variance') {\n      mu <- plogis(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      ))\n      out <- mu * (1 - mu) / (1 + as.vector(family_pars$phi))\n    } else {\n      out <- plogis(as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      ))\n    }\n  }\n\n  # Gamma observations (requires argument 'shape')\n  if (family == 'Gamma') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n\n      if (density) {\n        out <- dgamma(\n          truth,\n          rate = as.vector(family_pars$shape) / exp(out),\n          shape = as.vector(family_pars$shape),\n          log = TRUE\n        )\n      }\n    } else if (type == 'response') {\n      out <- rgamma(\n        n = NROW(Xp),\n        rate = as.vector(family_pars$shape) /\n          exp(as.vector(\n            (matrix(Xp, ncol = NCOL(Xp)) %*%\n              betas) +\n              attr(Xp, 'model.offset')\n          )),\n        shape = as.vector(family_pars$shape)\n      )\n    } else if (type == 'variance') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )^2\n    } else {\n      out <- as.vector(family_pars$shape) /\n        (as.vector(family_pars$shape) /\n          exp(as.vector(\n            (matrix(Xp, ncol = NCOL(Xp)) %*%\n              betas) +\n              attr(Xp, 'model.offset')\n          )))\n    }\n  }\n\n  # Tweedie observations (requires argument 'phi')\n  if (family == 'tweedie') {\n    if (type == 'link') {\n      out <- as.vector(\n        (matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas) +\n          attr(Xp, 'model.offset')\n      )\n\n      if (density) {\n        out <- mgcv::ldTweedie(\n          y = truth,\n          mu = exp(out),\n          # Power parameter is fixed\n          p = 1.5,\n          phi = as.vector(family_pars$phi),\n          all.derivs = F\n        )[, 1]\n      }\n    } else if (type == 'response') {\n      out <- rpois(\n        n = NROW(Xp),\n        lambda = mgcv::rTweedie(\n          mu = exp(\n            ((matrix(Xp, ncol = NCOL(Xp)) %*%\n              betas)) +\n              attr(Xp, 'model.offset')\n          ),\n          # Power parameter is fixed\n          p = 1.5,\n          phi = as.vector(family_pars$phi)\n        )\n      )\n    } else if (type == 'variance') {\n      out <- (exp(\n        ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset')\n      )^1.5) *\n        as.vector(family_pars$phi)\n    } else {\n      out <- as.vector(exp(\n        ((matrix(Xp, ncol = NCOL(Xp)) %*%\n          betas)) +\n          attr(Xp, 'model.offset')\n      ))\n    }\n  }\n  return(out)\n}\n\n#' Set which family to use when calculating default intercept priors\n#' in brms\n#' @noRd\nfamily_to_brmsfam = function(family) {\n  if (family$family == 'beta') {\n    brms::Beta()\n  } else if (family$family == 'Beta regression') {\n    brms::Beta()\n  } else if (family$family == 'student') {\n    brms::student()\n  } else if (family$family %in% c('tweedie', 'negative binomial')) {\n    brms::negbinomial()\n  } else if (family$family == 'Gamma') {\n    Gamma(link = 'log')\n  } else {\n    family\n  }\n}\n\n#' Set which family to use when setting up the gam object\n#' Stick to Gaussian where possible to ensure the initial setup\n#' doesn't fail\n#' @noRd\nfamily_to_mgcvfam = function(family) {\n  if (family$family == 'beta') {\n    mgcv::betar()\n  } else if (family$family == 'student') {\n    gaussian()\n  } else if (family$family %in% c('gamma', 'Gamma', 'lognormal')) {\n    gaussian()\n  } else if (family$family == 'tweedie') {\n    mgcv::Tweedie(p = 1.5, link = 'log')\n  } else if (family$family == 'nmix') {\n    poisson()\n  } else if (family$family %in% c('bernoulli', 'beta_binomial')) {\n    binomial()\n  } else {\n    family\n  }\n}\n\n#' Set which family to use when setting up the jagam object\n#' @noRd\nfamily_to_jagamfam = function(family) {\n  if (family %in% c('gaussian', 'student')) {\n    gaussian()\n  } else {\n    poisson()\n  }\n}\n\n#' Define links used for the mean\n#' @noRd\nfamily_links = function(family) {\n  if (family %in% c('gaussian', 'lognormal', 'student')) {\n    out <- 'identity'\n  }\n  if (\n    family %in% c('Gamma', 'poisson', 'negative binomial', 'tweedie', 'nmix')\n  ) {\n    out <- 'log'\n  }\n  if (family %in% c('beta', 'binomial', 'bernoulli', 'beta_binomial')) {\n    out <- 'logit'\n  }\n  out\n}\n\n#' @noRd\nfamily_invlinks = function(family) {\n  if (family %in% c('gaussian', 'lognormal', 'student')) {\n    out <- function(x) {\n      x\n    }\n  }\n  if (family %in% c('Gamma', 'poisson', 'negative binomial', 'tweedie')) {\n    out <- function(x) {\n      exp(x)\n    }\n  }\n  if (family %in% c('beta', 'binomial', 'bernoulli', 'beta_binomial')) {\n    out <- function(x) {\n      plogis(x)\n    }\n  }\n  out\n}\n\n#' Parameters to monitor / extract depending on the observation family\n#' @param family Character string of family name\n#' @return Named list with parameter names and descriptive labels\n#' @noRd\nfamily_param_info = function(family) {\n  # Define family parameter specifications\n  family_specs <- list(\n    gaussian = list(\n      param_names = \"sigma_obs\",\n      labels = \"observation_error\"\n    ),\n    lognormal = list(\n      param_names = \"sigma_obs\",\n      labels = \"log_observation_error\"\n    ),\n    student = list(\n      param_names = c(\"sigma_obs\", \"nu\"),\n      labels = c(\"observation_error\", \"observation_df\")\n    ),\n    Gamma = list(\n      param_names = \"shape\",\n      labels = \"observation_shape\"\n    ),\n    beta = list(\n      param_names = \"phi\",\n      labels = \"observation_precision\"\n    ),\n    beta_binomial = list(\n      param_names = \"phi\",\n      labels = \"observation_dispersion\"\n    ),\n    \"negative binomial\" = list(\n      param_names = \"phi\",\n      labels = \"observation_dispersion\"\n    ),\n    tweedie = list(\n      param_names = \"phi\",\n      labels = \"observation_dispersion\"\n    ),\n    nmix = list(\n      param_names = \"detprob\",\n      labels = \"detection_probability\"\n    ),\n    poisson = list(\n      param_names = character(0),\n      labels = character(0)\n    ),\n    binomial = list(\n      param_names = character(0),\n      labels = character(0)\n    ),\n    bernoulli = list(\n      param_names = character(0),\n      labels = character(0)\n    )\n  )\n\n  # Return specification for the given family\n  spec <- family_specs[[family]]\n  if (is.null(spec)) {\n    # Default for unknown families\n    spec <- list(\n      param_names = character(0),\n      labels = character(0)\n    )\n  }\n\n  return(spec)\n}\n\n#' Parameters to monitor / extract depending on the observation family\n#' (deprecated Use family_param_info() instead)\n#' @noRd\nfamily_par_names = function(family) {\n  # Maintain backward compatibility by extracting param_names from new function\n  family_param_info(family)$param_names\n}\n\n#' Define which parameters to monitor / extract\n#' @noRd\nextract_family_pars = function(object, newdata = NULL) {\n  # Get names of parameters to extract\n  pars_to_extract <- family_param_info(object$family)$param_names\n\n  # Extract into a named list\n  if (length(pars_to_extract) > 0) {\n    out <- vector(mode = 'list')\n    for (i in 1:length(pars_to_extract)) {\n      out[[i]] <- mcmc_chains(object$model_output, params = pars_to_extract[i])\n      if (NCOL(out[[i]]) == 1) {\n        out[[i]] <- as.vector(out[[i]])\n      }\n    }\n  } else {\n    out <- list()\n  }\n\n  names(out) <- pars_to_extract\n\n  # Return list of extracted posterior parameter samples\n  out\n}\n\n#' Family-specific prior information\n#' @noRd\nfamily_prior_info = function(family, use_stan, data) {\n  if (family == 'gaussian') {\n    prior_df <- data.frame(\n      param_name = c('vector<lower=0>[n_series] sigma_obs;'),\n      param_length = length(unique(data$series)),\n      param_info = c('observation error sd'),\n      prior = c('sigma_obs ~ student_t(3, 0, 2);'),\n      example_change = c(\n        paste0(\n          'sigma_obs ~ normal(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.1, max = 1, n = 1), 2),\n          ');'\n        )\n      )\n    )\n  }\n\n  if (family == 'lognormal') {\n    prior_df <- data.frame(\n      param_name = c('vector<lower=0>[n_series] sigma_obs;'),\n      param_length = length(unique(data$series)),\n      param_info = c('log(observation error sd)'),\n      prior = c('sigma_obs ~ student_t(3, 0, 1);'),\n      example_change = c(\n        paste0(\n          'sigma_obs ~ normal(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.1, max = 1, n = 1), 2),\n          ');'\n        )\n      )\n    )\n  }\n\n  if (family == 'student') {\n    prior_df <- data.frame(\n      param_name = c(\n        'vector<lower=0>[n_series] sigma_obs;',\n        'vector<lower=0>[n_series] nu;'\n      ),\n      param_length = rep(length(unique(data$series)), 2),\n      param_info = c('observation error sd', 'observation degrees of freedom'),\n      prior = c('sigma_obs ~ student_t(3, 0, 2);', 'nu ~ gamma(2, 0.1);'),\n      example_change = c(\n        paste0(\n          'sigma_obs ~ normal(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.1, max = 1, n = 1), 2),\n          ');'\n        ),\n        paste0(\n          'nu ~ normal(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.1, max = 1, n = 1), 2),\n          ');'\n        )\n      )\n    )\n  }\n\n  if (family == 'beta') {\n    prior_df <- data.frame(\n      param_name = c('vector<lower=0>[n_series] phi;'),\n      param_length = length(unique(data$series)),\n      param_info = c('Beta precision parameter'),\n      prior = c('phi ~ gamma(0.01, 0.01);'),\n      example_change = c(\n        paste0(\n          'phi ~ normal(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.1, max = 1, n = 1), 2),\n          ');'\n        )\n      )\n    )\n  }\n\n  if (family == 'beta_binomial') {\n    prior_df <- data.frame(\n      param_name = c('vector<lower=0>[n_series] phi;'),\n      param_length = length(unique(data$series)),\n      param_info = c('Beta Binomial precision parameter'),\n      prior = c('phi ~ gamma(0.01, 0.01);'),\n      example_change = c(\n        paste0(\n          'phi ~ normal(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.1, max = 1, n = 1), 2),\n          ');'\n        )\n      )\n    )\n  }\n\n  if (family == 'Gamma') {\n    prior_df <- data.frame(\n      param_name = c('vector<lower=0>[n_series] shape;'),\n      param_length = length(unique(data$series)),\n      param_info = c('Gamma shape parameter'),\n      prior = c('shape ~ gamma(0.01, 0.01);'),\n      example_change = c(\n        paste0(\n          'shape ~ normal(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.1, max = 1, n = 1), 2),\n          ');'\n        )\n      )\n    )\n  }\n\n  if (family == 'negative binomial') {\n    if (use_stan) {\n      prior_df <- data.frame(\n        param_name = c('vector<lower=0>[n_series] phi_inv;'),\n        param_length = length(unique(data$series)),\n        param_info = c('inverse of NB dispsersion'),\n        prior = c('phi_inv ~ student_t(3, 0, 0.1);'),\n        example_change = c(\n          paste0(\n            'phi_inv ~ normal(',\n            round(runif(min = -1, max = 1, n = 1), 2),\n            ', ',\n            round(runif(min = 0.1, max = 1, n = 1), 2),\n            ');'\n          )\n        )\n      )\n    } else {\n      prior_df <- data.frame(\n        param_name = c('vector<lower=0>[n_series] phi_inv;'),\n        param_length = length(unique(data$series)),\n        param_info = c('inverse of NB dispsersion'),\n        prior = c('phi_inv[s] ~ dexp(5)'),\n        example_change = c(\n          paste0(\n            'phi_inv[s] ~ dnorm(',\n            round(runif(min = -1, max = 1, n = 1), 2),\n            ', ',\n            round(runif(min = 0.1, max = 1, n = 1), 2),\n            ')T(0, )'\n          )\n        )\n      )\n    }\n  }\n\n  if (family == 'tweedie') {\n    prior_df <- data.frame(\n      param_name = c('vector<lower=0>[n_series] phi_raw;'),\n      param_length = length(unique(data$series)),\n      param_info = c('log of Tweedie dispsersion (for each series s)'),\n      prior = c('phi_raw[s] ~ dnorm(0, 2)T(-3.5, 3.5)'),\n      example_change = c(\n        paste0(\n          'phi_raw[s] ~ dnorm(',\n          round(runif(min = -1, max = 1, n = 1), 2),\n          ', ',\n          round(runif(min = 0.5, max = 5, n = 1), 2),\n          ')'\n        )\n      )\n    )\n  }\n\n  if (family %in% c('nmix', 'poisson', 'binomial', 'bernoulli')) {\n    prior_df <- NULL\n  }\n\n  return(prior_df)\n}\n\n#' Family-specific Dunn-Smyth residual functions\n#' @noRd\nds_resids_nmix = function(truth, fitted, draw, p, N) {\n  na_obs <- is.na(truth)\n  a_obs <- pbinom(\n    ifelse(\n      as.vector(truth[!na_obs]) - 1.e-6 > 0,\n      as.vector(truth[!na_obs]) - 1.e-6,\n      0\n    ),\n    size = N[!na_obs],\n    prob = p[!na_obs]\n  )\n  b_obs <- pbinom(\n    as.vector(truth[!na_obs]),\n    size = N[!na_obs],\n    prob = p[!na_obs]\n  )\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_binomial = function(truth, fitted, draw, N) {\n  na_obs <- is.na(truth)\n  a_obs <- pbinom(\n    ifelse(\n      as.vector(truth[!na_obs]) - 1.e-6 > 0,\n      as.vector(truth[!na_obs]) - 1.e-6,\n      0\n    ),\n    size = N[!na_obs],\n    prob = fitted[!na_obs]\n  )\n  b_obs <- pbinom(\n    as.vector(truth[!na_obs]),\n    size = N[!na_obs],\n    prob = fitted[!na_obs]\n  )\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_beta_binomial = function(truth, fitted, draw, N, phi) {\n  na_obs <- is.na(truth)\n  a_obs <- pbeta_binomial(\n    ifelse(\n      as.vector(truth[!na_obs]) - 1.e-6 > 0,\n      as.vector(truth[!na_obs]) - 1.e-6,\n      0\n    ),\n    size = N[!na_obs],\n    mu = fitted[!na_obs],\n    phi = phi[!na_obs]\n  )\n  b_obs <- pbeta_binomial(\n    ifelse(as.vector(truth[!na_obs]), as.vector(truth[!na_obs]), 0),\n    size = N[!na_obs],\n    mu = fitted[!na_obs],\n    phi = phi[!na_obs]\n  )\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_nb = function(truth, fitted, draw, size) {\n  na_obs <- is.na(truth)\n\n  p <- size[!na_obs] / (fitted[!na_obs] + size[!na_obs])\n  a_obs <- ifelse(\n    as.vector(truth[!na_obs]) > 0,\n    pbeta(p, size[!na_obs], pmax(as.vector(truth[!na_obs]), 1)),\n    0\n  )\n  b_obs <- pbeta(p, size[!na_obs], as.vector(truth[!na_obs]) + 1)\n  u_obs <- runif(n = length(truth[!na_obs]), min = a_obs, max = b_obs)\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_beta = function(truth, fitted, draw, precision) {\n  shape_pars <- beta_shapes(mu = fitted, phi = precision)\n  na_obs <- is.na(truth)\n  a_obs <- pbeta(\n    as.vector(truth[!na_obs]) - 1.e-6,\n    shape1 = shape_pars$shape1[!na_obs],\n    shape2 = shape_pars$shape2[!na_obs]\n  )\n  b_obs <- pbeta(\n    as.vector(truth[!na_obs]),\n    shape1 = shape_pars$shape1[!na_obs],\n    shape2 = shape_pars$shape2[!na_obs]\n  )\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_pois = function(truth, fitted, draw) {\n  na_obs <- is.na(truth)\n  a_obs <- ppois(as.vector(truth[!na_obs]) - 1.e-6, lambda = fitted[!na_obs])\n  b_obs <- ppois(as.vector(truth[!na_obs]), lambda = fitted[!na_obs])\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_tw = function(truth, fitted, draw) {\n  na_obs <- is.na(truth)\n  a_obs <- ppois(as.vector(truth[!na_obs]) - 1.e-6, lambda = fitted[!na_obs])\n  b_obs <- ppois(as.vector(truth[!na_obs]), lambda = fitted[!na_obs])\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_gaus = function(truth, fitted, sigma, draw) {\n  na_obs <- is.na(truth)\n  a_obs <- pnorm(\n    as.vector(truth[!na_obs]) - 1.e-6,\n    mean = fitted[!na_obs],\n    sd = sigma\n  )\n  b_obs <- pnorm(as.vector(truth[!na_obs]), mean = fitted[!na_obs], sd = sigma)\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_lnorm = function(truth, fitted, sigma, draw) {\n  na_obs <- is.na(truth)\n  a_obs <- plnorm(\n    as.vector(truth[!na_obs]) - 1.e-6,\n    meanlog = log(fitted[!na_obs]),\n    sdlog = sigma[!na_obs]\n  )\n  b_obs <- plnorm(\n    as.vector(truth[!na_obs]),\n    meanlog = log(fitted[!na_obs]),\n    sdlog = sigma[!na_obs]\n  )\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_gamma = function(truth, fitted, shape, draw) {\n  na_obs <- is.na(truth)\n  a_obs <- pgamma(\n    as.vector(truth[!na_obs]) - 1.e-6,\n    shape = shape[!na_obs],\n    rate = shape[!na_obs] / fitted[!na_obs]\n  )\n  b_obs <- pgamma(\n    as.vector(truth[!na_obs]),\n    shape = shape[!na_obs],\n    rate = shape[!na_obs] / fitted[!na_obs]\n  )\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#' @noRd\nds_resids_student = function(truth, fitted, sigma, nu, draw) {\n  na_obs <- is.na(truth)\n  a_obs <- pstudent_t(\n    as.vector(truth[!na_obs]) - 1,\n    df = nu[!na_obs],\n    mu = fitted[!na_obs],\n    sigma = sigma[!na_obs]\n  )\n  b_obs <- pstudent_t(\n    as.vector(truth[!na_obs]),\n    df = nu[!na_obs],\n    mu = fitted[!na_obs],\n    sigma = sigma[!na_obs]\n  )\n  u_obs <- runif(\n    n = length(truth[!na_obs]),\n    min = pmin(a_obs, b_obs),\n    max = pmax(a_obs, b_obs)\n  )\n\n  if (any(is.na(truth))) {\n    u <- vector(length = length(truth))\n    u[na_obs] <- NaN\n    u[!na_obs] <- u_obs\n  } else {\n    u <- u_obs\n  }\n  dsres_out <- qnorm(u)\n  dsres_out[is.infinite(dsres_out)] <- NaN\n  dsres_out\n}\n\n#'Residual calculations for a forecast\n#' @noRd\nget_forecast_resids = function(\n  object,\n  series,\n  truth,\n  preds,\n  family,\n  sample_seq\n) {\n  if (family == 'poisson') {\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_pois(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ]\n        ))\n      })\n    )\n  }\n\n  if (family == 'negative binomial') {\n    size <- mcmc_chains(object$model_output, 'phi')\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_nb(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ],\n          size = size[x]\n        ))\n      })\n    )\n  }\n\n  if (family == 'gaussian') {\n    sigma <- mcmc_chains(object$model_output, 'sigma_obs')\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_gaus(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ],\n          sigma = sigma[x]\n        ))\n      })\n    )\n  }\n\n  if (family == 'lognormal') {\n    sigma <- mcmc_chains(object$model_output, 'sigma_obs')\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_lnorm(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ],\n          sigma = sigma[x]\n        ))\n      })\n    )\n  }\n\n  if (family == 'student') {\n    sigma <- mcmc_chains(object$model_output, 'sigma_obs')\n    nu <- mcmc_chains(object$model_output, 'nu')\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_student(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ],\n          sigma = sigma[x],\n          nu = nu[x]\n        ))\n      })\n    )\n  }\n\n  if (family == 'beta') {\n    precision <- mcmc_chains(object$model_output, 'phi')\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_beta(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ],\n          precision = precision[x]\n        ))\n      })\n    )\n  }\n\n  if (family == 'Gamma') {\n    shapes <- mcmc_chains(object$model_output, 'shape')\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_gamma(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ],\n          shape = shapes[x]\n        ))\n      })\n    )\n  }\n\n  if (family == 'tweedie') {\n    series_residuals <- do.call(\n      rbind,\n      lapply(sample_seq, function(x) {\n        suppressWarnings(ds_resids_tw(\n          truth = truth,\n          fitted = preds[x, ],\n          draw = preds[x, ]\n        ))\n      })\n    )\n  }\n  return(series_residuals)\n}\n\n#' #'Residual calculations for a fitted mvgam object\n#' @noRd\ndsresids_vec = function(object) {\n  family <- object$family\n  obs_series <- object$obs_data$series\n  series_levels <- levels(obs_series)\n  fit_engine <- object$fit_engine\n\n  # Need to know which series each observation belongs to so we can\n  # pull out appropriate family-level parameters (overdispersions, shapes, etc...)\n  all_dat <- data.frame(\n    series = object$obs_data$series,\n    time = object$obs_data$index..time..index,\n    y = object$obs_data$y\n  ) %>%\n    dplyr::arrange(time, series)\n\n  truth <- all_dat$y\n  last_train <- NROW(all_dat)\n  series_obs <- as.numeric(all_dat$series)\n\n  # Extract expectations and necessary generated quantities\n  # and subset to only include training data\n  preds <- posterior_epred(object)[, 1:last_train, drop = FALSE]\n\n  if (family == 'nmix') {\n    p <- mcmc_chains(object$model_output, 'detprob')[,\n      1:last_train,\n      drop = FALSE\n    ]\n    N <- mcmc_chains(object$model_output, 'latent_ypred')[,\n      1:last_train,\n      drop = FALSE\n    ]\n  }\n\n  if (family %in% c('binomial', 'beta_binomial')) {\n    p <- plogis(mcmc_chains(object$model_output, 'mus')[,\n      1:last_train,\n      drop = FALSE\n    ])\n    N <- as.vector(attr(object$mgcv_model, 'trials'))[1:length(truth)]\n  }\n\n  # Family-specific parameters\n  family_pars <- extract_family_pars(object = object)\n  n_series <- NCOL(object$ytimes)\n\n  # Family parameters spread into a vector\n  family_extracts <- lapply(seq_along(family_pars), function(j) {\n    if (is.matrix(family_pars[[j]])) {\n      as.vector(family_pars[[j]][, series_obs])\n    } else {\n      as.vector(matrix(\n        rep(family_pars[[j]], NCOL(preds)),\n        nrow = NROW(preds),\n        byrow = FALSE\n      ))\n    }\n  })\n  names(family_extracts) <- names(family_pars)\n\n  # Create a truth matrix for vectorised residual computation\n  truth_mat <- matrix(rep(truth, NROW(preds)), nrow = NROW(preds), byrow = TRUE)\n\n  # Calculate DS residual distributions\n  if (family == 'gaussian') {\n    resids <- matrix(\n      ds_resids_gaus(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1,\n        sigma = family_extracts$sigma_obs\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'binomial') {\n    N_mat <- matrix(rep(N, NROW(preds)), nrow = NROW(preds), byrow = TRUE)\n    resids <- matrix(\n      ds_resids_binomial(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(p),\n        draw = 1,\n        N = as.vector(N_mat)\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'beta_binomial') {\n    N_mat <- matrix(rep(N, NROW(preds)), nrow = NROW(preds), byrow = TRUE)\n    resids <- matrix(\n      ds_resids_beta_binomial(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(p),\n        draw = 1,\n        N = as.vector(N_mat),\n        phi = family_extracts$phi\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'bernoulli') {\n    resids <- matrix(\n      ds_resids_binomial(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1,\n        N = rep(1, length(truth_mat))\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'nmix') {\n    resids <- matrix(\n      ds_resids_nmix(\n        truth = as.vector(truth_mat),\n        fitted = 1,\n        draw = 1,\n        N = as.vector(N),\n        p = as.vector(p)\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'student') {\n    resids <- matrix(\n      ds_resids_student(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1,\n        sigma = family_extracts$sigma_obs,\n        nu = family_extracts$nu\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'lognormal') {\n    resids <- matrix(\n      ds_resids_lnorm(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1,\n        sigma = family_extracts$sigma_obs\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'poisson') {\n    resids <- matrix(\n      ds_resids_pois(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'beta') {\n    resids <- matrix(\n      ds_resids_beta(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1,\n        precision = family_extracts$phi\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'Gamma') {\n    resids <- matrix(\n      ds_resids_gamma(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1,\n        shape = family_extracts$shape\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'negative binomial') {\n    resids <- matrix(\n      ds_resids_nb(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1,\n        size = family_extracts$phi\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  if (family == 'tweedie') {\n    resids <- matrix(\n      ds_resids_tw(\n        truth = as.vector(truth_mat),\n        fitted = as.vector(preds),\n        draw = 1\n      ),\n      nrow = NROW(preds)\n    )\n  }\n\n  # Convert to a list of series-level matrices and return\n  series_resids <- lapply(seq_len(n_series), function(series) {\n    inds_keep <- which(series_obs == series)\n    resids[, inds_keep]\n  })\n  names(series_resids) <- levels(all_dat$series)\n\n  return(series_resids)\n}\n"
  },
  {
    "path": "R/fevd.mvgam.R",
    "content": "#' Calculate latent VAR forecast error variance decompositions\n#'\n#' Compute forecast error variance decompositions from\n#' \\code{mvgam} models with Vector Autoregressive dynamics\n#'\n#' @name fevd.mvgam\n#'\n#' @param object \\code{list} object of class \\code{mvgam} resulting from a call to [mvgam()]\n#' that used a Vector Autoregressive latent process model (either as `VAR(cor = FALSE)` or\n#' `VAR(cor = TRUE)`; see [VAR()] for details)\n#'\n#' @param h Positive \\code{integer} specifying the forecast horizon over which to calculate\n#' the IRF\n#'\n#' @param ... ignored\n#'\n#' @return See \\code{\\link{mvgam_fevd-class}} for a full description of the quantities that are\n#' computed and returned by this function, along with key references.\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso [VAR()], [irf()], [stability()], \\code{\\link{mvgam_fevd-class}}\n#'\n#' @references Lütkepohl, H. (2007).\n#' New Introduction to Multiple Time Series Analysis. 2nd ed. Springer-Verlag Berlin Heidelberg.\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some time series that follow a latent VAR(1) process\n#' simdat <- sim_mvgam(\n#'   family = gaussian(),\n#'   n_series = 4,\n#'   trend_model = VAR(cor = TRUE),\n#'   prop_trend = 1\n#' )\n#' plot_mvgam_series(data = simdat$data_train, series = \"all\")\n#'\n#' # Fit a model that uses a latent VAR(1)\n#' mod <- mvgam(\n#'   formula = y ~ -1,\n#'   trend_formula = ~ 1,\n#'   trend_model = VAR(cor = TRUE),\n#'   family = gaussian(),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot the autoregressive coefficient distributions;\n#' # use 'dir = \"v\"' to arrange the order of facets\n#' # correctly\n#' mcmc_plot(\n#'   mod,\n#'   variable = 'A',\n#'   regex = TRUE,\n#'   type = 'hist',\n#'   facet_args = list(dir = 'v')\n#' )\n#'\n#' # Calulate forecast error variance decompositions for each series\n#' fevds <- fevd(mod, h = 12)\n#'\n#' # Plot median contributions to forecast error variance\n#' plot(fevds)\n#'\n#' # View a summary of the error variance decompositions\n#' summary(fevds)\n#' }\n#' @export\nfevd <- function(object, ...) {\n  UseMethod(\"fevd\", object)\n}\n\n#' @rdname fevd.mvgam\n#' @method fevd mvgam\n#' @export\nfevd.mvgam <- function(object, h = 10, ...) {\n  validate_pos_integer(h)\n  trend_model <- attr(object$model_data, \"trend_model\")\n  if (!trend_model %in% c(\"VAR\", \"VARcor\", \"VAR1\", \"VAR1cor\")) {\n    stop(\n      \"Only VAR(1) models currently supported for calculating FEVDs\",\n      call. = FALSE\n    )\n  }\n  beta_vars <- mcmc_chains(object$model_output, \"A\")\n  sigmas <- mcmc_chains(object$model_output, \"Sigma\")\n  n_series <- object$n_lv\n\n  if (is.null(n_series)) {\n    n_series <- nlevels(object$obs_data$series)\n  }\n\n  all_fevds <- lapply(seq_len(NROW(beta_vars)), function(draw) {\n    # Get necessary VAR parameters into a simple list format\n    x <- list(\n      K = n_series,\n      A = matrix(\n        beta_vars[draw, ],\n        nrow = n_series,\n        ncol = n_series,\n        byrow = TRUE\n      ),\n      Sigma = matrix(\n        sigmas[draw, ],\n        nrow = n_series,\n        ncol = n_series,\n        byrow = TRUE\n      ),\n      p = 1\n    )\n\n    # Calculate the FEVD for this draw\n    gen_fevd(x, h = h)\n  })\n  class(all_fevds) <- \"mvgam_fevd\"\n  return(all_fevds)\n}\n\n#### Functions to compute forecast error variance decompositions\n# Much of this code is modified from R code generously provided in the vars\n# package https://github.com/cran/vars ####\n#' Forecast error variance decomposition\n#' @noRd\ngen_fevd <- function(x, h = 6, ...) {\n  K <- x$K\n  ynames <- paste0(\"process_\", 1:K)\n  msey <- var_fecov(x, h = h)\n  Psi <- var_psi(x, h = h)\n  mse <- matrix(NA, nrow = h, ncol = K)\n  Omega <- array(0, dim = c(h, K, K))\n  for (i in 1:h) {\n    mse[i, ] <- diag(msey[,, i])\n    temp <- matrix(0, K, K)\n    for (l in 1:K) {\n      for (m in 1:K) {\n        for (j in 1:i) {\n          temp[l, m] <- temp[l, m] + Psi[l, m, j]^2\n        }\n      }\n    }\n    temp <- temp / mse[i, ]\n    for (j in 1:K) {\n      Omega[i, , j] <- temp[j, ]\n    }\n  }\n  result <- list()\n  for (i in 1:K) {\n    result[[i]] <- matrix(Omega[,, i], nrow = h, ncol = K)\n    colnames(result[[i]]) <- ynames\n  }\n  names(result) <- ynames\n  return(result)\n}\n\n\n#' Forecast error covariance matrix\n#' @noRd\nvar_fecov <- function(x, h) {\n  sigma_yh <- array(NA, dim = c(x$K, x$K, h))\n  Phi <- var_phi(x, h = h)\n  sigma_yh[,, 1] <- Phi[,, 1] %*% t(Phi[,, 1])\n  if (h > 1) {\n    for (i in 2:h) {\n      temp <- matrix(0, nrow = x$K, ncol = x$K)\n      for (j in 2:i) {\n        temp <- temp + Phi[,, j] %*% t(Phi[,, j])\n      }\n      sigma_yh[,, i] <- temp + sigma_yh[,, 1]\n    }\n  }\n  return(sigma_yh)\n}\n"
  },
  {
    "path": "R/forecast.mvgam.R",
    "content": "#' @importFrom generics forecast\n#' @export\ngenerics::forecast\n\n#' @title Extract or compute hindcasts and forecasts for a fitted\n#'   \\code{mvgam} object\n#'\n#' @name forecast.mvgam\n#'\n#' @method forecast mvgam\n#'\n#' @importFrom stats predict\n#'\n#' @importFrom rlang missing_arg\n#'\n#' @inheritParams predict.mvgam\n#'\n#' @param newdata Optional \\code{dataframe} or \\code{list} of test data\n#'   containing the same variables that were included in the original `data`\n#'   used to fit the model. If included, the covariate information in\n#'   \\code{newdata} will be used to generate forecasts from the fitted model\n#'   equations. If this same \\code{newdata} was originally included in the call\n#'   to \\code{mvgam}, then forecasts have already been produced by the\n#'   generative model and these will simply be extracted and plotted. However\n#'   if no \\code{newdata} was supplied to the original model call, an\n#'   assumption is made that the \\code{newdata} supplied here comes\n#'   sequentially after the data supplied in the original model (i.e. we\n#'   assume there is no time gap between the last observation of series 1 in\n#'   the original data and the first observation for series 1 in\n#'   \\code{newdata})\n#'\n#' @param data_test Deprecated. Still works in place of \\code{newdata} but\n#'   users are recommended to use \\code{newdata} instead for more seamless\n#'   integration into `R` workflows\n#'\n#' @param n_cores Deprecated. Parallel processing is no longer supported\n#'\n#' @param ... Ignored\n#'\n#' @details Posterior predictions are drawn from the fitted \\code{mvgam} and\n#'   used to simulate a forecast distribution\n#'\n#' @return An object of class \\code{mvgam_forecast} containing hindcast and\n#'   forecast distributions. See \\code{\\link{mvgam_forecast-class}} for\n#'   details.\n#'\n#' @seealso [hindcast.mvgam()], [plot.mvgam_forecast()],\n#'   [summary.mvgam_forecast()], [score.mvgam_forecast()]\n#'   [ensemble.mvgam_forecast()]\n#'\n#' @examples\n#' \\dontrun{\n#'   # Simulate data with 3 series and AR trend model\n#'   simdat <- sim_mvgam(n_series = 3, trend_model = AR())\n#'\n#'   # Fit mvgam model\n#'   mod <- mvgam(\n#'     y ~ s(season, bs = 'cc', k = 6),\n#'     trend_model = AR(),\n#'     noncentred = TRUE,\n#'     data = simdat$data_train,\n#'     chains = 2,\n#'     silent = 2\n#'   )\n#'\n#'   # Hindcasts on response scale\n#'   hc <- hindcast(mod)\n#'   str(hc)\n#'\n#'   # Use summary() to extract hindcasts / forecasts for custom plotting\n#'   head(summary(hc), 12)\n#'\n#'   # Or just use the plot() function for quick plots\n#'   plot(hc, series = 1)\n#'   plot(hc, series = 2)\n#'   plot(hc, series = 3)\n#'\n#'   # Forecasts on response scale\n#'   fc <- forecast(\n#'     mod,\n#'     newdata = simdat$data_test\n#'   )\n#'   str(fc)\n#'   head(summary(fc), 12)\n#'   plot(fc, series = 1)\n#'   plot(fc, series = 2)\n#'   plot(fc, series = 3)\n#'\n#'   # Forecasts as expectations\n#'   fc <- forecast(\n#'     mod,\n#'     newdata = simdat$data_test,\n#'     type = 'expected'\n#'   )\n#'   head(summary(fc), 12)\n#'   plot(fc, series = 1)\n#'   plot(fc, series = 2)\n#'   plot(fc, series = 3)\n#'\n#'   # Dynamic trend extrapolations\n#'   fc <- forecast(\n#'     mod,\n#'     newdata = simdat$data_test,\n#'     type = 'trend'\n#'   )\n#'   head(summary(fc), 12)\n#'   plot(fc, series = 1)\n#'   plot(fc, series = 2)\n#'   plot(fc, series = 3)\n#' }\n#'\n#' @export\nforecast.mvgam = function(\n  object,\n  newdata,\n  data_test,\n  n_cores = 1,\n  type = 'response',\n  ...\n) {\n  # Check arguments\n  validate_pos_integer(n_cores)\n  if (n_cores > 1L) {\n    message('argument \"n_cores\" is deprecated')\n  }\n\n  if (!missing(\"newdata\")) {\n    data_test <- newdata\n  }\n\n  if (missing(\"newdata\") & missing(data_test) & is.null(object$test_data)) {\n    stop('newdata must be supplied to compute forecasts', call. = FALSE)\n  }\n\n  type <- match.arg(\n    arg = type,\n    choices = c(\n      \"link\",\n      \"response\",\n      \"trend\",\n      \"expected\",\n      \"detection\",\n      \"latent_N\"\n    )\n  )\n\n  if (inherits(object, 'jsdgam')) {\n    orig_trend_model <- attr(object$model_data, 'prepped_trend_model')\n  } else {\n    orig_trend_model <- object$trend_model\n  }\n\n  data_train <- validate_series_time(\n    object$obs_data,\n    trend_model = orig_trend_model\n  )\n  n_series <- NCOL(object$ytimes)\n\n  # Check whether a forecast has already been computed\n  forecasts_exist <- FALSE\n  if (!is.null(object$test_data) && !missing(data_test)) {\n    object$test_data <- validate_series_time(\n      object$test_data,\n      trend_model = orig_trend_model\n    )\n    data_test <- validate_series_time(data_test, trend_model = orig_trend_model)\n    if (\n      max(data_test$index..time..index) <=\n        max(object$test_data$index..time..index)\n    ) {\n      forecasts_exist <- TRUE\n    } else {\n      data.frame(time = data_test$time) %>%\n        dplyr::mutate(rowid = dplyr::row_number()) %>%\n        dplyr::filter(time > max(object$test_data$index..time..index)) %>%\n        dplyr::pull(rowid) -> idx\n      if (inherits(data_test, 'list')) {\n        data_arranged <- data_test\n        data_arranged <- lapply(data_test, function(x) {\n          if (is.matrix(x)) {\n            matrix(x[idx, ], ncol = NCOL(x))\n          } else {\n            x[idx]\n          }\n        })\n        names(data_arranged) <- names(data_test)\n        data_test <- data_arranged\n      } else {\n        data_test <- data_test[idx, ]\n      }\n    }\n  }\n\n  if (!is.null(object$test_data) && missing(data_test)) {\n    forecasts_exist <- TRUE\n  }\n\n  if (is.null(object$test_data)) {\n    data_test <- validate_series_time(\n      data_test,\n      name = 'newdata',\n      trend_model = orig_trend_model\n    )\n    data.frame(series = object$obs_data$series, time = object$obs_data$time) %>%\n      dplyr::group_by(series) %>%\n      dplyr::summarise(maxt = max(time)) -> series_max_ts\n\n    data.frame(series = data_test$series, time = data_test$time) %>%\n      dplyr::mutate(orig_rows = dplyr::row_number()) %>%\n      dplyr::left_join(series_max_ts, by = 'series') %>%\n      dplyr::filter(time > maxt) %>%\n      dplyr::pull(orig_rows) -> idx\n\n    if (inherits(data_test, 'list')) {\n      data_arranged <- data_test\n      data_arranged <- lapply(data_test, function(x) {\n        if (is.matrix(x)) {\n          matrix(x[idx, ], ncol = NCOL(x))\n        } else {\n          x[idx]\n        }\n      })\n      names(data_arranged) <- names(data_test)\n      data_test <- data_arranged\n    } else {\n      data_test <- data_test[idx, ]\n    }\n    object$test_data <- data_test\n  }\n\n  # Only compute forecasts if they don't already exist!\n  if (!forecasts_exist) {\n    resp_terms <- as.character(terms(formula(object))[[2]])\n    if (length(resp_terms) == 1) {\n      out_name <- as.character(terms(formula(object))[[2]])\n    } else {\n      if (any(grepl('cbind', resp_terms))) {\n        resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n        out_name <- resp_terms[1]\n      }\n    }\n\n    if (out_name != 'y') {\n      data_test$y <- data_test[[out_name]]\n    }\n\n    if (!missing(data_test)) {\n      if (!'y' %in% names(data_test)) {\n        data_test$y <- rep(NA, NROW(data_test))\n      }\n      data_test <- validate_series_time(\n        data_test,\n        name = 'newdata',\n        trend_model = orig_trend_model\n      )\n    }\n\n    # Generate draw-specific forecasts\n    fc_preds <- forecast_draws(\n      object = object,\n      type = type,\n      series = 'all',\n      data_test = data_test,\n      n_cores = n_cores,\n      ...\n    )\n\n    # Extract forecasts into the correct format\n    series_fcs <- lapply(seq_len(n_series), function(series) {\n      indexed_forecasts <- do.call(\n        rbind,\n        lapply(seq_along(fc_preds), function(x) {\n          fc_preds[[x]][[series]]\n        })\n      )\n      indexed_forecasts\n    })\n    names(series_fcs) <- levels(data_test$series)\n\n    # Extract hindcasts\n    data_train <- validate_series_time(\n      object$obs_data,\n      trend_model = orig_trend_model\n    )\n    ends <- seq(\n      0,\n      dim(mcmc_chains(object$model_output, 'ypred'))[2],\n      length.out = NCOL(object$ytimes) + 1\n    )\n    starts <- ends + 1\n    starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n    ends <- ends[-1]\n\n    series_hcs <- lapply(seq_len(n_series), function(series) {\n      to_extract <- switch(\n        type,\n        'link' = 'mus',\n        'expected' = 'mus',\n        'response' = 'ypred',\n        'trend' = 'trend',\n        'latent_N' = 'mus',\n        'detection' = 'mus'\n      )\n      if (\n        object$family == 'nmix' &\n          type == 'link'\n      ) {\n        to_extract <- 'trend'\n      }\n      if (object$fit_engine == 'stan') {\n        preds <- mcmc_chains(object$model_output, to_extract)[,\n          seq(\n            series,\n            dim(mcmc_chains(object$model_output, 'ypred'))[2],\n            by = NCOL(object$ytimes)\n          ),\n          drop = FALSE\n        ]\n      } else {\n        preds <- mcmc_chains(object$model_output, to_extract)[,\n          starts[series]:ends[series],\n          drop = FALSE\n        ]\n      }\n\n      if (\n        object$family == 'nmix' &\n          type == 'link'\n      ) {\n        preds <- exp(preds)\n      }\n\n      if (type %in% c('expected', 'latent_N', 'detection')) {\n        # Compute expectations as one long vector\n        Xpmat <- matrix(as.vector(preds))\n        attr(Xpmat, 'model.offset') <- 0\n\n        family_pars <- extract_family_pars(object = object)\n        par_extracts <- lapply(seq_along(family_pars), function(j) {\n          if (is.matrix(family_pars[[j]])) {\n            as.vector(matrix(\n              rep(as.vector(family_pars[[j]][, series]), NCOL(preds)),\n              nrow = NROW(preds),\n              byrow = FALSE\n            ))\n          } else {\n            as.vector(matrix(\n              rep(family_pars[[j]], NCOL(preds)),\n              nrow = NROW(preds),\n              byrow = FALSE\n            ))\n          }\n        })\n        names(par_extracts) <- names(family_pars)\n\n        # Add trial information if this is a Binomial model\n        if (object$family %in% c('binomial', 'beta_binomial')) {\n          trials <- as.vector(matrix(\n            rep(\n              as.vector(attr(object$mgcv_model, 'trials')[, series]),\n              NROW(preds)\n            ),\n            nrow = NROW(preds),\n            byrow = TRUE\n          ))\n          par_extracts$trials <- trials\n        }\n\n        if (object$family == 'nmix') {\n          preds <- mcmc_chains(object$model_output, 'detprob')[,\n            object$ytimes[, series],\n            drop = FALSE\n          ]\n          Xpmat <- matrix(qlogis(as.vector(preds)))\n          attr(Xpmat, 'model.offset') <- 0\n          latent_lambdas <- as.vector(mcmc_chains(\n            object$model_output,\n            'trend'\n          )[,\n            seq(\n              series,\n              dim(mcmc_chains(object$model_output, 'ypred'))[2],\n              by = NCOL(object$ytimes)\n            ),\n            drop = FALSE\n          ])\n          latent_lambdas <- exp(latent_lambdas)\n          n_draws <- dim(mcmc_chains(object$model_output, 'ypred'))[1]\n          cap <- as.vector(t(replicate(\n            n_draws,\n            object$obs_data$cap[which(\n              as.numeric(object$obs_data$series) == series\n            )]\n          )))\n        } else {\n          latent_lambdas <- NULL\n          cap <- NULL\n        }\n\n        if (type == 'latent_N') {\n          preds <- mcmc_chains(object$model_output, 'latent_ypred')[,\n            seq(\n              series,\n              dim(mcmc_chains(object$model_output, 'ypred'))[2],\n              by = NCOL(object$ytimes)\n            ),\n            drop = FALSE\n          ]\n        } else {\n          preds <- matrix(\n            as.vector(mvgam_predict(\n              family = object$family,\n              Xp = Xpmat,\n              latent_lambdas = latent_lambdas,\n              cap = cap,\n              type = type,\n              betas = 1,\n              family_pars = par_extracts\n            )),\n            nrow = NROW(preds)\n          )\n        }\n      }\n      preds\n    })\n    names(series_hcs) <- levels(data_test$series)\n\n    # Extract observations\n    series_obs <- lapply(seq_len(n_series), function(series) {\n      s_name <- levels(object$obs_data$series)[series]\n      data.frame(\n        series = object$obs_data$series,\n        time = object$obs_data$index..time..index,\n        y = object$obs_data$y\n      ) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n    })\n    names(series_obs) <- levels(data_test$series)\n\n    series_test <- lapply(seq_len(n_series), function(series) {\n      s_name <- levels(object$obs_data$series)[series]\n      data.frame(\n        series = data_test$series,\n        time = data_test$index..time..index,\n        y = data_test$y\n      ) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n    })\n    names(series_test) <- levels(data_test$series)\n  } else {\n    # If forecasts already exist, simply extract them\n    data_test <- validate_series_time(\n      object$test_data,\n      trend_model = orig_trend_model\n    )\n    last_train <- max(object$obs_data$index..time..index) -\n      (min(object$obs_data$index..time..index) - 1)\n\n    data_train <- validate_series_time(\n      object$obs_data,\n      trend_model = orig_trend_model\n    )\n    ends <- seq(\n      0,\n      dim(mcmc_chains(object$model_output, 'ypred'))[2],\n      length.out = NCOL(object$ytimes) + 1\n    )\n    starts <- ends + 1\n    starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n    ends <- ends[-1]\n\n    series_fcs <- lapply(seq_len(n_series), function(series) {\n      to_extract <- switch(\n        type,\n        'link' = 'mus',\n        'expected' = 'mus',\n        'response' = 'ypred',\n        'trend' = 'trend',\n        'latent_N' = 'mus',\n        'detection' = 'mus'\n      )\n      if (\n        object$family == 'nmix' &\n          type == 'link'\n      ) {\n        to_extract <- 'trend'\n      }\n\n      if (object$fit_engine == 'stan') {\n        preds <- mcmc_chains(object$model_output, to_extract)[,\n          seq(\n            series,\n            dim(mcmc_chains(object$model_output, 'ypred'))[2],\n            by = NCOL(object$ytimes)\n          ),\n          drop = FALSE\n        ]\n      } else {\n        preds <- mcmc_chains(object$model_output, to_extract)[,\n          starts[series]:ends[series],\n          drop = FALSE\n        ]\n      }\n\n      if (\n        object$family == 'nmix' &\n          type == 'link'\n      ) {\n        preds <- exp(preds)\n      }\n\n      if (type %in% c('expected', 'latent_N', 'detection')) {\n        # Compute expectations as one long vector\n        Xpmat <- matrix(as.vector(preds))\n        attr(Xpmat, 'model.offset') <- 0\n\n        family_pars <- extract_family_pars(object = object)\n        par_extracts <- lapply(seq_along(family_pars), function(j) {\n          if (is.matrix(family_pars[[j]])) {\n            family_pars[[j]][, series]\n          } else {\n            family_pars[[j]]\n          }\n        })\n        names(par_extracts) <- names(family_pars)\n\n        # Add trial information if this is a Binomial model\n        if (object$family %in% c('binomial', 'beta_binomial')) {\n          trials <- as.vector(matrix(\n            rep(\n              as.vector(attr(object$mgcv_model, 'trials')[, series]),\n              NROW(mus)\n            ),\n            nrow = NROW(mus),\n            byrow = TRUE\n          ))\n          par_extracts$trials <- trials\n        }\n\n        if (object$family == 'nmix') {\n          preds <- mcmc_chains(object$model_output, 'detprob')[,\n            object$ytimes[, series],\n            drop = FALSE\n          ]\n          Xpmat <- matrix(qlogis(as.vector(preds)))\n          attr(Xpmat, 'model.offset') <- 0\n          n_draws <- dim(mcmc_chains(object$model_output, 'ypred'))[1]\n          n_cols <- dim(mcmc_chains(object$model_output, 'ypred'))[2]\n          latent_lambdas <- as.vector(mcmc_chains(\n            object$model_output,\n            'trend'\n          )[, seq(series, n_cols, by = NCOL(object$ytimes)), drop = FALSE])\n          latent_lambdas <- exp(latent_lambdas)\n          cap <- as.vector(t(replicate(\n            n_draws,\n            c(\n              object$obs_data$cap[which(\n                as.numeric(object$obs_data$series) == series\n              )],\n              object$test_data$cap[which(\n                as.numeric(object$test_data$series) == series\n              )]\n            )\n          )))\n        } else {\n          latent_lambdas <- NULL\n          cap <- NULL\n        }\n\n        if (type == 'latent_N') {\n          preds <- mcmc_chains(object$model_output, 'latent_ypred')[,\n            seq(\n              series,\n              dim(mcmc_chains(object$model_output, 'ypred'))[2],\n              by = NCOL(object$ytimes)\n            ),\n            drop = FALSE\n          ]\n        } else {\n          preds <- matrix(\n            as.vector(mvgam_predict(\n              family = object$family,\n              Xp = Xpmat,\n              latent_lambdas = latent_lambdas,\n              cap = cap,\n              type = type,\n              betas = 1,\n              family_pars = par_extracts\n            )),\n            nrow = NROW(preds)\n          )\n        }\n      }\n      preds[, (last_train + 1):NCOL(preds)]\n    })\n    names(series_fcs) <- levels(data_train$series)\n\n    # Extract hindcasts for storing in the returned object\n    series_hcs <- lapply(seq_len(n_series), function(series) {\n      to_extract <- switch(\n        type,\n        'link' = 'mus',\n        'expected' = 'mus',\n        'response' = 'ypred',\n        'trend' = 'trend',\n        'latent_N' = 'mus',\n        'detection' = 'mus'\n      )\n      if (\n        object$family == 'nmix' &\n          type == 'link'\n      ) {\n        to_extract <- 'trend'\n      }\n      if (object$fit_engine == 'stan') {\n        preds <- mcmc_chains(object$model_output, to_extract)[,\n          seq(\n            series,\n            dim(mcmc_chains(object$model_output, 'ypred'))[2],\n            by = NCOL(object$ytimes)\n          ),\n          drop = FALSE\n        ][, 1:last_train]\n      } else {\n        preds <- mcmc_chains(object$model_output, to_extract)[,\n          starts[series]:ends[series],\n          drop = FALSE\n        ][, 1:last_train]\n      }\n\n      if (\n        object$family == 'nmix' &\n          type == 'link'\n      ) {\n        preds <- exp(preds)\n      }\n\n      if (type %in% c('expected', 'latent_N', 'detection')) {\n        # Compute expectations as one long vector\n        Xpmat <- matrix(as.vector(preds))\n        attr(Xpmat, 'model.offset') <- 0\n\n        family_pars <- extract_family_pars(object = object)\n        par_extracts <- lapply(seq_along(family_pars), function(j) {\n          if (is.matrix(family_pars[[j]])) {\n            family_pars[[j]][, series]\n          } else {\n            family_pars[[j]]\n          }\n        })\n        names(par_extracts) <- names(family_pars)\n\n        # Add trial information if this is a Binomial model\n        if (object$family %in% c('binomial', 'beta_binomial')) {\n          trials <- as.vector(matrix(\n            rep(\n              as.vector(attr(object$mgcv_model, 'trials')[\n                1:last_train,\n                series\n              ]),\n              NROW(mus)\n            ),\n            nrow = NROW(mus),\n            byrow = TRUE\n          ))\n          par_extracts$trials <- trials\n        }\n\n        if (object$family == 'nmix') {\n          preds <- mcmc_chains(object$model_output, 'detprob')[,\n            object$ytimes[1:last_train, series],\n            drop = FALSE\n          ]\n          Xpmat <- matrix(qlogis(as.vector(preds)))\n          attr(Xpmat, 'model.offset') <- 0\n          n_draws <- dim(mcmc_chains(object$model_output, 'ypred'))[1]\n          n_cols <- dim(mcmc_chains(object$model_output, 'ypred'))[2]\n          latent_lambdas <- as.vector(mcmc_chains(\n            object$model_output,\n            'trend'\n          )[, seq(series, n_cols, by = NCOL(object$ytimes)), drop = FALSE][,\n            1:last_train\n          ])\n          latent_lambdas <- exp(latent_lambdas)\n          cap <- as.vector(t(replicate(\n            n_draws,\n            object$obs_data$cap[which(\n              as.numeric(object$test_data$series) == series\n            )]\n          )))\n        } else {\n          latent_lambdas <- NULL\n          cap <- NULL\n        }\n\n        if (type == 'latent_N') {\n          preds <- mcmc_chains(object$model_output, 'latent_ypred')[,\n            seq(\n              series,\n              dim(mcmc_chains(object$model_output, 'ypred'))[2],\n              by = NCOL(object$ytimes)\n            ),\n            drop = FALSE\n          ][, 1:last_train]\n        } else {\n          preds <- matrix(\n            as.vector(mvgam_predict(\n              family = object$family,\n              Xp = Xpmat,\n              latent_lambdas = latent_lambdas,\n              cap = cap,\n              type = type,\n              betas = 1,\n              family_pars = par_extracts\n            )),\n            nrow = NROW(preds)\n          )\n        }\n      }\n      preds\n    })\n    names(series_hcs) <- levels(data_train$series)\n\n    series_obs <- lapply(seq_len(n_series), function(series) {\n      s_name <- levels(object$obs_data$series)[series]\n      data.frame(\n        series = object$obs_data$series,\n        time = object$obs_data$index..time..index,\n        y = object$obs_data$y\n      ) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n    })\n    names(series_obs) <- levels(data_train$series)\n\n    series_test <- lapply(seq_len(n_series), function(series) {\n      s_name <- levels(object$obs_data$series)[series]\n      data.frame(\n        series = object$test_data$series,\n        time = object$test_data$index..time..index,\n        y = object$test_data$y\n      ) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n    })\n    names(series_test) <- levels(data_train$series)\n  }\n\n  series_train_times <- lapply(seq_len(n_series), function(series) {\n    s_name <- levels(object$obs_data$series)[series]\n    data.frame(\n      series = object$obs_data$series,\n      time = object$obs_data$time,\n      y = object$obs_data$y\n    ) %>%\n      dplyr::filter(series == s_name) %>%\n      dplyr::arrange(time) %>%\n      dplyr::pull(time)\n  })\n  names(series_train_times) <- levels(data_train$series)\n\n  series_test_times <- lapply(seq_len(n_series), function(series) {\n    s_name <- levels(object$obs_data$series)[series]\n    data.frame(\n      series = data_test$series,\n      time = data_test$time\n    ) %>%\n      dplyr::filter(series == s_name) %>%\n      dplyr::arrange(time) %>%\n      dplyr::pull(time)\n  })\n  names(series_test_times) <- levels(data_train$series)\n\n  series_fcs <- structure(\n    list(\n      call = object$call,\n      trend_call = object$trend_call,\n      family = object$family,\n      family_pars = if (type == 'link') {\n        extract_family_pars(object = object)\n      } else {\n        NULL\n      },\n      trend_model = object$trend_model,\n      drift = object$drift,\n      use_lv = object$use_lv,\n      fit_engine = object$fit_engine,\n      type = type,\n      series_names = factor(\n        levels(data_train$series),\n        levels = levels(data_train$series)\n      ),\n      train_observations = series_obs,\n      train_times = series_train_times,\n      test_observations = series_test,\n      test_times = series_test_times,\n      hindcasts = series_hcs,\n      forecasts = series_fcs\n    ),\n    class = 'mvgam_forecast'\n  )\n  return(series_fcs)\n}\n\n#'Compute forecasts using a posterior distribution\n#'@noRd\nforecast_draws = function(\n  object,\n  type = 'response',\n  series = 'all',\n  data_test,\n  n_cores = 1,\n  n_samples,\n  ending_time,\n  b_uncertainty = TRUE,\n  trend_uncertainty = TRUE,\n  obs_uncertainty = TRUE\n) {\n  # Check arguments\n  validate_pos_integer(n_cores)\n  if (inherits(object, 'jsdgam')) {\n    orig_trend_model <- attr(object$model_data, 'prepped_trend_model')\n  } else {\n    orig_trend_model <- object$trend_model\n  }\n  data_test <- validate_series_time(\n    data_test,\n    name = 'newdata',\n    trend_model = orig_trend_model\n  )\n  data_test <- sort_data(data_test)\n  n_series <- NCOL(object$ytimes)\n  use_lv <- object$use_lv\n\n  if (series != 'all') {\n    s_name <- levels(data_test$series)[series]\n  }\n\n  # Generate the observation model linear predictor matrix,\n  # ensuring the test data is sorted correctly (by time and then series)\n  if (inherits(data_test, 'list')) {\n    Xp <- obs_Xp_matrix(\n      newdata = sort_data(data_test),\n      mgcv_model = object$mgcv_model\n    )\n\n    if (series != 'all') {\n      obs_keep <- data.frame(\n        y = data_test$y,\n        series = data_test$series,\n        time = data_test$index..time..index,\n        rowid = 1:length(data_test$y)\n      ) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(rowid)\n      series_test <- data.frame(\n        y = data_test$y,\n        series = data_test$series,\n        time = data_test$index..time..index,\n        rowid = 1:length(data_test$y)\n      ) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::arrange(time)\n      Xp <- Xp[obs_keep, ]\n    } else {\n      series_test <- NULL\n    }\n  } else {\n    if (series != 'all') {\n      series_test <- data_test %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::arrange(index..time..index)\n      Xp <- obs_Xp_matrix(newdata = series_test, mgcv_model = object$mgcv_model)\n    } else {\n      Xp <- obs_Xp_matrix(\n        newdata = sort_data(data_test),\n        mgcv_model = object$mgcv_model\n      )\n      series_test <- NULL\n    }\n  }\n\n  # Generate linear predictor matrix from trend mgcv model, ensuring\n  # the test data is sorted correctly (by time and then series)\n  if (!is.null(object$trend_call)) {\n    Xp_trend <- trend_Xp_matrix(\n      newdata = sort_data(data_test),\n      trend_map = object$trend_map,\n      series = series,\n      mgcv_model = object$trend_mgcv_model,\n      forecast = TRUE\n    )\n\n    # For trend_formula models with autoregressive processes,\n    # the process model operates as: AR * (process[t - 1] - mu[t-1]])\n    # We therefore need the values of mu at the end of the training set\n    # to correctly propagate the process model forward\n    if (use_lv & attr(object$model_data, 'trend_model') != 'GP') {\n      # Get the observed trend predictor matrix\n      newdata <- trend_map_data_prep(\n        object$obs_data,\n        object$trend_map,\n        forecast = TRUE\n      )\n      Xp_trend_last <- predict(\n        object$trend_mgcv_model,\n        newdata = newdata,\n        type = 'lpmatrix'\n      )\n\n      # Ensure the last three values are used, in case the obs_data\n      # was not supplied in order\n      data.frame(\n        time = newdata$index..time..index,\n        series = newdata$series,\n        row_id = 1:length(newdata$index..time..index)\n      ) %>%\n        dplyr::arrange(time, series) %>%\n        dplyr::pull(row_id) -> sorted_inds\n      n_processes <- length(unique(object$trend_map$trend))\n      linpred_order <- tail(sorted_inds, 3 * n_processes)\n\n      # Deal with any offsets\n      if (!all(attr(Xp_trend_last, 'model.offset') == 0)) {\n        offset_vec <- attr(Xp_trend_last, 'model.offset')\n        offset_last <- offset_vec[linpred_order]\n        offset_last[is.na(offset_last)] <- 0\n        full_offset <- c(offset_last, attr(Xp_trend, 'model.offset'))\n      } else {\n        full_offset <- 0\n      }\n\n      # Bind the last 3 linpred rows with the forecast linpred rows\n      Xp_trend <- rbind(Xp_trend_last[linpred_order, , drop = FALSE], Xp_trend)\n      attr(Xp_trend, 'model.offset') <- full_offset\n    }\n  } else {\n    Xp_trend <- NULL\n  }\n\n  # No need to compute in parallel if there was no trend model\n  nmix_notrend <- FALSE\n  if (\n    !inherits(orig_trend_model, 'mvgam_trend') &\n      object$family == 'nmix'\n  ) {\n    nmix_notrend <- TRUE\n  }\n  if (\n    attr(object$model_data, 'trend_model') == 'None' |\n      nmix_notrend\n  ) {\n    if (type == 'trend' & !nmix_notrend & !use_lv) {\n      stop('No trend_model was used in this model', call. = FALSE)\n    }\n\n    all_preds <- predict(\n      object,\n      type = type,\n      newdata = data_test,\n      summary = FALSE\n    )\n    fc_preds <- lapply(seq_len(NROW(all_preds)), function(draw) {\n      lapply(seq_len(n_series), function(series) {\n        all_preds[\n          draw,\n          which(data_test$series == levels(data_test$series)[series])\n        ]\n      })\n    })\n  } else {\n    # Else compute forecasts including dynamic trend components\n\n    # Set forecast horizon\n    if (series != 'all') {\n      fc_horizon <- NROW(series_test)\n    } else {\n      fc_horizon <- length(unique(data_test$index..time..index))\n    }\n\n    # Beta coefficients for GAM observation component\n    betas <- mcmc_chains(object$model_output, 'b')\n\n    # Generate sample sequence for n_samples\n    if (missing(n_samples)) {\n      sample_seq <- 1:dim(betas)[1]\n    } else {\n      if (n_samples < dim(betas)[1]) {\n        sample_seq <- sample(\n          seq_len(dim(betas)[1]),\n          size = n_samples,\n          replace = FALSE\n        )\n      } else {\n        sample_seq <- sample(\n          seq_len(dim(betas)[1]),\n          size = n_samples,\n          replace = TRUE\n        )\n      }\n    }\n\n    # Beta coefficients for GAM trend component\n    if (!is.null(object$trend_call)) {\n      betas_trend <- mcmc_chains(object$model_output, 'b_trend')\n    } else {\n      betas_trend <- NULL\n    }\n\n    # Family of model\n    family <- object$family\n\n    # Family-specific parameters\n    family_pars <- extract_family_pars(object = object, newdata = data_test)\n\n    # Add trial information if this is a Binomial model\n    if (object$family %in% c('binomial', 'beta_binomial')) {\n      resp_terms <- as.character(terms(formula(object$call))[[2]])\n      resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n      trial_name <- resp_terms[2]\n\n      if (!exists(trial_name, data_test)) {\n        stop(\n          paste0('Variable ', trial_name, ' not found in newdata'),\n          call. = FALSE\n        )\n      }\n\n      trial_df <- data.frame(\n        series = data_test$series,\n        time = data_test$index..time..index,\n        trial = data_test[[trial_name]]\n      )\n      trials <- matrix(NA, nrow = fc_horizon, ncol = n_series)\n      for (i in 1:n_series) {\n        trials[, i] <- trial_df %>%\n          dplyr::filter(series == levels(data_test$series)[i]) %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(trial)\n      }\n    } else {\n      trials <- NULL\n    }\n\n    # Trend model\n    trend_model <- attr(object$model_data, 'trend_model')\n\n    # Calculate time_dis if this is a CAR1 model\n    if (trend_model == 'CAR1') {\n      data_test$index..time..index <- data_test$index..time..index +\n        max(object$obs_data$index..time..index)\n      time_dis <- add_corcar(\n        model_data = list(),\n        data_train = object$obs_data,\n        data_test = data_test\n      )[[1]]\n      time_dis <- time_dis[-c(1:max(object$obs_data$index..time..index)), ]\n    } else {\n      time_dis <- NULL\n    }\n\n    # Trend-specific parameters\n    if (missing(ending_time)) {\n      trend_pars <- extract_trend_pars(\n        object = object,\n        keep_all_estimates = FALSE\n      )\n    } else {\n      trend_pars <- extract_trend_pars(\n        object = object,\n        keep_all_estimates = FALSE,\n        ending_time = ending_time\n      )\n    }\n\n    # Any model in which an autoregressive process was included should be\n    # considered as VAR1 for forecasting purposes as this will make use of the\n    # faster c++ functions\n    if (trend_model == 'CAR1') {\n      if (!'last_lvs' %in% names(trend_pars)) {\n        trend_pars$last_lvs <- trend_pars$last_trends\n      }\n    } else {\n      if (\n        'Sigma' %in%\n          names(trend_pars) |\n          'sigma' %in% names(trend_pars) |\n          'tau' %in% names(trend_pars)\n      ) {\n        trend_model <- 'VAR1'\n        if (!'last_lvs' %in% names(trend_pars)) {\n          trend_pars$last_lvs <- trend_pars$last_trends\n        }\n      }\n    }\n\n    # Loop over draws and compute forecasts (in serial at the moment)\n    fc_preds <- lapply(seq_len(dim(betas)[1]), function(i) {\n      # Sample index\n      samp_index <- i\n\n      # Sample beta coefs\n      if (b_uncertainty) {\n        betas <- betas[samp_index, ]\n      } else {\n        betas <- betas[1, ]\n      }\n\n      if (!is.null(betas_trend)) {\n        if (b_uncertainty) {\n          betas_trend <- betas_trend[samp_index, ]\n        } else {\n          betas_trend <- betas_trend[1, ]\n        }\n      }\n\n      # Return predictions\n      # Sample general trend-specific parameters\n      if (trend_uncertainty) {\n        general_trend_pars <- extract_general_trend_pars(\n          trend_pars = trend_pars,\n          samp_index = samp_index\n        )\n      } else {\n        general_trend_pars <- extract_general_trend_pars(\n          trend_pars = trend_pars,\n          samp_index = 1\n        )\n      }\n\n      if (\n        use_lv || trend_model %in% c('VAR1', 'PWlinear', 'PWlogistic', 'CAR1')\n      ) {\n        if (trend_model == 'PWlogistic') {\n          if (!(exists('cap', where = data_test))) {\n            stop(\n              'Capacities must also be supplied in \"newdata\" for logistic growth predictions',\n              call. = FALSE\n            )\n          }\n          family_links <- eval(parse(text = family))\n          if (family_links()$family == 'Gamma') {\n            family_links <- Gamma(link = 'log')\n          }\n          cap <- data.frame(\n            series = data_test$series,\n            time = data_test$index..time..index,\n            cap = suppressWarnings(linkfun(\n              data_test$cap,\n              link = family_links()$link\n            ))\n          )\n\n          if (any(is.na(cap$cap)) | any(is.infinite(cap$cap))) {\n            stop(\n              paste0(\n                'Missing or infinite values found for some \"cap\" terms\\n',\n                'after transforming to the ',\n                family$link,\n                ' link scale'\n              ),\n              call. = FALSE\n            )\n          }\n        } else {\n          cap <- NULL\n        }\n\n        # Propagate all trends / lvs forward jointly using sampled trend parameters\n        trends <- forecast_trend(\n          trend_model = trend_model,\n          use_lv = use_lv,\n          trend_pars = general_trend_pars,\n          h = fc_horizon,\n          betas_trend = betas_trend,\n          Xp_trend = Xp_trend,\n          time = unique(\n            data_test$index..time..index -\n              min(object$obs_data$index..time..index) +\n              1\n          ),\n          cap = cap,\n          time_dis = time_dis\n        )\n      }\n\n      # Loop across series and produce the next trend estimate\n      trend_states <- lapply(seq_len(n_series), function(series) {\n        # Sample series- and trend-specific parameters\n        trend_extracts <- extract_series_trend_pars(\n          series = series,\n          samp_index = samp_index,\n          trend_pars = trend_pars,\n          use_lv = use_lv\n        )\n\n        if (\n          use_lv || trend_model %in% c('VAR1', 'PWlinear', 'PWlogistic', 'CAR1')\n        ) {\n          if (use_lv) {\n            # Multiply lv states with loadings to generate the series' forecast trend state\n            out <- as.numeric(trends %*% trend_extracts$lv_coefs)\n          } else if (\n            trend_model %in% c('VAR1', 'PWlinear', 'PWlogistic', 'CAR1')\n          ) {\n            out <- trends[, series]\n          }\n        } else {\n          # Propagate the series-specific trends forward\n          out <- forecast_trend(\n            trend_model = trend_model,\n            use_lv = FALSE,\n            trend_pars = trend_extracts,\n            h = fc_horizon,\n            betas_trend = betas_trend,\n            Xp_trend = Xp_trend,\n            time = sort(unique(data_test$index..time..index)),\n            time_dis = NULL\n          )\n        }\n        out\n      })\n\n      if (type == 'trend') {\n        out <- trend_states\n      } else {\n        trend_states <- do.call(cbind, trend_states)\n        out <- lapply(seq_len(n_series), function(series) {\n          if (family == 'nmix') {\n            Xpmat <- Xp[which(as.numeric(data_test$series) == series), ]\n            latent_lambdas <- exp(trend_states[, series])\n            pred_betas <- betas\n            cap <- data_test$cap[which(as.numeric(data_test$series) == series)]\n          } else {\n            Xpmat <- cbind(\n              Xp[which(as.numeric(data_test$series) == series), ],\n              trend_states[, series]\n            )\n            latent_lambdas <- NULL\n            pred_betas <- c(betas, 1)\n            cap <- NULL\n          }\n\n          if (!is.null(attr(Xp, 'model.offset'))) {\n            attr(Xpmat, 'model.offset') <-\n              attr(Xp, 'model.offset')[which(\n                as.numeric(data_test$series) == series\n              )]\n\n            attr(Xpmat, 'model.offset')[is.na(attr(Xpmat, 'model.offset'))] <- 0\n          }\n\n          # Family-specific parameters\n          family_extracts <- lapply(seq_along(family_pars), function(x) {\n            if (is.matrix(family_pars[[x]])) {\n              if (obs_uncertainty) {\n                family_pars[[x]][samp_index, series]\n              } else {\n                family_pars[[x]][1, series]\n              }\n            } else {\n              if (obs_uncertainty) {\n                family_pars[[x]][samp_index]\n              } else {\n                family_pars[[x]][1]\n              }\n            }\n          })\n          names(family_extracts) <- names(family_pars)\n\n          # Add trial information if this is a Binomial model\n          if (family %in% c('binomial', 'beta_binomial')) {\n            family_extracts$trials <- trials[, series]\n          }\n\n          mvgam_predict(\n            family = family,\n            Xp = Xpmat,\n            latent_lambdas = latent_lambdas,\n            cap = cap,\n            type = type,\n            betas = pred_betas,\n            family_pars = family_extracts\n          )\n        })\n      }\n      out\n    })\n  }\n\n  return(fc_preds)\n}\n"
  },
  {
    "path": "R/formula.mvgam.R",
    "content": "#'Extract formulae from \\pkg{mvgam} objects\n#'\n#'@rdname formula.mvgam\n#'@param x `mvgam`, `jsdgam` or `mvgam_prefit` object\n#'@param trend_effects \\code{logical}, return the formula from the\n#'observation model (if \\code{FALSE}) or from the underlying process\n#'model (if\\code{TRUE})\n#'@param ... Ignored\n#'@author Nicholas J Clark\n#'@return A \\code{formula} object\n#'@export\nformula.mvgam = function(x, trend_effects = FALSE, ...) {\n  # Check trend_effects\n  if (trend_effects) {\n    if (is.null(x$trend_call)) {\n      stop('no trend_formula exists so there is no trend-level model.frame')\n    }\n  }\n\n  if (!trend_effects) {\n    out <- x$call\n  } else {\n    out <- x$trend_call\n    out <- update(out, as.formula(paste('trend_y', '~.')))\n  }\n  return(out)\n}\n\n#'@rdname formula.mvgam\n#'@export\nformula.mvgam_prefit = function(x, trend_effects = FALSE, ...) {\n  # Check trend_effects\n  if (trend_effects) {\n    if (is.null(x$trend_call)) {\n      stop('no trend_formula exists so there is no trend-level model.frame')\n    }\n  }\n\n  if (!trend_effects) {\n    out <- x$call\n  } else {\n    out <- x$trend_call\n    out <- update(out, as.formula(paste('trend_y', '~.')))\n  }\n  return(out)\n}\n"
  },
  {
    "path": "R/get_linear_predictors.R",
    "content": "#' Function to prepare observation model linear predictor matrix\n#' @importFrom brms brmsterms\n#' @noRd\nobs_Xp_matrix = function(newdata, mgcv_model) {\n  suppressWarnings(\n    Xp <- try(\n      predict(mgcv_model, newdata = newdata, type = 'lpmatrix'),\n      silent = TRUE\n    )\n  )\n\n  if (inherits(Xp, 'try-error')) {\n    testdat <- data.frame(time = newdata$time)\n\n    terms_include <- insight::find_predictors(mgcv_model)$conditional\n    if (any(terms_include %in% names(newdata) == FALSE)) {\n      stop(\n        'not all required variables have been supplied in newdata!',\n        call. = FALSE\n      )\n    }\n    if (length(terms_include) > 0L) {\n      newnames <- vector()\n      newnames[1] <- 'time'\n      for (i in 1:length(terms_include)) {\n        testdat <- cbind(testdat, data.frame(newdata[[terms_include[i]]]))\n        newnames[i + 1] <- terms_include[i]\n      }\n      colnames(testdat) <- newnames\n    }\n\n    suppressWarnings(\n      Xp <- predict(mgcv_model, newdata = testdat, type = 'lpmatrix')\n    )\n  }\n\n  # Check for any gp() terms and update the design matrix\n  # accordingly\n  if (!is.null(attr(mgcv_model, 'gp_att_table'))) {\n    # Compute the gp() eigenfunctions for newdata using the supplied brms_mock object\n    # Requires a dataframe of all relevant variables for the gp effects\n    mock_terms <- brms::brmsterms(attr(mgcv_model, 'brms_mock')$formula)\n    terms_needed <- unique(all.vars(mock_terms$formula)[-1])\n    newdata_mock <- data.frame(newdata[[terms_needed[1]]])\n    if (length(terms_needed) > 1L) {\n      for (i in 2:length(terms_needed)) {\n        newdata_mock <- cbind(\n          newdata_mock,\n          data.frame(newdata[[terms_needed[i]]])\n        )\n      }\n    }\n    colnames(newdata_mock) <- terms_needed\n    newdata_mock$.fake_gp_y <- rnorm(NROW(newdata_mock))\n    brms_mock_data <- brms::standata(\n      attr(mgcv_model, 'brms_mock'),\n      newdata = newdata_mock,\n      internal = TRUE\n    )\n\n    # Extract GP attributes\n    gp_att_table <- attr(mgcv_model, 'gp_att_table')\n    bys <- unlist(purrr::map(gp_att_table, 'by'), use.names = FALSE)\n    lvls <- unlist(purrr::map(gp_att_table, 'level'), use.names = FALSE)\n\n    # Extract eigenfunctions for each gp effect\n    eigenfuncs <- eigenfunc_list(\n      stan_data = brms_mock_data,\n      mock_df = newdata_mock,\n      by = bys,\n      level = lvls\n    )\n\n    # Find indices to replace in the design matrix and replace with\n    # the computed eigenfunctions\n    starts <- purrr::map(gp_att_table, 'first_coef')\n    ends <- purrr::map(gp_att_table, 'last_coef')\n    for (i in seq_along(starts)) {\n      Xp[, c(starts[[i]]:ends[[i]])] <- eigenfuncs[[i]]\n    }\n  }\n\n  return(Xp)\n}\n\n#' Function to prepare trend linear predictor matrix in the presence of a\n#' trend_map\n#' @noRd\ntrend_map_data_prep = function(newdata, trend_map, forecast = FALSE) {\n  trend_test <- newdata\n  trend_indicators <- vector(length = length(trend_test$series))\n  for (i in 1:length(trend_test$series)) {\n    trend_indicators[i] <- trend_map$trend[which(\n      as.character(trend_map$series) == as.character(trend_test$series[i])\n    )]\n  }\n  trend_indicators <- factor(\n    paste0('trend', trend_indicators),\n    levels = paste0('trend', unique(trend_map$trend))\n  )\n  trend_test$series <- trend_indicators\n  trend_test$y <- NULL\n\n  # Only keep one time observation per trend, in case this is a reduced dimensionality\n  # State-Space model (with a trend_map) and we are forecasting ahead\n  if (forecast) {\n    data.frame(\n      series = trend_test$series,\n      time = trend_test$index..time..index,\n      row_num = 1:length(trend_test$index..time..index)\n    ) %>%\n      dplyr::group_by(series, time) %>%\n      dplyr::slice_head(n = 1) %>%\n      dplyr::pull(row_num) -> inds_keep\n    inds_keep <- sort(inds_keep)\n\n    if (inherits(trend_test, 'list')) {\n      trend_test <- lapply(trend_test, function(x) {\n        if (is.matrix(x)) {\n          matrix(x[inds_keep, ], ncol = NCOL(x))\n        } else {\n          x[inds_keep]\n        }\n      })\n    } else {\n      trend_test <- trend_test[inds_keep, ]\n    }\n  }\n\n  return(trend_test)\n}\n\n#' Function to prepare trend linear predictor matrix, ensuring ordering and\n#' indexing is correct with respect to the model structure\n#' @noRd\ntrend_Xp_matrix = function(\n  newdata,\n  trend_map,\n  series = 'all',\n  mgcv_model,\n  forecast = FALSE\n) {\n  trend_test <- trend_map_data_prep(newdata, trend_map, forecast = forecast)\n\n  suppressWarnings(\n    Xp_trend <- try(\n      predict(mgcv_model, newdata = trend_test, type = 'lpmatrix'),\n      silent = TRUE\n    )\n  )\n\n  if (inherits(Xp_trend, 'try-error')) {\n    testdat <- data.frame(series = trend_test$series)\n\n    terms_include <- insight::find_predictors(mgcv_model)$conditional\n    if (any(terms_include %in% names(trend_test) == FALSE)) {\n      stop(\n        'not all required variables have been supplied in newdata!',\n        call. = FALSE\n      )\n    }\n    if (length(terms_include) > 0) {\n      newnames <- vector()\n      newnames[1] <- 'series'\n      for (i in 1:length(terms_include)) {\n        testdat <- cbind(testdat, data.frame(trend_test[[terms_include[i]]]))\n        newnames[i + 1] <- terms_include[i]\n      }\n      colnames(testdat) <- newnames\n    }\n\n    suppressWarnings(\n      Xp_trend <- predict(mgcv_model, newdata = testdat, type = 'lpmatrix')\n    )\n  }\n\n  # Check for any gp() terms and update the design matrix\n  # accordingly\n  if (!is.null(attr(mgcv_model, 'gp_att_table'))) {\n    # Compute the gp() eigenfunctions for newdata using the supplied brms_mock object\n    # Requires a dataframe of all relevant variables for the gp effects\n    mock_terms <- brms::brmsterms(attr(mgcv_model, 'brms_mock')$formula)\n    terms_needed <- unique(all.vars(mock_terms$formula)[-1])\n    newdata_mock <- data.frame(trend_test[[terms_needed[1]]])\n    if (length(terms_needed) > 1L) {\n      for (i in 2:length(terms_needed)) {\n        newdata_mock <- cbind(\n          newdata_mock,\n          data.frame(trend_test[[terms_needed[i]]])\n        )\n      }\n    }\n    colnames(newdata_mock) <- terms_needed\n    newdata_mock$.fake_gp_y <- rnorm(NROW(newdata_mock))\n    brms_mock_data <- brms::standata(\n      attr(mgcv_model, 'brms_mock'),\n      newdata = newdata_mock,\n      internal = TRUE\n    )\n\n    # Extract GP attributes\n    gp_att_table <- attr(mgcv_model, 'gp_att_table')\n    bys <- unlist(purrr::map(gp_att_table, 'by'), use.names = FALSE)\n    lvls <- unlist(purrr::map(gp_att_table, 'level'), use.names = FALSE)\n\n    # Extract eigenfunctions for each gp effect\n    eigenfuncs <- eigenfunc_list(\n      stan_data = brms_mock_data,\n      mock_df = newdata_mock,\n      by = bys,\n      level = lvls\n    )\n\n    # Find indices to replace in the design matrix and replace with\n    # the computed eigenfunctions\n    starts <- purrr::map(gp_att_table, 'first_coef')\n    ends <- purrr::map(gp_att_table, 'last_coef')\n    for (i in seq_along(starts)) {\n      Xp_trend[, c(starts[[i]]:ends[[i]])] <- eigenfuncs[[i]]\n    }\n  }\n\n  return(Xp_trend)\n}\n"
  },
  {
    "path": "R/get_monitor_pars.R",
    "content": "#' Return parameters to monitor during modelling\n#'\n#'\n#' @param family \\code{character}\n#' @param smooths_included Logical. Are smooth terms included in the model formula?\n#' @param use_lv Logical (use latent variable trends or not)\n#' @param trend_model The type of trend model used\n#' @param drift Logical (was a drift term estimated or not)\n#' @return A string of parameters to monitor\n#' @noRd\nget_monitor_pars = function(\n  family,\n  smooths_included = TRUE,\n  use_lv,\n  trend_model,\n  drift\n) {\n  family <- match.arg(\n    arg = family,\n    choices = c(\n      \"negative binomial\",\n      \"poisson\",\n      \"tweedie\",\n      \"beta\",\n      \"gaussian\",\n      \"lognormal\",\n      \"student\",\n      \"Gamma\",\n      \"nmix\",\n      \"binomial\",\n      \"bernoulli\",\n      \"beta_binomial\"\n    )\n  )\n\n  if (smooths_included) {\n    param <- c('rho', 'b', 'ypred', 'mus', 'lp__', 'lambda')\n  } else {\n    param <- c('b', 'ypred', 'mus', 'lp__')\n  }\n\n  # Family-specific parameters to monitor\n  param <- c(param, family_param_info(family)$param_names)\n\n  # Trend-specific parameters\n  param <- c(\n    param,\n    trend_par_names(trend_model = trend_model, use_lv = use_lv, drift = drift)\n  )\n\n  return(param)\n}\n"
  },
  {
    "path": "R/get_mvgam_priors.R",
    "content": "#' Extract information on default prior distributions for an \\pkg{mvgam} model\n#'\n#' This function lists the parameters that can have their prior distributions\n#' changed for a given model, as well listing their default distributions\n#'\n#' @inheritParams mvgam\n#'\n#' @inheritParams jsdgam\n#'\n#' @param ... Not currently used\n#'\n#' @param factor_formula Can be supplied instead `trend_formula` to match\n#'   syntax from [jsdgam]\n#'\n#' @details Users can supply a model formula, prior to fitting the model, so\n#'   that default priors can be inspected and altered. To make alterations,\n#'   change the contents of the `prior` column and supplying this\n#'   \\code{data.frame} to the \\code{\\link{mvgam}} or \\code{\\link{jsdgam}}\n#'   functions using the argument `priors`. If using `Stan` as the backend,\n#'   users can also modify the parameter bounds by modifying the\n#'   `new_lowerbound` and/or `new_upperbound` columns. This will be necessary\n#'   if using restrictive distributions on some parameters, such as a Beta\n#'   distribution for the trend sd parameters for example (Beta only has\n#'   support on \\code{(0,1)}), so the upperbound cannot be above `1`. Another\n#'   option is to make use of the prior modification functions in \\pkg{brms}\n#'   (i.e. \\code{\\link[brms]{prior}}) to change prior distributions and bounds\n#'   (just use the name of the parameter that you'd like to change as the\n#'   `class` argument; see examples below)\n#'\n#' @note Only the `prior`, `new_lowerbound` and/or `new_upperbound` columns of\n#'   the output should be altered when defining the user-defined priors for\n#'   the model. Use only if you are familiar with the underlying probabilistic\n#'   programming language. There are no sanity checks done to ensure that the\n#'   code is legal (i.e. to check that lower bounds are smaller than upper\n#'   bounds, for example)\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso \\code{\\link{mvgam}}, \\code{\\link{mvgam_formulae}},\n#'   \\code{\\link[brms]{prior}}\n#'\n#' @return either a \\code{data.frame} containing the prior definitions (if any\n#'   suitable priors can be altered by the user) or \\code{NULL}, indicating\n#'   that no priors in the model can be modified\n#'\n#' @examples\n#' \\dontrun{\n#' # ========================================================================\n#' # Example 1: Simulate data and inspect default priors\n#' # ========================================================================\n#'\n#' dat <- sim_mvgam(trend_rel = 0.5)\n#'\n#' # Get a model file that uses default mvgam priors for inspection (not\n#' # always necessary, but this can be useful for testing whether your\n#' # updated priors are written correctly)\n#' mod_default <- mvgam(\n#'   y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n#'   family = nb(),\n#'   data = dat$data_train,\n#'   trend_model = AR(p = 2),\n#'   run_model = FALSE\n#' )\n#'\n#' # Inspect the model file with default mvgam priors\n#' stancode(mod_default)\n#'\n#' # Look at which priors can be updated in mvgam\n#' test_priors <- get_mvgam_priors(\n#'   y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n#'   family = nb(),\n#'   data = dat$data_train,\n#'   trend_model = AR(p = 2)\n#' )\n#' test_priors\n#'\n#' # ========================================================================\n#' # Example 2: Modify priors manually\n#' # ========================================================================\n#'\n#' # Make a few changes; first, change the population mean for the\n#' # series-level random intercepts\n#' test_priors$prior[2] <- \"mu_raw ~ normal(0.2, 0.5);\"\n#'\n#' # Now use stronger regularisation for the series-level AR2 coefficients\n#' test_priors$prior[5] <- \"ar2 ~ normal(0, 0.25);\"\n#'\n#' # Check that the changes are made to the model file without any warnings\n#' # by setting 'run_model = FALSE'\n#' mod <- mvgam(\n#'   y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n#'   family = nb(),\n#'   data = dat$data_train,\n#'   trend_model = AR(p = 2),\n#'   priors = test_priors,\n#'   run_model = FALSE\n#' )\n#' stancode(mod)\n#'\n#' # No warnings, the model is ready for fitting now in the usual way with\n#' # the addition of the 'priors' argument\n#'\n#' # ========================================================================\n#' # Example 3: Use brms syntax for prior modification\n#' # ========================================================================\n#'\n#' # The same can be done using 'brms' functions; here we will also change\n#' # the ar1 prior and put some bounds on the ar coefficients to enforce\n#' # stationarity; we set the prior using the 'class' argument in all brms\n#' # prior functions\n#' brmsprior <- c(\n#'   prior(normal(0.2, 0.5), class = mu_raw),\n#'   prior(normal(0, 0.25), class = ar1, lb = -1, ub = 1),\n#'   prior(normal(0, 0.25), class = ar2, lb = -1, ub = 1)\n#' )\n#' brmsprior\n#'\n#' mod <- mvgam(\n#'   y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n#'   family = nb(),\n#'   data = dat$data_train,\n#'   trend_model = AR(p = 2),\n#'   priors = brmsprior,\n#'   run_model = FALSE\n#' )\n#' stancode(mod)\n#'\n#' # ========================================================================\n#' # Example 4: Error handling example\n#' # ========================================================================\n#'\n#' # Look at what is returned when an incorrect spelling is used\n#' test_priors$prior[5] <- \"ar2_bananas ~ normal(0, 0.25);\"\n#' mod <- mvgam(\n#'   y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n#'   family = nb(),\n#'   data = dat$data_train,\n#'   trend_model = AR(p = 2),\n#'   priors = test_priors,\n#'   run_model = FALSE\n#' )\n#' stancode(mod)\n#'\n#' # ========================================================================\n#' # Example 5: Parametric (fixed effect) priors\n#' # ========================================================================\n#'\n#' simdat <- sim_mvgam()\n#'\n#' # Add a fake covariate\n#' simdat$data_train$cov <- rnorm(NROW(simdat$data_train))\n#'\n#' priors <- get_mvgam_priors(\n#'   y ~ cov + s(season),\n#'   data = simdat$data_train,\n#'   family = poisson(),\n#'   trend_model = AR()\n#' )\n#'\n#' # Change priors for the intercept and fake covariate effects\n#' priors$prior[1] <- \"(Intercept) ~ normal(0, 1);\"\n#' priors$prior[2] <- \"cov ~ normal(0, 0.1);\"\n#'\n#' mod2 <- mvgam(\n#'   y ~ cov + s(season),\n#'   data = simdat$data_train,\n#'   trend_model = AR(),\n#'   family = poisson(),\n#'   priors = priors,\n#'   run_model = FALSE\n#' )\n#' stancode(mod2)\n#'\n#' # ========================================================================\n#' # Example 6: Alternative brms syntax for fixed effects\n#' # ========================================================================\n#'\n#' # Likewise using 'brms' utilities (note that you can use Intercept rather\n#' # than `(Intercept)`) to change priors on the intercept\n#' brmsprior <- c(\n#'   prior(normal(0.2, 0.5), class = cov),\n#'   prior(normal(0, 0.25), class = Intercept)\n#' )\n#' brmsprior\n#'\n#' mod2 <- mvgam(\n#'   y ~ cov + s(season),\n#'   data = simdat$data_train,\n#'   trend_model = AR(),\n#'   family = poisson(),\n#'   priors = brmsprior,\n#'   run_model = FALSE\n#' )\n#' stancode(mod2)\n#'\n#' # ========================================================================\n#' # Example 7: Bulk prior assignment\n#' # ========================================================================\n#'\n#' # The \"class = 'b'\" shortcut can be used to put the same prior on all\n#' # 'fixed' effect coefficients (apart from any intercepts)\n#' set.seed(0)\n#' dat <- mgcv::gamSim(1, n = 200, scale = 2)\n#' dat$time <- 1:NROW(dat)\n#' mod <- mvgam(\n#'   y ~ x0 + x1 + s(x2) + s(x3),\n#'   priors = prior(normal(0, 0.75), class = \"b\"),\n#'   data = dat,\n#'   family = gaussian(),\n#'   run_model = FALSE\n#' )\n#' stancode(mod)\n#' }\n#'\n#' @export\nget_mvgam_priors = function(\n  formula,\n  trend_formula,\n  factor_formula,\n  knots,\n  trend_knots,\n  trend_model = 'None',\n  family = poisson(),\n  data,\n  unit = time,\n  species = series,\n  use_lv = FALSE,\n  n_lv,\n  trend_map,\n  ...\n) {\n  # Validate the data\n  dots <- list(...)\n  if (missing(\"data\")) {\n    if ('data_train' %in% names(dots)) {\n      message('argument \"data_train\" is deprecated; supply as \"data\" instead')\n      data <- dots$data_train\n      dots$data_train <- NULL\n    } else {\n      stop('Argument \"data\" is missing with no default', call. = FALSE)\n    }\n  }\n  if (!missing(\"data\")) {\n    data_train <- data\n  }\n  orig_data <- data_train\n\n  # Set trend_formula\n  if (!missing(factor_formula)) {\n    if (missing(n_lv)) {\n      n_lv <- 2\n    }\n    validate_pos_integer(n_lv)\n    unit <- deparse0(substitute(unit))\n    subgr <- deparse0(substitute(species))\n    prepped_trend <- prep_jsdgam_trend(unit = unit, subgr = subgr, data = data)\n    trend_model <- 'None'\n    data_train <- validate_series_time(data = data, trend_model = prepped_trend)\n    trend_map <- prep_jsdgam_trendmap(data_train, n_lv)\n    if (!missing(trend_formula)) {\n      warning(\n        'Both \"trend_formula\" and \"factor_formula\" supplied\\nUsing \"factor_formula\" as default'\n      )\n    }\n    trend_formula <- factor_formula\n  }\n\n  # Validate the trend arguments\n  if ('drift' %in% names(dots)) {\n    message(\n      'The \"drift\" argument is deprecated; use fixed effects of \"time\" instead'\n    )\n    dots$drift <- NULL\n  }\n  drift <- FALSE\n  orig_trend_model <- trend_model\n  trend_model <- validate_trend_model(\n    orig_trend_model,\n    drift = drift,\n    noncentred = FALSE,\n    warn = FALSE\n  )\n\n  # Ensure series and time variables are present\n  data_train <- validate_series_time(\n    data_train,\n    name = 'data',\n    trend_model = orig_trend_model\n  )\n\n  # Validate the formula to convert any dynamic() terms\n  formula <- interpret_mvgam(formula, N = max(data_train$time), family = family)\n\n  # Check for gp terms in the validated formula\n  list2env(\n    check_gp_terms(formula, data_train, family = family),\n    envir = environment()\n  )\n\n  # Check for missing rhs in formula\n  list2env(check_obs_intercept(formula, orig_formula), envir = environment())\n\n  # Validate observation formula\n  formula <- interpret_mvgam(formula, N = max(data_train$time))\n  data_train <- validate_obs_formula(formula, data = data_train, refit = FALSE)\n\n  # Validate the family argument\n  use_stan <- TRUE\n  family <- validate_family(family, use_stan = use_stan)\n  family_char <- match.arg(arg = family$family, choices = family_char_choices())\n\n  # Nmixture additions?\n  list2env(\n    check_nmix(\n      family,\n      family_char,\n      trend_formula,\n      trend_model,\n      trend_map,\n      data_train,\n      priors = TRUE\n    ),\n    envir = environment()\n  )\n\n  # Validate remaining trend arguments\n  trend_val <- validate_trend_restrictions(\n    trend_model = trend_model,\n    formula = formula,\n    trend_formula = trend_formula,\n    trend_map = trend_map,\n    drift = drift,\n    drop_obs_intercept = drop_obs_intercept,\n    use_lv = use_lv,\n    n_lv = n_lv,\n    data_train = data_train,\n    use_stan = use_stan,\n    priors = TRUE\n  )\n  list2env(trend_val, envir = environment())\n  if (is.null(trend_map)) {\n    trend_map <- rlang::missing_arg()\n  }\n  if (is.null(n_lv)) {\n    n_lv <- rlang::missing_arg()\n  }\n\n  # If trend_formula supplied, first run get_mvgam_priors for the observation model\n  # and then modify the resulting output\n  if (!missing(trend_formula)) {\n    if (trend_model == 'None') {\n      trend_model <- 'RW'\n    }\n    validate_trend_formula(trend_formula)\n    prior_df <- get_mvgam_priors(\n      formula = orig_formula,\n      data = data_train,\n      family = family,\n      use_lv = FALSE,\n      trend_model = if (trend_model == 'None') {\n        RW()\n      } else {\n        orig_trend_model\n      },\n      trend_map = trend_map,\n      knots = knots\n    )\n\n    # Replace any terms labelled 'trend' with 'series' for creating the necessary\n    # structures\n    trend_formula <- formula(paste(\n      gsub('trend', 'series', as.character(trend_formula), fixed = TRUE),\n      collapse = \" \"\n    ))\n\n    # Drop any intercept from the formula if this is not an N-mixture model or if a\n    # trend_map was not originally supplied\n    if (family_char == 'nmix') {\n      drop_trend_int <- FALSE\n    } else {\n      drop_trend_int <- TRUE\n    }\n    if (!missing(trend_map)) {\n      drop_trend_int <- FALSE\n    }\n    if (drop_trend_int) {\n      if (attr(terms(trend_formula), 'intercept') == 1) {\n        trend_formula <- update(trend_formula, trend_y ~ . - 1)\n      } else {\n        trend_formula <- update(trend_formula, trend_y ~ .)\n      }\n    } else {\n      trend_formula <- update(trend_formula, trend_y ~ .)\n    }\n\n    trend_train <- data_train\n    trend_train$time <- trend_train$index..time..index\n    trend_train$trend_y <- rnorm(length(trend_train$time))\n\n    # Add indicators of trend names as factor levels using the trend_map\n    trend_indicators <- vector(length = length(trend_train$time))\n    for (i in 1:length(trend_train$time)) {\n      trend_indicators[i] <- trend_map$trend[which(\n        trend_map$series == trend_train$series[i]\n      )]\n    }\n    trend_indicators <- as.factor(paste0('trend', trend_indicators))\n    trend_train$series <- trend_indicators\n    trend_train$y <- NULL\n\n    # Only keep one time observation per trend\n    data.frame(\n      series = trend_train$series,\n      time = trend_train$time,\n      row_num = 1:length(trend_train$time)\n    ) %>%\n      dplyr::group_by(series, time) %>%\n      dplyr::slice_head(n = 1) %>%\n      dplyr::pull(row_num) -> inds_keep\n\n    if (inherits(trend_train, 'list')) {\n      trend_train <- lapply(trend_train, function(x) {\n        if (is.matrix(x)) {\n          matrix(x[inds_keep, ], ncol = NCOL(x))\n        } else {\n          x[inds_keep]\n        }\n      })\n    } else {\n      trend_train <- trend_train[inds_keep, ]\n    }\n\n    # Now get the priors related to the trend model\n    trend_prior_df <- get_mvgam_priors(\n      trend_formula,\n      data = trend_train,\n      family = gaussian(),\n      trend_model = 'None',\n      knots = trend_knots\n    )\n\n    # Modify some of the term names and return\n    if (any(grepl('fixed effect', trend_prior_df$param_info))) {\n      para_lines <- grep('fixed effect', trend_prior_df$param_info)\n      for (i in para_lines) {\n        trend_prior_df$param_name[i] <- paste0(\n          trend_prior_df$param_name[i],\n          '_trend'\n        )\n        trend_prior_df$prior[i] <- paste0(\n          trimws(strsplit(trend_prior_df$prior[i], \"[~]\")[[1]][1]),\n          '_trend ~ student_t(3, 0, 2);'\n        )\n        trend_prior_df$example_change[i] <- paste0(\n          trimws(strsplit(trend_prior_df$example_change[i], \"[~]\")[[1]][1]),\n          '_trend ~ normal(0, 1);'\n        )\n      }\n    }\n\n    if (any(grepl('(Intercept)', trend_prior_df$param_info))) {\n      para_lines <- grep('(Intercept)', trend_prior_df$param_info)\n      for (i in para_lines) {\n        trend_prior_df$param_name[i] <- paste0(\n          trend_prior_df$param_name[i],\n          '_trend'\n        )\n        trend_prior_df$prior[i] <- paste0(\n          trimws(strsplit(trend_prior_df$prior[i], \"[~]\")[[1]][1]),\n          '_trend ~ student_t(3, 0, 2);'\n        )\n        trend_prior_df$example_change[i] <- paste0(\n          trimws(strsplit(trend_prior_df$example_change[i], \"[~]\")[[1]][1]),\n          '_trend ~ normal(0, 1);'\n        )\n        trend_prior_df$param_info[i] <- '(Intercept) for the trend'\n      }\n    }\n\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"lambda\", \"lambda_trend\", x)\n    )\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"n_sp\", \"n_sp_trend\", x)\n    )\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"mu_raw\", \"mu_raw_trend\", x)\n    )\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"sigma_raw\", \"sigma_raw_trend\", x)\n    )\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"n_series\", \"n_lv\", x)\n    )\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"series\", \"trend\", x)\n    )\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"alpha_gp\", \"alpha_gp_trend\", x)\n    )\n    trend_prior_df[] <- lapply(\n      trend_prior_df,\n      function(x) gsub(\"rho_gp\", \"rho_gp_trend\", x)\n    )\n    trend_prior_df <- trend_prior_df[\n      !trend_prior_df$param_info == 'observation error sd',\n    ]\n    out <- rbind(prior_df, trend_prior_df)\n    out[] <- lapply(out, function(x) gsub(\"trend sd\", \"process error sd\", x))\n    out[] <- lapply(out, function(x) gsub(\"trend AR1\", \"process model AR1\", x))\n    out[] <- lapply(out, function(x) gsub(\"trend AR2\", \"process model AR2\", x))\n    out[] <- lapply(out, function(x) gsub(\"trend AR3\", \"process model AR3\", x))\n    out[] <- lapply(\n      out,\n      function(x) gsub(\"trend drift\", \"process model drift\", x)\n    )\n    out[] <- lapply(\n      out,\n      function(x) {\n        gsub(\n          \"vector<lower=0>[n_series] sigma;\",\n          \"vector<lower=0>[n_lv] sigma;\",\n          x,\n          fixed = TRUE\n        )\n      }\n    )\n\n    # Remove intercept prior if an intercept was suppressed from the\n    # observation model\n    if (drop_obs_intercept) {\n      if (any(grepl('Intercept', out$param_name))) {\n        which_obs_int <- grep('Intercept', out$param_name) &\n          !grep('(Intercept)_trend', out$param_name)\n        if (length(which_obs_int) > 0L) out <- out[-which_obs_int, ]\n      }\n    }\n\n    # Remove sigma prior if this is an N-mixture with no dynamics\n    if (add_nmix & trend_model == 'None') {\n      out <- out[\n        -grep('vector<lower=0>[n_lv] sigma;', out$param_name, fixed = TRUE),\n      ]\n    }\n  } else {\n    # JAGS cannot support latent GP, VAR or piecewise trends\n    if (\n      !use_stan & trend_model %in% c('GP', 'VAR1', 'PWlinear', 'PWlogistic')\n    ) {\n      stop(\n        'Gaussian Process, VAR and piecewise trends not supported for JAGS',\n        call. = FALSE\n      )\n    }\n\n    if (use_stan & family_char == 'tweedie') {\n      warning('Tweedie family not supported for Stan; reverting to JAGS')\n      use_stan <- FALSE\n    }\n\n    # Number of latent variables cannot be greater than number of series\n    if (use_lv) {\n      if (missing(n_lv)) {\n        n_lv <- min(2, floor(length(unique(data_train$series)) / 2))\n      }\n      if (n_lv > length(unique(data_train$series))) {\n        stop(\n          'number of latent variables cannot be greater than number of series',\n          call. = FALSE\n        )\n      }\n    }\n\n    # # No point in latent variables if trend model is None\n    # if(trend_model == 'None' & use_lv){\n    #   use_lv <- FALSE\n    #   warning('No point in latent variables if trend model is None; changing use_lv to FALSE')\n    # }\n\n    # Fill in missing observations in data_train so the size of the dataset is correct when\n    # building the initial JAGS model\n    resp_terms <- as.character(terms(formula(formula))[[2]])\n    if (length(resp_terms) == 1) {\n      out_name <- as.character(terms(formula(formula))[[2]])\n    } else {\n      if (any(grepl('cbind', resp_terms))) {\n        resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n        out_name <- resp_terms[1]\n      }\n    }\n    data_train[[out_name]] <- replace_nas(data_train[[out_name]])\n\n    # Some general family-level restrictions can now be checked\n    validate_family_restrictions(\n      response = data_train[[out_name]],\n      family = family\n    )\n\n    # Use a small fit from mgcv to extract relevant information on smooths included\n    # in the model\n    ss_gam <- try(\n      mvgam_setup(\n        formula = formula,\n        family = family_to_mgcvfam(family),\n        dat = data_train,\n        knots = knots\n      ),\n      silent = TRUE\n    )\n    if (inherits(ss_gam, 'try-error')) {\n      if (grepl('missing values', ss_gam[1])) {\n        stop(\n          paste(\n            'Missing values found in data predictors:\\n',\n            attr(ss_gam, 'condition')\n          ),\n          call. = FALSE\n        )\n      } else {\n        stop(paste(ss_gam[1]), call. = FALSE)\n      }\n    }\n\n    # Parametric effect priors\n    if (use_stan) {\n      smooth_labs <- do.call(\n        rbind,\n        lapply(seq_along(ss_gam$smooth), function(x) {\n          data.frame(\n            label = ss_gam$smooth[[x]]$label,\n            term = paste(ss_gam$smooth[[x]]$term, collapse = ','),\n            class = class(ss_gam$smooth[[x]])[1]\n          )\n        })\n      )\n      lpmat <- suppressWarnings(predict(\n        ss_gam,\n        type = 'lpmatrix',\n        exclude = smooth_labs$label\n      ))\n      para_indices <- which(apply(lpmat, 2, function(x) !all(x == 0)) == TRUE)\n\n      int_included <- attr(ss_gam$pterms, 'intercept') == 1L\n      if (int_included) {\n        other_pterms <- names(para_indices)[-1]\n      } else {\n        other_pterms <- names(para_indices)\n      }\n      all_paras <- other_pterms\n\n      para_priors <- c()\n      para_info <- c()\n\n      if (length(other_pterms) > 0) {\n        para_priors <- c(\n          para_priors,\n          paste(other_pterms, '~ student_t(3, 0, 2);')\n        )\n        para_info <- c(para_info, paste(other_pterms, 'fixed effect'))\n      }\n\n      if (int_included) {\n        all_paras <- c('(Intercept)', all_paras)\n        # Compute default intercept prior using brms\n        def_int <- make_default_int(response = data_train$y, family = family)\n        para_priors <- c(\n          paste0(def_int$class, ' ~ ', def_int$prior, ';'),\n          para_priors\n        )\n        para_info <- c('(Intercept)', para_info)\n      }\n\n      if (length(all_paras) == 0) {\n        para_df <- NULL\n      } else {\n        para_df <- data.frame(\n          param_name = all_paras,\n          param_length = 1,\n          param_info = para_info,\n          prior = para_priors,\n          example_change = c(\n            paste0(all_paras, ' ~ normal(0, 1);')\n          )\n        )\n      }\n    } else {\n      para_df <- NULL\n    }\n\n    # Extract information on the number of smoothing parameters and\n    # random effects\n    smooth_labs <- do.call(\n      rbind,\n      lapply(seq_along(ss_gam$smooth), function(x) {\n        data.frame(\n          label = ss_gam$smooth[[x]]$label,\n          class = class(ss_gam$smooth[[x]])[1],\n          nsp = ss_gam$smooth[[x]]$last.sp -\n            ss_gam$smooth[[x]]$first.sp +\n            1\n        )\n      })\n    )\n\n    # Check for gp() terms\n    if (!is.null(gp_terms)) {\n      gp_additions <- make_gp_additions(\n        gp_details = gp_details,\n        orig_formula = orig_formula,\n        data = data_train,\n        newdata = NULL,\n        model_data = list(X = t(predict(ss_gam, type = 'lpmatrix'))),\n        mgcv_model = ss_gam,\n        gp_terms = gp_terms,\n        family = family\n      )\n      gp_names <- unlist(\n        purrr::map(gp_additions$gp_att_table, 'name'),\n        use.names = FALSE\n      )\n      gp_isos <- unlist(\n        purrr::map(gp_additions$gp_att_table, 'iso'),\n        use.names = FALSE\n      )\n      abbv_names <- vector(mode = 'list', length = length(gp_names))\n      full_names <- vector(mode = 'list', length = length(gp_names))\n      for (i in seq_len(length(gp_names))) {\n        if (gp_isos[i]) {\n          abbv_names[[i]] <- gp_names[i]\n          full_names[[i]] <- paste0(gp_names[i], '[1]')\n        } else {\n          abbv_names[[i]] <- paste0(gp_names[i], '[1][', 1:2, ']')\n          full_names[[i]] <- paste0(gp_names[i], '[1][', 1:2, ']')\n        }\n      }\n      full_names <- unlist(full_names, use.names = FALSE)\n      abbv_names <- unlist(abbv_names, use.names = FALSE)\n      alpha_priors <- unlist(\n        purrr::map(gp_additions$gp_att_table, 'def_alpha'),\n        use.names = FALSE\n      )\n      rho_priors <- unlist(\n        purrr::map(gp_additions$gp_att_table, 'def_rho'),\n        use.names = FALSE\n      )\n      rho_2_priors <- unlist(\n        purrr::map(gp_additions$gp_att_table, 'def_rho_2'),\n        use.names = FALSE\n      )\n      full_priors <- vector(mode = 'list', length = length(gp_names))\n      for (i in seq_len(length(gp_names))) {\n        if (gp_isos[i]) {\n          full_priors[[i]] <- rho_priors[i]\n        } else {\n          full_priors[[i]] <- c(rho_priors[i], rho_2_priors[i])\n        }\n      }\n      full_priors <- unlist(full_priors, use.names = FALSE)\n      smooth_labs <- smooth_labs %>%\n        dplyr::filter(\n          !label %in%\n            gsub('gp(', 's(', gp_names, fixed = TRUE)\n        )\n\n      alpha_df <- data.frame(\n        param_name = paste0('real<lower=0> alpha_', gp_names, ';'),\n        param_length = 1,\n        param_info = paste(gp_names, 'marginal deviation'),\n        prior = paste0('alpha_', gp_names, ' ~ ', alpha_priors, ';'),\n        example_change = paste0(\n          'alpha_',\n          gp_names,\n          ' ~ ',\n          'normal(0, ',\n          round(runif(length(gp_names), 0.5, 1), 2),\n          ');'\n        )\n      )\n      rho_df <- data.frame(\n        param_name = paste0('real<lower=0> rho_', abbv_names, ';'),\n        param_length = 1,\n        param_info = paste(abbv_names, 'length scale'),\n        prior = paste0('rho_', full_names, ' ~ ', full_priors, ';'),\n        example_change = paste0(\n          'rho_',\n          full_names,\n          ' ~ ',\n          'normal(0, ',\n          round(runif(length(full_names), 0.5, 1), 2),\n          ');'\n        )\n      )\n      gp_df <- rbind(alpha_df, rho_df)\n    } else {\n      gp_df <- NULL\n    }\n\n    # Smoothing parameter priors for non-random effect smooths\n    if (any(smooth_labs$class != 'random.effect')) {\n      n_smooth_params <- smooth_labs %>%\n        dplyr::filter(class != 'random.effect') %>%\n        dplyr::pull(nsp)\n      nonre_smooths <- smooth_labs %>%\n        dplyr::filter(class != 'random.effect') %>%\n        dplyr::pull(label)\n\n      if (use_stan) {\n        sp_df <- data.frame(\n          param_name = 'vector<lower=0>[n_sp] lambda;',\n          param_length = sum(smooth_labs$nsp),\n          param_info = c(paste(\n            nonre_smooths,\n            'smooth parameters',\n            collapse = ', '\n          )),\n          prior = 'lambda ~ normal(5, 30);',\n          # Add an example for changing the prior; note that it is difficult to\n          # understand how to change individual smoothing parameter priors because each\n          # one acts on a different subset of the smooth function parameter space\n          example_change = c(\n            paste0(\n              'lambda ~ exponential(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ');'\n            )\n          )\n        )\n      } else {\n        # Not recommended to alter smoothing parameter priors for JAGS as the Gibbs sampler\n        # needs to have informative priors to have any hope of convergence\n        sp_df <- NULL\n      }\n    } else {\n      sp_df <- NULL\n    }\n\n    # Population mean and sd priors for random effect smooths\n    if (any(smooth_labs$class == 'random.effect')) {\n      re_smooths <- smooth_labs %>%\n        dplyr::filter(class == 'random.effect') %>%\n        dplyr::pull(label)\n      n_re_terms <- length(re_smooths)\n\n      if (use_stan) {\n        re_df <- data.frame(\n          param_name = c(\n            paste0('vector[', n_re_terms, '] mu_raw;'),\n            paste0('vector<lower=0>[', n_re_terms, '] sigma_raw;')\n          ),\n          param_length = rep(n_re_terms, 2),\n          param_info = c(\n            paste(re_smooths, 'pop mean', collapse = ', '),\n            paste(re_smooths, 'pop sd', collapse = ', ')\n          ),\n          prior = c('mu_raw ~ std_normal();', 'sigma_raw ~ exponential(0.5);')\n        )\n\n        # Add example change that users could implement to put different priors\n        # on each re's mean and sd\n        if (n_re_terms > 1) {\n          re_df <- cbind(\n            re_df,\n            data.frame(\n              example_change = c(\n                paste(\n                  paste0(\n                    'mu_raw[',\n                    1:n_re_terms,\n                    '] ~ normal(',\n                    round(runif(min = -1, max = 1, n = n_re_terms), 2),\n                    ', ',\n                    round(runif(min = 0.1, max = 1, n = n_re_terms), 2),\n                    ');'\n                  ),\n                  collapse = '\\n'\n                ),\n                paste(\n                  paste0(\n                    'sigma_raw[',\n                    1:n_re_terms,\n                    '] ~ exponential(',\n                    round(runif(min = 0.01, max = 1, n = n_re_terms), 2),\n                    ');'\n                  ),\n                  collapse = '\\n'\n                )\n              )\n            )\n          )\n        } else {\n          re_df <- cbind(\n            re_df,\n            data.frame(\n              example_change = c(\n                paste0(\n                  'mu_raw ~ normal(',\n                  round(runif(min = -1, max = 1, n = 1), 2),\n                  ', ',\n                  round(runif(min = 0.1, max = 1, n = 1), 2),\n                  ');'\n                ),\n                paste0(\n                  'sigma_raw ~ exponential(',\n                  round(runif(min = 0.01, max = 1, n = 1), 2),\n                  ');'\n                )\n              )\n            )\n          )\n        }\n      } else {\n        # If using JAGS as the backend\n        re_df <- data.frame(\n          param_name = c(\n            paste0('mu_raw', 1:n_re_terms),\n            paste0('sigma_raw', 1:n_re_terms, '<lower=0>')\n          ),\n          param_length = 1,\n          param_info = c(\n            paste(re_smooths, 'pop mean'),\n            paste(re_smooths, 'pop sd')\n          ),\n          prior = c(\n            paste0('mu_raw', 1:n_re_terms, ' ~ dnorm(0, 1)'),\n            paste0('sigma_raw', 1:n_re_terms, ' ~ dexp(0.5)')\n          )\n        )\n\n        # Add example change that users could implement to put different priors\n        # on each re's mean and sd\n        if (n_re_terms > 1) {\n          re_df <- cbind(\n            re_df,\n            data.frame(\n              example_change = c(\n                paste(paste0(\n                  'mu_raw',\n                  1:n_re_terms,\n                  ' ~ dnorm(',\n                  round(runif(min = -1, max = 1, n = n_re_terms), 2),\n                  ', ',\n                  round(runif(min = 0.1, max = 10, n = n_re_terms), 2),\n                  ')'\n                )),\n                paste(paste0(\n                  'sigma_raw',\n                  1:n_re_terms,\n                  ' ~ dexp(',\n                  round(runif(min = 0.01, max = 1, n = n_re_terms), 2),\n                  ')'\n                ))\n              )\n            )\n          )\n        } else {\n          re_df <- cbind(\n            re_df,\n            data.frame(\n              example_change = c(\n                paste0(\n                  'mu_raw ~ dnorm(',\n                  round(runif(min = -1, max = 1, n = 1), 2),\n                  ', ',\n                  round(runif(min = 0.1, max = 1, n = 1), 2),\n                  ')'\n                ),\n                paste0(\n                  'sigma_raw ~ dexp(',\n                  round(runif(min = 0.01, max = 1, n = 1), 2),\n                  ')'\n                )\n              )\n            )\n          )\n        }\n      }\n    } else {\n      re_df <- NULL\n    }\n\n    # Extract information on priors for trend components\n    trend_df <- NULL\n\n    if (trend_model %in% c('PWlinear', 'PWlogistic')) {\n      # Need to fix this as a next priority\n      # trend_df <- NULL\n      trend_df <- data.frame(\n        param_name = c(\n          'vector[n_series] k_trend;',\n          'vector[n_series] m_trend;'\n        ),\n        param_length = length(unique(data_train$series)),\n        param_info = c('base trend growth rates', 'trend offset parameters'),\n        prior = c('k_trend ~ std_normal();', 'm_trend ~ student_t(3, 0, 2.5);'),\n        example_change = c(\n          paste0(\n            'k ~ normal(',\n            round(runif(min = -1, max = 1, n = 1), 2),\n            ', ',\n            round(runif(min = 0.1, max = 1, n = 1), 2),\n            ');'\n          ),\n          paste0(\n            'm ~ normal(',\n            round(runif(min = -1, max = 1, n = 1), 2),\n            ', ',\n            round(runif(min = 0.1, max = 1, n = 1), 2),\n            ');'\n          )\n        )\n      )\n    }\n    if (trend_model == 'GP') {\n      if (use_lv) {\n        trend_df <- data.frame(\n          param_name = c('vector<lower=0>[n_lv] rho_gp;'),\n          param_length = n_lv,\n          param_info = c('trend length scale'),\n          prior = c('rho_gp ~ inv_gamma(1.499007, 5.670433);'),\n          example_change = paste0(\n            'rho_gp ~ exponential(',\n            round(runif(min = 0.01, max = 1, n = 1), 2),\n            ');'\n          )\n        )\n      } else {\n        trend_df <- data.frame(\n          param_name = c(\n            'vector<lower=0>[n_series] alpha_gp;',\n            'vector<lower=0>[n_series] rho_gp;'\n          ),\n          param_length = length(unique(data_train$series)),\n          param_info = c('trend amplitude', 'trend length scale'),\n          prior = c(\n            'alpha_gp ~ normal(0, 0.5);',\n            'rho_gp ~ inv_gamma(1.499007, 5.670433);'\n          ),\n          example_change = c(\n            paste0(\n              'alpha_gp ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            ),\n            paste0(\n              'rho_gp ~ exponential(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ');'\n            )\n          )\n        )\n      }\n\n      trend_df <- rbind(\n        trend_df,\n        data.frame(\n          param_name = c('int<lower=1> num_gp_basis;'),\n          param_length = 1,\n          param_info = c('basis dimension for approximate GP'),\n          prior = c('num_gp_basis = min(20, n);'),\n          example_change = 'num_gp_basis = 12;'\n        )\n      )\n    }\n\n    if (trend_model %in% c('ZMVN', 'ZMVNhiercor')) {\n      trend_df <- data.frame(\n        param_name = c(paste0(\n          'vector<lower=0>[',\n          ifelse(use_lv, 'n_lv', 'n_series'),\n          '] sigma;'\n        )),\n        param_length = ifelse(use_lv, n_lv, length(unique(data_train$series))),\n        param_info = c('residual sd'),\n        prior = c('sigma ~ exponential(2);'),\n        example_change = c(\n          paste0(\n            'sigma ~ exponential(',\n            round(runif(min = 0.01, max = 1, n = 1), 2),\n            ');'\n          )\n        )\n      )\n    }\n\n    if (trend_model %in% c('RW', 'RWcor', 'RWhiercor')) {\n      if (use_stan) {\n        trend_df <- data.frame(\n          param_name = c(paste0(\n            'vector<lower=0>[',\n            ifelse(use_lv, 'n_lv', 'n_series'),\n            '] sigma;'\n          )),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c('trend sd'),\n          prior = c('sigma ~ exponential(2);'),\n          example_change = c(\n            paste0(\n              'sigma ~ exponential(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ');'\n            )\n          )\n        )\n      } else {\n        trend_df <- data.frame(\n          param_name = c('vector<lower=0>[n_series] sigma'),\n          param_length = length(unique(data_train$series)),\n          param_info = 'trend sd (for each series s)',\n          prior = c('sigma[s] ~ dexp(1)T(0.075, 5)'),\n          example_change = c(\n            paste0(\n              'sigma[s] ~ dexp(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ')'\n            )\n          )\n        )\n      }\n    }\n\n    if (trend_model == 'VAR1') {\n      trend_df <- data.frame(\n        param_name = c('vector<lower=0>[n_series] sigma;'),\n        param_length = c(length(unique(data_train$series))),\n        param_info = c('trend sd'),\n        prior = c('sigma ~ inv_gamma(2.3693353, 0.7311319);'),\n        example_change = c(\n          paste0(\n            'sigma ~ exponential(',\n            round(runif(min = 0.01, max = 1, n = 1), 2),\n            ');'\n          )\n        )\n      )\n      trend_df <- rbind(\n        trend_df,\n        data.frame(\n          param_name = c(\n            \"real es[1];\",\n            \"real es[2];\",\n            \"real<lower=0> fs[1];\",\n            \"real<lower=0> fs[2];\",\n            \"real<lower=0> gs[1];\",\n            \"real<lower=0> gs[2];\",\n            \"real<lower=0> hs[1];\",\n            \"real<lower=0> hs[2];\"\n          ),\n          param_length = 1,\n          param_info = c(\n            'diagonal autocorrelation population mean',\n            'off-diagonal autocorrelation population mean',\n            'diagonal autocorrelation population variance',\n            'off-diagonal autocorrelation population variance',\n            'shape1 for diagonal autocorrelation precision',\n            'shape1 for off-diagonal autocorrelation precision',\n            'shape2 for diagonal autocorrelation precision',\n            'shape2 for off-diagonal autocorrelation precision'\n          ),\n          prior = c(\n            \"es[1] = 0;\",\n            \"es[2] = 0;\",\n            \"fs[1] = sqrt(0.455);\",\n            \"fs[2] = sqrt(0.455);\",\n            \"gs[1] = 1.365;\",\n            \"gs[2] = 1.365;\",\n            \"hs[1] = 0.071175;\",\n            \"hs[2] = 0.071175;\"\n          ),\n          example_change = c(\n            \"es[1] = 0.5;\",\n            \"es[2] = 0.1;\",\n            \"fs[1] = 0.6;\",\n            \"fs[2] = 0.3;\",\n            \"gs[1] = 1.1;\",\n            \"gs[2] = 1.07;\",\n            \"hs[1] = 0.08;\",\n            \"hs[2] = 0.1;\"\n          )\n        )\n      )\n    }\n\n    if (trend_model %in% c('VAR1cor', 'VARhiercor', 'VARMA1,1cor')) {\n      trend_df <- data.frame(\n        param_name = c('vector<lower=0>[n_series] sigma;'),\n        param_length = c(length(unique(data_train$series))),\n        param_info = c('trend sd'),\n        prior = c('sigma ~ inv_gamma(2.3693353, 0.7311319);'),\n        example_change = c(\n          paste0(\n            'sigma ~ exponential(',\n            round(runif(min = 0.01, max = 1, n = 1), 2),\n            ');'\n          )\n        )\n      )\n      trend_df <- rbind(\n        trend_df,\n        data.frame(\n          param_name = c(\n            \"real es[1];\",\n            \"real es[2];\",\n            \"real<lower=0> fs[1];\",\n            \"real<lower=0> fs[2];\",\n            \"real<lower=0> gs[1];\",\n            \"real<lower=0> gs[2];\",\n            \"real<lower=0> hs[1];\",\n            \"real<lower=0> hs[2];\",\n            \"real<lower=0> L_Omega;\"\n          ),\n          param_length = 1,\n          param_info = c(\n            'diagonal autocorrelation population mean',\n            'off-diagonal autocorrelation population mean',\n            'diagonal autocorrelation population variance',\n            'off-diagonal autocorrelation population variance',\n            'shape1 for diagonal autocorrelation precision',\n            'shape1 for off-diagonal autocorrelation precision',\n            'shape2 for diagonal autocorrelation precision',\n            'shape2 for off-diagonal autocorrelation precision',\n            'LKJ prior on trend error correlations'\n          ),\n          prior = c(\n            \"es[1] = 0;\",\n            \"es[2] = 0;\",\n            \"fs[1] = sqrt(0.455);\",\n            \"fs[2] = sqrt(0.455);\",\n            \"gs[1] = 1.365;\",\n            \"gs[2] = 1.365;\",\n            \"hs[1] = 0.071175;\",\n            \"hs[2] = 0.071175;\",\n            \"L_Omega ~ lkj_corr_cholesky(2);\"\n          ),\n          example_change = c(\n            \"es[1] = 0.5;\",\n            \"es[2] = 0.1;\",\n            \"fs[1] = 0.6;\",\n            \"fs[2] = 0.3;\",\n            \"gs[1] = 1.1;\",\n            \"gs[2] = 1.07;\",\n            \"hs[1] = 0.08;\",\n            \"hs[2] = 0.1;\",\n            \"L_Omega ~ lkj_corr_cholesky(4);\"\n          )\n        )\n      )\n    }\n\n    if (trend_model == 'CAR1') {\n      trend_df <- data.frame(\n        param_name = c(\n          paste0(\n            'vector<lower=0,upper=1>[',\n            ifelse(use_lv, 'n_lv', 'n_series'),\n            '] ar1;'\n          ),\n          paste0(\n            'vector<lower=0>[',\n            ifelse(use_lv, 'n_lv', 'n_series'),\n            '] sigma;'\n          )\n        ),\n        param_length = ifelse(use_lv, n_lv, length(unique(data_train$series))),\n        param_info = c('trend AR1 coefficient', 'trend sd'),\n        prior = c('ar1 ~ std_normal();', 'sigma ~ exponential(2);'),\n        example_change = c(\n          paste0(\n            'ar1 ~ normal(',\n            round(runif(min = 0.1, max = 1, n = 1), 2),\n            ', ',\n            round(runif(min = 0.1, max = 1, n = 1), 2),\n            ');'\n          ),\n          paste0(\n            'sigma ~ exponential(',\n            round(runif(min = 0.01, max = 1, n = 1), 2),\n            ');'\n          )\n        )\n      )\n    }\n\n    if (trend_model %in% c('AR1', 'AR1cor', 'AR1hiercor')) {\n      if (use_stan) {\n        trend_df <- data.frame(\n          param_name = c(\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar1;'\n            ),\n            paste0(\n              'vector<lower=0>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] sigma;'\n            )\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c('trend AR1 coefficient', 'trend sd'),\n          prior = c('ar1 ~ std_normal();', 'sigma ~ exponential(2);'),\n          example_change = c(\n            paste0(\n              'ar1 ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            ),\n            paste0(\n              'sigma ~ exponential(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ');'\n            )\n          )\n        )\n      } else {\n        trend_df <- data.frame(\n          param_name = c(\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar1;'\n            ),\n            paste0(\n              'vector<lower=0>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] sigma;'\n            )\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c(\n            'trend AR1 coefficient (for each series s)',\n            'trend sd (for each series s)'\n          ),\n          prior = c('ar1[s] ~ dnorm(0, 10)', 'sigma[s] ~ dexp(2)T(0.075, 5)'),\n          example_change = c(\n            paste0(\n              'ar1[s] ~ dnorm(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ')'\n            ),\n            paste0(\n              'sigma[s] ~ dexp(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ')'\n            )\n          )\n        )\n      }\n    }\n\n    if (trend_model %in% c('AR2', 'AR2cor', 'AR2hiercor')) {\n      if (use_stan) {\n        trend_df <- data.frame(\n          param_name = c(\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar1;'\n            ),\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar2;'\n            ),\n            paste0(\n              'vector<lower=0>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] sigma;'\n            )\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c(\n            'trend AR1 coefficient',\n            'trend AR2 coefficient',\n            'trend sd'\n          ),\n          prior = c(\n            'ar1 ~ std_normal();',\n            'ar2 ~ std_normal();',\n            'sigma ~ exponential(2);'\n          ),\n          example_change = c(\n            paste0(\n              'ar1 ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            ),\n            paste0(\n              'ar2 ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            ),\n            paste0(\n              'sigma ~ exponential(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ');'\n            )\n          )\n        )\n      } else {\n        trend_df <- data.frame(\n          param_name = c(\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar1;'\n            ),\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar2;'\n            ),\n            paste0(\n              'vector<lower=0>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] sigma;'\n            )\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c(\n            'trend AR1 coefficient (for each series s)',\n            'trend AR2 coefficient (for each series s)',\n            'trend sd (for each series s)'\n          ),\n          prior = c(\n            'ar1[s] ~ dnorm(0, 10)',\n            'ar2[s] ~ dnorm(0, 10)',\n            'sigma[s] ~ dexp(2)T(0.075, 5)'\n          ),\n          example_change = c(\n            paste0(\n              'ar1[s] ~ dnorm(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ')'\n            ),\n            paste0(\n              'ar2[s] ~ dnorm(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ')'\n            ),\n            paste0(\n              'sigma[s] ~ dexp(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ')'\n            )\n          )\n        )\n      }\n    }\n\n    if (trend_model %in% c('AR3', 'AR3cor', 'AR3hiercor')) {\n      if (use_stan) {\n        trend_df <- data.frame(\n          param_name = c(\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar1;'\n            ),\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar2;'\n            ),\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar3;'\n            ),\n            paste0(\n              'vector<lower=0>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] sigma;'\n            )\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c(\n            'trend AR1 coefficient',\n            'trend AR2 coefficient',\n            'trend AR3 coefficient',\n            'trend sd'\n          ),\n          prior = c(\n            'ar1 ~ std_normal();',\n            'ar2 ~ std_normal();',\n            'ar3 ~ std_normal();',\n            'sigma ~ exponential(2);'\n          ),\n          example_change = c(\n            paste0(\n              'ar1 ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            ),\n            paste0(\n              'ar2 ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            ),\n            paste0(\n              'ar3 ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            ),\n            paste0(\n              'sigma ~ exponential(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ');'\n            )\n          )\n        )\n      } else {\n        trend_df <- data.frame(\n          param_name = c(\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar1;'\n            ),\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar2;'\n            ),\n            paste0(\n              'vector<lower=-1,upper=1>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] ar3;'\n            ),\n            paste0(\n              'vector<lower=0>[',\n              ifelse(use_lv, 'n_lv', 'n_series'),\n              '] sigma;'\n            )\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c(\n            'trend AR1 coefficient (for each series s)',\n            'trend AR2 coefficient (for each series s)',\n            'trend AR3 coefficient (for each series s)',\n            'trend sd (for each series s)'\n          ),\n          prior = c(\n            'ar1[s] ~ dnorm(0, 10)',\n            'ar2[s] ~ dnorm(0, 10)',\n            'ar3[s] ~ dnorm(0, 10)',\n            'sigma[s] ~ dexp(2)T(0.075, 5)'\n          ),\n          example_change = c(\n            paste0(\n              'ar1[s] ~ dnorm(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ')'\n            ),\n            paste0(\n              'ar2[s] ~ dnorm(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ')'\n            ),\n            paste0(\n              'ar3[s] ~ dnorm(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ')'\n            ),\n            paste0(\n              'sigma[s] ~ dexp(',\n              round(runif(min = 0.01, max = 1, n = 1), 2),\n              ')'\n            )\n          )\n        )\n      }\n    }\n\n    # Remove options for trend variance priors if using a dynamic factor model\n    if (use_lv) {\n      if (missing(trend_map)) {\n        trend_df %>%\n          dplyr::filter(\n            !grepl(\n              paste0(\n                'vector<lower=0>[',\n                ifelse(use_lv, 'n_lv', 'n_series'),\n                '] sigma;'\n              ),\n              param_name,\n              fixed = TRUE\n            )\n          ) -> trend_df\n      }\n\n      if (use_stan) {\n        if (missing(trend_map)) {\n          trend_df <- rbind(\n            trend_df,\n            data.frame(\n              param_name = c('vector[M] L;'),\n              param_length = n_lv * length(unique(data_train$series)),\n              param_info = c('factor loadings'),\n              prior = c('L ~ student_t(5, 0, 1);'),\n              example_change = 'L ~ std_normal();'\n            )\n          )\n        }\n      }\n    }\n\n    # Extract drift parameter information\n    if (drift) {\n      if (use_stan) {\n        drift_df <- data.frame(\n          param_name = paste0(\n            'vector[',\n            ifelse(use_lv, 'n_lv', 'n_series'),\n            '] drift;'\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c('trend drift'),\n          prior = c('drift ~ std_normal();'),\n          example_change = c(\n            paste0(\n              'drift ~ normal(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ');'\n            )\n          )\n        )\n      } else {\n        drift_df <- data.frame(\n          param_name = paste0(\n            'vector[',\n            ifelse(use_lv, 'n_lv', 'n_series'),\n            '] drift;'\n          ),\n          param_length = ifelse(\n            use_lv,\n            n_lv,\n            length(unique(data_train$series))\n          ),\n          param_info = c('trend drift (for each series s)'),\n          prior = c('drift ~ dnorm(0, 10)'),\n          example_change = c(\n            paste0(\n              'drift ~ dnorm(',\n              round(runif(min = -1, max = 1, n = 1), 2),\n              ', ',\n              round(runif(min = 0.1, max = 1, n = 1), 2),\n              ')'\n            )\n          )\n        )\n      }\n    } else {\n      drift_df <- NULL\n    }\n\n    # Extract information for family-specific parameters\n    family_df <- family_prior_info(\n      family = family_char,\n      use_stan = use_stan,\n      data = data_train\n    )\n\n    # Return the dataframe of prior information\n    prior_df <- rbind(\n      para_df,\n      gp_df,\n      sp_df,\n      re_df,\n      trend_df,\n      drift_df,\n      family_df\n    )\n\n    prior_df$new_lowerbound <- NA\n    prior_df$new_upperbound <- NA\n\n    # Final update to use more brms-like default priors on\n    # scale parameters\n    def_scale_prior <- update_default_scales(\n      response = replace_nas(data_train[[out_name]]),\n      family = family\n    )\n\n    # Update in priors df\n    if (any(grepl('sigma|sigma_raw|sigma_obs', prior_df$prior))) {\n      lines_with_scales <- grep('sigma|sigma_raw|sigma_obs', prior_df$prior)\n      for (i in lines_with_scales) {\n        prior_df$prior[i] <- paste0(\n          trimws(strsplit(prior_df$prior[i], \"[~]\")[[1]][1]),\n          ' ~ ',\n          def_scale_prior,\n          ';'\n        )\n      }\n    }\n    out <- prior_df\n  }\n\n  return(out)\n}\n\n#' @export\n#' @importFrom brms prior\nbrms::prior\n\n#' @export\n#' @importFrom brms prior_\nbrms::prior_\n\n#' @export\n#' @importFrom brms set_prior\nbrms::set_prior\n\n#' @export\n#' @importFrom brms prior_string\nbrms::prior_string\n\n#' Use informative scale and intercept priors following brms example\n#' @importFrom stats mad qcauchy setNames\n#' @importFrom brms logm1 prior_string get_prior\n#' @noRd\nmake_default_scales = function(response, family) {\n  def_scale_prior <- update_default_scales(response, family)\n  c(\n    prior_string(def_scale_prior, class = 'sigma'),\n    prior_string(def_scale_prior, class = 'sigma_raw'),\n    prior_string(def_scale_prior, class = 'sigma_obs')\n  )\n}\n\n#' @noRd\nmake_default_int = function(response, family) {\n  if (all(is.na(response))) {\n    out <- prior_string(\"student_t(3, 0, 3.5)\", class = '(Intercept)')\n  } else if (family$family == 'nmix') {\n    # Intercept prior in N-Mixtures applies to avg detection probability\n    out <- prior_string(\"normal(0, 1.5)\", class = '(Intercept)')\n  } else {\n    resp_dat <- data.frame(y = response[!is.na(response)])\n    int_prior <- get_prior(\n      y ~ 1,\n      data = resp_dat,\n      family = family_to_brmsfam(family)\n    )\n    out <- prior_string(\n      int_prior$prior[which(int_prior$class == 'Intercept')],\n      class = '(Intercept)'\n    )\n  }\n  return(out)\n}\n\n#' @noRd\nlinkfun = function(x, link) {\n  switch(\n    link,\n    identity = x,\n    log = log(x),\n    logm1 = logm1(x),\n    log1p = log1p(x),\n    inverse = 1 / x,\n    sqrt = sqrt(x),\n    `1/mu^2` = 1 / x^2,\n    tan_half = tan(x / 2),\n    logit = plogis(x),\n    probit = qnorm(x),\n    cauchit = qcauchy(x),\n    probit_approx = qnorm(x),\n    squareplus = (x^2 - 1) / x,\n    stop(\"Link '\", link, \"' is not supported.\", call. = FALSE)\n  )\n}\n\n#' @noRd\nupdate_default_scales = function(\n  response,\n  family,\n  df = 3,\n  center = TRUE\n) {\n  if (all(is.na(response))) {\n    out <- paste0(\n      \"student_t(\",\n      paste0(as.character(c(df, '0', '3')), collapse = \", \"),\n      \")\"\n    )\n  } else {\n    y <- response[!is.na(response)]\n    link <- family$link\n    if (link %in% c(\"log\", \"inverse\", \"1/mu^2\")) {\n      # avoid Inf in link(y)\n      y <- ifelse(y == 0, y + 0.1, y)\n    }\n\n    y_link <- suppressWarnings(linkfun(y, link = link))\n    scale_y <- round(mad(y_link, na.rm = TRUE), 1)\n\n    if (scale_y <= 5) {\n      out <- 'inv_gamma(1.418, 0.452)'\n    }\n\n    if (\n      scale_y > 5 &\n        scale_y <= 20\n    ) {\n      out <- 'inv_gamma(0.9187, 0.3516)'\n    }\n\n    if (scale_y > 20) {\n      out <- paste0(\n        \"student_t(\",\n        paste0(as.character(c(df, 0, scale_y)), collapse = \", \"),\n        \")\"\n      )\n    }\n  }\n\n  return(out)\n}\n"
  },
  {
    "path": "R/globals.R",
    "content": "#' Prevent R CMD Check notes about missing global variables due to\n#' dplyr mutates etc...\n#' @noRd\nutils::globalVariables(c(\n  \"y\",\n  \"year\",\n  \"smooth_vals\",\n  \"smooth_num\",\n  \"series\",\n  \"season\",\n  \"rowid\",\n  \"row_number\",\n  \"nsp\",\n  \"last_assim\",\n  \"index\",\n  \"in_interval\",\n  \"assimilated\",\n  \"eval_horizon\",\n  \"label\",\n  \"mod_call\",\n  \"particles\",\n  \"obs\",\n  \"mgcv_model\",\n  \"param_name\",\n  \"outcome\",\n  \"mgcv_plottable\",\n  \"term\",\n  \"data_test\",\n  \"object\",\n  \"row_num\",\n  \"trends_test\",\n  \"trend\",\n  \"trend_series\",\n  \"trend_y\",\n  \".\",\n  \"gam\",\n  \"group\",\n  \"mod\",\n  \"row_id\",\n  \"byvar\",\n  \"direction\",\n  \"index..time..index\",\n  \"trend_test\",\n  \"Var2\",\n  \"add_cor\",\n  \"add_ma\",\n  \"add_nmix\",\n  \"binomial\",\n  \"current\",\n  \"drop_obs_intercept\",\n  \"gp_details\",\n  \"gp_terms\",\n  \"k\",\n  \"mus\",\n  \"name\",\n  \"needed\",\n  \"nmix_trendmap\",\n  \"orig_formula\",\n  \"trial\",\n  \"use_var1\",\n  \"use_var1cor\",\n  \"xcols_drop\",\n  \"time_lag\",\n  \"dis_time\",\n  \"maxt\",\n  \"orig_rows\",\n  \"matches\",\n  \"time.\",\n  \"file_name\",\n  \".data\",\n  \"horizon\",\n  \"target\",\n  \"Series\",\n  \"evd\",\n  \"mean_evd\",\n  \"total_evd\",\n  \"smooth_label\",\n  \"by_variable\",\n  \"gr\",\n  \"tot_subgrs\",\n  \"subgr\",\n  \"lambda\",\n  \"level\",\n  \"sim_hilbert_gp\",\n  \"trend_model\",\n  \"jags_path\",\n  \"x\",\n  \"elpds\",\n  \"pareto_ks\",\n  \"value\",\n  \"threshold\",\n  \"colour\",\n  \"resids\",\n  \"c_dark\",\n  \"eval_timepoints\",\n  \"yqlow\",\n  \"ymidlow\",\n  \"ymidhigh\",\n  \"yqhigh\",\n  \"preds\",\n  \"yhigh\",\n  \"ylow\",\n  \"weight\",\n  \"orig_weight\",\n  \"imp_resp\",\n  \"lower1\",\n  \"lower2\",\n  \"lower3\",\n  \"lower4\",\n  \"med\",\n  \"resp_var\",\n  \"upper1\",\n  \"upper2\",\n  \"upper3\",\n  \"upper4\",\n  \"draw\",\n  \"fevd_Qlower\",\n  \"fevd_Qupper\",\n  \"fevd_median\",\n  \"shock\",\n  \"irf_median\",\n  \"irf_Qlower\",\n  \"irf_Qupper\",\n  \"fevdQ50\",\n  \"parameter\",\n  \"pred_median\",\n  \"pred_Qupper\",\n  \"pred_Qlower\",\n  \"lower_deriv\",\n  \"med_deriv\",\n  \"upper_deriv\",\n  \"sum_contribution\",\n  \"total\",\n  \"Contribution\",\n  \"Var1\",\n  \"lv\",\n  \"correlation\",\n  \"Factor\",\n  \"contribution\",\n  \"unit\",\n  \"lw\",\n  \"data\"\n))\n"
  },
  {
    "path": "R/gp.R",
    "content": "#' Re-label gp terms inside an mgcv gam object for nicer plotting\n#' @noRd\nrelabel_gps = function(mgcv_model) {\n  if (length(mgcv_model$smooth) > 0L) {\n    # Get classes of all smooths\n    smooth_classes <- purrr::map(mgcv_model$smooth, class)\n\n    # Check for gp() terms\n    for (x in seq_along(smooth_classes)) {\n      if (any(smooth_classes[[x]] %in% 'hilbert.smooth')) {\n        mgcv_model$smooth[[x]]$label <-\n          gsub('s\\\\(|ti\\\\(', 'gp(', mgcv_model$smooth[[x]]$label)\n      }\n    }\n  }\n  return(mgcv_model)\n}\n\n#' @noRd\nseq_cols <- function(x) {\n  seq_len(NCOL(x))\n}\n\n#' Make gp() attributes table and necessary stan lines\n#' @importFrom brms brm standata\n#' @noRd\nmake_gp_additions = function(\n  gp_details,\n  orig_formula,\n  data,\n  newdata,\n  model_data,\n  mgcv_model,\n  gp_terms,\n  family = gaussian(),\n  rho_names\n) {\n  by <- gp_details$by\n  gp_details$row_id <- 1:NROW(gp_details)\n  gp_covariates <- gp_details$gp_covariates\n  gp_details_orig <- gp_details\n  if (any(!is.na(by))) {\n    for (i in 1:length(by)) {\n      if (!is.na(by[i])) {\n        if (is.factor(data[[by[i]]])) {\n          nlevels <- length(levels(droplevels(data[[by[i]]])))\n          new_details <- do.call(\n            rbind,\n            lapply(1:nlevels, function(x) {\n              gp_details_orig[i, ]\n            })\n          )\n          new_details$level <- levels(droplevels(data[[by[i]]]))\n\n          rows_drop <- which(\n            gp_details$gp_covariates == gp_covariates[i] &\n              gp_details$by == by[i]\n          )\n\n          gp_details <- gp_details[-rows_drop, ]\n          gp_details <- rbind(gp_details, new_details)\n        }\n      }\n    }\n  }\n\n  # Preserve ordering of terms\n  gp_details %>%\n    dplyr::arrange(row_id, level) %>%\n    dplyr::select(-row_id) -> gp_details\n\n  # Initiate a brms GP model using the 'mock' backend so it doesn't actually fit;\n  terms_needed <- unique(c(\n    unlist(strsplit(gp_details$gp_covariates, \", |\\\\n\")),\n    unlist(strsplit(gp_details$by, \", |\\\\n\"))\n  ))\n  terms_needed <- terms_needed[!is.na(terms_needed)]\n  terms_needed <- terms_needed[!terms_needed %in% c('series', 'time')]\n  brms_fake_df <- data.frame(\n    .fake_gp_y = rnorm(length(data[[1]])),\n    series = data$series,\n    time = data$index..time..index\n  )\n  for (i in seq_along(terms_needed)) {\n    brms_fake_df <- cbind(brms_fake_df, data[[terms_needed[i]]])\n  }\n  colnames(brms_fake_df) <- c('.fake_gp_y', 'series', 'time', terms_needed)\n\n  brms_fake_df <- brms_fake_df %>%\n    dplyr::arrange(time, series)\n\n  # Build the gp formula to pass to the mock brms\n  gp_formula <- reformulate(\n    attr(terms(attr(gp_details, 'gp_formula')), 'term.labels'),\n    '.fake_gp_y'\n  )\n  brms_mock <- brms::brm(\n    gp_formula,\n    data = brms_fake_df,\n    mock_fit = 1,\n    backend = \"mock\",\n    rename = FALSE\n  )\n  brms_mock <- trim_mockbrms(brms_mock)\n\n  # Eigenfunction design matrices (to be inserted into Xp matrices)\n  brms_mock_data <- brms::standata(brms_mock)\n  eigenfuncs <- eigenfunc_list(\n    stan_data = brms_mock_data,\n    mock_df = brms_fake_df,\n    by = gp_details$by,\n    level = gp_details$level\n  )\n\n  # Eigenvalues  (l_gp in mvgam stancode)\n  eigenvals <- eigenval_list(brms_mock_data)\n\n  # If newdata supplied, compute the eigenfunctions for these out of\n  # sample data points\n  if (!is.null(newdata)) {\n    brms_fake_df_new <- data.frame(\n      .fake_gp_y = rnorm(length(newdata[[1]])),\n      series = newdata$series,\n      time = newdata$index..time..index\n    )\n    for (i in seq_along(terms_needed)) {\n      brms_fake_df_new <- cbind(brms_fake_df_new, newdata[[terms_needed[i]]])\n    }\n    colnames(brms_fake_df_new) <- c(\n      '.fake_gp_y',\n      'series',\n      'time',\n      terms_needed\n    )\n\n    brms_fake_df_new <- brms_fake_df_new %>%\n      dplyr::arrange(time, series)\n\n    # Compute eigenfunctions for these new data and bind to the\n    # training data eigenfunctions\n    brms_mock_data_new <- brms::standata(\n      brms_mock,\n      newdata = brms_fake_df_new,\n      internal = TRUE\n    )\n    eigenfuncs_new <- eigenfunc_list(\n      stan_data = brms_mock_data_new,\n      mock_df = brms_fake_df_new,\n      by = gp_details$by,\n      level = gp_details$level\n    )\n    for (i in seq_along(eigenfuncs)) {\n      eigenfuncs[[i]] <- rbind(eigenfuncs[[i]], eigenfuncs_new[[i]])\n    }\n  }\n\n  # Numbers of basis functions (k_gp in mvgam stancode)\n  k_gps <- lapply(eigenvals, function(x) NROW(x))\n\n  # Put all relevant data into a list\n  gp_data <- lapply(seq_along(eigenvals), function(x) {\n    byname <- ifelse(is.na(gp_details$by[x]), '', paste0(':', gp_details$by[x]))\n    covariate_name <- paste0('gp(', gp_details$gp_covariates[x], ')', byname)\n    if (!is.na(gp_details$level[x])) {\n      covariate_name <- paste0(covariate_name, gp_details$level[x])\n    }\n    orig_name <- if (gp_details$dim[x] > 1L) {\n      paste0('ti(', gp_details$gp_covariates[x], ')', byname)\n    } else {\n      paste0('s(', gp_details$gp_covariates[x], ')', byname)\n    }\n    if (!is.na(gp_details$level[x])) {\n      orig_name <- paste0(orig_name, gp_details$level[x])\n    }\n    att_table <- list(\n      effect = 'gp',\n      name = covariate_name,\n      orig_name = orig_name,\n      dim = gp_details$dim[x],\n      iso = gp_details$iso[x],\n      kernel = gp_details$kernel[x],\n      covariate = gp_details$gp_covariates[x],\n      by = gp_details$b[x],\n      level = gp_details$level[x],\n      k = k_gps[[x]],\n      def_rho = gp_details$def_rho[x],\n      def_rho_2 = gp_details$def_rho_2[x],\n      def_rho_3 = gp_details$def_rho_3[x],\n      def_rho_4 = gp_details$def_rho_4[x],\n      def_alpha = gp_details$def_alpha[x],\n      eigenvalues = eigenvals[[x]]\n    )\n\n    # Items to add to Stan data\n    # Number of basis functions\n    covariate_name <- clean_gpnames(covariate_name)\n    data_lines <- paste0(\n      'int<lower=1> k_',\n      covariate_name,\n      '; // basis functions for approximate gp\\n'\n    )\n    append_dat <- list(k = k_gps[[x]])\n    names(append_dat) <- paste0('k_', covariate_name, '')\n\n    # Approximate GP eigenvalues\n    data_lines <- paste0(\n      data_lines,\n      paste0(\n        'array[',\n        'k_',\n        covariate_name,\n        '] vector[',\n        gp_details$dim[x],\n        '] l_',\n        covariate_name,\n        '; // approximate gp eigenvalues\\n'\n      ),\n      collapse = '\\n'\n    )\n\n    append_dat2 <- list(slambda = eigenvals[[x]])\n    names(append_dat2) <- paste0('l_', covariate_name, '')\n    append_dat <- append(append_dat, append_dat2)\n\n    # Return necessary objects in a list\n    list(\n      att_table = att_table,\n      data_lines = data_lines,\n      data_append = append_dat,\n      eigenfunctions = eigenfuncs[[x]]\n    )\n  })\n\n  # Consolidate Stan data objects and add to model_data\n  gp_stan_data <- do.call(c, purrr::map(gp_data, 'data_append'))\n  model_data <- append(model_data, gp_stan_data)\n\n  # Consolidate attribute tables\n  gp_att_table <- purrr::map(gp_data, 'att_table')\n\n  # Create updated design matrix by replacing the s() basis functions with\n  # the gp() eigenfunctions\n  coefs_replace <- list()\n  for (x in gp_terms) {\n    label <- attr(terms(formula(mgcv_model), keep.order = TRUE), 'term.labels')[\n      x\n    ]\n    s_attributes <- eval(rlang::parse_expr(label))\n    if (s_attributes$by != 'NA') {\n      if (grepl('ti(', label, fixed = TRUE)) {\n        coef_name <- paste0(\n          'ti(',\n          paste(s_attributes$term, collapse = ','),\n          '):',\n          s_attributes$by\n        )\n      } else {\n        coef_name <- paste0('s(', s_attributes$term, '):', s_attributes$by)\n      }\n    } else {\n      if (grepl('ti(', label, fixed = TRUE)) {\n        coef_name <- paste0(\n          'ti(',\n          paste(s_attributes$term, collapse = ','),\n          ')'\n        )\n      } else {\n        coef_name <- paste0('s(', s_attributes$term, ')')\n      }\n    }\n    which_replace <- grep(coef_name, names(coef(mgcv_model)), fixed = TRUE)\n    names(mgcv_model$coefficients)[which_replace] <-\n      if (grepl('ti(', label, fixed = TRUE)) {\n        gsub(\n          'ti(',\n          'gp(',\n          names(mgcv_model$coefficients)[which_replace],\n          fixed = TRUE\n        )\n      } else {\n        gsub(\n          's(',\n          'gp(',\n          names(mgcv_model$coefficients)[which_replace],\n          fixed = TRUE\n        )\n      }\n    coefs_replace[[x]] <- which_replace\n  }\n\n  # Replace basis functions with gp() eigenfunctions\n  newX <- model_data$X\n\n  # Add eigenfunctions to the GAM design matrix\n  eigenfuncs <- do.call(cbind, purrr::map(gp_data, 'eigenfunctions'))\n  newX[unlist(coefs_replace), ] <- t(eigenfuncs)\n  model_data$X <- newX\n\n  # Consolidate Stan data lines\n  gp_stan_lines <- paste0(purrr::map(gp_data, 'data_lines'), collapse = '')\n\n  # Add coefficient indices to attribute table and to Stan data\n  for (covariate in seq_along(gp_att_table)) {\n    clean_name <- gsub(' ', '', gp_att_table[[covariate]]$name)\n    clean_coefs <- sub(\"^(.*)[.].*\", \"\\\\1\", names(coef(mgcv_model)))\n\n    coef_indices <- which(\n      clean_coefs %in%\n        clean_name &\n        !grepl(\n          paste0(gp_att_table[[covariate]]$name, ':'),\n          names(coef(mgcv_model)),\n          fixed = TRUE\n        ) ==\n          TRUE\n    )\n\n    gp_att_table[[covariate]]$first_coef <- min(coef_indices)\n    gp_att_table[[covariate]]$last_coef <- max(coef_indices)\n\n    gp_names <- clean_gpnames(gp_att_table[[covariate]]$name)\n    gp_stan_lines <- paste0(\n      gp_stan_lines,\n      paste0(\n        'array[',\n        gp_att_table[[covariate]]$k,\n        '] int b_idx_',\n        gp_names,\n        '; // gp basis coefficient indices\\n'\n      )\n    )\n    gp_idx_data <- list(coef_indices)\n    names(gp_idx_data) <- paste0('b_idx_', gp_names)\n    model_data <- append(model_data, gp_idx_data)\n  }\n\n  # Add the GP attribute table and mock brmsfit object to the mgcv_model\n  attr(mgcv_model, 'gp_att_table') <- gp_att_table\n  attr(mgcv_model, 'brms_mock') <- brms_mock\n\n  # Assign GP labels to smooths\n  gp_assign <- data.frame(\n    label = unlist(purrr::map(gp_att_table, 'name')),\n    first.para = unlist(purrr::map(gp_att_table, 'first_coef')),\n    last.para = unlist(purrr::map(gp_att_table, 'last_coef')),\n    by = unlist(purrr::map(gp_att_table, 'by'))\n  )\n  for (i in seq_along(mgcv_model$smooth)) {\n    if (\n      mgcv_model$smooth[[i]]$label %in%\n        gsub('gp(', 's(', gsub(' ', '', gp_assign$label[i]), fixed = TRUE) ||\n        mgcv_model$smooth[[i]]$label %in%\n          gsub('gp(', 'ti(', gsub(' ', '', gp_assign$label[i]), fixed = TRUE) &\n          mgcv_model$smooth[[i]]$first.para %in% gp_assign$first.para\n    ) {\n      mgcv_model$smooth[[i]]$gp_term <- TRUE\n      class(mgcv_model$smooth[[i]]) <- c(\n        class(mgcv_model$smooth[[i]])[1],\n        'hilbert.smooth',\n        'mgcv.smooth'\n      )\n    } else {\n      mgcv_model$smooth[[i]]$gp_term <- FALSE\n    }\n  }\n\n  # Update smoothing parameter names and return\n  if (!missing(rho_names)) {\n    gp_names <- unlist(purrr::map(gp_att_table, 'name'))\n    gp_names_new <- vector()\n    for (i in seq_along(gp_names)) {\n      if (any(grepl(',', gp_names[i]))) {\n        gp_names_new[i] <- gsub(\n          ' ',\n          '',\n          gsub('gp(', 'ti(', gp_names[i], fixed = TRUE)\n        )\n      } else {\n        gp_names_new[i] <- gsub('gp(', 's(', gp_names[i], fixed = TRUE)\n      }\n    }\n\n    rhos_change <- list()\n    for (i in seq_along(gp_names_new)) {\n      rhos_change[[i]] <- grep(gp_names_new[i], rho_names, fixed = TRUE)\n    }\n    rho_names[c(unique(unlist(rhos_change)))] <- gsub(\n      's\\\\(|ti\\\\(',\n      'gp(',\n      rho_names[c(unique(unlist(rhos_change)))]\n    )\n  } else {\n    rho_names <- NULL\n  }\n\n  # Return\n  return(list(\n    model_data = model_data,\n    mgcv_model = mgcv_model,\n    gp_stan_lines = gp_stan_lines,\n    gp_att_table = gp_att_table,\n    rho_names\n  ))\n}\n\n#' Reduce the size of the brmsfit object\n#' @noRd\ntrim_mockbrms = function(brms_mock) {\n  brms_mock$opencl <- NULL\n  brms_mock$data.name <- NULL\n  brms_mock$algorithm <- NULL\n  brms_mock$backend <- NULL\n  brms_mock$stan_args <- NULL\n  brms_mock$model <- NULL\n  brms_mock$stan_funs <- NULL\n  brms_mock$threads <- NULL\n  brms_mock$prior <- NULL\n  brms_mock$family <- NULL\n  brms_mock$save_pars <- NULL\n  brms_mock\n}\n\n#' Extract eigenfunctions for gp() terms and pad with zeros if necessary\n#' @noRd\neigenfunc_list = function(stan_data, mock_df, by = NA, level = NA) {\n  eigenfuncs <- stan_data[which(\n    grepl('Xgp_', names(stan_data), fixed = TRUE) &\n      !grepl('_old', names(stan_data), fixed = TRUE) &\n      !grepl('_prior', names(stan_data), fixed = TRUE)\n  )]\n  # We need to pad the eigenfunctions with zeros\n  # for the observations where the by is a different level;\n  padded_eigenfuncs <- lapply(seq_along(eigenfuncs), function(x) {\n    if (!is.na(by[x])) {\n      if (!is.na(level[x])) {\n        sorted_by <- mock_df[[by[x]]]\n        full_eigens <- matrix(\n          0,\n          nrow = length(sorted_by),\n          ncol = NCOL(eigenfuncs[[x]])\n        )\n        full_eigens[\n          (seq_along(sorted_by))[\n            sorted_by == level[x]\n          ],\n        ] <- eigenfuncs[[x]]\n      } else {\n        # Numeric by variables should be multiplied by the\n        # spectral eigenfunctions\n        full_eigens <- eigenfuncs[[x]] * mock_df[[by[x]]]\n      }\n    } else {\n      full_eigens <- eigenfuncs[[x]]\n    }\n    full_eigens\n  })\n  padded_eigenfuncs\n}\n\n#' Extract eigenvalues for gp() terms\n#' @noRd\neigenval_list = function(stan_data) {\n  stan_data[which(\n    grepl('slambda_', names(stan_data), fixed = TRUE) &\n      !grepl('_old', names(stan_data), fixed = TRUE)\n  )]\n}\n\n#' Which terms are gp() terms?\n#' @noRd\nwhich_are_gp = function(formula) {\n  termlabs <- attr(terms(formula, keep.order = TRUE), 'term.labels')\n  return(grep('gp(', termlabs, fixed = TRUE))\n}\n\n#' Convert gp() terms to s() terms for initial model construction\n#' @importFrom stats drop.terms\n#' @noRd\ngp_to_s <- function(formula, data, family) {\n  # Extract details of gp() terms\n  gp_details <- get_gp_attributes(formula, data, family)\n  termlabs <- attr(terms(formula, keep.order = TRUE), 'term.labels')\n\n  # Check for offsets as well\n  off_names <- grep(\n    'offset',\n    rownames(attr(terms.formula(formula), 'factors')),\n    value = TRUE\n  )\n  if (length(off_names) > 0L) {\n    termlabs <- c(termlabs, off_names)\n  }\n\n  # Replace the gp() terms with s() for constructing the initial model\n  which_gp <- which_are_gp(formula)\n  response <- rlang::f_lhs(formula)\n  s_terms <- vector()\n  for (i in 1:NROW(gp_details)) {\n    if (!is.na(gp_details$by[i])) {\n      if (is.factor(data[[gp_details$by[i]]])) {\n        # For terms with factor by variables, constraints are in place\n        # we either need one additional\n        # value for k (for unidimensionsal terms) or must use mc = 0 for all\n        # marginals in a ti call (for multidimensional terms)\n        s_terms[i] <- paste0(\n          if (gp_details$dim[i] < 2L) {\n            's('\n          } else {\n            'ti('\n          },\n          gp_details$gp_covariates[i],\n          ', by = ',\n          gp_details$by[i],\n          ', k = ',\n          if (gp_details$dim[i] > 1L) {\n            paste0(\n              gp_details$k[i],\n              ', mc = c(',\n              paste(rep(0, gp_details$dim[i]), collapse = ', '),\n              ')'\n            )\n          } else {\n            gp_details$k[i] + 1\n          },\n          ')'\n        )\n      } else {\n        # No constraints are used when numeric by variables are in smooths,\n        # so number of coefficients will match those from the brms gp\n        s_terms[i] <- paste0(\n          if (gp_details$dim[i] < 2L) {\n            's('\n          } else {\n            'ti('\n          },\n          gp_details$gp_covariates[i],\n          ', by = ',\n          gp_details$by[i],\n          ', k = ',\n          gp_details$k[i],\n          ')'\n        )\n      }\n    } else {\n      # For terms with no by-variable, we either need one additional\n      # value for k (for unidimensionsal terms) or must use mc = 0 for all\n      # marginals in a ti call (for multidimensional terms)\n      s_terms[i] <- paste0(\n        if (gp_details$dim[i] < 2L) {\n          's('\n        } else {\n          'ti('\n        },\n        gp_details$gp_covariates[i],\n        ', k = ',\n        if (gp_details$dim[i] > 1L) {\n          paste0(\n            gp_details$k[i],\n            ', mc = c(',\n            paste(rep(0, gp_details$dim[i]), collapse = ', '),\n            ')'\n          )\n        } else {\n          gp_details$k[i] + 1\n        },\n        ')'\n      )\n    }\n\n    termlabs[which_gp[i]] <- s_terms[i]\n  }\n\n  newformula <- reformulate(termlabs, rlang::f_lhs(formula))\n  attr(newformula, '.Environment') <- attr(formula, '.Environment')\n  return(newformula)\n}\n\n#' Store attributes of the gp terms\n#' @importFrom rlang parse_expr\n#' @noRd\nget_gp_attributes = function(formula, data, family = gaussian()) {\n  gp_terms <- rownames(attr(terms(formula), 'factors'))[\n    grep('gp(', rownames(attr(terms(formula), 'factors')), fixed = TRUE)\n  ]\n\n  # Term details and default priors\n  gp_attributes <- lapply(seq_along(gp_terms), function(x) {\n    eval(rlang::parse_expr(gp_terms[x]))\n  })\n\n  gp_isos <- unlist(purrr::map(gp_attributes, 'iso'), use.names = FALSE)\n  gp_kernels <- unlist(purrr::map(gp_attributes, 'cov'), use.names = FALSE)\n  gp_cmcs <- unlist(purrr::map(gp_attributes, 'cmc'), use.names = FALSE)\n  if (any(gp_cmcs == FALSE)) {\n    rlang::warn(\n      paste0(\n        \"gp effects in mvgam cannot yet handle contrast coding\\n\",\n        \"resetting all instances of 'cmc = FALSE' to 'cmc = TRUE'\"\n      ),\n      .frequency = \"once\",\n      .frequency_id = 'gp_cmcs'\n    )\n  }\n  gp_grs <- unlist(purrr::map(gp_attributes, 'gr'), use.names = FALSE)\n  if (any(gp_grs == TRUE)) {\n    rlang::warn(\n      paste0(\n        \"gp effects in mvgam cannot yet handle autogrouping\\n\",\n        \"resetting all instances of 'gr = TRUE' to 'gr = FALSE'\"\n      ),\n      .frequency = \"once\",\n      .frequency_id = 'gp_grs'\n    )\n  }\n\n  newgp_terms <- unlist(\n    lapply(seq_along(gp_terms), function(x) {\n      lbl <- paste0(\n        'gp(',\n        paste(gp_attributes[[x]]$term, collapse = ', '),\n        if (gp_attributes[[x]]$by != 'NA') {\n          paste0(', by = ', gp_attributes[[x]]$by)\n        } else {\n          NULL\n        },\n        ', k = ',\n        gp_attributes[[x]]$k,\n        ', cov = \"',\n        gp_attributes[[x]]$cov,\n        '\", iso = ',\n        gp_attributes[[x]]$iso,\n        ', scale = ',\n        gp_attributes[[x]]$scale,\n        ', c = ',\n        gp_attributes[[x]]$c[1],\n        ', gr = FALSE, cmc = TRUE)'\n      )\n    }),\n    use.names = FALSE\n  )\n\n  gp_formula <- reformulate(newgp_terms, rlang::f_lhs(formula))\n\n  gp_def_priors <- do.call(\n    rbind,\n    lapply(seq_along(gp_terms), function(x) {\n      def_gp_prior <- suppressWarnings(brms::get_prior(\n        reformulate(newgp_terms[x], rlang::f_lhs(formula)),\n        family = family_to_brmsfam(family),\n        data = data\n      ))\n      def_gp_prior <- def_gp_prior[def_gp_prior$prior != '', ]\n      def_rho <- def_gp_prior$prior[which(def_gp_prior$class == 'lscale')]\n      def_alpha <- def_gp_prior$prior[min(which(def_gp_prior$class == 'sdgp'))]\n      if (def_alpha == '') {\n        def_alpha <- 'student_t(3, 0, 2.5);'\n      }\n      if (length(def_rho) > 1L) {\n        def_rho_1 <- def_rho[1]\n        def_rho_2 <- def_rho[2]\n        out <- data.frame(\n          def_rho = def_rho_1,\n          def_rho_2 = def_rho_2,\n          def_rho_3 = NA,\n          def_rho_4 = NA,\n          def_alpha = def_alpha\n        )\n        if (length(def_rho) > 2L) {\n          out$def_rho_3 <- def_rho[3]\n        }\n        if (length(def_rho) > 3L) out$def_rho_4 <- def_rho[4]\n      } else {\n        out <- data.frame(\n          def_rho = def_rho,\n          def_rho_2 = NA,\n          def_rho_3 = NA,\n          def_rho_4 = NA,\n          def_alpha = def_alpha\n        )\n      }\n      out\n    })\n  )\n\n  # Extract information necessary to construct the GP terms\n  gp_terms <- purrr::map(gp_attributes, 'term')\n  gp_dims <- unlist(lapply(gp_terms, length), use.names = FALSE)\n  gp_covariates <- unlist(\n    lapply(gp_terms, function(x) {\n      paste(x, collapse = ', ')\n    }),\n    use.names = FALSE\n  )\n  k <- unlist(purrr::map(gp_attributes, 'k'))\n  if (any(is.na(k))) {\n    stop('argument \"k\" must be supplied for any gp() terms', call. = FALSE)\n  }\n\n  # No longer will need boundary or scale information as\n  # brms will handle this internally\n  by <- unlist(purrr::map(gp_attributes, 'by'), use.names = FALSE)\n  if (any(by == 'NA')) {\n    by[by == 'NA'] <- NA\n  }\n\n  ret_dat <- data.frame(\n    gp_covariates,\n    dim = gp_dims,\n    kernel = gp_kernels,\n    iso = gp_isos,\n    k = k,\n    by,\n    level = NA,\n    def_alpha = gp_def_priors$def_alpha,\n    def_rho = gp_def_priors$def_rho,\n    def_rho_2 = gp_def_priors$def_rho_2,\n    def_rho_3 = gp_def_priors$def_rho_3,\n    def_rho_4 = gp_def_priors$def_rho_4\n  )\n  attr(ret_dat, 'gp_formula') <- gp_formula\n\n  # Return as a data.frame\n  return(ret_dat)\n}\n\n\n#' Clean GP names so no illegal characters are used in Stan code\n#' @noRd\nclean_gpnames = function(gp_names) {\n  gp_names_clean <- gsub(' ', '_', gp_names, fixed = TRUE)\n  gp_names_clean <- gsub('(', '_', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(')', '_', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(',', 'by', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(':', 'by', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub('.', '_', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(']', '_', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub('[', '_', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(';', '_', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(':', '_', gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(\"'\", \"\", gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(\"\\\"\", \"\", gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(\"%\", \"percent\", gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(\"[.]+\", \"_\", gp_names_clean, fixed = TRUE)\n  gp_names_clean <- gsub(\"'\", \"\", gp_names_clean, fixed = TRUE)\n  #gp_names_clean <- gsub(\"’\", \"\", gp_names_clean, fixed = TRUE)\n  gp_names_clean\n}\n\n#' Update a Stan file with GP information\n#' @noRd\nadd_gp_model_file = function(model_file, model_data, mgcv_model, gp_additions) {\n  rho_priors <- unlist(\n    purrr::map(gp_additions$gp_att_table, 'def_rho'),\n    use.names = FALSE\n  )\n  rho_2_priors <- unlist(\n    purrr::map(gp_additions$gp_att_table, 'def_rho_2'),\n    use.names = FALSE\n  )\n  rho_3_priors <- unlist(\n    purrr::map(gp_additions$gp_att_table, 'def_rho_3'),\n    use.names = FALSE\n  )\n  rho_4_priors <- unlist(\n    purrr::map(gp_additions$gp_att_table, 'def_rho_4'),\n    use.names = FALSE\n  )\n  alpha_priors <- unlist(\n    purrr::map(gp_additions$gp_att_table, 'def_alpha'),\n    use.names = FALSE\n  )\n\n  # Add data lines\n  model_file[grep(\n    'int<lower=0> ytimes[n, n_series];',\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      model_file[grep(\n        'int<lower=0> ytimes[n, n_series];',\n        model_file,\n        fixed = TRUE\n      )],\n      '\\n',\n      gp_additions$gp_stan_lines\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Replace the multi_normal_prec lines with the relevant spd function\n  gp_kernels <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'kernel'),\n    use.names = FALSE\n  )\n  gp_names <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'name'),\n    use.names = FALSE\n  )\n  gp_isos <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'iso'),\n    use.names = FALSE\n  )\n  gp_dims <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'dim'),\n    use.names = FALSE\n  )\n  orig_names <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'orig_name'),\n    use.names = FALSE\n  )\n  gp_names_clean <- clean_gpnames(gp_names)\n  s_to_remove <- list()\n  for (i in seq_along(gp_names)) {\n    i_rho_priors <- c(\n      rho_priors[i],\n      rho_2_priors[i],\n      rho_3_priors[i],\n      rho_4_priors[i]\n    )\n    i_rho_priors <- i_rho_priors[!is.na(i_rho_priors)]\n    s_name <- gsub(' ', '', orig_names[i])\n    to_replace <- grep(\n      paste0('// prior for ', s_name, '...'),\n      model_file,\n      fixed = TRUE\n    ) +\n      1\n    pattern <- \"S\\\\s*(.*?)\\\\s*\\\\[\"\n    result <- regmatches(\n      model_file[to_replace],\n      regexec(pattern, model_file[to_replace])\n    )[[1]]\n    s_to_remove[[i]] <- unique(unlist(regmatches(\n      result,\n      gregexpr(\"[[:digit:]]+\", result)\n    )))\n\n    model_file[grep(\n      paste0('// prior for ', s_name, '...'),\n      model_file,\n      fixed = TRUE\n    )] <-\n      gsub(\n        's\\\\(|ti\\\\(',\n        'gp(',\n        model_file[grep(\n          paste0('// prior for ', s_name, '...'),\n          model_file,\n          fixed = TRUE\n        )]\n      )\n\n    rho_prior_lines <- paste(\n      paste0(\n        'rho_',\n        gp_names_clean[i],\n        if (!gp_isos[i]) {\n          '[1]'\n        } else {\n          NULL\n        },\n        '[',\n        if (gp_isos[i]) {\n          1\n        } else {\n          seq(1:gp_dims[i])\n        },\n        ']',\n        ' ~ ',\n        if (gp_isos[i]) {\n          rho_priors[i]\n        } else {\n          i_rho_priors\n        },\n        ';\\n'\n      ),\n      collapse = '\\n'\n    )\n\n    model_file[to_replace] <-\n      paste0(\n        'z_',\n        gp_names_clean[i],\n        ' ~ std_normal();\\n',\n        'alpha_',\n        gp_names_clean[i],\n        ' ~ ',\n        alpha_priors[i],\n        ';\\n',\n        rho_prior_lines,\n        'b_raw[b_idx_',\n        gp_names_clean[i],\n        '] ~ std_normal();\\n'\n      )\n  }\n  b_line <- max(which(\n    grepl('b[', model_file, fixed = TRUE) &\n      grepl('] =', model_file, fixed = TRUE)\n  ))\n  b_edits <- paste0(\n    'b[b_idx_',\n    gp_names_clean,\n    add_gp_spd_calls(gp_kernels),\n    gp_names_clean,\n    ', alpha_',\n    gp_names_clean,\n    ', rho_',\n    gp_names_clean,\n    '[1])) .* z_',\n    gp_names_clean,\n    ';',\n    collapse = '\\n'\n  )\n  model_file[b_line] <- paste0(model_file[b_line], '\\n', b_edits)\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Remove un-needed penalty matrices from the model file and the\n  # model data\n  for (i in seq_along(unique(unlist(s_to_remove)))) {\n    model_data[[paste0('S', unique(unlist(s_to_remove))[i])]] <- NULL\n    model_file <- model_file[\n      -grep(\n        paste0(\n          '\\\\bmgcv smooth penalty matrix S',\n          unique(unlist(s_to_remove))[i],\n          '\\\\b'\n        ),\n        model_file\n      )\n    ]\n  }\n\n  # Add alpha, rho and z lines in parameters and model blocks\n  alpha_names <- paste(\n    paste0('real<lower=0> alpha_', gp_names_clean, ';'),\n    collapse = '\\n'\n  )\n\n  rho_names <- paste(\n    paste0(\n      'array[1] vector<lower=0>[',\n      ifelse(gp_isos, 1, gp_dims),\n      '] rho_',\n      gp_names_clean,\n      ';'\n    ),\n    collapse = '\\n'\n  )\n\n  z_names <- paste(\n    paste0('vector[k_', gp_names_clean, '] z_', gp_names_clean, ';'),\n    collapse = '\\n'\n  )\n  model_file[grep(\"vector[num_basis] b_raw;\", model_file, fixed = TRUE)] <-\n    paste0(\n      \"vector[num_basis] b_raw;\\n\\n\",\n      '// gp term sd parameters\\n',\n      alpha_names,\n      '\\n\\n// gp term length scale parameters\\n',\n      rho_names,\n      '\\n\\n// gp term latent variables\\n',\n      z_names,\n      '\\n'\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add spd_ functions from brms code\n  kerns_add <- rev(gp_kernels)\n  for (i in seq_along(kerns_add)) {\n    model_file <- add_gp_spd_funs(model_file, kerns_add[i])\n  }\n\n  return(list(model_file = model_file, model_data = model_data))\n}\n\n#' Add GP SPD functions to a stan model file\n#' @noRd\nadd_gp_spd_calls = function(kernels) {\n  kern_calls <- vector(length = length(kernels))\n  for (i in seq_along(kern_calls)) {\n    if (kernels[i] == 'exp_quad') {\n      kern_calls[i] <- '] = sqrt(spd_gp_exp_quad(l_'\n    }\n    if (kernels[i] == 'exponential') {\n      kern_calls[i] <- '] = sqrt(spd_gp_exponential(l_'\n    }\n    if (kernels[i] == 'matern32') {\n      kern_calls[i] <- '] = sqrt(spd_gp_matern32(l_'\n    }\n    if (kernels[i] == 'matern52') {\n      kern_calls[i] <- '] = sqrt(spd_gp_matern52(l_'\n    }\n  }\n  return(kern_calls)\n}\n\n#' @noRd\nadd_gp_spd_funs = function(model_file, kernel) {\n  if (kernel == 'exp_quad') {\n    if (\n      !any(grepl(\n        '/* Spectral density of a squared exponential Gaussian process',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      fun_lines <- paste0(\n        '/* Spectral density of a squared exponential Gaussian process\\n',\n        '* Args:\\n',\n        '*   x: array of numeric values of dimension NB x D\\n',\n        '*   sdgp: marginal SD parameter\\n',\n        '*   lscale: vector of length-scale parameters\\n',\n        '* Returns:\\n',\n        \"*   numeric vector of length NB of the SPD evaluated at 'x'\\n\",\n        '*/\\n',\n        'vector spd_gp_exp_quad(data array[] vector x, real sdgp, vector lscale) {\\n',\n        'int NB = dims(x)[1];\\n',\n        'int D = dims(x)[2];\\n',\n        'int Dls = rows(lscale);\\n',\n        'real constant = square(sdgp) * sqrt(2 * pi())^D;\\n',\n        'vector[NB] out;\\n',\n        'if (Dls == 1) {\\n',\n        '// one dimensional or isotropic GP\\n',\n        'real neg_half_lscale2 = -0.5 * square(lscale[1]);\\n',\n        'constant = constant * lscale[1]^D;\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * exp(neg_half_lscale2 * dot_self(x[m]));\\n',\n        '}\\n',\n        '} else {\\n',\n        '// multi-dimensional non-isotropic GP\\n',\n        'vector[Dls] neg_half_lscale2 = -0.5 * square(lscale);\\n',\n        'constant = constant * prod(lscale);\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * exp(dot_product(neg_half_lscale2, square(x[m])));\\n',\n        '}\\n',\n        '}\\n',\n        'return out;\\n',\n        '}'\n      )\n    } else {\n      fun_lines <- NULL\n    }\n  }\n\n  if (kernel %in% c('exponential', 'matern12')) {\n    if (\n      !any(grepl(\n        '/* Spectral density of an exponential Gaussian process',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      fun_lines <- paste0(\n        '/* Spectral density of an exponential Gaussian process\\n',\n        '* also known as the Matern 1/2 kernel\\n',\n        '* Args:\\n',\n        '*   x: array of numeric values of dimension NB x D\\n',\n        '*   sdgp: marginal SD parameter\\n',\n        '*   lscale: vector of length-scale parameters\\n',\n        '* Returns:\\n',\n        \"*   numeric vector of length NB of the SPD evaluated at 'x'\\n\",\n        '*/\\n',\n        'vector spd_gp_exponential(data array[] vector x, real sdgp, vector lscale) {\\n',\n        'int NB = dims(x)[1];\\n',\n        'int D = dims(x)[2];\\n',\n        'int Dls = rows(lscale);\\n',\n        'real constant = square(sdgp) *\\n',\n        '(2^D * pi()^(D / 2.0) * tgamma((D + 1.0) / 2)) / sqrt(pi());\\n',\n        'real expo = -(D + 1.0) / 2;\\n',\n        'vector[NB] out;\\n',\n        'if (Dls == 1) {\\n',\n        '// one dimensional or isotropic GP\\n',\n        'real lscale2 = square(lscale[1]);\\n',\n        'constant = constant * lscale[1]^D;\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * (1 + lscale2 * dot_self(x[m]))^expo;\\n',\n        '}\\n',\n        '} else {\\n',\n        '// multi-dimensional non-isotropic GP\\n',\n        'vector[Dls] lscale2 = square(lscale);\\n',\n        'constant = constant * prod(lscale);\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * (1 + dot_product(lscale2, square(x[m])))^expo;\\n',\n        '}\\n',\n        '}\\n',\n        'return out;\\n',\n        '}'\n      )\n    } else {\n      fun_lines <- NULL\n    }\n  }\n\n  if (kernel == 'matern32') {\n    if (\n      !any(grepl(\n        '/* Spectral density of a Matern 3/2 Gaussian process',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      fun_lines <- paste0(\n        '/* Spectral density of a Matern 3/2 Gaussian process\\n',\n        '* Args:\\n',\n        '*   x: array of numeric values of dimension NB x D\\n',\n        '*   sdgp: marginal SD parameter\\n',\n        '*   lscale: vector of length-scale parameters\\n',\n        '* Returns:\\n',\n        \"*   numeric vector of length NB of the SPD evaluated at 'x'\\n\",\n        '*/\\n',\n        'vector spd_gp_matern32(data array[] vector x, real sdgp, vector lscale) {\\n',\n        'int NB = dims(x)[1];\\n',\n        'int D = dims(x)[2];\\n',\n        'int Dls = rows(lscale);\\n',\n        'real constant = square(sdgp) *\\n',\n        '(2^D * pi()^(D / 2.0) * tgamma((D + 3.0) / 2) * 3^(3.0 / 2)) /\\n',\n        '(0.5 * sqrt(pi()));\\n',\n        'real expo = -(D + 3.0) / 2;\\n',\n        'vector[NB] out;\\n',\n        'if (Dls == 1) {\\n',\n        '// one dimensional or isotropic GP\\n',\n        'real lscale2 = square(lscale[1]);\\n',\n        'constant = constant * lscale[1]^D;\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * (3 + lscale2 * dot_self(x[m]))^expo;\\n',\n        '}\\n',\n        '} else {\\n',\n        '// multi-dimensional non-isotropic GP\\n',\n        'vector[Dls] lscale2 = square(lscale);\\n',\n        'constant = constant * prod(lscale);\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * (3 + dot_product(lscale2, square(x[m])))^expo;\\n',\n        '}\\n',\n        '}\\n',\n        'return out;\\n',\n        '}'\n      )\n    } else {\n      fun_lines <- NULL\n    }\n  }\n\n  if (kernel == 'matern52') {\n    if (\n      !any(grepl(\n        '/* Spectral density of a Matern 5/2 Gaussian process',\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      fun_lines <- paste0(\n        '/* Spectral density of a Matern 5/2 Gaussian process\\n',\n        '* Args:\\n',\n        '*   x: array of numeric values of dimension NB x D\\n',\n        '*   sdgp: marginal SD parameter\\n',\n        '*   lscale: vector of length-scale parameters\\n',\n        '* Returns:\\n',\n        \"*   numeric vector of length NB of the SPD evaluated at 'x'\\n\",\n        '*/\\n',\n        'vector spd_gp_matern52(data array[] vector x, real sdgp, vector lscale) {\\n',\n        'int NB = dims(x)[1];\\n',\n        'int D = dims(x)[2];\\n',\n        'int Dls = rows(lscale);\\n',\n        'real constant = square(sdgp) *\\n',\n        '(2^D * pi()^(D / 2.0) * tgamma((D + 5.0) / 2) * 5^(5.0 / 2)) /\\n',\n        '(0.75 * sqrt(pi()));\\n',\n        'real expo = -(D + 5.0) / 2;\\n',\n        'vector[NB] out;\\n',\n        'if (Dls == 1) {\\n',\n        '// one dimensional or isotropic GP\\n',\n        'real lscale2 = square(lscale[1]);\\n',\n        'constant = constant * lscale[1]^D;\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * (5 + lscale2 * dot_self(x[m]))^expo;\\n',\n        '}\\n',\n        '} else {\\n',\n        '// multi-dimensional non-isotropic GP\\n',\n        'vector[Dls] lscale2 = square(lscale);\\n',\n        'constant = constant * prod(lscale);\\n',\n        'for (m in 1:NB) {\\n',\n        'out[m] = constant * (5 + dot_product(lscale2, square(x[m])))^expo;\\n',\n        '}\\n',\n        '}\\n',\n        'return out;\\n',\n        '}'\n      )\n    } else {\n      fun_lines <- NULL\n    }\n  }\n\n  if (any(grepl('functions {', model_file, fixed = TRUE))) {\n    model_file[grep('functions {', model_file, fixed = TRUE)] <-\n      paste0('functions {\\n', fun_lines)\n  } else {\n    model_file[grep('Stan model code', model_file)] <-\n      paste0(\n        '// Stan model code generated by package mvgam\\n',\n        'functions {\\n',\n        fun_lines,\n        '\\n}\\n'\n      )\n  }\n\n  model_file <- readLines(textConnection(model_file), n = -1)\n}\n\n#' Evaluate Laplacian eigenfunction for a given GP basis function\n#' @noRd\nphi = function(boundary, m, centred_covariate) {\n  1 /\n    sqrt(boundary) *\n    sin((m * pi) / (2 * boundary) * (centred_covariate + boundary))\n}\n\n#' Evaluate eigenvalues for a given GP basis function\n#' @noRd\nlambda = function(boundary, m) {\n  ((m * pi) / (2 * boundary))^2\n}\n\n#' Spectral density squared exponential Gaussian Process kernel\n#' @noRd\nspd = function(alpha_gp, rho_gp, eigenvalues) {\n  (alpha_gp^2) *\n    sqrt(2 * pi) *\n    rho_gp *\n    exp(-0.5 * (rho_gp^2) * (eigenvalues^2))\n}\n\n#' @noRd\nsim_hilbert_gp = function(\n  alpha_gp,\n  rho_gp,\n  b_gp,\n  last_trends,\n  fc_times,\n  train_times,\n  mean_train_times\n) {\n  num_gp_basis <- length(b_gp)\n\n  # Get vector of eigenvalues of covariance matrix\n  eigenvalues <- vector()\n  for (m in 1:num_gp_basis) {\n    eigenvalues[m] <- lambda(\n      boundary = (5.0 / 4) *\n        (max(train_times) - min(train_times)),\n      m = m\n    )\n  }\n\n  # Get vector of eigenfunctions\n  eigenfunctions <- matrix(NA, nrow = length(fc_times), ncol = num_gp_basis)\n  for (m in 1:num_gp_basis) {\n    eigenfunctions[, m] <- phi(\n      boundary = (5.0 / 4) *\n        (max(train_times) - min(train_times)),\n      m = m,\n      centred_covariate = fc_times - mean_train_times\n    )\n  }\n\n  # Compute diagonal of covariance matrix\n  diag_SPD <- sqrt(spd(alpha_gp = alpha_gp, rho_gp = rho_gp, sqrt(eigenvalues)))\n\n  # Compute GP trend forecast\n  as.vector((diag_SPD * b_gp) %*% t(eigenfunctions))\n}\n\n#### Old gp() prepping functions; these are now redundant because\n# brms is used to evaluate gp() effects and produce the relevant\n# eigenfunctions / eigenvalues, but keeping the functions here for\n# now in case they are needed for later work ####\n\n#' #' Compute the mth eigen function of an approximate GP\n#' #' Credit to Paul Burkner from brms: https://github.com/paul-buerkner/brms/R/formula-gp.R#L289\n#' #' @noRd\n#' eigen_fun_cov_exp_quad <- function(x, m, L) {\n#'   x <- as.matrix(x)\n#'   D <- ncol(x)\n#'   stopifnot(length(m) == D, length(L) == D)\n#'   out <- vector(\"list\", D)\n#'   for (i in seq_cols(x)) {\n#'     out[[i]] <- 1 / sqrt(L[i]) *\n#'       sin((m[i] * pi) / (2 * L[i]) * (x[, i] + L[i]))\n#'   }\n#'   Reduce(\"*\", out)\n#' }\n\n#' #' Compute squared differences\n#' #' Credit to Paul Burkner from brms: https://github.com/paul-buerkner/brms/R/formula-gp.R#L241\n#' #' @param x vector or matrix\n#' #' @param x_new optional vector of matrix with the same ncol as x\n#' #' @return an nrow(x) times nrow(x_new) matrix\n#' #' @details if matrices are passed results are summed over the columns\n#' #' @noRd\n#' diff_quad <- function(x, x_new = NULL) {\n#'   x <- as.matrix(x)\n#'   if (is.null(x_new)) {\n#'     x_new <- x\n#'   } else {\n#'     x_new <- as.matrix(x_new)\n#'   }\n#'   .diff_quad <- function(x1, x2) (x1 - x2)^2\n#'   out <- 0\n#'   for (i in seq_cols(x)) {\n#'     out <- out + outer(x[, i], x_new[, i], .diff_quad)\n#'   }\n#'   out\n#' }\n\n#' #' Extended range of input data for which predictions should be made\n#' #' Credit to Paul Burkner from brms: https://github.com/paul-buerkner/brms/R/formula-gp.R#L301\n#' #' @noRd\n#' choose_L <- function(x, c) {\n#'   if (!length(x)) {\n#'     range <- 1\n#'   } else {\n#'     range <- max(1, max(x, na.rm = TRUE) - min(x, na.rm = TRUE))\n#'   }\n#'   c * range\n#' }\n\n#' #' Mean-center and scale the particular covariate of interest\n#' #' so that the maximum Euclidean distance between any two points is 1\n#' #' @noRd\n#' scale_cov <- function(data, covariate, by, level,\n#'                       mean, max_dist){\n#'   Xgp <- data[[covariate]]\n#'   if(!is.na(by) &\n#'      !is.na(level)){\n#'       Xgp <- data[[covariate]][data[[by]] == level]\n#'    }\n#'\n#'   # Compute max Euclidean distance if not supplied\n#'   if(is.na(max_dist)){\n#'     Xgp_max_dist <- sqrt(max(diff_quad(Xgp)))\n#'   } else {\n#'     Xgp_max_dist <- max_dist\n#'   }\n#'\n#'   # Scale\n#'   Xgp <- Xgp / Xgp_max_dist\n#'\n#'   # Compute mean if not supplied (after scaling)\n#'   if(is.na(mean)){\n#'     Xgp_mean <- mean(Xgp, na.rm = TRUE)\n#'   } else {\n#'     Xgp_mean <- mean\n#'   }\n#'\n#'   # Center\n#'   Xgp <- Xgp - Xgp_mean\n#'\n#'   return(list(Xgp = Xgp,\n#'               Xgp_mean = Xgp_mean,\n#'               Xgp_max_dist = Xgp_max_dist))\n#' }\n#'\n#' #' Prep GP eigenfunctions\n#' #' @noRd\n#' prep_eigenfunctions = function(data,\n#'                                covariate,\n#'                                by = NA,\n#'                                level = NA,\n#'                                k,\n#'                                boundary,\n#'                                mean = NA,\n#'                                max_dist = NA,\n#'                                scale = TRUE,\n#'                                L,\n#'                                initial_setup = FALSE){\n#'\n#'   # Extract and scale covariate (scale set to FALSE if this is a prediction\n#'   # step so that we can scale by the original training covariate values supplied\n#'   # in mean and max_dist)\n#'   covariate_cent <- scale_cov(data = data,\n#'                               covariate = covariate,\n#'                               by = by,\n#'                               level = level,\n#'                               mean = mean,\n#'                               max_dist = max_dist)$Xgp\n#'\n#'   # Construct matrix of eigenfunctions\n#'   eigenfunctions <- matrix(NA, nrow = length(covariate_cent),\n#'                            ncol = k)\n#'   if(missing(L)){\n#'     L <- choose_L(covariate_cent, boundary)\n#'   }\n#'\n#'   for(m in 1:k){\n#'     eigenfunctions[, m] <- eigen_fun_cov_exp_quad(x = matrix(covariate_cent),\n#'                                                   m = m,\n#'                                                   L = L)\n#'   }\n#'\n#'   # Multiply eigenfunctions by the 'by' variable if one is supplied\n#'   if(!is.na(by)){\n#'     if(!is.na(level)){\n#'       # no multiplying needed as this is a factor by variable,\n#'       # but we need to pad the eigenfunctions with zeros\n#'       # for the observations where the by is a different level;\n#'       # the design matrix is always sorted by time and then by series\n#'       # in mvgam\n#'       if(initial_setup){\n#'         sorted_by <- data.frame(time = data$time,\n#'                                 series = data$series,\n#'                                 byvar = data[[by]]) %>%\n#'           dplyr::arrange(time, series) %>%\n#'           dplyr::pull(byvar)\n#'       } else {\n#'         sorted_by <- data[[by]]\n#'       }\n#'\n#'       full_eigens <- matrix(0, nrow = length(data[[by]]),\n#'                             ncol = NCOL(eigenfunctions))\n#'       full_eigens[(1:length(data[[by]]))[\n#'         sorted_by == level],] <- eigenfunctions\n#'       eigenfunctions <- full_eigens\n#'     } else {\n#'       eigenfunctions <- eigenfunctions * data[[by]]\n#'     }\n#'   }\n#'   eigenfunctions\n#' }\n#'\n#' #' Prep Hilbert Basis GP covariates\n#' #' @noRd\n#' prep_gp_covariate = function(data,\n#'                              response,\n#'                              covariate,\n#'                              by = NA,\n#'                              level = NA,\n#'                              scale = TRUE,\n#'                              boundary = 5.0/4,\n#'                              k = 20,\n#'                              family = gaussian()){\n#'\n#'   # Get default gp param priors from a call to brms::get_prior()\n#'   def_gp_prior <- suppressWarnings(brms::get_prior(formula(paste0(response,\n#'                                                                   ' ~ gp(', covariate,\n#'                                                  ifelse(is.na(by), ', ',\n#'                                                         paste0(', by = ', by, ', ')),\n#'                                                  'k = ', k,\n#'                                                  ', scale = ',\n#'                                                  scale,\n#'                                                  ', c = ',\n#'                                                  boundary,\n#'                                                  ')')), data = data,\n#'                                                  family = family))\n#'   def_gp_prior <- def_gp_prior[def_gp_prior$prior != '',]\n#'   def_rho <- def_gp_prior$prior[min(which(def_gp_prior$class == 'lscale'))]\n#'   if(def_rho == ''){\n#'     def_rho <- 'inv_gamma(1.5, 5);'\n#'   }\n#'   def_alpha <- def_gp_prior$prior[min(which(def_gp_prior$class == 'sdgp'))]\n#'   if(def_alpha == ''){\n#'     def_alpha<- 'student_t(3, 0, 2.5);'\n#'   }\n#'\n#'   # Prepare the covariate\n#'   if(scale){\n#'     max_dist <- NA\n#'   } else {\n#'     max_dist <- 1\n#'   }\n#'\n#'   covariate_cent <- scale_cov(data = data,\n#'                               covariate = covariate,\n#'                               by = by,\n#'                               mean = NA,\n#'                               max_dist = max_dist,\n#'                               level = level)\n#'\n#'   covariate_mean <- covariate_cent$Xgp_mean\n#'   covariate_max_dist <- covariate_cent$Xgp_max_dist\n#'   covariate_cent <- covariate_cent$Xgp\n#'\n#'   # Construct vector of eigenvalues for GP covariance matrix; the\n#'   # same eigenvalues are always used in prediction, so we only need to\n#'   # create them when prepping the data. They will need to be included in\n#'   # the Stan data list\n#'   L <- choose_L(covariate_cent, boundary)\n#'   eigenvalues <- vector()\n#'   for(m in 1:k){\n#'     eigenvalues[m] <- sqrt(lambda(boundary = L,\n#'                                      m = m))\n#'   }\n#'\n#'   # Construct matrix of eigenfunctions; this will change depending on the values\n#'   # of the covariate, so it needs to be computed and included as data but also needs\n#'   # to be computed to make predictions\n#'   eigenfunctions <- prep_eigenfunctions(data = data,\n#'                                         covariate = covariate,\n#'                                         by = by,\n#'                                         level = level,\n#'                                         L = L,\n#'                                         k = k,\n#'                                         boundary = boundary,\n#'                                         mean = covariate_mean,\n#'                                         max_dist = covariate_max_dist,\n#'                                         scale = scale,\n#'                                         initial_setup = TRUE)\n#'\n#'   # Make attributes table using a cleaned version of the covariate\n#'   # name to ensure there are no illegal characters in the Stan code\n#'   byname <- ifelse(is.na(by), '', paste0(':', by))\n#'   covariate_name <- paste0('gp(', covariate, ')', byname)\n#'   if(!is.na(level)){\n#'     covariate_name <- paste0(covariate_name, level)\n#'   }\n#'   att_table <- list(effect = 'gp',\n#'                     name = covariate_name,\n#'                     covariate = covariate,\n#'                     by = by,\n#'                     level = level,\n#'                     k = k,\n#'                     boundary = boundary,\n#'                     L = L,\n#'                     scale = scale,\n#'                     def_rho = def_rho,\n#'                     def_alpha = def_alpha,\n#'                     mean = covariate_mean,\n#'                     max_dist = covariate_max_dist,\n#'                     eigenvalues = eigenvalues)\n#'\n#'   # Items to add to Stan data\n#'   # Number of basis functions\n#'   covariate_name <- clean_gpnames(covariate_name)\n#'   data_lines <- paste0('int<lower=1> k_', covariate_name,\n#'                        '; // basis functions for approximate gp\\n')\n#'   append_dat <- list(k = k)\n#'   names(append_dat) <- paste0('k_', covariate_name, '')\n#'\n#'   # Approximate GP eigenvalues\n#'   data_lines <- paste0(data_lines, paste0(\n#'     'vector[',\n#'     'k_', covariate_name,\n#'     '] l_', covariate_name, '; // approximate gp eigenvalues\\n'),\n#'     collapse = '\\n')\n#'   append_dat2 <- list(slambda = eigenvalues)\n#'   names(append_dat2) <- paste0('l_', covariate_name, '')\n#'   append_dat <- append(append_dat, append_dat2)\n#'\n#'   # Return necessary objects in a list\n#'   list(att_table = att_table,\n#'        data_lines = data_lines,\n#'        data_append = append_dat,\n#'        eigenfunctions = eigenfunctions)\n#' }\n"
  },
  {
    "path": "R/gratia_methods.R",
    "content": "#### Functions to ensure gratia methods work with mvgam, using the Enhance functionality\n# in the Description ####\n\n# Add eval_smooth and draw methods to gratia namespace\n# on load\n.onLoad <- function(libname, pkgname) {\n  if (requireNamespace(\"gratia\", quietly = TRUE)) {\n    registerS3method(\n      \"eval_smooth\",\n      \"moi.smooth\",\n      eval_smoothDotmoiDotsmooth,\n      envir = asNamespace(\"gratia\")\n    )\n    registerS3method(\n      \"eval_smooth\",\n      \"mod.smooth\",\n      eval_smoothDotmodDotsmooth,\n      envir = asNamespace(\"gratia\")\n    )\n    registerS3method(\n      \"eval_smooth\",\n      \"hilbert.smooth\",\n      eval_smoothDothilbertDotsmooth,\n      envir = asNamespace(\"gratia\")\n    )\n    registerS3method(\n      \"draw\",\n      \"mvgam\",\n      drawDotmvgam,\n      envir = asNamespace(\"gratia\")\n    )\n  }\n}\n\n#' Enhance post-processing of \\pkg{mvgam} models using \\pkg{gratia} functionality\n#'\n#' These evaluation and plotting functions exist to allow some popular `gratia`\n#' methods to work with `mvgam` or `jsdgam` models\n#'\n#' @name gratia_mvgam_enhancements\n#'\n#' @param object a fitted mvgam, the result of a call to [mvgam()]\n#'\n#' @param model a fitted `mgcv` model of clas `gam` or `bam`\n#'\n#' @param data a data frame of covariate values at which to evaluate the\n#'   model's smooth functions\n#'\n#' @param smooth a smooth object of class `\"gp.smooth\"` (returned from a model using either the\n#' `dynamic()` function or the `gp()` function) or of class `\"moi.smooth\"` or `\"mod.smooth\"`\n#' (returned from a model using the 'moi' or 'mod' basis)\n#'\n#' @param trend_effects logical specifying whether smooth terms from the `trend_formula` should\n#' be drawn. If `FALSE`, only terms from the observation formula are drawn. If `TRUE`, only\n#' terms from the `trend_formula` are drawn\n#'\n#' @param select character, logical, or numeric; which smooths to plot. If\n#'   `NULL`, the default, then all model smooths are drawn.\n#'   Character `select` matches the labels for smooths\n#'   as shown for example in the output from `summary(object)`. Logical\n#'   `select` operates as per numeric `select` in the order that smooths are\n#'   stored\n#'\n#' @param parametric logical; plot parametric terms also? Note that `select` is\n#'   used for selecting which smooths to plot. The `terms` argument is used to\n#'   select which parametric effects are plotted. The default, as with\n#'   [mgcv::plot.gam()], is to not draw parametric effects\n#'\n#' @param terms character; which model parametric terms should be drawn? The\n#'   Default of `NULL` will plot all parametric terms that can be drawn.\n#' @param residuals currently ignored for `mvgam` models\n#'\n#' @param scales character; should all univariate smooths be plotted with the\n#'   same y-axis scale? If `scales = \"free\"`, the default, each univariate\n#'   smooth has its own y-axis scale. If `scales = \"fixed\"`, a common y axis\n#'   scale is used for all univariate smooths.\n#'\n#'   Currently does not affect the y-axis scale of plots of the parametric\n#'   terms\n#'\n#' @param constant numeric; a constant to add to the estimated values of the\n#'   smooth. `constant`, if supplied, will be added to the estimated value\n#'   before the confidence band is computed\n#'\n#' @param fun function; a function that will be applied to the estimated values\n#'   and confidence interval before plotting. Can be a function or the name of a\n#'   function. Function `fun` will be applied after adding any `constant`, if\n#'   provided\n#'\n#' @param ci_level numeric between 0 and 1; the coverage of credible interval.\n#' @param n numeric; the number of points over the range of the covariate at\n#'   which to evaluate the smooth\n#'\n#' @param n_3d,n_4d numeric; the number of points over the range of last\n#'   covariate in a 3D or 4D smooth. The default is `NULL` which achieves the\n#'   standard behaviour of using `n` points over the range of all covariate,\n#'   resulting in `n^d` evaluation points, where `d` is the dimension of the\n#'   smooth. For `d > 2` this can result in very many evaluation points and slow\n#'   performance. For smooths of `d > 4`, the value of `n_4d` will be used for\n#'   all dimensions `> 4`, unless this is `NULL`, in which case the default\n#'   behaviour (using `n` for all dimensions) will be observed\n#'\n#' @param unconditional ignored for `mvgam` models as all appropriate\n#' uncertainties are already included in the posterior estimates\n#'\n#' @param overall_uncertainty ignored for `mvgam` models as all appropriate\n#' uncertainties are already included in the posterior estimates\n#'\n#' @param dist numeric; if greater than 0, this is used to determine when\n#'   a location is too far from data to be plotted when plotting 2-D smooths.\n#'   The data are scaled into the unit square before deciding what to exclude,\n#'   and `dist` is a distance within the unit square. See\n#'   [mgcv::exclude.too.far()] for further details\n#'\n#' @param rug logical; draw a rug plot at the bottom of each plot for 1-D\n#'   smooths or plot locations of data for higher dimensions.\n#' @param contour logical; should contours be draw on the plot using\n#'   [ggplot2::geom_contour()]\n#'\n#' @param grouped_by logical; should factor by smooths be drawn as one panel\n#'   per level of the factor (`FALSE`, the default), or should the individual\n#'   smooths be combined into a single panel containing all levels (`TRUE`)?\n#'\n#' @param ci_alpha numeric; alpha transparency for confidence or simultaneous\n#'   interval\n#'\n#' @param ci_col colour specification for the confidence/credible intervals\n#'   band. Affects the fill of the interval\n#'\n#' @param smooth_col colour specification for the smooth line\n#'\n#' @param resid_col colour specification for residual points. Ignored\n#'\n#' @param contour_col colour specification for contour lines\n#'\n#' @param n_contour numeric; the number of contour bins. Will result in\n#'   `n_contour - 1` contour lines being drawn. See [ggplot2::geom_contour()]\n#'\n#' @param partial_match logical; should smooths be selected by partial matches\n#'   with `select`? If `TRUE`, `select` can only be a single string to match\n#'   against\n#'\n#' @param discrete_colour a suitable colour scale to be used when plotting\n#'   discrete variables\n#'\n#' @param discrete_fill a suitable fill scale to be used when plotting\n#'   discrete variables.\n#' @param continuous_colour a suitable colour scale to be used when plotting\n#'   continuous variables\n#'\n#' @param continuous_fill a suitable fill scale to be used when plotting\n#'   continuous variables\n#'\n#' @param position Position adjustment, either as a string, or the result of a\n#'   call to a position adjustment function\n#'\n#' @param angle numeric; the angle at which the x axis tick labels are to be\n#'   drawn passed to the `angle` argument of [ggplot2::guide_axis()]\n#'\n#' @param ncol,nrow numeric; the numbers of rows and columns over which to\n#'   spread the plots\n#'\n#' @param guides character; one of `\"keep\"` (the default), `\"collect\"`, or\n#'   `\"auto\"`. Passed to [patchwork::plot_layout()]\n#'\n#' @param widths,heights The relative widths and heights of each column and\n#'   row in the grid. Will get repeated to match the dimensions of the grid. If\n#'   there is more than 1 plot and `widths = NULL`, the value of `widths` will\n#'   be set internally to `widths = 1` to accommodate plots of smooths that\n#'   use a fixed aspect ratio.=\n#'\n#' @param crs the coordinate reference system (CRS) to use for the plot. All\n#'   data will be projected into this CRS. See [ggplot2::coord_sf()] for\n#'   details\n#'\n#' @param default_crs the coordinate reference system (CRS) to use for the\n#'   non-sf layers in the plot. If left at the default `NULL`, the CRS used is\n#'   4326 (WGS84), which is appropriate for spline-on-the-sphere smooths, which\n#'   are parameterized in terms of latitude and longitude as coordinates. See\n#'   [ggplot2::coord_sf()] for more details\n#'\n#' @param lims_method character; affects how the axis limits are determined. See\n#'   [ggplot2::coord_sf()]. Be careful; in testing of some examples, changing\n#'   this to `\"orthogonal\"` for example with the chlorophyll-a example from\n#'   Simon Wood's GAM book quickly used up all the RAM in my test system and the\n#'   OS killed R. This could be incorrect usage on my part; right now the grid\n#'   of points at which SOS smooths are evaluated (if not supplied by the user)\n#'   can produce invalid coordinates for the corners of tiles as the grid is\n#'   generated for tile centres without respect to the spacing of those tiles\n#'\n#' @param wrap logical; wrap plots as a patchwork? If \\code{FALSE}, a list of\n#'   ggplot objects is returned, 1 per term plotted\n#'\n#' @param envir an environment to look up the data within\n#'\n#' @param ... additional arguments passed to other methods\n#'\n#' @details These methods allow `mvgam` models to be *Enhanced* if users have the `gratia`\n#' package installed, making available the popular `draw()` function to plot partial effects\n#' of `mvgam` smooth functions using [ggplot2::ggplot()] utilities\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' # Fit a simple GAM and draw partial effects of smooths using 'gratia'\n#' set.seed(0)\n#' dat <- mgcv::gamSim(\n#'   eg = 1,\n#'   n = 200,\n#'   scale = 2\n#' )\n#'\n#' mod <- mvgam(\n#'   formula = y ~ s(x1, bs = 'moi') +\n#'     te(x0, x2),\n#'   data = dat,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' if (require(\"gratia\")) {\n#'   gratia::draw(mod)\n#' }\n#' }\nNULL\n\n#' @rdname gratia_mvgam_enhancements\n#' @aliases draw.mvgam\n#' @export\n#'\n`drawDotmvgam` <- function(\n  object,\n  trend_effects = FALSE,\n  data = NULL,\n  select = NULL,\n  parametric = FALSE,\n  terms = NULL,\n  residuals = FALSE,\n  scales = c(\"free\", \"fixed\"),\n  ci_level = 0.95,\n  n = 100,\n  n_3d = 16,\n  n_4d = 4,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  constant = NULL,\n  fun = NULL,\n  dist = 0.1,\n  rug = TRUE,\n  contour = TRUE,\n  grouped_by = FALSE,\n  ci_alpha = 0.2,\n  ci_col = \"black\",\n  smooth_col = \"black\",\n  resid_col = \"steelblue3\",\n  contour_col = \"black\",\n  n_contour = NULL,\n  partial_match = FALSE,\n  discrete_colour = NULL,\n  discrete_fill = NULL,\n  continuous_colour = NULL,\n  continuous_fill = NULL,\n  position = \"identity\",\n  angle = NULL,\n  ncol = NULL,\n  nrow = NULL,\n  guides = \"keep\",\n  widths = NULL,\n  heights = NULL,\n  crs = NULL,\n  default_crs = NULL,\n  lims_method = \"cross\",\n  wrap = TRUE,\n  envir = environment(formula(object)),\n  ...\n) {\n  if (trend_effects) {\n    if (is.null(object$trend_call)) {\n      stop('no trend_formula exists so there are no trend-level terms to plot')\n    }\n\n    object$trend_mgcv_model <- relabel_gps(object$trend_mgcv_model)\n    object$trend_mgcv_model$call$data <- NULL\n    object$trend_mgcv_model$cmX <- object$trend_mgcv_model$coefficients\n    sm_plots <- gratia::draw(\n      object = object$trend_mgcv_model,\n      data = data,\n      select = select,\n      parametric = parametric,\n      terms = terms,\n      residuals = FALSE,\n      scales = scales,\n      ci_level = ci_level,\n      n = n,\n      n_3d = n_3d,\n      n_4d = n_4d,\n      unconditional = FALSE,\n      overall_uncertainty = FALSE,\n      constant = constant,\n      fun = fun,\n      dist = dist,\n      rug = rug,\n      contour = contour,\n      grouped_by = grouped_by,\n      ci_alpha = ci_alpha,\n      ci_col = ci_col,\n      smooth_col = smooth_col,\n      resid_col = \"steelblue3\",\n      contour_col = contour_col,\n      n_contour = n_contour,\n      partial_match = partial_match,\n      discrete_colour = discrete_colour,\n      discrete_fill = discrete_fill,\n      continuous_colour = continuous_colour,\n      continuous_fill = continuous_fill,\n      position = position,\n      angle = angle,\n      ncol = ncol,\n      nrow = nrow,\n      guides = guides,\n      widths = widths,\n      heights = heights,\n      crs = crs,\n      default_crs = default_crs,\n      lims_method = lims_method,\n      wrap = wrap,\n      envir = envir,\n      ...\n    )\n  } else {\n    object$mgcv_model <- relabel_gps(object$mgcv_model)\n    object$mgcv_model$call$data <- NULL\n    object$mgcv_model$cmX <- object$mgcv_model$coefficients\n    sm_plots <- gratia::draw(\n      object = object$mgcv_model,\n      data = data,\n      select = select,\n      parametric = parametric,\n      terms = terms,\n      residuals = FALSE,\n      scales = scales,\n      ci_level = ci_level,\n      n = n,\n      n_3d = n_3d,\n      n_4d = n_4d,\n      unconditional = FALSE,\n      overall_uncertainty = FALSE,\n      constant = constant,\n      fun = fun,\n      dist = dist,\n      rug = rug,\n      contour = contour,\n      grouped_by = grouped_by,\n      ci_alpha = ci_alpha,\n      ci_col = ci_col,\n      smooth_col = smooth_col,\n      resid_col = \"steelblue3\",\n      contour_col = contour_col,\n      n_contour = n_contour,\n      partial_match = partial_match,\n      discrete_colour = discrete_colour,\n      discrete_fill = discrete_fill,\n      continuous_colour = continuous_colour,\n      continuous_fill = continuous_fill,\n      position = position,\n      angle = angle,\n      ncol = ncol,\n      nrow = nrow,\n      guides = guides,\n      widths = widths,\n      heights = heights,\n      crs = crs,\n      default_crs = default_crs,\n      lims_method = lims_method,\n      wrap = wrap,\n      envir = envir,\n      ...\n    )\n  }\n  sm_plots\n}\n\n#' @rdname gratia_mvgam_enhancements\n#' @aliases eval_smooth.hilbert.smooth\n#' @export\neval_smoothDothilbertDotsmooth = function(\n  smooth,\n  model,\n  n = 100,\n  n_3d = NULL,\n  n_4d = NULL,\n  data = NULL,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  dist = NULL,\n  ...\n) {\n  insight::check_if_installed(\"gratia\")\n  model$cmX <- model$coefficients\n\n  # deal with data if supplied\n  data <- process_user_data_for_eval(\n    data = data,\n    model = model,\n    n = n,\n    n_3d = n_3d,\n    n_4d = n_4d,\n    id = which_smooth(\n      model,\n      gratia::smooth_label(smooth)\n    )\n  )\n\n  # by variables\n  by_var <- gratia::by_variable(smooth)\n  if (by_var == \"NA\") {\n    by_var <- NA_character_\n  }\n\n  # Compute the gp() eigenfunctions for newdata using the supplied brms_mock object\n  # Requires a dataframe of all relevant variables for the gp effects\n  mock_terms <- brms::brmsterms(attr(model, 'brms_mock')$formula)\n  terms_needed <- unique(all.vars(mock_terms$formula)[-1])\n\n  # Only use actual values of those covariates needed for this smooth\n  terms_smooth <- intersect(terms_needed, colnames(data))\n  newdata_mock <- data.frame(data[[terms_smooth[1]]])\n  if (length(terms_smooth) > 1L) {\n    for (i in 2:length(terms_smooth)) {\n      newdata_mock <- cbind(newdata_mock, data.frame(data[[terms_smooth[i]]]))\n    }\n  }\n  colnames(newdata_mock) <- terms_smooth\n  newdata_mock$.fake_gp_y <- rnorm(NROW(newdata_mock))\n\n  # Fill in other covariates as fixed values from the original data\n  other_terms <- setdiff(terms_needed, colnames(data))\n  if (length(other_terms) > 0) {\n    newdata_mock <- cbind(\n      newdata_mock,\n      do.call(\n        cbind,\n        lapply(seq_along(other_terms), function(x) {\n          df <- data.frame(\n            var = rep(model$model[[other_terms[x]]][1], NROW(newdata_mock))\n          )\n          colnames(df) <- other_terms[x]\n          df\n        })\n      )\n    )\n  }\n\n  brms_mock_data <- brms::standata(\n    attr(model, 'brms_mock'),\n    newdata = newdata_mock,\n    internal = TRUE\n  )\n\n  # Extract GP attributes\n  gp_att_table <- attr(model, 'gp_att_table')\n  bys <- unlist(purrr::map(gp_att_table, 'by'), use.names = FALSE)\n  lvls <- unlist(purrr::map(gp_att_table, 'level'), use.names = FALSE)\n\n  # Extract eigenfunctions for each gp effect\n  eigenfuncs <- eigenfunc_list(\n    stan_data = brms_mock_data,\n    mock_df = newdata_mock,\n    by = bys,\n    level = lvls\n  )\n\n  # Which GP term are we plotting?\n  gp_covariate <- smooth$term\n  level <- ifelse(is.null(smooth$by.level), NA, smooth$by.level)\n  gp_names <- gsub(' ', '', unlist(purrr::map(gp_att_table, 'name')))\n  if (!is.na(level)) {\n    gp_select <- which(\n      gp_names == smooth$label &\n        unlist(purrr::map(gp_att_table, 'level')) == level\n    )\n  } else {\n    gp_select <- which(\n      gp_names == smooth$label &\n        which(bys %in% by_var)\n    )\n  }\n\n  # Compute eigenfunctions for this GP term\n  X <- eigenfuncs[[gp_select]]\n\n  # Extract mean coefficients\n  start <- purrr::map(gp_att_table, 'first_coef')[[gp_select]]\n  end <- purrr::map(gp_att_table, 'last_coef')[[gp_select]]\n  betas <- model$coefficients[start:end]\n  fit <- as.vector(X %*% betas)\n\n  ## want full vcov for component-wise CI\n  V <- model$Vp\n\n  ## variables for component-wise CIs for smooths\n  column_means <- model[[\"cmX\"]]\n  lcms <- length(column_means)\n  nc <- ncol(V)\n  meanL1 <- smooth[[\"meanL1\"]]\n  eta_idx <- lss_eta_index(model)\n  para.seq <- start:end\n\n  if (isTRUE(overall_uncertainty) && attr(smooth, \"nCons\") > 0L) {\n    if (lcms < nc) {\n      column_means <- c(column_means, rep(0, nc - lcms))\n    }\n    Xcm <- matrix(column_means, nrow = nrow(X), ncol = nc, byrow = TRUE)\n    if (!is.null(meanL1)) {\n      Xcm <- Xcm / meanL1\n    }\n    Xcm[, para.seq] <- X\n    # only apply the uncertainty from linear predictors of which this smooth\n    # is a part of\n    idx <- vapply(\n      eta_idx,\n      function(i, beta) any(beta %in% i),\n      FUN.VALUE = logical(1L),\n      beta = para.seq\n    )\n    idx <- unlist(eta_idx[idx])\n    rs <- rowSums(\n      (Xcm[, idx, drop = FALSE] %*%\n        V[idx, idx, drop = FALSE]) *\n        Xcm[, idx, drop = FALSE]\n    )\n  } else {\n    rs <- rowSums((X %*% V[para.seq, para.seq, drop = FALSE]) * X)\n  }\n\n  ## standard error of the estimate\n  se.fit <- sqrt(pmax(0, rs))\n\n  # convert to the gratia tidy format\n  label <- smooth$label\n\n  ## identify which vars are needed for this smooth...\n  keep_vars <- c(smooth$term, smooth$by)\n  keep_vars <- keep_vars[!keep_vars %in% 'NA']\n\n  ## ... then keep only those vars\n  data <- dplyr::select(data, dplyr::all_of(keep_vars))\n\n  ## tibble object\n  tbl <- tibble::tibble(\n    .smooth = rep(label, nrow(X)),\n    .estimate = fit,\n    .se = se.fit\n  )\n\n  ## bind on the data\n  tbl <- dplyr::bind_cols(tbl, data)\n\n  ## nest all columns with varying data\n  eval_sm <- tidyr::nest(\n    tbl,\n    data = tidyr::all_of(c(\".estimate\", \".se\", names(data)))\n  )\n\n  ## add on info regarding by variable\n  eval_sm <- add_by_var_column(eval_sm, by_var = by_var)\n\n  ## add on spline type info\n  eval_sm <- add_smooth_type_column(eval_sm, sm_type = \"GP\")\n\n  # set some values to NA if too far from the data\n  if (gratia::smooth_dim(smooth) == 2L && (!is.null(dist) && dist > 0)) {\n    eval_sm <- gratia::too_far_to_na(\n      smooth,\n      input = eval_sm,\n      reference = model[[\"model\"]],\n      cols = c(\".estimate\", \".se\"),\n      dist = dist\n    )\n  }\n\n  return(eval_sm)\n}\n\n#' @rdname gratia_mvgam_enhancements\n#' @aliases eval_smooth.mod.smooth\n#' @export\neval_smoothDotmodDotsmooth = function(\n  smooth,\n  model,\n  n = 100,\n  n_3d = NULL,\n  n_4d = NULL,\n  data = NULL,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  dist = NULL,\n  ...\n) {\n  insight::check_if_installed(\"gratia\")\n  model$cmX <- model$coefficients\n\n  ## deal with data if supplied\n  data <- process_user_data_for_eval(\n    data = data,\n    model = model,\n    n = n,\n    n_3d = n_3d,\n    n_4d = n_4d,\n    id = which_smooth(\n      model,\n      gratia::smooth_label(smooth)\n    )\n  )\n\n  by_var <- gratia::by_variable(smooth) # even if not a by as we want NA later\n  if (by_var == \"NA\") {\n    by_var <- NA_character_\n  }\n\n  ## values of spline at data\n  eval_sm <- gratia::spline_values(\n    smooth,\n    data = data,\n    unconditional = unconditional,\n    model = model,\n    overall_uncertainty = overall_uncertainty\n  )\n\n  ## add on info regarding by variable\n  eval_sm <- add_by_var_column(eval_sm, by_var = by_var)\n  ## add on spline type info\n  eval_sm <- add_smooth_type_column(eval_sm, sm_type = \"Mono dec P spline\")\n\n  # set some values to NA if too far from the data\n  if (gratia::smooth_dim(smooth) == 2L && (!is.null(dist) && dist > 0)) {\n    eval_sm <- gratia::too_far_to_na(\n      smooth,\n      input = eval_sm,\n      reference = model[[\"model\"]],\n      cols = c(\".estimate\", \".se\"),\n      dist = dist\n    )\n  }\n  ## return\n  eval_sm\n}\n\n#' @rdname gratia_mvgam_enhancements\n#' @aliases eval_smooth.moi.smooth\n#' @export\neval_smoothDotmoiDotsmooth = function(\n  smooth,\n  model,\n  n = 100,\n  n_3d = NULL,\n  n_4d = NULL,\n  data = NULL,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  dist = NULL,\n  ...\n) {\n  insight::check_if_installed(\"gratia\")\n  model$cmX <- model$coefficients\n\n  ## deal with data if supplied\n  data <- process_user_data_for_eval(\n    data = data,\n    model = model,\n    n = n,\n    n_3d = n_3d,\n    n_4d = n_4d,\n    id = which_smooth(\n      model,\n      gratia::smooth_label(smooth)\n    )\n  )\n\n  by_var <- gratia::by_variable(smooth) # even if not a by as we want NA later\n  if (by_var == \"NA\") {\n    by_var <- NA_character_\n  }\n\n  ## values of spline at data\n  eval_sm <- gratia::spline_values(\n    smooth,\n    data = data,\n    unconditional = unconditional,\n    model = model,\n    overall_uncertainty = overall_uncertainty\n  )\n\n  ## add on info regarding by variable\n  eval_sm <- add_by_var_column(eval_sm, by_var = by_var)\n  ## add on spline type info\n  eval_sm <- add_smooth_type_column(eval_sm, sm_type = \"Mono inc P spline\")\n\n  # set some values to NA if too far from the data\n  if (gratia::smooth_dim(smooth) == 2L && (!is.null(dist) && dist > 0)) {\n    eval_sm <- gratia::too_far_to_na(\n      smooth,\n      input = eval_sm,\n      reference = model[[\"model\"]],\n      cols = c(\".estimate\", \".se\"),\n      dist = dist\n    )\n  }\n  ## return\n  eval_sm\n}\n\n#' Utility functions; full credit goes to Gavin Simpson, the developer and\n#' maintainer of the gratia package\n#' @noRd\n`is.gamm` <- function(object) {\n  inherits(object, \"gamm\")\n}\n\n#' @noRd\n`is.gamm4` <- function(object) {\n  is.list(object) & (!is.null(object[[\"gam\"]]))\n}\n\n#' @noRd\n`is.gam` <- function(object) {\n  inherits(object, \"gam\")\n}\n\n#' @noRd\n`is.bam` <- function(object) {\n  inherits(object, \"bam\")\n}\n\n#' @noRd\n`which_smooth` <- function(object, term) {\n  if (is.gamm(object) || is.gamm4(object)) {\n    object <- object[[\"gam\"]]\n  }\n  smooths <- gratia::smooths(object)\n  which(term == smooths)\n}\n\n#' @noRd\n`process_user_data_for_eval` <- function(\n  data,\n  model,\n  n,\n  n_3d,\n  n_4d,\n  id,\n  var_order = NULL\n) {\n  if (is.null(data)) {\n    data <- gratia::smooth_data(\n      model = model,\n      n = n,\n      n_3d = n_3d,\n      n_4d = n_4d,\n      id = id,\n      var_order = var_order\n    )\n  } else {\n    smooth <- gratia::get_smooths_by_id(model, id)[[1L]]\n    vars <- smooth_variable(smooth)\n    by_var <- gratia::by_variable(smooth)\n    if (!identical(by_var, \"NA\")) {\n      vars <- append(vars, by_var)\n    }\n    ## if this is a by variable, filter the by variable for the required\n    ## level now\n    if (gratia::is_factor_by_smooth(smooth)) {\n      data <- data %>%\n        dplyr::filter(.data[[by_var]] == gratia::by_level(smooth))\n    }\n  }\n  data\n}\n\n#' @noRd\n`add_by_var_column` <- function(object, by_var, n = NULL) {\n  if (is.null(n)) {\n    n <- NROW(object)\n  }\n  insight::check_if_installed(\"tibble\")\n  tibble::add_column(object, .by = rep(by_var, times = n), .after = 1L)\n}\n\n#' @noRd\n`add_smooth_type_column` <- function(object, sm_type, n = NULL) {\n  if (is.null(n)) {\n    n <- NROW(object)\n  }\n  insight::check_if_installed(\"tibble\")\n  tibble::add_column(object, .type = rep(sm_type, times = n), .after = 1L)\n}\n\n#' @noRd\nlss_eta_index <- function(object) {\n  function(object) {\n    lpi <- attr(formula(object), \"lpi\")\n    if (is.null(lpi)) {\n      lpi <- list(seq_along(coef(object)))\n    }\n    attr(lpi, \"overlap\") <- NULL\n    lpi\n  }\n}\n\n#' @noRd\nsmooth_variable <- function(smooth) {\n  gratia::check_is_mgcv_smooth(smooth)\n  smooth[[\"term\"]]\n}\n"
  },
  {
    "path": "R/hindcast.mvgam.R",
    "content": "#'@title Extract hindcasts for a fitted \\code{mvgam} object\n#'@name hindcast.mvgam\n#'@importFrom stats predict\n#'@inheritParams predict.mvgam\n#'@param ... Ignored\n#'@details Posterior hindcasts (i.e. retrodictions) are drawn from the fitted \\code{mvgam} and\n#'organized into a convenient format for plotting\n#'@return An object of class \\code{mvgam_forecast} containing hindcast distributions.\n#'See \\code{\\link{mvgam_forecast-class}} for details.\n#'\n#'@seealso [plot.mvgam_forecast()], [summary.mvgam_forecast()],\n#'[forecast.mvgam()], [fitted.mvgam()], [predict.mvgam()]\n#'@export\nhindcast <- function(object, ...) {\n  UseMethod(\"hindcast\", object)\n}\n\n#'@rdname hindcast.mvgam\n#'@method hindcast mvgam\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(n_series = 3, trend_model = AR())\n#' mod <- mvgam(y ~ s(season, bs = 'cc'),\n#'              trend_model = AR(),\n#'              noncentred = TRUE,\n#'              data = simdat$data_train,\n#'              chains = 2,\n#'              silent = 2)\n#'\n#' # Hindcasts on response scale\n#' hc <- hindcast(mod)\n#' str(hc)\n#' head(summary(hc), 12)\n#' plot(hc, series = 1)\n#' plot(hc, series = 2)\n#' plot(hc, series = 3)\n#'\n#' # Hindcasts as expectations\n#' hc <- hindcast(mod, type = 'expected')\n#' head(summary(hc), 12)\n#' plot(hc, series = 1)\n#' plot(hc, series = 2)\n#' plot(hc, series = 3)\n#'\n#' # Estimated latent trends\n#' hc <- hindcast(mod, type = 'trend')\n#' head(summary(hc), 12)\n#' plot(hc, series = 1)\n#' plot(hc, series = 2)\n#' plot(hc, series = 3)\n#' }\n#'@export\nhindcast.mvgam = function(object, type = 'response', ...) {\n  # Check arguments\n  series <- 'all'\n  type <- match.arg(\n    arg = type,\n    choices = c(\n      \"link\",\n      \"response\",\n      \"trend\",\n      \"expected\",\n      \"latent_N\",\n      \"detection\"\n    )\n  )\n\n  data_train <- object$obs_data\n  data_train <- validate_series_time(\n    data_train,\n    trend_model = attr(object$model_data, 'trend_model')\n  )\n  last_train <- max(data_train$index..time..index) -\n    (min(data_train$index..time..index) - 1)\n\n  n_series <- NCOL(object$ytimes)\n  n_predcols <- dim(mcmc_chains(object$model_output, 'ypred'))\n  ends <- seq(0, n_predcols[2], length.out = NCOL(object$ytimes) + 1)\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n  ends <- ends[-1]\n\n  # Extract hindcasts for storing in the returned object\n  series_hcs <- lapply(seq_len(n_series), function(series) {\n    to_extract <- switch(\n      type,\n      'link' = 'mus',\n      'expected' = 'mus',\n      'response' = 'ypred',\n      'trend' = 'trend',\n      'latent_N' = 'mus',\n      'detection' = 'mus'\n    )\n    if (object$family == 'nmix' & type == 'link') {\n      to_extract <- 'trend'\n    }\n\n    if (object$fit_engine == 'stan') {\n      preds <- mcmc_chains(object$model_output, to_extract)[,\n        seq(series, n_predcols[2], by = n_series),\n        drop = FALSE\n      ][, 1:last_train]\n    } else {\n      preds <- mcmc_chains(object$model_output, to_extract)[,\n        starts[series]:ends[series],\n        drop = FALSE\n      ][, 1:last_train]\n    }\n\n    if (object$family == 'nmix' & type == 'link') {\n      preds <- exp(preds)\n    }\n\n    if (type %in% c('expected', 'latent_N', 'detection')) {\n      # Extract family-specific parameters for this series\n      family_pars <- extract_family_pars(object = object)\n      par_extracts <- lapply(seq_along(family_pars), function(j) {\n        if (is.matrix(family_pars[[j]])) {\n          as.vector(matrix(\n            rep(as.vector(family_pars[[j]][, series]), NCOL(preds)),\n            nrow = NROW(preds),\n            byrow = FALSE\n          ))\n        } else {\n          as.vector(matrix(\n            rep(family_pars[[j]], NCOL(preds)),\n            nrow = NROW(preds),\n            byrow = FALSE\n          ))\n        }\n      })\n      names(par_extracts) <- names(family_pars)\n\n      # Add trial information if this is a Binomial model\n      if (object$family %in% c('binomial', 'beta_binomial')) {\n        trials <- as.vector(matrix(\n          rep(\n            as.vector(attr(object$mgcv_model, 'trials')[, series]),\n            NROW(preds)\n          ),\n          nrow = NROW(preds),\n          byrow = TRUE\n        ))\n        par_extracts$trials <- trials\n      }\n\n      # Compute expectations as one long vector\n      Xpmat <- matrix(as.vector(preds))\n      attr(Xpmat, 'model.offset') <- 0\n\n      if (object$family == 'nmix') {\n        preds <- mcmc_chains(object$model_output, 'detprob')[,\n          object$ytimes[1:last_train, series],\n          drop = FALSE\n        ]\n        Xpmat <- matrix(qlogis(as.vector(preds)))\n        attr(Xpmat, 'model.offset') <- 0\n        latent_lambdas <- as.vector(mcmc_chains(object$model_output, 'trend')[,\n          seq(series, n_predcols[2], by = n_series),\n          drop = FALSE\n        ][, 1:last_train])\n\n        latent_lambdas <- exp(latent_lambdas)\n        cap <- as.vector(t(replicate(\n          n_predcols[1],\n          object$obs_data$cap[which(\n            as.numeric(object$obs_data$series) == series\n          )]\n        )))\n      } else {\n        latent_lambdas <- NULL\n        cap <- NULL\n      }\n\n      if (type == 'latent_N') {\n        preds <- mcmc_chains(object$model_output, 'latent_ypred')[,\n          seq(series, n_predcols[2], by = n_series),\n          drop = FALSE\n        ][, 1:last_train]\n      } else {\n        preds <- matrix(\n          as.vector(mvgam_predict(\n            family = object$family,\n            Xp = Xpmat,\n            latent_lambdas = latent_lambdas,\n            cap = cap,\n            type = type,\n            betas = 1,\n            family_pars = par_extracts\n          )),\n          nrow = NROW(preds)\n        )\n      }\n    }\n    preds\n  })\n  names(series_hcs) <- levels(data_train$series)\n\n  series_obs <- lapply(seq_len(n_series), function(series) {\n    s_name <- levels(data_train$series)[series]\n    data.frame(\n      series = data_train$series,\n      time = data_train$index..time..index,\n      y = data_train$y\n    ) %>%\n      dplyr::filter(series == s_name) %>%\n      dplyr::arrange(time) %>%\n      dplyr::pull(y)\n  })\n  names(series_obs) <- levels(data_train$series)\n\n  series_train_times <- lapply(seq_len(n_series), function(series) {\n    s_name <- levels(data_train$series)[series]\n    data.frame(\n      series = data_train$series,\n      time = data_train$time,\n      y = data_train$y\n    ) %>%\n      dplyr::filter(series == s_name) %>%\n      dplyr::arrange(time) %>%\n      dplyr::pull(time)\n  })\n  names(series_train_times) <- levels(data_train$series)\n\n  series_fcs <- structure(\n    list(\n      call = object$call,\n      trend_call = object$trend_call,\n      family = object$family,\n      trend_model = object$trend_model,\n      drift = object$drift,\n      use_lv = object$use_lv,\n      fit_engine = object$fit_engine,\n      type = type,\n      series_names = levels(data_train$series),\n      train_observations = series_obs,\n      train_times = series_train_times,\n      test_observations = NULL,\n      test_times = NULL,\n      hindcasts = series_hcs,\n      forecasts = NULL\n    ),\n    class = 'mvgam_forecast'\n  )\n  return(series_fcs)\n}\n"
  },
  {
    "path": "R/how_to_cite.R",
    "content": "#' Generate a methods description for \\pkg{mvgam} models\n#'\n#' Create a brief but fully referenced methods description, along with a useful\n#' list of references, for fitted \\code{mvgam} and \\code{jsdgam} models.\n#'\n#' @name how_to_cite.mvgam\n#'\n#' @param object \\code{list} object of class \\code{mvgam} resulting from a call\n#' to [mvgam()] or [jsdgam()]\n#'\n#' @param ... ignored\n#'\n#' @details This function uses the model's structure to come up with a very\n#' basic but hopefully useful methods description that can help users to\n#' appropriately acknowledge the hard work of developers and champion open\n#' science. Please do not consider the text returned by this function to be a\n#' completely adequate methods section; it is only meant to get you started.\n#'\n#' @return An object of class \\code{how_to_cite} containing a text description\n#' of the methods as well as lists of both primary and additional references.\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso \\code{\\link[utils]{citation}}, \\code{\\link{mvgam}},\n#' \\code{\\link{jsdgam}}\n#'\n#' @examples\n#' \\dontrun{\n#' #--------------------------------------------------\n#' # Simulate 4 time series with hierarchical seasonality\n#' # and a VAR(1) dynamic process\n#' #--------------------------------------------------\n#' set.seed(0)\n#'\n#' simdat <- sim_mvgam(\n#'   seasonality = 'hierarchical',\n#'   trend_model = VAR(cor = TRUE),\n#'   family = gaussian()\n#' )\n#'\n#' # Fit an appropriate model\n#' mod1 <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   data = simdat$data_train,\n#'   family = gaussian(),\n#'   trend_model = VAR(cor = TRUE),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' how_to_cite(mod1)\n#'\n#' #--------------------------------------------------\n#' # For a GP example, simulate data using the mgcv package\n#' #--------------------------------------------------\n#' dat <- mgcv::gamSim(1, n = 30, scale = 2)\n#'\n#' # Fit a model that uses an approximate GP from brms\n#' mod2 <- mvgam(\n#'   y ~ gp(x2, k = 12),\n#'   data = dat,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' how_to_cite(mod2)\n#' }\n#'\n#'@export\nhow_to_cite <- function(object, ...) {\n  UseMethod(\"how_to_cite\", object)\n}\n\n#'@export\n#'@export\nprint.how_to_cite = function(x, ...) {\n  cat(\"Methods text skeleton\\n\")\n  cat(insight::format_message(x$methods_text))\n  cat('\\n')\n\n  cat(\"\\nPrimary references\\n\")\n  for (i in seq_along(x$citations)) {\n    cat(insight::format_message(x$citations[[i]]))\n    cat('\\n')\n  }\n\n  cat(\"\\nOther useful references\\n\")\n  for (i in seq_along(x$other_citations)) {\n    cat(insight::format_message(x$other_citations[[i]]))\n    cat('\\n')\n  }\n\n  invisible(x)\n}\n\n#'@rdname how_to_cite.mvgam\n#'@method how_to_cite mvgam\n#'@export\nhow_to_cite.mvgam <- function(object, ...) {\n  current_year <- format(Sys.Date(), \"%Y\")\n  citations <- vector(mode = 'list')\n\n  # mvgam-specific methods\n  mvgam_text <- paste0(\n    \"We used the R package mvgam (version \",\n    utils::packageVersion(\"mvgam\"),\n    \"; Clark & Wells, 2023) to construct, fit and interrogate the model.\",\n    \" mvgam fits Bayesian State-Space models that can include flexible\",\n    \" predictor effects in both the process and observation components\",\n    \" by incorporating functionalities from the brms (Burkner 2017),\",\n    \" mgcv (Wood 2017) and splines2 (Wang & Yan, 2023) packages.\"\n  )\n\n  citations[[\n    1\n  ]] <- \"Clark, NJ and Wells K (2023). Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series. Methods in Ecology and Evolution, 14, 771-784. doi.org/10.1111/2041-210X.13974\"\n  citations[[\n    2\n  ]] <- \"Burkner, PC (2017). brms: An R Package for Bayesian Multilevel Models Using Stan. Journal of Statistical Software, 80(1), 1-28. doi:10.18637/jss.v080.i01\"\n  citations[[\n    3\n  ]] <- \"Wood, SN (2017). Generalized Additive Models: An Introduction with R (2nd edition). Chapman and Hall/CRC.\"\n  citations[[\n    4\n  ]] <- \"Wang W and Yan J (2021). Shape-Restricted Regression Splines with R Package splines2. Journal of Data Science, 19(3), 498-517. doi:10.6339/21-JDS1020 https://doi.org/10.6339/21-JDS1020.\"\n\n  # Any specials; first check whether this model used a VAR / VARMA process\n  specials_text <- NULL\n  trend_model <- attr(object$model_data, 'trend_model')\n  if (\n    trend_model %in%\n      c(\n        'VAR',\n        'VARcor',\n        'VARhiercor',\n        'VAR1',\n        'VAR1cor',\n        'VAR1hiercor',\n        'VARMA',\n        'VARMAcor',\n        'VARMA1,1cor'\n      )\n  ) {\n    specials_text <- c(\n      specials_text,\n      \" To encourage stability and prevent forecast variance from increasing indefinitely, we enforced stationarity of the Vector Autoregressive process following methods described by Heaps (2023) and Clark et al. (2025).\"\n    )\n    citations <- append(\n      citations,\n      list(\n        \"Heaps, SE (2023). Enforcing stationarity through the prior in vector autoregressions. Journal of Computational and Graphical Statistics 32, 74-83.\"\n      )\n    )\n    citations <- append(\n      citations,\n      list(\n        \"Clark NJ, Ernest SKM, Senyondo H, Simonis J, White EP, Yenni GM, Karunarathna KANK (2025). Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability. PeerJ 13:e18929.\"\n      )\n    )\n  }\n\n  # Check for approximate GPs\n  if (\n    !is.null(attr(object$mgcv_model, 'gp_att_table')) |\n      !is.null(attr(object$trend_mgcv_model, 'gp_att_table')) |\n      trend_model == 'GP'\n  ) {\n    specials_text <- c(\n      specials_text,\n      \" Gaussian Process functional effects were estimated using a low-rank Hilbert space approximation following methods described by Riutort-Mayol et al. (2023).\"\n    )\n    citations <- append(\n      citations,\n      list(\n        \"Riutort-Mayol G, Burkner PC, Andersen MR, Solin A and Vehtari A (2023). Practical Hilbert space approximate Bayesian Gaussian processes for probabilistic programming. Statistics and Computing 33, 1. https://doi.org/10.1007/s11222-022-10167-2\"\n      )\n    )\n  }\n\n  # Check for piecewise trends\n  if (\n    trend_model %in%\n      c('PWlogistic', 'PWlinear')\n  ) {\n    specials_text <- c(\n      specials_text,\n      \" Piecewise dynamic trends were parameterized and estimated following methods described by Taylor and Letham (2018).\"\n    )\n    citations <- append(\n      citations,\n      list(\n        \"Taylor S and Letham B (2018). Forecasting at scale. The American Statistician 72(1) 37-45. https://doi.org/10.1080/00031305.2017.1380080\"\n      )\n    )\n  }\n\n  # Was this a jsdgam?\n  if (inherits(object, 'jsdgam')) {\n    specials_text <- c(\n      specials_text,\n      \" To ensure identifiability of factors, factor loadings were constrained following Lopes & West (2004).\"\n    )\n    citations <- append(\n      citations,\n      list(\n        \"Lopes HF and West M (2014). Bayesian model assessment in factor analysis. Statistica Sinica 14(1) 41-67. https://www.jstor.org/stable/24307179\"\n      )\n    )\n  }\n\n  # Stan-specific methods\n  citations <- append(\n    citations,\n    list(\n      \"Carpenter B, Gelman A, Hoffman MD, Lee D, Goodrich B, Betancourt M, Brubaker M, Guo J, Li P and Riddell A (2017). Stan: A probabilistic programming language. Journal of Statistical Software 76.\"\n    )\n  )\n\n  stan_text <-\n    paste0(\n      \" The mvgam-constructed model and observed data\",\n      \" were passed to the probabilistic programming environment Stan\"\n    )\n\n  if (object$backend == 'cmdstanr') {\n    stan_text <- paste0(\n      stan_text,\n      \" (version \",\n      cmdstanr::cmdstan_version(),\n      \"; Carpenter et al. 2017, Stan Development Team \",\n      current_year,\n      \"), specifically through the cmdstanr interface (Gabry & Cesnovar, 2021).\"\n    )\n    citations <- append(\n      citations,\n      list(paste0(\n        \"Gabry J, Cesnovar R, Johnson A, and Bronder S (\",\n        current_year,\n        \"). cmdstanr: R Interface to 'CmdStan'. https://mc-stan.org/cmdstanr/, https://discourse.mc-stan.org.\"\n      ))\n    )\n  } else {\n    stan_text <- paste0(\n      stan_text,\n      \" (version \",\n      rstan::stan_version(),\n      \"; Carpenter et al. 2017)\",\n      \", specifically through the rstan interface (Stan Development Team \",\n      current_year,\n      \")\"\n    )\n    citations <- append(\n      citations,\n      list(paste0(\n        \"Stan Development Team (\",\n        current_year,\n        \"). RStan: the R interface to Stan. R package version \",\n        utils::packageVersion(\"rstan\"),\n        \". https://mc-stan.org/.\"\n      ))\n    )\n  }\n\n  if (object$algorithm == 'sampling') {\n    stan_text <- paste0(\n      stan_text,\n      \" We ran \",\n      object$model_output@sim$chains,\n      \" Hamiltonian Monte Carlo chains for \",\n      object$model_output@sim$warmup,\n      \" warmup iterations and \",\n      object$model_output@sim$iter - object$model_output@sim$warmup,\n      \" sampling iterations for joint posterior estimation.\",\n      \" Rank normalized split Rhat (Vehtari et al. 2021) and effective\",\n      \" sample sizes were used to monitor convergence.\"\n    )\n    citations <- append(\n      citations,\n      list(\n        \"Vehtari A, Gelman A, Simpson D, Carpenter B, and Burkner P (2021). Rank-normalization, folding, and localization: An improved Rhat for assessing convergence of MCMC (with discussion). Bayesian Analysis 16(2) 667-718. https://doi.org/10.1214/20-BA1221.\"\n      )\n    )\n  }\n\n  if (object$algorithm %in% c('meanfield', 'fullrank')) {\n    stan_text <- paste0(\n      stan_text,\n      \" We used Stan's Automatic Differentiation Variational Inference algorithm\",\n      \" (Kucukelbir et al. 2017) for posterior approximation, specifically using \",\n      object$algorithm,\n      \" algorithm to draw \",\n      object$model_output@sim$iter,\n      \" samples from the approximate joint posterior.\"\n    )\n    citations <- append(\n      citations,\n      list(\n        \"Kucukelbir A, Tran D, Ranganath R, Gelman A, and Blei DM (2017). Automatic Differentiation Variational Inference. Journal of Machine Learning Research 18 1-45.\"\n      )\n    )\n  }\n\n  if (object$algorithm == c('laplace')) {\n    stan_text <- paste0(\n      stan_text,\n      \" We used Stan's Laplace approximation algorithm\",\n      \" to draw \",\n      object$model_output@sim$iter,\n      \" samples from the approximate joint posterior.\"\n    )\n  }\n\n  if (object$algorithm == c('pathfinder')) {\n    stan_text <- paste0(\n      stan_text,\n      \" We used Stan's Pathfinder variational approximation algorithm (Zhang et al. 2022)\",\n      \" to draw \",\n      object$model_output@sim$iter,\n      \" samples from the approximate joint posterior.\"\n    )\n\n    citations <- append(\n      citations,\n      list(\n        \"Zhang L, Carpenter B, Gelman A, and Vehtari A (2022). Pathfinder: parallel Quasi-Newton variational inference. Journal of Machine Learning Research 23(306), 1-49. http://jmlr.org/papers/v23/21-0889.html.\"\n      )\n    )\n  }\n  # Append texts\n  all_text <- paste0(mvgam_text, specials_text, stan_text)\n\n  # List of additional, possibly very useful references\n  other_citations <- vector(mode = 'list')\n  other_citations[[\n    1\n  ]] <- \"Arel-Bundock V, Greifer N, and Heiss A (2024). How to interpret statistical models using marginaleffects for R and Python. Journal of Statistical Software, 111(9), 1-32. https://doi.org/10.18637/jss.v111.i09\"\n  other_citations[[\n    2\n  ]] <- \"Gabry J, Simpson D, Vehtari A, Betancourt M, and Gelman A (2019). Visualization in Bayesian workflow. Journal of the Royal Statatistical Society A, 182, 389-402. doi:10.1111/rssa.12378.\"\n  other_citations[[\n    3\n  ]] <- \"Vehtari A, Gelman A, and Gabry J (2017). Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC. Statistics and Computing, 27, 1413-1432. doi:10.1007/s11222-016-9696-4.\"\n  other_citations[[\n    4\n  ]] <- \"Burkner PC, Gabry J, and Vehtari A. (2020). Approximate leave-future-out cross-validation for Bayesian time series models. Journal of Statistical Computation and Simulation, 90(14), 2499-2523. https://doi.org/10.1080/00949655.2020.1783262\"\n\n  out <- structure(\n    list(\n      methods_text = all_text,\n      citations = citations,\n      other_citations = other_citations\n    ),\n    class = 'how_to_cite'\n  )\n\n  return(out)\n}\n"
  },
  {
    "path": "R/index-mvgam.R",
    "content": "#' Index \\code{mvgam} objects\n#'\n#' @aliases variables\n#'\n#' Index variables and their `mgcv` coefficient names\n#'\n#' @param x A \\code{mvgam} object or another \\R object for which\n#' the methods are defined.\n#'\n#' @param ... Arguments passed to individual methods (if applicable).\n#'\n#' @name index-mvgam\nNULL\n\n#' @rdname index-mvgam\n#'\n#' @importFrom posterior variables\n#'\n#' @param x \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @method variables mvgam\n#'\n#' @return a `list` object of the variables that can be extracted, along\n#' with their aliases\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate data and fit a model\n#' simdat <- sim_mvgam(\n#'   n_series = 1,\n#'   trend_model = AR()\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   trend_model = AR(),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract model variables\n#' variables(mod)\n#' }\n#'\n#' @export\n#' @export variables\nvariables.mvgam = function(x, ...) {\n  parnames <- dimnames(x$model_output)$parameters\n\n  # Observation distribution parameters\n  if (\n    any(grepl(\n      paste(c('sigma_obs', 'phi', 'nu', 'shape'), collapse = '|'),\n      parnames\n    ))\n  ) {\n    observation_pars <- data.frame(\n      orig_name = parnames[grepl(\n        paste(c('sigma_obs', 'phi', 'nu', 'shape'), collapse = '|'),\n        parnames\n      )],\n      alias = NA\n    )\n  } else {\n    observation_pars <- NULL\n  }\n\n  # Linear predictor parameters\n  observation_linpreds <- data.frame(\n    orig_name = parnames[\n      grepl('mus[', parnames, fixed = TRUE) &\n        !grepl('trend_mus[', parnames, fixed = TRUE)\n    ],\n    alias = NA\n  )\n\n  if (!is.null(x$trend_call) & !inherits(x, 'jsdgam')) {\n    trend_linpreds <- data.frame(\n      orig_name = parnames[grepl('trend_mus[', parnames, fixed = TRUE)],\n      alias = NA\n    )\n  } else {\n    trend_linpreds <- NULL\n  }\n\n  # Posterior predictions\n  posterior_preds <- data.frame(\n    orig_name = parnames[grepl('ypred[', parnames, fixed = TRUE)],\n    alias = NA\n  )\n\n  # Beta coefficient parameters\n  b_names <- colnames(mcmc_chains(x$model_output, 'b'))\n  mgcv_names <- names(coef(x$mgcv_model))\n  observation_betas <- data.frame(orig_name = b_names, alias = mgcv_names)\n\n  if (!is.null(x$trend_call) & !inherits(x, 'jsdgam')) {\n    b_names <- colnames(mcmc_chains(x$model_output, 'b_trend'))\n    mgcv_names <- gsub(\n      'series',\n      'trend',\n      paste0(names(coef(x$trend_mgcv_model)), '_trend')\n    )\n    trend_betas <- data.frame(orig_name = b_names, alias = mgcv_names)\n  } else {\n    trend_betas <- NULL\n  }\n\n  # Population parameters from hierarchical (random) effects\n  if (any(unlist(purrr::map(x$mgcv_model$smooth, inherits, 'random.effect')))) {\n    re_labs <- unlist(lapply(\n      purrr::map(x$mgcv_model$smooth, 'term'),\n      paste,\n      collapse = ','\n    ))[\n      unlist(purrr::map(x$mgcv_model$smooth, inherits, 'random.effect'))\n    ]\n    observation_re_params <- data.frame(\n      orig_name = c(\n        rownames(mcmc_summary(x$model_output, 'mu_raw', ISB = TRUE)),\n        rownames(mcmc_summary(x$model_output, 'sigma_raw', ISB = TRUE))\n      ),\n      alias = c(paste0('mean(', re_labs, ')'), paste0('sd(', re_labs, ')'))\n    )\n  } else {\n    observation_re_params <- NULL\n  }\n\n  trend_re_params <- NULL\n  if (!is.null(x$trend_call) & !inherits(x, 'jsdgam')) {\n    if (\n      any(unlist(purrr::map(\n        x$trend_mgcv_model$smooth,\n        inherits,\n        'random.effect'\n      )))\n    ) {\n      re_labs <- unlist(lapply(\n        purrr::map(x$trend_mgcv_model$smooth, 'term'),\n        paste,\n        collapse = ','\n      ))[\n        unlist(purrr::map(x$trend_mgcv_model$smooth, inherits, 'random.effect'))\n      ]\n      re_labs <- gsub('series', 'trend', re_labs)\n      trend_re_params <- data.frame(\n        orig_name = c(\n          rownames(mcmc_summary(x$model_output, 'mu_raw_trend', ISB = TRUE)),\n          rownames(mcmc_summary(x$model_output, 'sigma_raw_trend', ISB = TRUE))\n        ),\n        alias = c(\n          paste0('mean(', re_labs, ')_trend'),\n          paste0('sd(', re_labs, ')_trend')\n        )\n      )\n    } else {\n      trend_re_params <- NULL\n    }\n  }\n\n  # Smoothing parameters\n  if (any(grepl('rho[', parnames, fixed = TRUE))) {\n    observation_smoothpars <- data.frame(\n      orig_name = parnames[grepl('rho[', parnames, fixed = TRUE)],\n      alias = paste0(x$sp_names, '_rho')\n    )\n  } else {\n    observation_smoothpars <- NULL\n  }\n\n  if (\n    any(grepl('rho_trend[', parnames, fixed = TRUE)) & !inherits(x, 'jsdgam')\n  ) {\n    trend_smoothpars <- data.frame(\n      orig_name = parnames[grepl('rho_trend[', parnames, fixed = TRUE)],\n      alias = paste0(x$trend_sp_names, '_rho_trend')\n    )\n  } else {\n    trend_smoothpars <- NULL\n  }\n\n  # Trend state parameters\n  if (\n    any(\n      grepl('trend[', parnames, fixed = TRUE) &\n        !grepl('_trend[', parnames, fixed = TRUE)\n    ) &\n      !inherits(x, 'jsdgam')\n  ) {\n    trend_states <- grepl('trend[', parnames, fixed = TRUE) &\n      !grepl('_trend[', parnames, fixed = TRUE)\n    trends <- data.frame(orig_name = parnames[trend_states], alias = NA)\n  } else {\n    trends <- NULL\n  }\n\n  # Trend dynamics parameters\n  if (\n    any(\n      grepl(\n        paste(\n          c(\n            'sigma',\n            'alpha_gp',\n            'rho_gp',\n            'ar1',\n            'ar2',\n            'ar3',\n            'A',\n            'Sigma',\n            'error',\n            'alpha_cor',\n            'theta',\n            'k_trend',\n            'delta_trend',\n            'm_trend'\n          ),\n          collapse = '|'\n        ),\n        parnames\n      ) &\n        !grepl('sigma_obs', parnames, fixed = TRUE) &\n        !grepl('sigma_raw', parnames, fixed = TRUE)\n    )\n  ) {\n    trend_pars <- grepl(\n      paste(\n        c(\n          'sigma',\n          'alpha_gp',\n          'rho_gp',\n          'ar1',\n          'ar2',\n          'ar3',\n          'A',\n          'Sigma',\n          'error',\n          'alpha_cor',\n          'theta',\n          'k_trend',\n          'delta_trend',\n          'm_trend'\n        ),\n        collapse = '|'\n      ),\n      parnames\n    ) &\n      !grepl('sigma_obs', parnames, fixed = TRUE) &\n      !grepl('sigma_raw', parnames, fixed = TRUE)\n    trend_pars <- data.frame(orig_name = parnames[trend_pars], alias = NA)\n  } else {\n    trend_pars <- NULL\n  }\n\n  return(list(\n    observation_pars = observation_pars,\n    observation_linpreds = observation_linpreds,\n    observation_betas = observation_betas,\n    observation_smoothpars = observation_smoothpars,\n    observation_re_params = observation_re_params,\n    posterior_preds = posterior_preds,\n    trend_pars = trend_pars,\n    trend_linpreds = trend_linpreds,\n    trend_betas = trend_betas,\n    trend_smoothpars = trend_smoothpars,\n    trend_re_params = trend_re_params,\n    trends = trends\n  ))\n}\n"
  },
  {
    "path": "R/interpret_mvgam.R",
    "content": "#' Interpret the formula specified to mvgam and replace any dynamic terms\n#' with the correct Gaussian Process smooth specification\n#' @importFrom stats formula terms as.formula terms.formula\n#' @noRd\ninterpret_mvgam = function(formula, N, family) {\n  # Check for proper binomial specification\n  if (!missing(family)) {\n    if (is.character(family)) {\n      if (family == 'beta') {\n        family <- betar()\n      }\n\n      family <- try(eval(parse(text = family)), silent = TRUE)\n\n      if (inherits(family, 'try-error')) {\n        stop(\"family not recognized\", call. = FALSE)\n      }\n    }\n\n    if (is.function(family)) {\n      family <- family()\n    }\n\n    if (family$family %in% c('binomial', 'beta_binomial')) {\n      # Check that response terms use the cbind() syntax\n      resp_terms <- as.character(terms(formula(formula))[[2]])\n      if (length(resp_terms) == 1) {\n        stop(\n          'Binomial family requires cbind() syntax in the formula left-hand side',\n          call. = FALSE\n        )\n      } else {\n        if (any(grepl('cbind', resp_terms))) {} else {\n          stop(\n            'Binomial family requires cbind() syntax in the formula left-hand side',\n            call. = FALSE\n          )\n        }\n      }\n    }\n  }\n\n  facs <- colnames(attr(terms.formula(formula), 'factors'))\n\n  # Check if formula has an intercept\n  keep_intercept <- attr(terms(formula), 'intercept') == 1\n\n  # Re-arrange so that random effects always come last\n  if (any(grepl('bs = \\\"re\\\"', facs, fixed = TRUE))) {\n    newfacs <- facs[!grepl('bs = \\\"re\\\"', facs, fixed = TRUE)]\n    refacs <- facs[grepl('bs = \\\"re\\\"', facs, fixed = TRUE)]\n    int <- attr(terms.formula(formula), 'intercept')\n\n    # Preserve offset if included\n    if (!is.null(attr(terms(formula(formula)), 'offset'))) {\n      newformula <- as.formula(paste(\n        dimnames(attr(terms(formula), 'factors'))[[1]][1],\n        '~',\n        grep(\n          'offset',\n          rownames(attr(terms.formula(formula), 'factors')),\n          value = TRUE\n        ),\n        '+',\n        paste(\n          paste(newfacs, collapse = '+'),\n          '+',\n          paste(refacs, collapse = '+'),\n          collapse = '+'\n        ),\n        ifelse(int == 0, ' - 1', '')\n      ))\n    } else {\n      newformula <- as.formula(paste(\n        dimnames(attr(terms(formula), 'factors'))[[1]][1],\n        '~',\n        paste(\n          paste(newfacs, collapse = '+'),\n          '+',\n          paste(refacs, collapse = '+'),\n          collapse = '+'\n        ),\n        ifelse(int == 0, ' - 1', '')\n      ))\n    }\n  } else {\n    newformula <- formula\n  }\n\n  attr(newformula, '.Environment') <- attr(formula, '.Environment')\n\n  # Check if any terms use the gp wrapper\n  response <- terms.formula(newformula)[[2]]\n  tf <- terms.formula(newformula, specials = c(\"gp\"))\n  which_gp <- attr(tf, \"specials\")$gp\n  if (length(which_gp) != 0L) {\n    gp_details <- vector(length = length(which_gp), mode = 'list')\n    for (i in seq_along(which_gp)) {\n      gp_details[[i]] <- eval(parse(\n        text = rownames(attr(tf, \"factors\"))[which_gp[i]]\n      ))\n    }\n  }\n\n  # Check if any terms use the dynamic wrapper\n  response <- terms.formula(newformula)[[2]]\n  tf <- attr(terms.formula(newformula, keep.order = TRUE), 'term.labels')\n  which_dynamics <- grep('dynamic(', tf, fixed = TRUE)\n\n  # Update the formula to the correct Gaussian Process implementation\n  if (length(which_dynamics) != 0L) {\n    dyn_details <- vector(length = length(which_dynamics), mode = 'list')\n    if (length(which_dynamics > 1)) {\n      for (i in seq_along(which_dynamics)) {\n        dyn_details[[i]] <- eval(parse(text = tf[which_dynamics[i]]))\n      }\n    }\n\n    # k is set based on the number of timepoints available; want to ensure\n    # it is large enough to capture the expected wiggliness of the latent GP\n    # (a smaller rho will require more basis functions for accurate approximation)\n    dyn_to_gpspline = function(term, N) {\n      if (term$rho > N - 1) {\n        stop(\n          'Argument \"rho\" in dynamic() cannot be larger than (max(time) - 1)',\n          call. = FALSE\n        )\n      }\n\n      k <- term$k\n      if (is.null(k)) {\n        if (N > 8) {\n          k <- min(\n            50,\n            min(N, max(8, ceiling(N / (term$rho - (term$rho / 10)))))\n          )\n        } else {\n          k <- N\n        }\n      }\n\n      paste0(\n        \"s(time,by=\",\n        term$term,\n        \",bs='gp',m=c(\",\n        ifelse(term$stationary, '-', ''),\n        \"2,\",\n        term$rho,\n        \",2),\",\n        \"k=\",\n        k,\n        \")\"\n      )\n    }\n\n    dyn_to_gphilbert = function(term, N) {\n      k <- term$k\n      if (is.null(k)) {\n        if (N > 8) {\n          k <- min(40, min(N - 1, max(8, N - 1)))\n        } else {\n          k <- N - 1\n        }\n      }\n\n      paste0(\n        \"gp(time,by=\",\n        term$term,\n        \",c=5/4,\",\n        \"k=\",\n        k,\n        \",scale=\",\n        term$scale,\n        \")\"\n      )\n    }\n    # Replace dynamic terms with the correct specification\n    termlabs <- attr(terms(newformula, keep.order = TRUE), 'term.labels')\n    for (i in seq_along(which_dynamics)) {\n      if (is.null(dyn_details[[i]]$rho)) {\n        termlabs[which_dynamics[i]] <- dyn_to_gphilbert(dyn_details[[i]], N = N)\n      } else {\n        termlabs[which_dynamics[i]] <- dyn_to_gpspline(dyn_details[[i]], N = N)\n      }\n    }\n\n    # Return the updated formula for passing to mgcv\n    updated_formula <- reformulate(termlabs, rlang::f_lhs(newformula))\n    attr(updated_formula, '.Environment') <- attr(newformula, '.Environment')\n  } else {\n    updated_formula <- newformula\n  }\n\n  if (!keep_intercept) {\n    updated_formula <- update(updated_formula, . ~ . - 1)\n    attr(updated_formula, '.Environment') <- attr(newformula, '.Environment')\n  }\n\n  return(updated_formula)\n}\n"
  },
  {
    "path": "R/irf.mvgam.R",
    "content": "#' Calculate latent VAR impulse response functions\n#'\n#' Compute Generalized or Orthogonalized Impulse Response Functions (IRFs) from\n#' \\code{mvgam} models with Vector Autoregressive dynamics\n#'\n#' @name irf.mvgam\n#' @param object \\code{list} object of class \\code{mvgam} resulting from a call to [mvgam()]\n#' that used a Vector Autoregressive latent process model (either as `VAR(cor = FALSE)` or\n#' `VAR(cor = TRUE)`; see [VAR()] for details)\n#' @param h Positive \\code{integer} specifying the forecast horizon over which to calculate\n#' the IRF\n#' @param cumulative \\code{Logical} flag indicating whether the IRF should be cumulative\n#' @param orthogonal \\code{Logical} flag indicating whether orthogonalized IRFs should be\n#' calculated. Note that the order of the variables matters when calculating these\n#' @param ... ignored\n#' @details\n#' See \\code{\\link{mvgam_irf-class}} for a full description of the quantities that are\n#' computed and returned by this function, along with key references.\n#' @return An object of \\code{\\link{mvgam_irf-class}} containing the posterior IRFs. This\n#' object can be used with the supplied S3 functions [plot.mvgam_irf()]\n#' and [summary.mvgam_irf()]\n#' @author Nicholas J Clark\n#' @seealso \\code{\\link{mvgam_irf-class}}, [VAR()], [plot.mvgam_irf()], [stability()], [fevd()]\n#' @examples\n#' \\dontrun{\n#' # Fit a model to the portal time series that uses a latent VAR(1)\n#' mod <- mvgam(\n#'   formula = captures ~ -1,\n#'   trend_formula = ~ trend,\n#'   trend_model = VAR(cor = TRUE),\n#'   family = poisson(),\n#'   data = portal_data,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot the autoregressive coefficient distributions;\n#' # use 'dir = \"v\"' to arrange the order of facets\n#' # correctly\n#' mcmc_plot(\n#'   mod,\n#'   variable = 'A',\n#'   regex = TRUE,\n#'   type = 'hist',\n#'   facet_args = list(dir = 'v')\n#' )\n#'\n#' # Calulate Generalized IRFs for each series\n#' irfs <- irf(\n#'   mod,\n#'   h = 12,\n#'   cumulative = FALSE\n#' )\n#'\n#' # Plot them\n#' plot(irfs, series = 1)\n#' plot(irfs, series = 2)\n#' plot(irfs, series = 3)\n#' plot(irfs, series = 4)\n#'\n#' # Calculate posterior median, upper and lower 95th quantiles\n#' # of the impulse responses\n#' summary(irfs)\n#' }\n#' @export\nirf <- function(object, ...) {\n  UseMethod(\"irf\", object)\n}\n\n#' @rdname irf.mvgam\n#' @method irf mvgam\n#' @export\nirf.mvgam <- function(\n  object,\n  h = 10,\n  cumulative = FALSE,\n  orthogonal = FALSE,\n  ...\n) {\n  validate_pos_integer(h)\n  trend_model <- attr(object$model_data, \"trend_model\")\n  if (!trend_model %in% c(\"VAR\", \"VARcor\", \"VAR1\", \"VAR1cor\")) {\n    stop(\n      \"Only VAR(1) models currently supported for calculating IRFs\",\n      call. = FALSE\n    )\n  }\n  beta_vars <- mcmc_chains(object$model_output, \"A\")\n  sigmas <- mcmc_chains(object$model_output, \"Sigma\")\n  n_series <- object$n_lv\n\n  if (is.null(n_series)) {\n    n_series <- nlevels(object$obs_data$series)\n  }\n\n  all_irfs <- lapply(seq_len(NROW(beta_vars)), function(draw) {\n    # Get necessary VAR parameters into a simple list format\n    x <- list(\n      K = n_series,\n      A = matrix(\n        beta_vars[draw, ],\n        nrow = n_series,\n        ncol = n_series,\n        byrow = TRUE\n      ),\n      Sigma = matrix(\n        sigmas[draw, ],\n        nrow = n_series,\n        ncol = n_series,\n        byrow = TRUE\n      ),\n      p = 1\n    )\n\n    # Calculate the IRF\n    gen_irf(x, h = h, cumulative = cumulative, orthogonal = orthogonal)\n  })\n  class(all_irfs) <- \"mvgam_irf\"\n  attr(all_irfs, \"irf_type\") <- ifelse(\n    orthogonal,\n    \"Orthogonalized\",\n    \"Generalized\"\n  )\n  return(all_irfs)\n}\n\n#### Functions to compute Generalized Impulse Response functions\n# Much of this code is modified from R code generously provided by Clinton Watkins:\n# https://www.clintonwatkins.com/posts/2021-generalised-impulse-response-function-R/ ####\n\n#' Calculate impulse response functions\n#' @noRd\ngen_irf <- function(x, h = 6, cumulative = TRUE, orthogonal = FALSE) {\n  impulse <- paste0(\"process_\", 1:x$K)\n\n  # Create arrays to hold calculations\n  IRF_o <- array(\n    data = 0,\n    dim = c(h, x$K, x$K),\n    dimnames = list(NULL, impulse, impulse)\n  )\n  IRF_g <- array(\n    data = 0,\n    dim = c(h, x$K, x$K),\n    dimnames = list(NULL, impulse, impulse)\n  )\n  IRF_g1 <- array(data = 0, dim = c(h, x$K, x$K))\n\n  # Estimation of orthogonalised or generalised IRFs\n  if (orthogonal) {\n    var_ma <- var_psi(x, h)\n  } else {\n    var_ma <- var_phi(x, h)\n  }\n\n  sigma_u <- x$Sigma\n  P <- t(chol(sigma_u))\n  sig_jj <- diag(sigma_u)\n\n  for (jj in 1:x$K) {\n    indx_ <- matrix(0, x$K, 1)\n    indx_[jj, 1] <- 1\n\n    for (kk in 1:h) {\n      IRF_o[kk, , jj] <- var_ma[,, kk] %*% P %*% indx_ # Peseran-Shin eqn 7 (OIRF)\n      IRF_g1[kk, , jj] <- var_ma[,, kk] %*% sigma_u %*% indx_\n      IRF_g[kk, , jj] <- sig_jj[jj]^(-0.5) * IRF_g1[kk, , jj] # Peseran-Shin eqn 10 (GIRF)\n    }\n  }\n\n  if (orthogonal == TRUE) {\n    irf <- IRF_o\n  } else if (orthogonal == FALSE) {\n    irf <- IRF_g\n  } else {\n    stop(\"\\nError! Orthogonalised or generalised IRF?\\n\")\n  }\n\n  idx <- length(impulse)\n  irs <- list()\n  for (ii in 1:idx) {\n    irs[[ii]] <- matrix(irf[1:(h), impulse, impulse[ii]], nrow = h)\n    colnames(irs[[ii]]) <- impulse\n    if (cumulative) {\n      if (length(impulse) > 1) {\n        irs[[ii]] <- apply(irs[[ii]], 2, cumsum)\n      }\n      if (length(impulse) == 1) {\n        tmp <- matrix(cumsum(irs[[ii]]))\n        colnames(tmp) <- impulse\n        irs[[ii]] <- tmp\n      }\n    }\n  }\n  names(irs) <- impulse\n  return(irs)\n}\n\n#' Convert a VAR A matrix to its moving average representation\n#' @noRd\nvar_phi <- function(x, h = 10) {\n  h <- abs(as.integer(h))\n  K <- x$K\n  p <- x$p\n  A <- as.array(x$A)\n  if (h >= p) {\n    As <- array(0, dim = c(K, K, h + 1))\n    for (i in (p + 1):(h + 1)) {\n      As[,, i] <- matrix(0, nrow = K, ncol = K)\n    }\n  } else {\n    As <- array(0, dim = c(K, K, p))\n  }\n  As[,, 1] <- A\n  Phi <- array(0, dim = c(K, K, h + 1))\n  Phi[,, 1] <- diag(K)\n  Phi[,, 2] <- Phi[,, 1] %*% As[,, 1]\n  if (h > 1) {\n    for (i in 3:(h + 1)) {\n      tmp1 <- Phi[,, 1] %*% As[,, i - 1]\n      tmp2 <- matrix(0, nrow = K, ncol = K)\n      idx <- (i - 2):1\n      for (j in 1:(i - 2)) {\n        tmp2 <- tmp2 + Phi[,, j + 1] %*% As[,, idx[j]]\n      }\n      Phi[,, i] <- tmp1 + tmp2\n    }\n  }\n  return(Phi)\n}\n\n#' Convert a VAR A matrix to its orthogonalised moving average representation\n#' @noRd\nvar_psi <- function(x, h = 10) {\n  h <- abs(as.integer(h))\n  Phi <- var_phi(x, h = h)\n  Psi <- array(0, dim = dim(Phi))\n  sigma_u <- x$Sigma\n  P <- t(chol(sigma_u))\n  dim3 <- dim(Phi)[3]\n  for (i in 1:dim3) {\n    Psi[,, i] <- Phi[,, i] %*% P\n  }\n  return(Psi)\n}\n"
  },
  {
    "path": "R/jsdgam.R",
    "content": "#'Fit Joint Species Distribution Models in \\pkg{mvgam}\n#'\n#'This function sets up a Joint Species Distribution Model whereby the residual\n#'associations among species can be modelled in a reduced-rank format using a\n#'set of latent factors. The factor specification is extremely flexible,\n#'allowing users to include spatial, temporal or any other type of predictor\n#'effects to more efficiently capture unmodelled residual associations, while\n#'the observation model can also be highly flexible (including all smooth, GP\n#'and other effects that \\pkg{mvgam} can handle)\n#'\n#'@inheritParams mvgam\n#'@inheritParams ZMVN\n#'\n#'@param formula A \\code{formula} object specifying the GAM observation model\n#'  formula. These are exactly like the formula for a GLM except that smooth\n#'  terms, `s()`, `te()`, `ti()`, `t2()`, as well as time-varying `dynamic()`\n#'  terms, nonparametric `gp()` terms and offsets using `offset()`, can be\n#'  added to the right hand side to specify that the linear predictor depends\n#'  on smooth functions of predictors (or linear functionals of these).\n#'  Details of the formula syntax used by \\pkg{mvgam} can be found in\n#'  \\code{\\link{mvgam_formulae}}\n#'\n#'@param factor_formula A \\code{formula} object specifying the linear predictor\n#'  effects for the latent factors. Use `by = trend` within calls to functional\n#'  terms (i.e. `s()`, `te()`, `ti()`, `t2()`, `dynamic()`, or `gp()`) to\n#'  ensure that each factor captures a different axis of variation. See the\n#'  example below as an illustration\n#'\n#'@param factor_knots An optional \\code{list} containing user specified knot\n#'  values to be used for basis construction of any smooth terms in\n#'  `factor_formula`. For most bases the user simply supplies the knots to be\n#'  used, which must match up with the `k` value supplied (note that the\n#'  number of knots is not always just `k`). Different terms can use different\n#'  numbers of knots, unless they share a covariate\n#'\n#'@param data A \\code{dataframe} or \\code{list} containing the model response\n#'  variable and covariates required by the GAM \\code{formula} and\n#'  \\code{factor_formula} objects\n#'\n#'@param family \\code{family} specifying the observation family for the\n#'  outcomes. Currently supported families are:\n#'\\itemize{\n#'   \\item`gaussian()` for real-valued data\n#'   \\item`betar()` for proportional data on `(0,1)`\n#'   \\item`lognormal()` for non-negative real-valued data\n#'   \\item`student_t()` for real-valued data\n#'   \\item`Gamma()` for non-negative real-valued data\n#'   \\item`bernoulli()` for binary data\n#'   \\item`poisson()` for count data\n#'   \\item`nb()` for overdispersed count data\n#'   \\item`binomial()` for count data with imperfect detection when the number\n#'     of trials is known; note that the `cbind()` function must be used to\n#'     bind the discrete observations and the discrete number of trials\n#'   \\item`beta_binomial()` as for `binomial()` but allows for overdispersion}\n#'Default is `poisson()`. See \\code{\\link{mvgam_families}} for more details\n#'\n#' @param species The unquoted name of the `factor` variable that indexes the\n#'   different response units in `data` (usually `'species'` in a JSDM).\n#'   Defaults to `series` to be consistent with other `mvgam` models\n#'\n#'@param n_lv \\code{integer} the number of latent factors to use for modelling\n#'  residual associations. Cannot be `> n_species`. Defaults arbitrarily to `2`\n#'\n#'@param threads \\code{integer} Experimental option to use multithreading for\n#'  within-chain parallelisation in \\code{Stan}. We recommend its use only if\n#'  you are experienced with \\code{Stan}'s `reduce_sum` function and have a\n#'  slow running model that cannot be sped up by any other means. Currently\n#'  works for all families when using \\pkg{cmdstanr} as the backend\n#'\n#'@param priors An optional \\code{data.frame} with prior definitions (in Stan\n#'  syntax) or, preferentially, a vector containing objects of class\n#'  `brmsprior` (see. \\code{\\link[brms]{prior}} for details). See\n#'  [get_mvgam_priors] and for more information on changing default prior\n#'  distributions\n#'\n#'@param ... Other arguments to pass to [mvgam]\n#'\n#'@author Nicholas J Clark\n#'\n#'@details Joint Species Distribution Models allow for responses of multiple\n#'species to be learned hierarchically, whereby responses to environmental\n#'variables in `formula` can be partially pooled and any latent, unmodelled\n#'residual associations can also be learned. In \\pkg{mvgam}, both of these\n#'effects can be modelled with the full power of latent factor Hierarchical\n#'GAMs, providing unmatched flexibility to model full communities of species.\n#'When calling [jsdgam], an initial State-Space model using `trend = 'None'` is\n#'set up and then modified to include the latent factors and their linear\n#'predictors. Consequently, you can inspect priors for these models using\n#'[get_mvgam_priors] by supplying the relevant `formula`, `factor_formula`,\n#'`data` and `family` arguments and keeping the default `trend = 'None'`.\n#'\n#' In a JSDGAM, the expectation of response \\eqn{Y_{ij}} is modelled with\n#'\n#' \\deqn{g(\\mu_{ij}) = X_i\\beta + u_i\\theta_j,}\n#'\n#' where \\eqn{g(.)} is a known link function,\n#' \\eqn{X} is a design matrix of linear predictors (with associated \\eqn{\\beta}\n#' coefficients), \\eqn{u} are \\eqn{n_{lv}}-variate latent factors\n#' (\\eqn{n_{lv}}<<\\eqn{n_{species}}) and \\eqn{\\theta_j} are species-specific\n#' loadings on the latent factors, respectively. The design matrix \\eqn{X} and\n#' \\eqn{\\beta} coefficients are constructed and modelled using `formula` and\n#' can contain any of `mvgam`'s predictor effects, including random intercepts\n#' and slopes, multidimensional penalized smooths, GP effects etc... The factor\n#' loadings \\eqn{\\theta_j} are constrained for identifiability but can be used\n#' to reconstruct an estimate of the species' residual variance-covariance\n#' matrix using \\eqn{\\Theta \\Theta'} (see the example below and\n#' [residual_cor()] for details). The latent factors are further modelled using:\n#'\\deqn{\n#'u_i \\sim \\text{Normal}(Q_i\\beta_{factor}, 1)\n#'}\n#'where the second design matrix \\eqn{Q} and associated \\eqn{\\beta_{factor}}\n#'coefficients are constructed and modelled using `factor_formula`. Again, the\n#'effects that make up this linear predictor can contain any of `mvgam`'s\n#'allowed predictor effects, providing enormous flexibility for modelling\n#'species' communities.\n#'\n#'@seealso [mvgam()], [residual_cor()]\n#'\n#'@references Nicholas J Clark & Konstans Wells (2023). Dynamic generalised\n#'additive models (DGAMs) for forecasting discrete ecological time series.\n#'Methods in Ecology and Evolution. 14:3, 771-784.\n#' \\cr\n#' \\cr\n#'David I Warton, F Guillaume Blanchet, Robert B O'Hara, Otso Ovaskainen, Sara\n#'Taskinen, Steven C Walker & Francis KC Hui (2015). So many variables: joint\n#'modeling in community ecology. Trends in Ecology & Evolution 30:12, 766-779.\n#'\n#'@return A \\code{list} object of class \\code{mvgam} containing model output,\n#'the text representation of the model file, the mgcv model output (for easily\n#'generating simulations at unsampled covariate values), Dunn-Smyth residuals\n#'for each species and key information needed for other functions in the\n#'package. See \\code{\\link{mvgam-class}} for details. Use\n#'`methods(class = \"mvgam\")` for an overview on available methods\n#'\n#'@examples\n#'\\dontrun{\n#' # ========================================================================\n#' # Example 1: Basic JSDGAM with Portal Data\n#' # ========================================================================\n#'\n#' # Fit a JSDGAM to the portal_data captures\n#' mod <- jsdgam(\n#'   formula = captures ~\n#'     # Fixed effects of NDVI and mintemp, row effect as a GP of time\n#'     ndvi_ma12:series + mintemp:series + gp(time, k = 15),\n#'   factor_formula = ~ -1,\n#'   data = portal_data,\n#'   unit = time,\n#'   species = series,\n#'   family = poisson(),\n#'   n_lv = 2,\n#'   silent = 2,\n#'   chains = 2\n#' )\n#'\n#' # Plot covariate effects\n#' library(ggplot2); theme_set(theme_bw())\n#' plot_predictions(\n#'   mod,\n#'   condition = c('ndvi_ma12', 'series', 'series')\n#' )\n#'\n#' plot_predictions(\n#'   mod,\n#'   condition = c('mintemp', 'series', 'series')\n#' )\n#'\n#' # A residual correlation plot\n#' plot(residual_cor(mod))\n#'\n#' # An ordination biplot can also be constructed\n#' # from the factor scores and their loadings\n#' if(requireNamespace('ggrepel', quietly = TRUE)){\n#'   ordinate(mod, alpha = 0.7)\n#' }\n#'\n#' # ========================================================================\n#' # Example 2: Advanced JSDGAM with Spatial Predictors\n#' # ========================================================================\n#'\n#' # Simulate latent count data for 500 spatial locations and 10 species\n#' set.seed(0)\n#' N_points <- 500\n#' N_species <- 10\n#'\n#' # Species-level intercepts (on the log scale)\n#' alphas <- runif(N_species, 2, 2.25)\n#'\n#' # Simulate a covariate and species-level responses to it\n#' temperature <- rnorm(N_points)\n#' betas <- runif(N_species, -0.5, 0.5)\n#'\n#' # Simulate points uniformly over a space\n#' lon <- runif(N_points, min = 150, max = 155)\n#' lat <- runif(N_points, min = -20, max = -19)\n#'\n#' # Set up spatial basis functions as a tensor product of lat and lon\n#' sm <- mgcv::smoothCon(\n#'   mgcv::te(lon, lat, k = 5),\n#'   data = data.frame(lon, lat),\n#'   knots = NULL\n#' )[[1]]\n#'\n#' # The design matrix for this smooth is in the 'X' slot\n#' des_mat <- sm$X\n#' dim(des_mat)\n#'\n#' # Function to generate a random covariance matrix where all variables\n#' # have unit variance (i.e. diagonals are all 1)\n#' random_Sigma = function(N){\n#'   L_Omega <- matrix(0, N, N);\n#'   L_Omega[1, 1] <- 1;\n#'   for (i in 2 : N) {\n#'     bound <- 1;\n#'     for (j in 1 : (i - 1)) {\n#'       L_Omega[i, j] <- runif(1, -sqrt(bound), sqrt(bound));\n#'       bound <- bound - L_Omega[i, j] ^ 2;\n#'     }\n#'     L_Omega[i, i] <- sqrt(bound);\n#'   }\n#'   Sigma <- L_Omega %*% t(L_Omega);\n#'   return(Sigma)\n#' }\n#'\n#' # Simulate a variance-covariance matrix for the correlations among\n#' # basis coefficients\n#' Sigma <- random_Sigma(N = NCOL(des_mat))\n#'\n#' # Now simulate the species-level basis coefficients hierarchically, where\n#' # spatial basis function correlations are a convex sum of a base correlation\n#' # matrix and a species-level correlation matrix\n#' basis_coefs <- matrix(NA, nrow = N_species, ncol = NCOL(Sigma))\n#' base_field <- mgcv::rmvn(1, mu = rep(0, NCOL(Sigma)), V = Sigma)\n#' for(t in 1:N_species){\n#'   corOmega <- (cov2cor(Sigma) * 0.7) +\n#'     (0.3 * cov2cor(random_Sigma(N = NCOL(des_mat))))\n#'   basis_coefs[t, ] <- mgcv::rmvn(1, mu = rep(0, NCOL(Sigma)), V = corOmega)\n#' }\n#'\n#' # Simulate the latent spatial processes\n#' st_process <- do.call(rbind, lapply(seq_len(N_species), function(t){\n#'   data.frame(\n#'     lat = lat,\n#'     lon = lon,\n#'     species = paste0('species_', t),\n#'     temperature = temperature,\n#'     process = alphas[t] +\n#'       betas[t] * temperature +\n#'       des_mat %*% basis_coefs[t,]\n#'   )\n#' }))\n#'\n#' # Now take noisy observations at some of the points (60)\n#' obs_points <- sample(1:N_points, size = 60, replace = FALSE)\n#' obs_points <- data.frame(\n#'   lat = lat[obs_points],\n#'   lon = lon[obs_points],\n#'   site = 1:60\n#' )\n#'\n#' # Keep only the process data at these points\n#' st_process %>%\n#'   dplyr::inner_join(obs_points, by = c('lat', 'lon')) %>%\n#'   # now take noisy Poisson observations of the process\n#'   dplyr::mutate(count = rpois(NROW(.), lambda = exp(process))) %>%\n#'   dplyr::mutate(species = factor(\n#'     species,\n#'     levels = paste0('species_', 1:N_species)\n#'   )) %>%\n#'   dplyr::group_by(lat, lon) -> dat\n#'\n#' # View the count distributions for each species\n#' ggplot(dat, aes(x = count)) +\n#'   geom_histogram() +\n#'   facet_wrap(~ species, scales = 'free')\n#'\n#' ggplot(dat, aes(x = lon, y = lat, col = log(count + 1))) +\n#'   geom_point(size = 2.25) +\n#'   facet_wrap(~ species, scales = 'free') +\n#'   scale_color_viridis_c()\n#'\n#' # ------------------------------------------------------------------------\n#' # Model Fitting with Custom Priors\n#' # ------------------------------------------------------------------------\n#'\n#' # Inspect default priors for a joint species model with three spatial factors\n#' priors <- get_mvgam_priors(\n#'   formula = count ~\n#'     # Environmental model includes random slopes for\n#'     # a linear effect of temperature\n#'     s(species, bs = 're', by = temperature),\n#'\n#'   # Each factor estimates a different nonlinear spatial process, using\n#'   # 'by = trend' as in other mvgam State-Space models\n#'   factor_formula = ~ gp(lon, lat, k = 6, by = trend) - 1,\n#'   n_lv = 3,\n#'\n#'   # The data and grouping variables\n#'   data = dat,\n#'   unit = site,\n#'   species = species,\n#'\n#'   # Poisson observations\n#'   family = poisson()\n#' )\n#' head(priors)\n#'\n#' # Fit a JSDM that estimates hierarchical temperature responses\n#' # and that uses three latent spatial factors\n#' mod <- jsdgam(\n#'   formula = count ~\n#'     # Environmental model includes random slopes for a\n#'     # linear effect of temperature\n#'     s(species, bs = 're', by = temperature),\n#'\n#'   # Each factor estimates a different nonlinear spatial process, using\n#'   # 'by = trend' as in other mvgam State-Space models\n#'   factor_formula = ~ gp(lon, lat, k = 6, by = trend) - 1,\n#'   n_lv = 3,\n#'\n#'   # Change default priors for fixed random effect variances and\n#'   # factor GP marginal deviations to standard normal\n#'   priors = c(\n#'     prior(std_normal(), class = sigma_raw),\n#'     prior(std_normal(), class = `alpha_gp_trend(lon, lat):trendtrend1`),\n#'     prior(std_normal(), class = `alpha_gp_trend(lon, lat):trendtrend2`),\n#'     prior(std_normal(), class = `alpha_gp_trend(lon, lat):trendtrend3`)\n#'   ),\n#'\n#'   # The data and the grouping variables\n#'   data = dat,\n#'   unit = site,\n#'   species = species,\n#'\n#'   # Poisson observations\n#'   family = poisson(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # ------------------------------------------------------------------------\n#' # Model Visualization and Diagnostics\n#' # ------------------------------------------------------------------------\n#'\n#' # Plot the implicit species-level intercept estimates\n#' plot_predictions(mod, condition = 'species', type = 'link')\n#'\n#' # Plot species' hierarchical responses to temperature\n#' plot_predictions(\n#'   mod,\n#'   condition = c('temperature', 'species', 'species'),\n#'   type = 'link'\n#' )\n#'\n#' # Plot posterior median estimates of the latent spatial factors\n#' plot(mod, type = 'smooths', trend_effects = TRUE)\n#'\n#' # Or using gratia, if you have it installed\n#' if(requireNamespace('gratia', quietly = TRUE)){\n#'   gratia::draw(mod, trend_effects = TRUE, dist = 0)\n#' }\n#'\n#' # Plot species' randomized quantile residual distributions\n#' # as a function of latitude\n#' pp_check(\n#'   mod,\n#'   type = 'resid_ribbon_grouped',\n#'   group = 'species',\n#'   x = 'lat',\n#'   ndraws = 200\n#' )\n#'\n#' # ------------------------------------------------------------------------\n#' # Residual Correlation Analysis\n#' # ------------------------------------------------------------------------\n#'\n#' # Calculate residual spatial correlations\n#' post_cors <- residual_cor(mod)\n#' names(post_cors)\n#'\n#' # Look at lower and upper credible interval estimates for\n#' # some of the estimated correlations\n#' post_cors$cor[1:5, 1:5]\n#' post_cors$cor_upper[1:5, 1:5]\n#' post_cors$cor_lower[1:5, 1:5]\n#'\n#' # Plot of the posterior median correlations for those estimated\n#' # to be non-zero\n#' plot(post_cors, cluster = TRUE)\n#'\n#' # An ordination biplot can also be constructed\n#' # from the factor scores and their loadings\n#' if(requireNamespace('ggrepel', quietly = TRUE)){\n#'   ordinate(mod)\n#' }\n#'\n#' # ------------------------------------------------------------------------\n#' # Model Validation and Prediction\n#' # ------------------------------------------------------------------------\n#'\n#' # Posterior predictive checks and ELPD-LOO can ascertain model fit\n#' pp_check(\n#'   mod,\n#'   type = \"pit_ecdf_grouped\",\n#'   group = \"species\",\n#'   ndraws = 200\n#' )\n#' loo(mod)\n#'\n#' # Forecast log(counts) for entire region (site value doesn't matter as long\n#' # as each spatial location has a different and unique site identifier);\n#' # note this calculation takes a few minutes because of the need to calculate\n#' # draws from the stochastic latent factors\n#' newdata <- st_process %>%\n#'   dplyr::mutate(species = factor(\n#'     species,\n#'     levels = paste0('species_', 1:N_species)\n#'   )) %>%\n#'   dplyr::group_by(lat, lon) %>%\n#'   dplyr::mutate(site = dplyr::cur_group_id()) %>%\n#'   dplyr::ungroup()\n#' preds <- predict(mod, newdata = newdata)\n#'\n#' # Plot the median log(count) predictions on a grid\n#' newdata$log_count <- preds[,1]\n#' ggplot(newdata, aes(x = lon, y = lat, col = log_count)) +\n#'   geom_point(size = 1.5) +\n#'   facet_wrap(~ species, scales = 'free') +\n#'   scale_color_viridis_c() +\n#'   theme_classic()\n#'\n#' # Not needed for general use; cleans up connections for automated testing\n#' closeAllConnections()\n#' }\n#'@export\njsdgam = function(\n  formula,\n  factor_formula = ~ -1,\n  knots,\n  factor_knots,\n  data,\n  newdata,\n  family = poisson(),\n  unit = time,\n  species = series,\n  share_obs_params = FALSE,\n  priors,\n  n_lv = 2,\n  backend = getOption(\"brms.backend\", \"cmdstanr\"),\n  algorithm = getOption(\"brms.algorithm\", \"sampling\"),\n  control = list(max_treedepth = 10, adapt_delta = 0.8),\n  chains = 4,\n  burnin = 500,\n  samples = 500,\n  thin = 1,\n  parallel = TRUE,\n  threads = 1,\n  silent = 1,\n  run_model = TRUE,\n  return_model_data = FALSE,\n  residuals = TRUE,\n  ...\n) {\n  #### Validate arguments and initialise the model skeleton ####\n  validate_pos_integer(n_lv)\n\n  # Prep the trend so that the data can be structured in the usual\n  # mvgam fashion (with 'time' and 'series' variables)\n  unit <- deparse0(substitute(unit))\n  subgr <- deparse0(substitute(species))\n  prepped_trend <- prep_jsdgam_trend(unit = unit, subgr = subgr, data = data)\n  data_train <- validate_series_time(data = data, trend_model = prepped_trend)\n\n  # Set up a simple trend_map to get the model dimensions correct;\n  # this requires that we only have n_lv trends and that each series\n  # only maps to one distinct trend, resulting in a loading matrix of\n  # the correct size (n_series x n_lv)\n  trend_map <- prep_jsdgam_trendmap(data_train, n_lv)\n\n  # Set up the model structure but leave autoformat off so that the\n  # model file can be easily modified\n  mod <- suppressWarnings(mvgam(\n    formula = formula,\n    trend_formula = factor_formula,\n    knots = knots,\n    trend_knots = factor_knots,\n    family = family,\n    share_obs_params = share_obs_params,\n    priors = priors,\n    trend_model = 'None',\n    trend_map = trend_map,\n    data = data_train,\n    noncentred = TRUE,\n    run_model = FALSE,\n    autoformat = FALSE,\n    backend = backend,\n    ...\n  ))\n  model_file <- mod$model_file\n\n  #### Modify model data and model file ####\n  # Remove Z from supplied data\n  model_file <- model_file[\n    -grep(\n      \"matrix[n_series, n_lv] Z; // matrix mapping series to latent states\",\n      model_file,\n      fixed = TRUE\n    )\n  ]\n\n  # Add M to data block\n  model_file[grep(\n    'int<lower=0> n_lv; // number of dynamic factors',\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    'int<lower=0> n_lv; // number of dynamic factors\\n',\n    'int<lower=0> M; // number of nonzero lower-triangular factor loadings'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update parameters\n  model_file <- model_file[\n    -grep(\"// latent state SD terms\", model_file, fixed = TRUE)\n  ]\n  model_file <- model_file[\n    -grep(\"vector<lower=0>[n_lv] sigma;\", model_file, fixed = TRUE)\n  ]\n  model_file[grep(\n    \"matrix[n, n_lv] LV_raw;\",\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    \"matrix[n, n_lv] LV_raw;\\n\\n\",\n    \"// factor lower triangle loadings\\n\",\n    \"vector[M] L_lower;\\n\",\n    \"// factor diagonal loadings\\n\",\n    \"vector<lower=0>[n_lv] L_diag;\"\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update transformed parameters\n  model_file <- model_file[-grep(\"// latent states\", model_file, fixed = TRUE)]\n  model_file <- model_file[-grep(\"lv_coefs = Z;\", model_file, fixed = TRUE)]\n  model_file <- model_file[\n    -grep(\"matrix[n, n_lv] LV;\", model_file, fixed = TRUE)\n  ]\n  model_file <- model_file[\n    -grep(\"trend_mus = X_trend * b_trend;\", model_file, fixed = TRUE)\n  ]\n  model_file[grep(\n    \"matrix[n_series, n_lv] lv_coefs;\",\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    \"matrix[n_series, n_lv] lv_coefs = rep_matrix(0, n_series, n_lv);\\n\",\n    'matrix[n, n_lv] LV;\\n'\n  )\n\n  starts <- grep(\n    \"LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));\",\n    model_file,\n    fixed = TRUE\n  )\n  ends <- starts + 5\n  model_file <- model_file[-(starts:ends)]\n\n  # Simplified latent variable creation if no terms in factor_formula\n  if (\n    is.null(rownames(attr(terms.formula(factor_formula), 'factors'))) &\n      is.null(colnames(attr(terms.formula(factor_formula), 'factors')))\n  ) {\n    model_file[grep(\n      \"// latent process linear predictors\",\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      \"// latent process linear predictors\\n\",\n      \"trend_mus = X_trend * b_trend;\\n\\n\",\n      \"// constraints allow identifiability of loadings\\n\",\n      \"{\\n\",\n      \"int idx;\\n\",\n      \"idx = 0;\\n\",\n      \"for(j in 1 : n_lv) lv_coefs[j, j] = L_diag[j];\\n\",\n      \"for(j in 1 : n_lv) {\\n\",\n      \"for(k in (j + 1) : n_series) {\\n\",\n      \"idx = idx + 1;\\n\",\n      \"lv_coefs[k, j] = L_lower[idx];\\n\",\n      \"}\\n\",\n      \"}\\n\",\n      \"}\\n\\n\",\n      \"// raw latent factors\\n\",\n      \"LV = LV_raw;\\n\"\n    )\n  } else {\n    model_file[grep(\n      \"// latent process linear predictors\",\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      \"// latent process linear predictors\\n\",\n      \"trend_mus = X_trend * b_trend;\\n\\n\",\n      \"// constraints allow identifiability of loadings\\n\",\n      \"{\\n\",\n      \"int idx;\\n\",\n      \"idx = 0;\\n\",\n      \"for(j in 1 : n_lv) lv_coefs[j, j] = L_diag[j];\\n\",\n      \"for(j in 1 : n_lv) {\\n\",\n      \"for(k in (j + 1) : n_series) {\\n\",\n      \"idx = idx + 1;\\n\",\n      \"lv_coefs[k, j] = L_lower[idx];\\n\",\n      \"}\\n\",\n      \"}\\n\",\n      \"}\\n\\n\",\n      \"// raw latent factors (with linear predictors)\\n\",\n      \"for (j in 1 : n_lv) {\\n\",\n      \"for (i in 1 : n) {\\n\",\n      \"LV[i, j] = trend_mus[ytimes_trend[i, j]] + LV_raw[i, j];\\n\",\n      \"}\\n}\\n\"\n    )\n  }\n\n  model_file <- model_file[\n    -grep(\"// derived latent states\", model_file, fixed = TRUE)\n  ]\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update model block\n  sigma_prior <- grep(\n    \"// priors for latent state SD parameters\",\n    model_file,\n    fixed = TRUE\n  ) +\n    1\n  model_file <- model_file[-sigma_prior]\n\n  # Use standard normal for loadings in most models, apart from\n  # those using identify link\n  if (family_links(mod$family) != 'identity') {\n    model_file[grep(\n      \"// priors for latent state SD parameters\",\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      \"// priors for factors and loading coefficients\\n\",\n      \"L_lower ~ std_normal();\\n\",\n      \"L_diag ~ std_normal();\"\n    )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  } else {\n    model_file[grep(\n      \"// priors for latent state SD parameters\",\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      \"// priors for factors and loading coefficients\\n\",\n      \"L_lower ~ student_t(3, 0, 1);\\n\",\n      \"L_diag ~ student_t(3, 0, 1);\"\n    )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Update generated quantities\n  model_file[grep(\n    'matrix[n, n_series] mus;',\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    'matrix[n, n_series] mus;\\n',\n    'vector[n_lv] sigma;'\n  )\n  model_file[grep(\n    \"penalty = 1.0 / (sigma .* sigma);\",\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    \"penalty = rep_vector(1.0, n_lv);\\n\",\n    \"sigma = rep_vector(1.0, n_lv);\"\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n  model_file <- sanitise_modelfile(model_file)\n\n  # Remove Z from model_data as it is no longer needed\n  model_data <- mod$model_data\n  model_data$Z <- NULL\n\n  # Add M to model_data\n  n_series <- NCOL(model_data$ytimes)\n  model_data$M <- n_lv * (n_series - n_lv) + n_lv * (n_lv - 1) / 2\n\n  #### Autoformat the Stan code ####\n  if (requireNamespace('cmdstanr', quietly = TRUE) & backend == 'cmdstanr') {\n    if (\n      requireNamespace('cmdstanr') &\n        cmdstanr::cmdstan_version() >= \"2.29.0\"\n    ) {\n      model_file <- .autoformat(\n        model_file,\n        overwrite_file = FALSE,\n        backend = 'cmdstanr',\n        silent = silent >= 1L\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  } else {\n    model_file <- .autoformat(\n      model_file,\n      overwrite_file = FALSE,\n      backend = 'rstan',\n      silent = silent >= 1L\n    )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Remove lp__ from monitor params if VB is to be used\n  param <- unique(c(mod$monitor_pars, 'Sigma', 'LV'))\n  if (algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')) {\n    param <- param[!param %in% 'lp__']\n  }\n\n  #### Determine what to return ####\n  if (!run_model) {\n    mod$model_file <- model_file\n    mod$monitor_pars <- param\n    attr(model_data, 'trend_model') <- 'None'\n    attr(model_data, 'prepped_trend_model') <- prepped_trend\n    attr(model_data, 'noncentred') <- NULL\n    attr(model_data, 'threads') <- threads\n    mod$model_data <- model_data\n    out <- mod\n  } else {\n    # Check if cmdstan is accessible; if not, use rstan\n    if (backend == 'cmdstanr') {\n      if (!requireNamespace('cmdstanr', quietly = TRUE)) {\n        if (silent < 2) {\n          message('cmdstanr library not found; defaulting to rstan')\n        }\n        use_cmdstan <- FALSE\n      } else {\n        use_cmdstan <- TRUE\n        if (is.null(cmdstanr::cmdstan_version(error_on_NA = FALSE))) {\n          warning(\n            'cmdstanr library found but Cmdstan not found. Defaulting to rstan'\n          )\n          use_cmdstan <- FALSE\n        }\n      }\n    }\n\n    #### Run the model ####\n    if (use_cmdstan) {\n      # Prepare threading and generate the model\n      cmd_mod <- .model_cmdstanr(model_file, threads = threads, silent = silent)\n\n      # Condition the model using Cmdstan\n      out_gam_mod <- .sample_model_cmdstanr(\n        model = cmd_mod,\n        algorithm = algorithm,\n        prior_simulation = FALSE,\n        data = model_data,\n        chains = chains,\n        parallel = parallel,\n        silent = silent,\n        max_treedepth = control$max_treedepth,\n        adapt_delta = control$adapt_delta,\n        threads = threads,\n        burnin = burnin,\n        samples = samples,\n        param = param,\n        save_all_pars = FALSE,\n        ...\n      )\n    } else {\n      # Condition the model using rstan\n      requireNamespace('rstan', quietly = TRUE)\n      out_gam_mod <- .sample_model_rstan(\n        model = model_file,\n        algorithm = algorithm,\n        prior_simulation = FALSE,\n        data = model_data,\n        chains = chains,\n        parallel = parallel,\n        silent = silent,\n        max_treedepth = control$max_treedepth,\n        adapt_delta = control$adapt_delta,\n        threads = threads,\n        burnin = burnin,\n        samples = samples,\n        thin = thin,\n        ...\n      )\n    }\n\n    # After modeling (add a new class to make predictions and other post-processing\n    # simpler)\n    out1 <- mod\n    out1$model_output <- out_gam_mod\n    class(out1) <- c('mvgam')\n    if (residuals) {\n      mod_residuals <- dsresids_vec(out1)\n    } else {\n      mod_residuals <- NULL\n    }\n    rm(out1)\n\n    # Add the posterior median coefficients to the mgcv objects\n    ss_gam <- mod$mgcv_model\n    V <- cov(mcmc_chains(out_gam_mod, 'b'))\n    ss_gam$Vp <- ss_gam$Vc <- V\n    p <- mcmc_summary(\n      out_gam_mod,\n      'b',\n      variational = algorithm %in%\n        c('meanfield', 'fullrank', 'pathfinder', 'laplace')\n    )[, c(4)]\n    names(p) <- names(ss_gam$coefficients)\n    ss_gam$coefficients <- p\n\n    trend_mgcv_model <- mod$trend_mgcv_model\n    V <- cov(mcmc_chains(out_gam_mod, 'b_trend'))\n    trend_mgcv_model$Vp <- trend_mgcv_model$Vc <- V\n    p <- mcmc_summary(\n      out_gam_mod,\n      'b_trend',\n      variational = algorithm %in%\n        c('meanfield', 'fullrank', 'pathfinder', 'laplace')\n    )[, c(4)]\n    names(p) <- names(trend_mgcv_model$coefficients)\n    trend_mgcv_model$coefficients <- p\n\n    #### Return the output as class mvgam ####\n    trim_data <- list()\n    attr(trim_data, 'threads') <- threads\n    attr(trim_data, 'noncentred') <- NULL\n    attr(trim_data, 'trend_model') <- 'None'\n    attr(trim_data, 'prepped_trend_model') <- prepped_trend\n\n    # Extract sampler arguments\n    dots <- list(...)\n    if ('adapt_delta' %in% names(dots)) {\n      message(\n        'argument \"adapt_delta\" should be supplied as an element in \"control\"'\n      )\n      adapt_delta <- dots$adapt_delta\n      dots$adapt_delta <- NULL\n    } else {\n      adapt_delta <- control$adapt_delta\n      if (is.null(adapt_delta)) adapt_delta <- 0.8\n    }\n\n    if ('max_treedepth' %in% names(dots)) {\n      message(\n        'argument \"max_treedepth\" should be supplied as an element in \"control\"'\n      )\n      max_treedepth <- dots$max_treedepth\n      dots$max_treedepth <- NULL\n    } else {\n      max_treedepth <- control$max_treedepth\n      if (is.null(max_treedepth)) max_treedepth <- 10\n    }\n\n    out <- structure(\n      list(\n        call = mod$call,\n        trend_call = factor_formula,\n        family = mod$family,\n        share_obs_params = mod$share_obs_params,\n        trend_model = 'None',\n        trend_map = trend_map,\n        drift = FALSE,\n        priors = mod$priors,\n        model_output = out_gam_mod,\n        model_file = model_file,\n        model_data = if (return_model_data) {\n          model_data\n        } else {\n          trim_data\n        },\n        inits = NULL,\n        monitor_pars = param,\n        sp_names = mod$sp_names,\n        trend_sp_names = mod$trend_sp_names,\n        mgcv_model = ss_gam,\n        trend_mgcv_model = trend_mgcv_model,\n        ytimes = mod$ytimes,\n        resids = mod_residuals,\n        use_lv = TRUE,\n        n_lv = n_lv,\n        upper_bounds = mod$upper_bounds,\n        obs_data = mod$obs_data,\n        test_data = mod$test_data,\n        fit_engine = 'stan',\n        backend = backend,\n        algorithm = algorithm,\n        max_treedepth = max_treedepth,\n        adapt_delta = adapt_delta\n      ),\n      class = c('mvgam', 'jsdgam')\n    )\n  }\n\n  return(out)\n}\n\n#' Prep trend for jsdgam\n#' @noRd\nprep_jsdgam_trend = function(data, unit, subgr) {\n  unit <- as_one_character(unit)\n  subgr <- as_one_character(subgr)\n  validate_var_exists(\n    data = data,\n    variable = unit,\n    type = 'num/int',\n    name = 'data',\n    trend_char = 'ZMVN'\n  )\n  validate_var_exists(\n    data = data,\n    variable = subgr,\n    type = 'factor',\n    name = 'data',\n    trend_char = 'ZMVN'\n  )\n  out <- structure(\n    list(\n      trend_model = 'ZMVN',\n      ma = FALSE,\n      cor = TRUE,\n      unit = unit,\n      gr = \"NA\",\n      subgr = subgr,\n      label = NULL\n    ),\n    class = 'mvgam_trend'\n  )\n}\n\n#' @noRd\nprep_jsdgam_trendmap = function(data, n_lv) {\n  if (n_lv > nlevels(data$series)) {\n    stop(\n      'Number of factors must be <= number of levels in species',\n      call. = FALSE\n    )\n  }\n  data.frame(\n    trend = rep(1:n_lv, nlevels(data$series))[1:nlevels(data$series)],\n    series = factor(levels(data$series), levels = levels(data$series))\n  )\n}\n"
  },
  {
    "path": "R/lfo_cv.mvgam.R",
    "content": "#'@title Approximate leave-future-out cross-validation of fitted \\pkg{mvgam} objects\n#'@name lfo_cv.mvgam\n#'@importFrom stats update logLik\n#'@param object \\code{list} object of class \\code{mvgam}. See [mvgam()]\n#'@param data A \\code{dataframe} or \\code{list} containing the model response variable and covariates\n#'required by the GAM \\code{formula}. Should include columns:\n#''series' (character or factor index of the series IDs)\n#''time' (numeric index of the time point for each observation).\n#'Any other variables to be included in the linear predictor of \\code{formula} must also be present\n#'@param min_t Integer specifying the minimum training time required before making predictions\n#'from the data. Default is either the `30`th timepoint in the observational data,\n#'or whatever training time allows for at least\n#'`10` lfo-cv calculations, if possible.\n#'This value is essentially arbitrary so it is highly recommended to change it\n#'to something that is more suitable to the\n#'data and models being evaluated.\n#'@param fc_horizon Integer specifying the number of time steps ahead for evaluating forecasts\n#'@param pareto_k_threshold Proportion specifying the threshold over which the Pareto shape parameter\n#'is considered unstable, triggering a model refit. Default is `0.7`\n#'@param silent Verbosity level between `0` and `2`. If `1` (the default), most of the informational\n#'messages of compiler and sampler are suppressed. If `2`, even more messages are suppressed. The\n#'actual sampling progress is still printed. Set `refresh = 0` to turn this off as well. If using\n#'`backend = \"rstan\"` you can also set open_progress = FALSE to prevent opening additional\n#'progress bars.\n#'@param ... Ignored\n#'@details Approximate leave-future-out cross-validation uses an expanding training window scheme\n#' to evaluate a model on its forecasting ability. The steps used in this function mirror those laid out\n#' in the [lfo vignette from the `loo` package](https://mc-stan.org/loo/articles/loo2-lfo.html),\n#' written by Paul Bürkner, Jonah Gabry, Aki Vehtari. First, we refit the model using the first `min_t`\n#' observations to perform a single exact `fc_horizon`-ahead forecast step. This forecast is evaluated against\n#' the `min_t + fc_horizon` out of sample observations using the Expected Log Predictive Density (ELPD).\n#' Next, we approximate each successive round of\n#' expanding window forecasts by moving forward one step at a time `for i in 1:N_evaluations` and re-weighting\n#' draws from the model's posterior predictive distribution using Pareto Smoothed\n#' Importance Sampling (PSIS). In each iteration `i`, PSIS weights are obtained for the next observation\n#' that would have been included in the model if we had re-fit (i.e. the last observation that would have\n#' been in the training data, or `min_t + i`). If these importance ratios are stable, we consider the\n#' approximation adequate and use the re-weighted posterior's forecast for evaluating the next holdout\n#' set of testing observations (`(min_t + i + 1):(min_t + i + fc_horizon)`). At some point the\n#' importance ratio variability will become too large and importance sampling will fail. This is\n#' indicated by the estimated shape parameter `k` of the generalized Pareto distribution\n#' crossing a certain threshold `pareto_k_threshold`. Only then do we refit the model using\n#' all of the observations up to the time of the failure. We then restart the process and iterate forward\n#' until the next refit is triggered (Bürkner et al. 2020).\n#'@return A `list` of class `mvgam_lfo` containing the approximate ELPD scores,\n#'the Pareto-k shape values and 'the specified `pareto_k_threshold`\n#'@seealso \\code{\\link{forecast}}, \\code{\\link{score}}, \\code{\\link{compare_mvgams}}\n#'@references Paul-Christian Bürkner, Jonah Gabry & Aki Vehtari (2020). Approximate leave-future-out cross-validation for Bayesian time series models\n#'Journal of Statistical Computation and Simulation. 90:14, 2499-2523.\n#'@examples\n#'\\dontrun{\n#'# Simulate from a Poisson-AR2 model with a seasonal smooth\n#'set.seed(100)\n#'dat <- sim_mvgam(T = 75,\n#'                 n_series = 1,\n#'                 prop_trend = 0.75,\n#'                 trend_model = 'AR2',\n#'                 family = poisson())\n#'\n#'# Plot the time series\n#'plot_mvgam_series(data = dat$data_train,\n#'                  newdata = dat$data_test,\n#'                  series = 1)\n#'\n#'# Fit an appropriate model\n#'mod_ar2 <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n#'                trend_model = AR(p = 2),\n#'                family = poisson(),\n#'                data = dat$data_train,\n#'                newdata = dat$data_test,\n#'                chains = 2,\n#'                silent = 2)\n#'\n#'# Fit a less appropriate model\n#'mod_rw <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n#'               trend_model = RW(),\n#'               family = poisson(),\n#'               data = dat$data_train,\n#'               newdata = dat$data_test,\n#'               chains = 2,\n#'               silent = 2)\n#'\n#'# Compare Discrete Ranked Probability Scores for the testing period\n#'fc_ar2 <- forecast(mod_ar2)\n#'fc_rw <- forecast(mod_rw)\n#'score_ar2 <- score(fc_ar2, score = 'drps')\n#'score_rw <- score(fc_rw, score = 'drps')\n#'sum(score_ar2$series_1$score)\n#'sum(score_rw$series_1$score)\n#'\n#'# Now use approximate leave-future-out CV to compare\n#'# rolling forecasts; start at time point 40 to reduce\n#'# computational time and to ensure enough data is available\n#'# for estimating model parameters\n#'lfo_ar2 <- lfo_cv(mod_ar2,\n#'                  min_t = 40,\n#'                  fc_horizon = 3,\n#'                  silent = 2)\n#'lfo_rw <- lfo_cv(mod_rw,\n#'                 min_t = 40,\n#'                 fc_horizon = 3,\n#'                 silent = 2)\n#'\n#'# Plot Pareto-K values and ELPD estimates\n#'plot(lfo_ar2)\n#'plot(lfo_rw)\n#'\n#'# Proportion of timepoints in which AR2 model gives better forecasts\n#'length(which((lfo_ar2$elpds - lfo_rw$elpds) > 0)) /\n#'       length(lfo_ar2$elpds)\n#'\n#'# A higher total ELPD is preferred\n#'lfo_ar2$sum_ELPD\n#'lfo_rw$sum_ELPD\n#'}\n#'@author Nicholas J Clark\n#'@export\nlfo_cv <- function(object, ...) {\n  UseMethod(\"lfo_cv\", object)\n}\n\n#'@rdname lfo_cv.mvgam\n#'@method lfo_cv mvgam\n#'@export\nlfo_cv.mvgam = function(\n  object,\n  data,\n  min_t,\n  fc_horizon = 1,\n  pareto_k_threshold = 0.7,\n  silent = 1,\n  ...\n) {\n  validate_proportional(pareto_k_threshold)\n  validate_pos_integer(fc_horizon)\n\n  if (missing(data)) {\n    all_data <- object$obs_data\n  } else {\n    all_data <- validate_series_time(\n      data,\n      name = 'data',\n      trend_model = object$trend_model\n    )\n  }\n  N <- max(all_data$index..time..index)\n  all_unique_times <- sort(unique(all_data$index..time..index))\n\n  # Default minimum training time is the 30th timepoint, or\n  # whatever training time allows for at least 10 lfo_cv calculations\n  if (missing(min_t)) {\n    if (length(all_unique_times) > 30) {\n      min_t <- pmin(max(1, N - 10 - fc_horizon), all_unique_times[30])\n    } else if (length(all_unique_times) < 30 & length(all_unique_times) > 20) {\n      min_t <- pmin(max(1, N - 10 - fc_horizon), all_unique_times[20])\n    } else if (length(all_unique_times) < 20 & length(all_unique_times) > 10) {\n      min_t <- pmin(max(1, N - 10 - fc_horizon), all_unique_times[10])\n    } else {\n      min_t <- 1\n    }\n  }\n\n  if (min_t < 0) {\n    min_t <- 1\n  }\n  validate_pos_integer(min_t)\n  if (min_t >= N) {\n    stop('Argument \"min_t\" is >= the maximum training time', call. = FALSE)\n  }\n\n  # Store the Expected Log Predictive Density (EPLD) at each time point\n  approx_elpds <- rep(NA, N)\n\n  # Initialize the process for i = min_t, generating a\n  # conditional forecast for all of the future data\n  data_splits <- cv_split(all_data, last_train = min_t, fc_horizon = fc_horizon)\n\n  # Fit model to training and forecast all remaining testing observations\n  noncentred <- if (is.null(attr(object$model_data, 'noncentred'))) {\n    FALSE\n  } else {\n    TRUE\n  }\n\n  if (silent < 1L) {\n    cat('Approximating elpd for training point', min_t, '...\\n')\n  }\n\n  fit_past <- update(\n    object,\n    data = data_splits$data_train,\n    newdata = data_splits$data_test,\n    lfo = TRUE,\n    noncentred = noncentred,\n    silent = silent\n  )\n\n  # Calculate log likelihoods of forecast observations for the next\n  # fc_horizon ahead observations\n  fc_indices <- which(\n    c(data_splits$data_train$time, data_splits$data_test$time) %in%\n      (min_t + 1):(min_t + fc_horizon)\n  )\n  loglik_past <- logLik(fit_past)\n\n  # Store the EPLD estimate\n  approx_elpds[min_t + 1] <- log_mean_exp(sum_rows(loglik_past[, fc_indices]))\n\n  # Iterate over i > min_t\n  i_refit <- min_t\n  refits <- min_t\n  ks <- 0\n\n  for (i in (min_t + 1):(N - fc_horizon)) {\n    if (silent < 1L) {\n      cat('Approximating elpd for training point', i, '...\\n')\n    }\n\n    # Get log likelihoods of what would be the\n    # last training observations for calculating Pareto k values\n    last_obs_indices <- which(\n      c(data_splits$data_train$time, data_splits$data_test$time) %in%\n        (i_refit + 1):i\n    )\n    logratio <- sum_rows(loglik_past[, last_obs_indices])\n\n    # Use PSIS to estimate whether the Pareto shape parameter of the\n    # importance weights is below the specified threshold; a lower value\n    # indicates the importance ratios have finite variance and can be\n    # used for approximating prediction error\n    psis_obj <- suppressWarnings(loo::psis(logratio))\n    k <- loo::pareto_k_values(psis_obj)\n    ks <- c(ks, k)\n\n    # If k is too high, refit the model based on the first i observations;\n    # in other words, the last refit did not provide stable enough predictions\n    # of what would be the last set of training observations; we instead need\n    # to include these in the training data, resulting in a slightly larger\n    # model\n    if (k > pareto_k_threshold) {\n      i_refit <- i\n      refits <- c(refits, i)\n\n      # Subset the data to now include the last set of training observations\n      data_splits <- cv_split(all_data, last_train = i, fc_horizon = fc_horizon)\n\n      # Re-fit the model\n      fit_past <- update(\n        fit_past,\n        data = data_splits$data_train,\n        newdata = data_splits$data_test,\n        lfo = TRUE,\n        noncentred = noncentred,\n        silent = silent\n      )\n\n      # Calculate ELPD as before\n      fc_indices <- which(\n        c(data_splits$data_train$time, data_splits$data_test$time) %in%\n          (i + 1):(i + fc_horizon)\n      )\n      loglik_past <- logLik(fit_past)\n      approx_elpds[i + 1] <- log_mean_exp(sum_rows(loglik_past[, fc_indices]))\n    } else {\n      # If k below threshold, calculate log likelihoods for the\n      # forecast observations using the normalised importance weights\n      # to weight the posterior draws\n      fc_indices <- which(\n        c(data_splits$data_train$time, data_splits$data_test$time) %in%\n          (i + 1):(i + fc_horizon)\n      )\n      lw <- loo::weights.importance_sampling(psis_obj, normalize = TRUE)[, 1]\n      approx_elpds[i + 1] <- log_sum_exp(\n        lw + sum_rows(loglik_past[, fc_indices])\n      )\n    }\n  }\n  return(structure(\n    list(\n      elpds = approx_elpds[(min_t + 1):(N - fc_horizon)],\n      sum_ELPD = sum(approx_elpds, na.rm = TRUE),\n      pareto_ks = ks[-1],\n      eval_timepoints = (min_t + 1):(N - fc_horizon),\n      pareto_k_threshold = pareto_k_threshold\n    ),\n    class = 'mvgam_lfo'\n  ))\n}\n\n#' Plot Pareto-k and ELPD values from a `mvgam_lfo` object\n#'\n#' This function takes an object of class `mvgam_lfo` and creates several\n#' informative diagnostic plots\n#' @importFrom graphics layout axis lines abline polygon points\n#' @param x An object of class `mvgam_lfo`\n#' @param ... Ignored\n#' @return A `ggplot` object presenting Pareto-k and ELPD values over the\n#' evaluation timepoints. For the Pareto-k plot, a dashed red line indicates the\n#' specified threshold chosen for triggering model refits. For the ELPD plot,\n#' a dashed red line indicates the bottom 10% quantile of ELPD values. Points below\n#' this threshold may represent outliers that were more difficult to forecast\n#' @export\nplot.mvgam_lfo = function(x, ...) {\n  object <- x\n\n  # Plot Pareto-k values over time\n  object$pareto_ks[which(is.infinite(object$pareto_ks))] <-\n    max(object$pareto_ks[which(!is.infinite(object$pareto_ks))])\n\n  dplyr::tibble(\n    eval_timepoints = object$eval_timepoints,\n    elpds = object$elpds,\n    pareto_ks = object$pareto_ks\n  ) -> obj_tribble\n\n  # Hack so we don't have to import tidyr just to use pivot_longer once\n  dplyr::bind_rows(\n    obj_tribble %>%\n      dplyr::select(eval_timepoints, elpds) %>%\n      dplyr::mutate(name = 'elpds', value = elpds) %>%\n      dplyr::select(-elpds),\n    obj_tribble %>%\n      dplyr::select(eval_timepoints, pareto_ks) %>%\n      dplyr::mutate(name = 'pareto_ks', value = pareto_ks) %>%\n      dplyr::select(-pareto_ks)\n  ) %>%\n    dplyr::left_join(\n      dplyr::tribble(\n        ~name                                              ,\n        ~threshold                                         ,\n        \"elpds\"                                            ,\n        quantile(object$elpds, probs = 0.15, na.rm = TRUE) ,\n        \"pareto_ks\"                                        ,\n        object$pareto_k_threshold\n      ),\n      by = \"name\"\n    ) %>%\n    dplyr::rowwise() %>%\n    dplyr::mutate(\n      colour = dplyr::case_when(\n        name == 'elpds' & value < threshold ~ \"outlier\",\n        name == 'pareto_ks' & value > threshold ~ \"outlier\",\n        TRUE ~ \"inlier\"\n      )\n    ) %>%\n    dplyr::ungroup() %>%\n    ggplot2::ggplot(ggplot2::aes(eval_timepoints, value)) +\n    ggplot2::facet_wrap(\n      ~ factor(\n        name,\n        levels = c(\"pareto_ks\", \"elpds\"),\n        labels = c(\"Pareto K\", \"ELPD\")\n      ),\n      ncol = 1,\n      scales = \"free_y\"\n    ) +\n    ggplot2::geom_hline(\n      ggplot2::aes(yintercept = threshold),\n      colour = \"#A25050\",\n      linetype = \"dashed\",\n      linewidth = 1\n    ) +\n    ggplot2::geom_line(linewidth = 0.5, col = \"grey30\") +\n    ggplot2::geom_point(shape = 16, colour = 'white', size = 2) +\n    ggplot2::geom_point(\n      ggplot2::aes(colour = colour),\n      shape = 16,\n      show.legend = F,\n      size = 1.5\n    ) +\n    ggplot2::scale_colour_manual(values = c(\"grey30\", \"#8F2727\")) +\n    ggplot2::labs(x = \"Evaluation time\", y = NULL) +\n    ggplot2::theme_bw()\n}\n\n#' Function to generate training and testing splits\n#' @noRd\ncv_split = function(data, last_train, fc_horizon = 1) {\n  if (inherits(data, 'list')) {\n    # Find indices of training and testing splits\n    temp_dat = data.frame(\n      time = data$index..time..index,\n      series = data$series\n    ) %>%\n      dplyr::mutate(index = dplyr::row_number()) %>%\n      dplyr::arrange(time, series)\n\n    indices_train <- temp_dat %>%\n      dplyr::filter(time <= last_train) %>%\n      dplyr::pull(index)\n\n    indices_test <- temp_dat %>%\n      dplyr::filter(time > last_train) %>%\n      dplyr::pull(index)\n\n    # Split\n    data_train <- lapply(data, function(x) {\n      if (is.matrix(x)) {\n        matrix(x[indices_train, ], ncol = NCOL(x))\n      } else {\n        x[indices_train]\n      }\n    })\n\n    data_test <- lapply(data, function(x) {\n      if (is.matrix(x)) {\n        matrix(x[indices_test, ], ncol = NCOL(x))\n      } else {\n        x[indices_test]\n      }\n    })\n  } else {\n    data_train <- data %>%\n      dplyr::filter(index..time..index <= last_train) %>%\n      dplyr::arrange(index..time..index, series)\n\n    data_test <- data %>%\n      dplyr::filter(index..time..index > last_train) %>%\n      dplyr::arrange(index..time..index, series)\n  }\n\n  return(list(data_train = data_train, data_test = data_test))\n}\n\n#' More stable version of log(sum(exp(x)))\n#' @noRd\nlog_sum_exp <- function(x) {\n  max_x <- max(x)\n  max_x + log(sum(exp(x - max_x)))\n}\n\n#' More stable version of log(mean(exp(x)))\n#' @noRd\nlog_mean_exp <- function(x) {\n  log_sum_exp(x) - log(length(x))\n}\n\n#' Summing without NAs\n#' @noRd\nsum_rows = function(x) {\n  if (NCOL(x) > 1) {\n    out <- rowSums(x, na.rm = TRUE)\n  } else {\n    out <- x[!is.na(x)]\n  }\n  return(out)\n}\n"
  },
  {
    "path": "R/logLik.mvgam.R",
    "content": "#' @title Compute pointwise Log-Likelihoods from fitted \\pkg{mvgam} objects\n#'\n#' @importFrom parallel setDefaultCluster stopCluster\n#'\n#' @param object \\code{list} object of class \\code{mvgam} or \\code{jsdgam}\n#'\n#' @param linpreds Optional `matrix` of linear predictor draws to use for\n#' calculating pointwise log-likelihoods.\n#'\n#' @param newdata Optional `data.frame` or `list` object specifying which series\n#' each column in `linpreds` belongs to. If `linpreds` is supplied, then\n#' `newdata` must also be supplied.\n#'\n#' @param family_pars Optional `list` containing posterior draws of\n#' family-specific parameters (i.e. shape, scale or overdispersion parameters).\n#' Required if `linpreds` and `newdata` are supplied.\n#'\n#' @param include_forecast Logical. If `newdata` were fed to the model to\n#' compute forecasts, should the log-likelihood draws for these observations\n#' also be returned. Defaults to `TRUE`.\n#'\n#' @param ... Ignored\n#'\n#' @return A `matrix` of dimension `n_samples x n_observations` containing the\n#' pointwise log-likelihood draws for all observations in `newdata`. If no\n#' `newdata` is supplied, log-likelihood draws are returned for all observations\n#' that were originally fed to the model (training observations and, if supplied\n#' to the original model via the `newdata` argument in \\code{\\link{mvgam}},\n#' testing observations).\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data and fit a model\n#' simdat <- sim_mvgam(\n#'   n_series = 1,\n#'   trend_model = AR()\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   trend_model = AR(),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract log-likelihood values\n#' lls <- logLik(mod)\n#' str(lls)\n#' }\n#'\n#' @export\n\nlogLik.mvgam = function(\n  object,\n  linpreds,\n  newdata,\n  family_pars,\n  include_forecast = TRUE,\n  ...\n) {\n  if (!missing(linpreds) & missing(newdata)) {\n    stop('argument \"newdata\" must be supplied when \"linpreds\" is supplied')\n  }\n\n  if (!missing(linpreds) & missing(family_pars)) {\n    stop('argument \"family_pars\" must be supplied when \"linpreds\" is supplied')\n  }\n\n  if (!missing(newdata) & missing(linpreds)) {\n    stop('argument \"linpreds\" must be supplied when \"newdata\" is supplied')\n  }\n\n  if (!missing(family_pars) & missing(linpreds)) {\n    stop('argument \"linpreds\" must be supplied when \"family_pars\" is supplied')\n  }\n\n  # Extract the linear predictor draws\n  if (missing(linpreds)) {\n    mus <- mcmc_chains(object$model_output, 'mus')\n  } else {\n    mus <- linpreds\n  }\n\n  # Need to know which series each observation belongs to so we can\n  # pull out appropriate family-level parameters (overdispersions, shapes, etc...)\n  if (!missing(newdata)) {\n    all_dat <- data.frame(series = newdata$series, y = newdata$y)\n\n    if (object$family == 'nmix') {\n      all_dat$cap <- newdata$cap\n    }\n  } else {\n    if (is.null(object$test_data)) {\n      all_dat <- data.frame(\n        series = object$obs_data$series,\n        time = object$obs_data$time,\n        y = object$obs_data$y\n      ) %>%\n        dplyr::arrange(time, series)\n\n      if (object$family == 'nmix') {\n        all_dat$cap <- data.frame(\n          series = object$obs_data$series,\n          time = object$obs_data$time,\n          cap = object$obs_data$cap\n        ) %>%\n          dplyr::select(series, time, cap) %>%\n          dplyr::arrange(time, series) %>%\n          dplyr::pull(cap)\n      }\n    } else {\n      all_dat <- data.frame(\n        series = c(object$obs_data$series, object$test_data$series),\n        time = c(object$obs_data$time, object$test_data$time),\n        y = c(object$obs_data$y, object$test_data$y)\n      ) %>%\n        dplyr::arrange(time, series)\n\n      if (object$family == 'nmix') {\n        all_dat$cap <- data.frame(\n          series = c(object$obs_data$series, object$test_data$series),\n          time = c(object$obs_data$time, object$test_data$time),\n          cap = c(object$obs_data$cap, object$test_data$cap)\n        ) %>%\n          dplyr::select(series, time, cap) %>%\n          dplyr::arrange(time, series) %>%\n          dplyr::pull(cap)\n      }\n    }\n  }\n\n  obs <- all_dat$y\n  series_obs <- as.numeric(all_dat$series)\n\n  # Supply forecast NAs if include_forecast is FALSE\n  if (!is.null(object$test_data) & !include_forecast & missing(newdata)) {\n    n_fc_obs <- length(object$test_data$y)\n    n_obs <- length(obs)\n    obs[((n_obs - n_fc_obs) + 1):n_obs] <- NA\n  }\n\n  # Family-specific parameters\n  family <- object$family\n\n  if (missing(family_pars)) {\n    family_pars <- extract_family_pars(object = object)\n    n_series <- NCOL(object$ytimes)\n  } else {\n    n_series <- length(object$series_names)\n  }\n\n  # Family parameters spread into a vector\n  family_extracts <- lapply(seq_along(family_pars), function(j) {\n    if (is.matrix(family_pars[[j]])) {\n      as.vector(family_pars[[j]][, series_obs])\n    } else {\n      as.vector(matrix(\n        rep(family_pars[[j]], NCOL(mus)),\n        nrow = NROW(mus),\n        byrow = FALSE\n      ))\n    }\n  })\n  names(family_extracts) <- names(family_pars)\n\n  # Add trial information if this is a Binomial model\n  if (object$family %in% c('binomial', 'beta_binomial')) {\n    trials <- as.vector(matrix(\n      rep(as.vector(attr(object$mgcv_model, 'trials')), NROW(mus)),\n      nrow = NROW(mus),\n      byrow = TRUE\n    ))\n    family_extracts$trials <- trials\n  }\n\n  # Create a truth matrix that can also be spread to a vector\n  truth_mat <- matrix(rep(obs, NROW(mus)), nrow = NROW(mus), byrow = TRUE)\n\n  # Log-likelihood as a vector\n  Xp <- as.matrix(as.vector(mus))\n  attr(Xp, 'model.offset') <- 0\n\n  if (family == 'nmix') {\n    Xp <- as.matrix(qlogis(as.vector(mcmc_chains(\n      object$model_output,\n      'detprob'\n    ))))\n    attr(Xp, 'model.offset') <- 0\n    latent_lambdas <- exp(as.vector(mcmc_chains(object$model_output, 'trend')))\n    cap_mat <- matrix(\n      rep(all_dat$cap, NROW(mus)),\n      nrow = NROW(mus),\n      byrow = TRUE\n    )\n    cap <- as.vector(cap_mat)\n  } else {\n    latent_lambdas <- NULL\n    cap <- NULL\n  }\n  log_lik_vec <- mvgam_predict(\n    family = family,\n    family_pars = family_extracts,\n    truth = as.vector(truth_mat),\n    latent_lambdas = latent_lambdas,\n    cap = cap,\n    type = 'link',\n    Xp = Xp,\n    betas = 1,\n    density = TRUE\n  )\n\n  # Convert back to matrix and return\n  log_lik_mat <- matrix(log_lik_vec, nrow = NROW(mus))\n  return(log_lik_mat)\n}\n"
  },
  {
    "path": "R/loo.mvgam.R",
    "content": "#' LOO information criteria for \\pkg{mvgam} models\n#'\n#' Extract the LOOIC (leave-one-out information criterion) using [loo::loo()].\n#'\n#' @importFrom loo loo is.loo\n#'\n#' @param x Object of class `mvgam` or `jsdgam`\n#'\n#' @param incl_dynamics Deprecated and currently ignored\n#'\n#' @param ... Additional arguments for [loo::loo()]\n#'\n#' @rdname loo.mvgam\n#'\n#' @return For `loo.mvgam`, an object of class `psis_loo` (see [loo::loo()]\n#' for details). For `loo_compare.mvgam`, an object of class `compare.loo`\n#' (see [loo::loo_compare()] for details).\n#'\n#' @details\n#' When comparing two (or more) fitted `mvgam` models, we can estimate the\n#' difference in their in-sample predictive accuracies using the Expected Log\n#' Predictive Density (ELPD). This metric can be approximated using Pareto\n#' Smoothed Importance Sampling (PSIS), which re-weights posterior draws to\n#' approximate predictions for a datapoint had it not been included in the\n#' original model fit (i.e. leave-one-out cross-validation).\n#'\n#' See [loo::loo()] and [loo::loo_compare()] for further details on how this\n#' importance sampling works.\n#'\n#' Note: In-sample predictive metrics such as PSIS-LOO can sometimes be overly\n#' optimistic for models that include process error components (e.g. those with\n#' `trend_model`, `trend_formula`, or `factor_formula`). Consider using\n#' out-of-sample evaluations for further scrutiny (see\n#' \\code{\\link{forecast.mvgam}}, \\code{\\link{score.mvgam_forecast}},\n#' \\code{\\link{lfo_cv}}).\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' #--------------------------------------------------\n#' # Simulate 4 time series with hierarchical seasonality\n#' # and independent AR1 dynamic processes\n#' #--------------------------------------------------\n#' set.seed(111)\n#'\n#' simdat <- sim_mvgam(\n#'   seasonality = 'hierarchical',\n#'   trend_model = AR(),\n#'   family = gaussian()\n#' )\n#'\n#' # Fit a model with shared seasonality\n#' mod1 <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   data = rbind(simdat$data_train, simdat$data_test),\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' conditional_effects(mod1)\n#'\n#' mc.cores.def <- getOption('mc.cores')\n#' options(mc.cores = 1)\n#' loo(mod1)\n#'\n#' # Fit a model with hierarchical seasonality\n#' mod2 <- update(\n#'   mod1,\n#'   formula = y ~ s(season, bs = 'cc', k = 6) +\n#'     s(season, series, bs = 'fs', xt = list(bs = 'cc'), k = 4),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' conditional_effects(mod2)\n#' loo(mod2)\n#'\n#' # Add AR1 dynamic errors to mod2\n#' mod3 <- update(\n#'   mod2,\n#'   trend_model = AR(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' conditional_effects(mod3)\n#' plot(mod3, type = 'trend')\n#' loo(mod3)\n#'\n#' #--------------------------------------------------\n#' # Compare models using LOO\n#' #--------------------------------------------------\n#' loo_compare(mod1, mod2, mod3)\n#' options(mc.cores = mc.cores.def)\n#'\n#' #--------------------------------------------------\n#' # Compare forecast abilities using LFO-CV\n#' #--------------------------------------------------\n#'\n#' lfo_mod2 <- lfo_cv(mod2, min_t = 92)\n#' lfo_mod3 <- lfo_cv(mod3, min_t = 92)\n#'\n#' # Plot forecast ELPD differences\n#' plot(\n#'   y = lfo_mod2$elpds - lfo_mod3$elpds,\n#'   x = lfo_mod2$eval_timepoints,\n#'   pch = 16,\n#'   ylab = 'ELPD_mod2 - ELPD_mod3',\n#'   xlab = 'Evaluation timepoint'\n#' )\n#'\n#' abline(h = 0, lty = 'dashed')\n#' }\n#'\n#' @export\n\nloo.mvgam <- function(x, incl_dynamics = FALSE, ...) {\n  # Families with observation error components can give strange log-likelihood estimates\n  # if process error components were also included in the model (this is because the\n  # observation error estimates may be very small); use incl_dynamics = TRUE for these\n  # families to ensure all errors are propagated appropriately when calculating the\n  # log-likelihood\n  incl_dynamics <- FALSE\n  if (\n    x$family %in%\n      c(\n        \"gaussian\",\n        \"lognormal\",\n        \"student\"\n      )\n  ) {\n    incl_dynamics <- TRUE\n  }\n\n  if (x$family == 'nmix' | incl_dynamics) {\n    logliks <- logLik(x, include_forecast = FALSE)\n  } else {\n    x$series_names <- levels(x$obs_data$series)\n    logliks <- logLik(\n      x,\n      linpreds = predict(\n        x,\n        newdata = x$obs_data,\n        type = 'link',\n        summary = FALSE,\n        process_error = FALSE\n      ),\n      newdata = x$obs_data,\n      family_pars = extract_family_pars(x),\n      include_forecast = FALSE\n    )\n  }\n\n  logliks <- clean_ll(x, logliks)\n  releffs <- loo::relative_eff(\n    exp(logliks),\n    chain_id = sort(rep(\n      1:x$model_output@sim$chains,\n      (NROW(logliks) /\n        x$model_output@sim$chains)\n    ))\n  )\n  loo::loo(logliks, r_eff = releffs, ...)\n}\n\n#' @importFrom loo loo_compare\n#'\n#' @param x Object of class `mvgam`\n#'\n#' @param ... More \\code{mvgam} objects\n#'\n#' @param model_names If `NULL` (the default) will use model names derived\n#' from deparsing the call. Otherwise will use the passed values as model names\n#'\n#' @param incl_dynamics Deprecated and currently ignored\n#'\n#' @rdname loo.mvgam\n#'\n#' @export\nloo_compare.mvgam <- function(\n  x,\n  ...,\n  model_names = NULL,\n  incl_dynamics = FALSE\n) {\n  models <- split_mod_dots(x, ..., model_names = model_names)\n  loos <- named_list(names(models))\n  for (i in seq_along(models)) {\n    loos[[i]] <- loo(models[[i]], incl_dynamics = incl_dynamics)\n  }\n  loo_compare(loos)\n}\n\n#' @export\n#' @importFrom loo loo\nloo::loo\n\n#' @export\n#' @importFrom loo loo_compare\nloo::loo_compare\n\n#'@noRd\nsplit_mod_dots = function(x, ..., model_names = NULL, other = TRUE) {\n  dots <- list(x, ...)\n  names <- substitute(list(x, ...), env = parent.frame())[-1]\n  names <- ulapply(names, deparse)\n\n  if (!is.null(model_names)) {\n    names <- model_names\n  }\n\n  if (length(names)) {\n    if (!length(names(dots))) {\n      names(dots) <- names\n    } else {\n      has_no_name <- !nzchar(names(dots))\n      names(dots)[has_no_name] <- names[has_no_name]\n    }\n  }\n  is_mvgam <- unlist(lapply(dots, function(y) inherits(y, 'mvgam')))\n  models <- dots[is_mvgam]\n  out <- dots[!is_mvgam]\n\n  if (length(out)) {\n    stop(\n      \"Only model objects can be passed to '...' for this method.\",\n      call. = FALSE\n    )\n  }\n  models\n}\n\n#'@noRd\nnamed_list = function(names, values = NULL) {\n  if (!is.null(values)) {\n    if (length(values) <= 1L) {\n      values <- replicate(length(names), values)\n    }\n    values <- as.list(values)\n    stopifnot(length(values) == length(names))\n  } else {\n    values <- vector(\"list\", length(names))\n  }\n  setNames(values, names)\n}\n\n#'@noRd\nclean_ll = function(x, logliks) {\n  # First remove any columns that are all NA (these had missing observations)\n  logliks <- logliks[, !apply(logliks, 2, function(x) all(!is.finite(x)))]\n\n  # Next resample any remaining non-finite values (occasionally happens with\n  # some observation families)\n  samp_noinf = function(x) {\n    x_finite <- x[is.finite(x)]\n    x[!is.finite(x)] <- sample(\n      x_finite,\n      length(x[!is.finite(x)]),\n      replace = TRUE\n    )\n    x\n  }\n  logliks <- apply(logliks, 2, samp_noinf)\n\n  # return\n  logliks\n}\n"
  },
  {
    "path": "R/lv_correlations.R",
    "content": "#' Calculate trend correlations based on latent factor loadings for\n#' \\pkg{mvgam} models\n#'\n#' This function uses factor loadings from a fitted dynamic factor\n#' \\code{mvgam} model to calculate temporal correlations among series' trends.\n#'\n#' @importFrom stats cov2cor cov\n#'\n#' @param object \\code{list} object of class \\code{mvgam} that used latent\n#' factors, either with `use_lv = TRUE` or by supplying a `trend_map`. See\n#' [mvgam()] for details and for an example.\n#'\n#' @return A \\code{list} object containing the mean posterior correlations and\n#' the full array of posterior correlations.\n#'\n#' @details Although this function will still work, it is now recommended to use\n#' [residual_cor()] to obtain residual correlation information in a more\n#' user-friendly format that allows for a deeper investigation of relationships\n#' among the time series.\n#'\n#' @seealso [residual_cor()], [plot.mvgam_residcor()]\n#'\n#' @examples\n#' \\dontrun{\n#' #--------------------------------------------------\n#' # Fit a model that uses two AR(1) dynamic factors to model\n#' # the temporal dynamics of the four rodent species in the portal_data\n#' #--------------------------------------------------\n#' mod <- mvgam(\n#'   captures ~ series,\n#'   trend_model = AR(),\n#'   use_lv = TRUE,\n#'   n_lv = 2,\n#'   data = portal_data,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot the two dynamic factors\n#' plot(mod, type = 'factors')\n#'\n#' # Calculate correlations among the series\n#' lvcors <- lv_correlations(mod)\n#' names(lvcors)\n#' lapply(lvcors, class)\n#'\n#' # Recommended: use residual_cor() instead\n#' lvcors <- residual_cor(mod)\n#' names(lvcors)\n#' lvcors$cor\n#'\n#' # Plot credible correlations as a matrix\n#' plot(lvcors, cluster = TRUE)\n#'\n#' # Not needed for general use; cleans up connections for automated testing\n#' closeAllConnections()\n#' }\n#'\n#' @export\nlv_correlations = function(object) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  # Series start and end indices\n  ends <- seq(\n    0,\n    dim(mcmc_chains(object$model_output, 'ypred'))[2],\n    length.out = NCOL(object$ytimes) + 1\n  )\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n  ends <- ends[-1]\n\n  # Total number of MCMC samples\n  n_preds <- dim(mcmc_chains(object$model_output, 'trend')[,\n    starts[1]:ends[1]\n  ])[1]\n  data_train <- object$obs_data\n\n  # Total number of observations per series\n  if (inherits(data_train, 'list')) {\n    n_obs <- length(data_train$y) / NCOL(object$ytimes)\n  } else {\n    n_obs <- NROW(data_train) / NCOL(object$ytimes)\n  }\n\n  # Extract series trends\n  series_trends <- lapply(seq_len(length(ends)), function(y) {\n    if (object$fit_engine == 'stan') {\n      # For stan objects, trend is stored as a vector in column-major order\n      mcmc_chains(object$model_output, 'trend')[, seq(\n        y,\n        dim(mcmc_chains(object$model_output, 'trend'))[2],\n        by = NCOL(object$ytimes)\n      )]\n    } else {\n      mcmc_chains(object$model_output, 'trend')[, starts[y]:ends[y]][, 1:n_obs]\n    }\n  })\n\n  # Get list of trend correlation estimates\n  all_trend_cors <- lapply(seq_len(n_preds), function(x) {\n    cov2cor(cov(do.call(\n      cbind,\n      lapply(series_trends, function(y) {\n        y[x, ]\n      })\n    )))\n  })\n\n  # Calculate posterior mean correlations\n  mean_correlations <- Reduce(`+`, all_trend_cors) / length(all_trend_cors)\n  rownames(mean_correlations) <- colnames(mean_correlations) <- levels(\n    data_train$series\n  )\n\n  list(\n    mean_correlations = mean_correlations,\n    posterior_correlations = all_trend_cors\n  )\n}\n"
  },
  {
    "path": "R/marginaleffects.mvgam.R",
    "content": "#' Helper functions for \\pkg{marginaleffects} calculations in \\pkg{mvgam} models\n#'\n#' @importFrom stats coef model.frame\n#' @importFrom insight find_predictors get_data\n#' @importFrom marginaleffects get_coef set_coef get_vcov get_predict\n#' @importFrom utils getFromNamespace\n#'\n#' @inheritParams marginaleffects::get_coef\n#' @inheritParams marginaleffects::set_coef\n#' @inheritParams marginaleffects::get_vcov\n#' @inheritParams marginaleffects::get_predict\n#' @inheritParams insight::get_data\n#' @inheritParams insight::find_predictors\n#'\n#' @param mfx Ignored\n#' @param newparams Ignored\n#' @param ndraws Ignored\n#' @param se.fit Ignored\n#'\n#' @param trend_effects `logical`, extract from the process model component\n#' (only applicable if a `trend_formula` was specified in the model)\n#'\n#' @param process_error `logical`. If `TRUE`, uncertainty in the latent\n#' process (or trend) model is incorporated in predictions\n#'\n#' @return Objects suitable for internal 'marginaleffects' functions to proceed.\n#' See [marginaleffects::get_coef()], [marginaleffects::set_coef()],\n#' [marginaleffects::get_vcov()], [marginaleffects::get_predict()],\n#' [insight::get_data()] and [insight::find_predictors()] for details\n#'\n#' @name mvgam_marginaleffects\n#'\n#' @author Nicholas J Clark\nNULL\n\n#' @export\n#' @importFrom marginaleffects predictions\nmarginaleffects::predictions\n\n#' @export\n#' @importFrom marginaleffects avg_predictions\nmarginaleffects::avg_predictions\n\n#' @export\n#' @importFrom marginaleffects plot_predictions\nmarginaleffects::plot_predictions\n\n#' @export\n#' @importFrom marginaleffects slopes\nmarginaleffects::slopes\n\n#' @export\n#' @importFrom marginaleffects plot_slopes\nmarginaleffects::plot_slopes\n\n#' @export\n#' @importFrom marginaleffects comparisons\nmarginaleffects::comparisons\n\n#' @export\n#' @importFrom marginaleffects plot_comparisons\nmarginaleffects::plot_comparisons\n\n#' @export\n#' @importFrom marginaleffects datagrid\nmarginaleffects::datagrid\n\n#' @export\n#' @importFrom marginaleffects hypotheses\nmarginaleffects::hypotheses\n\n#' @export\n#' @importFrom marginaleffects get_predict\nmarginaleffects::get_predict\n\n#' @export\n#' @importFrom insight get_data\ninsight::get_data\n\n#' Functions needed for working with \\pkg{marginaleffects}\n#' @rdname mvgam_marginaleffects\n#' @export\nget_coef.mvgam <- function(model, trend_effects = FALSE, ...) {\n  # Check trend_effects\n  if (trend_effects) {\n    if (is.null(model$trend_call)) {\n      stop('no trend_formula exists so there no trend-level coefficients')\n    }\n  }\n\n  if (!trend_effects) {\n    b <- coef(model$mgcv_model)\n  } else {\n    b <- coef(model$trend_mgcv_model)\n  }\n  return(b)\n}\n\n#' @rdname mvgam_marginaleffects\n#' @export\nset_coef.mvgam <- function(model, coefs, trend_effects = FALSE, ...) {\n  # Check trend_effects\n  if (trend_effects) {\n    if (is.null(model$trend_call)) {\n      stop('no trend_formula exists so there no trend-level coefficients')\n    }\n  }\n\n  out <- model\n\n  if (!trend_effects) {\n    out$mgcv_model$coefficients <- coefs\n  } else {\n    out$trend_mgcv_model$coefficients <- coefs\n  }\n  return(out)\n}\n\n#' @rdname mvgam_marginaleffects\n#' @export\nget_vcov.mvgam <- function(model, vcov = NULL, ...) {\n  if (!is.null(vcov) && !is.logical(vcov)) {\n    insight::format_warning(\n      \"The `vcov` argument is not supported for models of this class.\"\n    )\n  }\n  return(NULL)\n}\n\n#' @rdname mvgam_marginaleffects\n#' @export\nget_predict.mvgam <- function(\n  model,\n  newdata,\n  type = 'response',\n  mfx,\n  newparams,\n  ndraws,\n  se.fit,\n  process_error = FALSE,\n  ...\n) {\n  preds <- predict(\n    object = model,\n    newdata = newdata,\n    type = type,\n    process_error = process_error,\n    summary = FALSE,\n    ...\n  )\n  if (\"rowid\" %in% colnames(newdata)) {\n    out <- data.frame(\n      rowid = newdata[[\"rowid\"]],\n      estimate = apply(preds, 2, median)\n    )\n  } else {\n    out <- data.frame(\n      rowid = seq_len(NCOL(preds)),\n      estimate = apply(preds, 2, median)\n    )\n  }\n\n  attr(out, \"posterior_draws\") <- t(preds)\n  return(out)\n}\n\n#' Functions needed for getting data / objects with \\pkg{insight}\n#' @rdname mvgam_marginaleffects\n#' @export\nget_data.mvgam = function(x, source = \"environment\", verbose = TRUE, ...) {\n  resp_terms <- as.character(rlang::f_lhs(x$call))\n  if (length(resp_terms) == 1L) {\n    resp <- resp_terms\n  } else {\n    if (any(grepl('cbind', resp_terms))) {\n      resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n      resp <- resp_terms[1]\n    }\n  }\n\n  mf <- tryCatch(\n    {\n      # Drop response observations if a trend call was used because often\n      # there won't be an easy way to match them up (for example if multiple\n      # series depend on a shared latent trend)\n      if (!is.null(x$trend_call)) {\n        # Original series, time and outcomes\n        orig_dat <- data.frame(\n          series = x$obs_data$series,\n          time = x$obs_data$index..time..index,\n          y = x$obs_data$y\n        )\n\n        # Add indicators of trend names as factor levels using the trend_map\n        trend_indicators <- vector(length = length(orig_dat$time))\n        for (i in 1:length(orig_dat$time)) {\n          trend_indicators[i] <- x$trend_map$trend[which(\n            x$trend_map$series == orig_dat$series[i]\n          )]\n        }\n        trend_indicators <- factor(\n          paste0('trend', trend_indicators),\n          levels = paste0('trend', unique(x$trend_map$trend))\n        )\n\n        # Trend-level data, before any slicing that took place\n        orig_dat %>%\n          dplyr::bind_cols(data.frame(\n            trend_series = trend_indicators,\n            row_num = 1:length(x$obs_data$index..time..index)\n          )) -> trend_level_data\n\n        # # We only kept one time observation per trend\n        trend_level_data %>%\n          dplyr::group_by(trend_series, time) %>%\n          dplyr::slice_head(n = 1) %>%\n          dplyr::pull(row_num) -> idx\n\n        # Extract model.frame for trend_level effects and add the\n        # trend indicators\n        mf_data <- model.frame(x, trend_effects = TRUE)\n        mf_data$trend_series <- trend_level_data$trend_series[idx]\n        mf_data$time <- trend_level_data$time[idx]\n\n        if ('series' %in% names(mf_data)) {\n          mf_data %>%\n            dplyr::select(-series) -> mf_data\n        }\n\n        # Now join with the original data so the original observations can\n        # be included\n        trend_level_data %>%\n          dplyr::left_join(mf_data, by = c('trend_series', 'time')) %>%\n          dplyr::select(-trend_series, -row_num, -trend_y) -> mf_data\n\n        # Extract any predictors from the observation level model and\n        # bind to the trend level model.frame\n        mf_obs <- model.frame(x, trend_effects = FALSE)\n        mf_data <- cbind(mf_obs, mf_data) %>%\n          subset(., select = which(!duplicated(names(.))))\n\n        # Now get the observed response, in case there are any\n        # NAs there that need to be updated\n        mf_data[, resp] <- x$obs_data$y\n      } else {\n        mf_data <- model.frame(x, trend_effects = FALSE)\n        mf_data[, resp] <- x$obs_data[[resp]]\n      }\n      mf_data\n    },\n    error = function(x) {\n      NULL\n    }\n  )\n\n  prep_data <- utils::getFromNamespace(\".prepare_get_data\", \"insight\")\n  out <- prep_data(x, mf, effects = \"all\", verbose = verbose)\n\n  # Remove colnames with cbind in them as these can be artifacts in\n  # binomial model data preparations\n  if (any(grepl('cbind', colnames(out)))) {\n    out %>%\n      dplyr::select(-matches('cbind')) -> out\n  }\n\n  return(out)\n}\n\n#' @rdname mvgam_marginaleffects\n#' @export\nget_data.mvgam_prefit = function(\n  x,\n  source = \"environment\",\n  verbose = TRUE,\n  ...\n) {\n  resp_terms <- as.character(rlang::f_lhs(x$call))\n  if (length(resp_terms) == 1L) {\n    resp <- resp_terms\n  } else {\n    if (any(grepl('cbind', resp_terms))) {\n      resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n      resp <- resp_terms[1]\n    }\n  }\n\n  mf <- tryCatch(\n    {\n      # Drop response observations if a trend call was used because often\n      # there won't be an easy way to match them up (for example if multiple\n      # series depend on a shared latent trend)\n      if (!is.null(x$trend_call)) {\n        # Original series, time and outcomes\n        orig_dat <- data.frame(\n          series = x$obs_data$series,\n          time = x$obs_data$index..time..index,\n          y = x$obs_data$y\n        )\n\n        # Add indicators of trend names as factor levels using the trend_map\n        trend_indicators <- vector(length = length(orig_dat$time))\n        for (i in 1:length(orig_dat$time)) {\n          trend_indicators[i] <- x$trend_map$trend[which(\n            x$trend_map$series == orig_dat$series[i]\n          )]\n        }\n        trend_indicators <- as.factor(paste0('trend', trend_indicators))\n\n        # Trend-level data, before any slicing that took place\n        trend_level_data <- data.frame(\n          trend_series = trend_indicators,\n          series = orig_dat$series,\n          time = orig_dat$time,\n          y = orig_dat$y,\n          row_num = 1:length(x$obs_data$index..time..index)\n        )\n\n        # # We only kept one time observation per trend\n        trend_level_data %>%\n          dplyr::group_by(trend_series, time) %>%\n          dplyr::slice_head(n = 1) %>%\n          dplyr::pull(row_num) -> idx\n\n        # Extract model.frame for trend_level effects and add the\n        # trend indicators\n        mf_data <- model.frame(x, trend_effects = TRUE)\n        mf_data$trend_series <- trend_level_data$trend_series[idx]\n        mf_data$time <- trend_level_data$time[idx]\n\n        if ('series' %in% names(mf_data)) {\n          mf_data %>%\n            dplyr::select(-series) -> mf_data\n        }\n\n        # Now join with the original data so the original observations can\n        # be included\n        trend_level_data %>%\n          dplyr::left_join(mf_data, by = c('trend_series', 'time')) %>%\n          dplyr::select(-trend_series, -row_num, -trend_y) -> mf_data\n\n        # Extract any predictors from the observation level model and\n        # bind to the trend level model.frame\n        mf_obs <- model.frame(x, trend_effects = FALSE)\n        mf_data <- cbind(mf_obs, mf_data) %>%\n          subset(., select = which(!duplicated(names(.))))\n\n        # Now get the observed response, in case there are any\n        # NAs there that need to be updated\n        mf_data[, resp] <- x$obs_data$y\n      } else {\n        mf_data <- model.frame(x, trend_effects = FALSE)\n        mf_data[, resp] <- x$obs_data[[resp]]\n      }\n      mf_data\n    },\n    error = function(x) {\n      NULL\n    }\n  )\n\n  prep_data <- utils::getFromNamespace(\".prepare_get_data\", \"insight\")\n  out <- prep_data(x, mf, effects = \"all\", verbose = verbose)\n\n  # Remove colnames with cbind in them as these can be artifacts in\n  # binomial model data preparations\n  if (any(grepl('cbind', colnames(out)))) {\n    out %>%\n      dplyr::select(-matches('cbind')) -> out\n  }\n\n  return(out)\n}\n\n#' @rdname mvgam_marginaleffects\n#' @export\nfind_predictors.mvgam = function(\n  x,\n  effects = c('fixed', 'random', 'all'),\n  component = c(\n    'all',\n    'conditional',\n    'zi',\n    'zero_inflated',\n    'dispersion',\n    'instruments',\n    'correlation',\n    'smooth_terms'\n  ),\n  flatten = FALSE,\n  verbose = TRUE,\n  ...\n) {\n  obs_preds <- insight::find_predictors(\n    x$mgcv_model,\n    effects = effects,\n    component = component,\n    flatten = flatten\n  )\n  if (!is.null(x$trend_call)) {\n    preds <- list()\n    trend_preds <- insight::find_predictors(\n      x$trend_mgcv_model,\n      effects = effects,\n      component = component,\n      flatten = flatten\n    )\n\n    if (flatten) {\n      preds <- unique(c(obs_preds, trend_preds))\n    } else {\n      preds$conditional <- unique(c(\n        obs_preds$conditional,\n        trend_preds$conditional\n      ))\n    }\n  } else {\n    preds <- obs_preds\n  }\n\n  if (x$family == 'nmix') {\n    if (flatten) {\n      preds <- c(preds, 'cap')\n    } else {\n      preds$conditional <- c(preds$conditional, 'cap')\n    }\n  }\n\n  # Check for offsets and add appropriately\n  if (!is.null(attr(terms(x$call), \"offset\"))) {\n    off_names <- grep(\n      'offset',\n      rownames(attr(terms.formula(x$call), 'factors')),\n      value = TRUE\n    )\n    off_names <- sub(\n      \"offset\\\\((.*)\\\\)$\",\n      \"\\\\1\",\n      grep('offset', off_names, value = TRUE)\n    )\n\n    if (flatten) {\n      for (i in 1:length(off_names)) {\n        preds <- c(preds, off_names[i])\n      }\n    } else {\n      for (i in 1:length(off_names)) {\n        preds$conditional <- c(preds$conditional, off_names[i])\n      }\n    }\n  }\n\n  # Any other required variables, needed for grouped models\n  if (!inherits(attr(x$model_data, 'trend_model'), 'mvgam_trend')) {\n    trend_model <- list(\n      trend_model = attr(x$model_data, 'trend_model'),\n      unit = 'time',\n      gr = 'NA',\n      subgr = 'series'\n    )\n  } else {\n    trend_model <- attr(x$model_data, 'trend_model')\n  }\n  other_vars <- c(trend_model$unit, trend_model$gr, trend_model$subgr)\n  if (!is.null(attr(x$model_data, 'prepped_trend_model'))) {\n    prepped_model <- attr(x$model_data, 'prepped_trend_model')\n    other_vars <- c(\n      other_vars,\n      c(prepped_model$unit, prepped_model$gr, prepped_model$subgr)\n    )\n  }\n\n  if (flatten) {\n    other_vars <- setdiff(unique(other_vars), c('NA', preds))\n    preds <- c(preds, other_vars)\n  } else {\n    other_vars <- setdiff(unique(other_vars), c('NA', preds$conditional))\n    preds$conditional <- c(preds$conditional, other_vars)\n  }\n\n  return(preds)\n}\n\n#' @rdname mvgam_marginaleffects\n#' @export\nfind_predictors.mvgam_prefit = function(\n  x,\n  effects = c('fixed', 'random', 'all'),\n  component = c(\n    'all',\n    'conditional',\n    'zi',\n    'zero_inflated',\n    'dispersion',\n    'instruments',\n    'correlation',\n    'smooth_terms'\n  ),\n  flatten = FALSE,\n  verbose = TRUE,\n  ...\n) {\n  obs_preds <- insight::find_predictors(\n    x$mgcv_model,\n    effects = effects,\n    component = component,\n    flatten = flatten\n  )\n  if (!is.null(x$trend_call)) {\n    preds <- list()\n    trend_preds <- insight::find_predictors(\n      x$trend_mgcv_model,\n      effects = effects,\n      component = component,\n      flatten = flatten\n    )\n\n    if (flatten) {\n      preds <- unique(c(obs_preds, trend_preds))\n    } else {\n      preds$conditional <- unique(c(\n        obs_preds$conditional,\n        trend_preds$conditional\n      ))\n    }\n  } else {\n    preds <- obs_preds\n  }\n\n  if (x$family == 'nmix') {\n    if (flatten) {\n      preds <- c(preds, 'cap')\n    } else {\n      preds$conditional <- c(preds$conditional, 'cap')\n    }\n  }\n\n  # Any other required variables, needed for grouped models\n  if (!inherits(attr(x$model_data, 'trend_model'), 'mvgam_trend')) {\n    trend_model <- list(\n      trend_model = attr(x$model_data, 'trend_model'),\n      unit = 'time',\n      gr = 'NA',\n      subgr = 'series'\n    )\n  } else {\n    trend_model <- attr(x$model_data, 'trend_model')\n  }\n  other_vars <- c(trend_model$unit, trend_model$gr, trend_model$subgr)\n  if (!is.null(attr(x$model_data, 'prepped_trend_model'))) {\n    prepped_model <- attr(x$model_data, 'prepped_trend_model')\n    other_vars <- c(\n      other_vars,\n      c(prepped_model$unit, prepped_model$gr, prepped_model$subgr)\n    )\n  }\n\n  if (flatten) {\n    other_vars <- setdiff(unique(other_vars), c('NA', preds))\n    preds <- c(preds, other_vars)\n  } else {\n    other_vars <- setdiff(unique(other_vars), c('NA', preds$conditional))\n    preds$conditional <- c(preds$conditional, other_vars)\n  }\n\n  return(preds)\n}\n"
  },
  {
    "path": "R/mcmc_plot.mvgam.R",
    "content": "#' MCMC plots of \\pkg{mvgam} parameters, as implemented in \\pkg{bayesplot}\n#'\n#' Convenient way to call MCMC plotting functions\n#' implemented in the \\pkg{bayesplot} package for \\pkg{mvgam} models\n#' @importFrom bayesplot color_scheme_set color_scheme_get\n#' @inheritParams brms::mcmc_plot\n#' @inheritParams as.data.frame.mvgam\n#' @param type The type of the plot.\n#'   Supported types are (as names) \\code{hist}, \\code{dens},\n#'   \\code{hist_by_chain}, \\code{dens_overlay},\n#'   \\code{violin}, \\code{intervals}, \\code{areas},\n#'   \\code{areas_ridges}, \\code{combo}, \\code{acf},\n#'   \\code{acf_bar}, \\code{trace}, \\code{trace_highlight},\n#'   \\code{scatter}, \\code{hex}, \\code{pairs}, \\code{violin},\n#'   \\code{rhat}, \\code{rhat_hist}, \\code{neff}, \\code{neff_hist}\n#'   and \\code{nuts_energy}.\n#'   For an overview on the various plot types see\n#'   \\code{\\link[bayesplot:MCMC-overview]{MCMC-overview}}.\n#' @return A \\code{\\link[ggplot2:ggplot]{ggplot}} object\n#' that can be further customized using the \\pkg{ggplot2} package.\n#' @seealso \\code{\\link{mvgam_draws}} for an overview of some of the shortcut strings\n#' that can be used for argument `variable`\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(n_series = 1, trend_model = AR())\n#' mod <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n#'              trend_model = AR(),\n#'              noncentred = TRUE,\n#'              data = simdat$data_train,\n#'              chains = 2,\n#'              silent = 2)\n#' mcmc_plot(mod)\n#' mcmc_plot(mod, type = 'neff_hist')\n#' mcmc_plot(mod, variable = 'betas', type = 'areas')\n#' mcmc_plot(mod, variable = 'trend_params', type = 'combo')\n#' }\n#' @export\nmcmc_plot.mvgam = function(\n  object,\n  type = 'intervals',\n  variable = NULL,\n  regex = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Set red colour scheme\n  col_scheme <- attr(color_scheme_get(), 'scheme_name')\n  color_scheme_set('red')\n\n  # Check type validity\n  valid_types <- as.character(bayesplot::available_mcmc(\"\"))\n  valid_types <- sub(\"^mcmc_\", \"\", valid_types)\n  if (!type %in% valid_types) {\n    stop(\n      \"Invalid plot type. Valid plot types are: \\n\",\n      paste0(\"'\", valid_types, \"'\", collapse = \", \"),\n      call. = FALSE\n    )\n  }\n\n  # Set default params to plot\n  # By default, don't plot the Betas as there can be hundreds\n  # of them in spline models\n  if (is.null(variable)) {\n    all_pars <- variables(object)\n    variable <- c(\n      all_pars$observation_pars[, 1],\n      all_pars$observation_smoothpars[, 1],\n      all_pars$observation_re_params[, 1],\n      all_pars$trend_pars[, 1],\n      all_pars$trend_smoothpars[, 1],\n      all_pars$trend_re_params[, 1]\n    )\n    regex <- FALSE\n  }\n\n  # Formal arguments\n  mcmc_fun <- get(paste0(\"mcmc_\", type), asNamespace(\"bayesplot\"))\n  mcmc_arg_names <- names(formals(mcmc_fun))\n  mcmc_args <- list(...)\n  if (\"x\" %in% mcmc_arg_names) {\n    if (grepl(\"^nuts_\", type)) {\n      # x refers to a molten data.frame of NUTS parameters\n      mcmc_args$x <- brms::nuts_params(object$model_output)\n    } else {\n      # x refers to a data.frame of draws\n      draws <- as.array(\n        object,\n        variable = variable,\n        regex = regex,\n        use_alias = use_alias\n      )\n      sel_variables <- dimnames(draws)$variable\n      if (type %in% c(\"scatter\", \"hex\") && length(sel_variables) != 2L) {\n        stop(\n          \"Exactly 2 parameters must be selected for this type.\",\n          \"\\nParameters selected: \",\n          paste0(\"'\", sel_variables, \"'\", collapse = \", \"),\n          call. = FALSE\n        )\n      }\n\n      if (type == 'pairs' && length(sel_variables) == 1L) {\n        stop(\n          \"2 or more parameters must be selected for this type.\",\n          \"\\nParameters selected: \",\n          paste0(\"'\", sel_variables, \"'\", collapse = \", \"),\n          call. = FALSE\n        )\n      }\n\n      mcmc_args$x <- draws\n    }\n  }\n\n  if (\"np\" %in% mcmc_arg_names) {\n    mcmc_args$np <- brms::nuts_params(object$model_output)\n  }\n  interval_type <- type %in% c(\"intervals\", \"areas\")\n  if (\"rhat\" %in% mcmc_arg_names && !interval_type) {\n    mcmc_args$rhat <- rhat(object)\n  }\n  if (\"ratio\" %in% mcmc_arg_names) {\n    mcmc_args$ratio <- neff_ratio(object)\n  }\n\n  # Generate plot and reset colour scheme\n  out_plot <- do.call(mcmc_fun, args = mcmc_args)\n  color_scheme_set(col_scheme)\n\n  # Return the plot\n  return(out_plot)\n}\n\n#' @export\n#' @importFrom brms mcmc_plot\nbrms::mcmc_plot\n"
  },
  {
    "path": "R/model.frame.mvgam.R",
    "content": "#' Extract model.frame from a fitted \\pkg{mvgam} object\n#'\n#' @inheritParams stats::model.frame\n#'\n#' @param trend_effects \\code{logical}, return the model.frame from the\n#'   observation model (if \\code{FALSE}) or from the underlying process\n#'   model (if \\code{TRUE})\n#'\n#' @param ... Ignored\n#'\n#' @method model.frame mvgam\n#'\n#' @author Nicholas J Clark\n#'\n#' @return A \\code{matrix} containing the fitted model frame\n#'\n#' @export\nmodel.frame.mvgam = function(formula, trend_effects = FALSE, ...) {\n  # Check trend_effects\n  if (trend_effects) {\n    if (is.null(formula$trend_call)) {\n      out <- NULL\n    } else {\n      out <- stats::model.frame(formula$trend_mgcv_model)\n    }\n  } else {\n    out <- stats::model.frame(formula$mgcv_model)\n\n    # Identify response variable\n    resp_terms <- as.character(rlang::f_lhs(formula$call))\n    if (length(resp_terms) == 1L) {\n      resp <- resp_terms\n    } else {\n      if (any(grepl('cbind', resp_terms))) {\n        resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n        resp <- resp_terms[1]\n      }\n    }\n\n    # Now add the observed response, in case there are any\n    # NAs there that need to be updated\n    out[, resp] <- formula$obs_data$y\n\n    # Ensure 'cap' is included if this is an N-mixture model\n    if (formula$family == 'nmix') {\n      out$cap <- formula$obs_data$cap\n    }\n\n    # Check for offsets and add appropriately\n    if (!is.null(attr(terms(formula$call), \"offset\"))) {\n      off_names <- grep(\n        'offset',\n        rownames(attr(terms.formula(formula$call), 'factors')),\n        value = TRUE\n      )\n      off_names <- sub(\n        \"offset\\\\((.*)\\\\)$\",\n        \"\\\\1\",\n        grep('offset', off_names, value = TRUE)\n      )\n\n      for (i in 1:length(off_names)) {\n        out[[off_names[i]]] <- formula$obs_data[[off_names[i]]]\n      }\n    }\n\n    # Any other required variables, needed for grouped models\n    if (\n      !inherits(attr(formula$model_data, 'trend_model'), 'mvgam_trend') &\n        !inherits(formula$trend_model, 'mvgam_trend')\n    ) {\n      trend_model <- list(\n        trend_model = attr(formula$model_data, 'trend_model'),\n        unit = 'time',\n        gr = 'NA',\n        subgr = 'series'\n      )\n    }\n\n    if (inherits(attr(formula$model_data, 'trend_model'), 'mvgam_trend')) {\n      trend_model <- attr(formula$model_data, 'trend_model')\n    }\n\n    if (inherits(formula$trend_model, 'mvgam_trend')) {\n      trend_model <- formula$trend_model\n    }\n\n    other_vars <- c(trend_model$unit, trend_model$gr, trend_model$subgr)\n    if (!is.null(attr(formula$model_data, 'prepped_trend_model'))) {\n      prepped_model <- attr(formula$model_data, 'prepped_trend_model')\n      other_vars <- c(\n        other_vars,\n        c(prepped_model$unit, prepped_model$gr, prepped_model$subgr)\n      )\n    }\n    other_vars <- setdiff(unique(other_vars), c('NA', colnames(out)))\n\n    if (length(other_vars)) {\n      orig_names <- colnames(out)\n      for (i in 1:length(other_vars)) {\n        out <- cbind(out, formula$obs_data[[other_vars[i]]])\n      }\n      colnames(out) <- c(orig_names, other_vars)\n    }\n  }\n\n  return(out)\n}\n\n#' @inheritParams model.frame.mvgam\n#' @rdname model.frame.mvgam\n#' @method model.frame mvgam_prefit\n#' @export\nmodel.frame.mvgam_prefit = function(formula, trend_effects = FALSE, ...) {\n  # Check trend_effects\n  if (trend_effects) {\n    if (is.null(formula$trend_call)) {\n      out <- NULL\n    } else {\n      out <- stats::model.frame(formula$trend_mgcv_model)\n    }\n  } else {\n    out <- stats::model.frame(formula$mgcv_model)\n\n    # Identify response variable\n    resp_terms <- as.character(rlang::f_lhs(formula$call))\n    if (length(resp_terms) == 1L) {\n      resp <- resp_terms\n    } else {\n      if (any(grepl('cbind', resp_terms))) {\n        resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n        resp <- resp_terms[1]\n      }\n    }\n\n    # Now add the observed response, in case there are any\n    # NAs there that need to be updated\n    out[, resp] <- formula$obs_data$y\n\n    # Ensure 'cap' is included if this is an N-mixture model\n    if (formula$family == 'nmix') {\n      out$cap <- formula$obs_data$cap\n    }\n\n    # Check for offsets and add appropriately\n    if (!is.null(attr(terms(formula$call), \"offset\"))) {\n      off_names <- grep(\n        'offset',\n        rownames(attr(terms.formula(formula$call), 'factors')),\n        value = TRUE\n      )\n      off_names <- sub(\n        \"offset\\\\((.*)\\\\)$\",\n        \"\\\\1\",\n        grep('offset', off_names, value = TRUE)\n      )\n\n      for (i in 1:length(off_names)) {\n        out[[off_names[i]]] <- formula$obs_data[[off_names[i]]]\n      }\n    }\n\n    # Any other required variables, needed for grouped models\n    if (!inherits(attr(formula$model_data, 'trend_model'), 'mvgam_trend')) {\n      trend_model <- list(\n        trend_model = attr(formula$model_data, 'trend_model'),\n        unit = 'time',\n        gr = 'NA',\n        subgr = 'series'\n      )\n    } else {\n      trend_model <- attr(formula$model_data, 'trend_model')\n    }\n    other_vars <- c(trend_model$unit, trend_model$gr, trend_model$subgr)\n    if (!is.null(attr(formula$model_data, 'prepped_trend_model'))) {\n      prepped_model <- attr(formula$model_data, 'prepped_trend_model')\n      other_vars <- c(\n        other_vars,\n        c(prepped_model$unit, prepped_model$gr, prepped_model$subgr)\n      )\n    }\n    other_vars <- setdiff(unique(other_vars), c('NA', colnames(out)))\n\n    if (length(other_vars)) {\n      orig_names <- colnames(out)\n      for (i in 1:length(other_vars)) {\n        out <- cbind(out, formula$obs_data[[other_vars[i]]])\n      }\n      colnames(out) <- c(orig_names, other_vars)\n    }\n  }\n\n  return(out)\n}\n"
  },
  {
    "path": "R/monotonic.R",
    "content": "#' Monotonic splines in \\pkg{mvgam} models\n#'\n#' Uses constructors from package \\pkg{splines2} to build monotonically increasing\n#' or decreasing splines. Details also in Wang & Yan (2021).\n#'\n#' @inheritParams mgcv::smooth.construct.bs.smooth.spec\n#'\n#' @param object A smooth specification object, usually generated by a term\n#' `s(x, bs = \"moi\", ...)` or `s(x, bs = \"mod\", ...)`\n#'\n#' @details The constructor is not normally called directly,\n#' but is rather used internally by [mvgam]. If they are not supplied then the\n#' knots of the spline are placed evenly throughout the covariate values to\n#' which the term refers: For example, if fitting 101 data with an 11\n#' knot spline of x then there would be a knot at every 10th (ordered) x value.\n#' The spline is an implementation of the closed-form I-spline basis based\n#' on the recursion formula given by Ramsay (1988), in which the basis coefficients\n#' must be constrained to either be non-negative (for monotonically increasing\n#' functions) or non-positive (monotonically decreasing)\n#' \\cr\n#' \\cr\n#' Take note that when using either monotonic basis, the number of basis functions\n#' `k` must be supplied as an even integer due to the manner in\n#' which monotonic basis functions are constructed\n#'\n#' @return An object of class `\"moi.smooth\"` or `\"mod.smooth\"`. In addition to\n#' the usual elements of a smooth class documented under \\code{\\link[mgcv]{smooth.construct}},\n#' this object will contain a slot called `boundary` that defines the endpoints beyond\n#' which the spline will begin extrapolating (extrapolation is flat due to the first\n#' order penalty placed on the smooth function)\n#'\n#' @note This constructor will result in a valid smooth if using a call to\n#' \\code{\\link[mgcv]{gam}} or \\code{\\link[mgcv]{bam}}, however the resulting\n#' functions will not be guaranteed to be monotonic because constraints on\n#' basis coefficients will not be enforced\n#'\n#' @references\n#' Wang, Wenjie, and Jun Yan. \"Shape-Restricted Regression Splines with R Package splines2.\"\n#' Journal of Data Science 19.3 (2021).\n#' \\cr\n#' \\cr\n#' Ramsay, J. O. (1988). Monotone regression splines in action. Statistical Science, 3(4), 425--441.\n#'\n#' @importFrom mgcv smooth.construct\n#'\n#' @author Nicholas J Clark\n#'\n#' @name monotonic\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate data from a monotonically increasing function\n#' set.seed(123123)\n#'\n#' x <- runif(80) * 4 - 1\n#' x <- sort(x)\n#' f <- exp(4 * x) / (1 + exp(4 * x))\n#' y <- f + rnorm(80) * 0.1\n#' plot(x, y)\n#'\n#' # A standard TRPS smooth doesn't capture monotonicity\n#' library(mgcv)\n#'\n#' mod_data <- data.frame(y = y, x = x)\n#' mod <- gam(\n#'   y ~ s(x, k = 16),\n#'   data = mod_data,\n#'   family = gaussian()\n#' )\n#'\n#' library(marginaleffects)\n#' plot_predictions(\n#'   mod,\n#'   by = 'x',\n#'   newdata = data.frame(\n#'     x = seq(min(x) - 0.5, max(x) + 0.5, length.out = 100)\n#'   ),\n#'   points = 0.5\n#' )\n#'\n#' # Using the 'moi' basis in mvgam rectifies this\n#' mod_data$time <- 1:NROW(mod_data)\n#' mod2 <- mvgam(\n#'   y ~ s(x, bs = 'moi', k = 18),\n#'   data = mod_data,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' plot_predictions(\n#'   mod2,\n#'   by = 'x',\n#'   newdata = data.frame(\n#'     x = seq(min(x) - 0.5, max(x) + 0.5, length.out = 100)\n#'   ),\n#'   points = 0.5\n#' )\n#'\n#' plot(mod2, type = 'smooth', realisations = TRUE)\n#'\n#' # 'by' terms that produce a different smooth for each level of the 'by'\n#' # factor are also allowed\n#'\n#' x <- runif(80) * 4 - 1\n#' x <- sort(x)\n#'\n#' # Two different monotonic smooths, one for each factor level\n#' f <- exp(4 * x) / (1 + exp(4 * x))\n#' f2 <- exp(3.5 * x) / (1 + exp(3 * x))\n#' fac <- c(rep('a', 80), rep('b', 80))\n#' y <- c(\n#'   f + rnorm(80) * 0.1,\n#'   f2 + rnorm(80) * 0.2\n#' )\n#'\n#' plot(x, y[1:80])\n#' plot(x, y[81:160])\n#'\n#' # Gather all data into a data.frame, including the factor 'by' variable\n#' mod_data <- data.frame(y, x, fac = as.factor(fac))\n#' mod_data$time <- 1:NROW(mod_data)\n#'\n#' # Fit a model with different smooths per factor level\n#' mod <- mvgam(\n#'   y ~ s(x, bs = 'moi', by = fac, k = 8),\n#'   data = mod_data,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Visualise the different monotonic functions\n#' plot_predictions(\n#'   mod,\n#'   condition = c('x', 'fac', 'fac'),\n#'   points = 0.5\n#' )\n#'\n#' plot(mod, type = 'smooth', realisations = TRUE)\n#'\n#' # First derivatives (on the link scale) should never be\n#' # negative for either factor level\n#' (derivs <- slopes(\n#'   mod,\n#'   variables = 'x',\n#'   by = c('x', 'fac'),\n#'   type = 'link'\n#' ))\n#'\n#' all(derivs$estimate > 0)\n#' }\n#' @export\nsmooth.construct.moi.smooth.spec <- function(object, data, knots) {\n  insight::check_if_installed(\"splines2\")\n\n  # Check arguments\n  object$p.order <- 1\n  if (object$bs.dim < 0) {\n    object$bs.dim <- 10\n  }\n  `k(bs = 'moi')` <- object$bs.dim\n  if (`k(bs = 'moi')` <= 1) {\n    stop(\"Basis dimension is too small\", call. = FALSE)\n  }\n  validate_pos_integer(`k(bs = 'moi')`)\n  validate_even(`k(bs = 'moi')`)\n\n  # Number of knots must be k / 2\n  nk <- object$bs.dim / 2L\n\n  if (!is.null(object$id)) {\n    stop(\"Monotonic splines don't work with ids\", call. = FALSE)\n  }\n\n  # Check basis dimension\n  if (length(object$term) != 1) {\n    stop(\"Monotonic basis only handles 1D smooths\", call. = FALSE)\n  }\n\n  # Find the data and specified knots\n  x <- data[[object$term]]\n  k <- knots[[object$term]]\n  if (length(unique(x)) < nk) {\n    warning(\"basis dimension is larger than number of unique covariates\")\n  }\n\n  # Checks on knots\n  if (is.null(k)) {\n    xl <- min(x)\n    xu <- max(x)\n  } else {\n    xl <- min(k)\n    xu <- max(k)\n    if (xl > min(x) || xu < max(x)) {\n      stop(\"knot range does not include data\", call. = FALSE)\n    }\n    if (length(k) != nk) {\n      stop(paste(\"there should be \", nk - 1, \" supplied knots\"), call. = FALSE)\n    }\n  }\n\n  if (!is.null(k)) {\n    if (sum(colSums(object$X) == 0) > 0) {\n      warning(\"there is *no* information about some basis coefficients\")\n    }\n  }\n\n  if (is.null(k)) {\n    # Generate knots if missing\n    k <- seq(xl, xu, length.out = nk + 2)[2:nk + 1]\n  }\n\n  # Set anchor points beyond which extrapolation will occur\n  xr <- xu - xl\n  boundary <- c(xl - xr * 0.01, xu + xr * 0.01)\n\n  # Generate basis functions\n  i_spline_basis <- splines2::iSpline(\n    x,\n    knots = k,\n    degree = nk,\n    Boundary.knots = boundary,\n    intercept = TRUE\n  )\n\n  nbasis <- dim(i_spline_basis)[2]\n\n  # Fill in object\n  object$boundary <- boundary\n  object$bs.dim <- nbasis\n  object$knots <- k\n  class(object) <- c(\"moi.smooth\")\n  object$X <- i_spline_basis\n  if (!is.null(object$xt$S)) {\n    stop(\n      'Cannot accept supplied penalty matrices for monotonic splines',\n      call. = FALSE\n    )\n  }\n  object$S <- list(diag(object$bs.dim))\n  object$rank <- object$bs.dim\n  object$null.space.dim <- 0\n  object$C <- matrix(0, 0, ncol(object$X))\n  object$random <- TRUE\n  return(object)\n}\n\n#' @export\n#' @author Nicholas J Clark\n#' @rdname monotonic\nsmooth.construct.mod.smooth.spec <- function(object, data, knots) {\n  insight::check_if_installed(\"splines2\")\n\n  # Check arguments\n  object$p.order <- 1\n  if (object$bs.dim < 0) {\n    object$bs.dim <- 10\n  }\n  `k(bs = 'moi')` <- object$bs.dim\n  if (`k(bs = 'moi')` <= 1) {\n    stop(\"Basis dimension is too small\", call. = FALSE)\n  }\n  validate_pos_integer(`k(bs = 'moi')`)\n  validate_even(`k(bs = 'moi')`)\n\n  # Number of knots must be k / 2\n  nk <- object$bs.dim / 2L\n\n  if (!is.null(object$id)) {\n    stop(\"Monotonic splines don't work with ids\", call. = FALSE)\n  }\n\n  # Check basis dimension\n  if (length(object$term) != 1) {\n    stop(\"Monotonic basis only handles 1D smooths\", call. = FALSE)\n  }\n\n  # Find the data and specified knots\n  x <- data[[object$term]]\n  k <- knots[[object$term]]\n  if (length(unique(x)) < nk) {\n    warning(\"basis dimension is larger than number of unique covariates\")\n  }\n\n  # Checks on knots\n  if (is.null(k)) {\n    xl <- min(x)\n    xu <- max(x)\n  } else {\n    xl <- min(k)\n    xu <- max(k)\n    if (xl > min(x) || xu < max(x)) {\n      stop(\"knot range does not include data\", call. = FALSE)\n    }\n    if (length(k) != nk) {\n      stop(paste(\"there should be \", nk - 1, \" supplied knots\"), call. = FALSE)\n    }\n  }\n\n  if (!is.null(k)) {\n    if (sum(colSums(object$X) == 0) > 0) {\n      warning(\"there is *no* information about some basis coefficients\")\n    }\n  }\n\n  if (is.null(k)) {\n    # Generate knots if missing\n    k <- seq(xl, xu, length.out = nk + 2)[2:nk + 1]\n  }\n\n  # Set anchor points beyond which extrapolation will occur\n  xr <- xu - xl\n  boundary <- c(xl - xr * 0.01, xu + xr * 0.01)\n\n  # Generate basis functions\n  i_spline_basis <- splines2::iSpline(\n    x,\n    knots = k,\n    degree = nk,\n    Boundary.knots = boundary,\n    intercept = TRUE\n  )\n\n  nbasis <- dim(i_spline_basis)[2]\n\n  # Fill in object\n  object$boundary <- boundary\n  object$bs.dim <- nbasis\n  object$knots <- k\n  class(object) <- c(\"mod.smooth\")\n  object$X <- i_spline_basis\n  if (!is.null(object$xt$S)) {\n    stop(\n      'Cannot accept supplied penalty matrices for monotonic splines',\n      call. = FALSE\n    )\n  }\n  object$S <- list(diag(object$bs.dim))\n  object$rank <- object$bs.dim\n  object$null.space.dim <- 0\n  object$C <- matrix(0, 0, ncol(object$X))\n  object$random <- TRUE\n  return(object)\n}\n\n# Prediction function for the `moi' smooth class\n#' @rdname monotonic\n#' @importFrom mgcv Predict.matrix\n#' @export\nPredict.matrix.moi.smooth <- function(object, data) {\n  insight::check_if_installed(\"splines2\")\n\n  # Ensure extrapolation is flat (1st degree penalty behaviour)\n  x <- data[[object$term]]\n  boundary <- object$boundary\n  x[x > max(boundary)] <- max(boundary)\n  x[x < min(boundary)] <- min(boundary)\n  Xp <- suppressWarnings(splines2::iSpline(\n    x,\n    knots = object$knots,\n    degree = object$bs.dim / 2,\n    Boundary.knots = boundary,\n    intercept = TRUE\n  ))\n  return(as.matrix(Xp))\n}\n\n# Prediction function for the `mod' smooth class\n#' @rdname monotonic\n#' @importFrom mgcv Predict.matrix\n#' @export\nPredict.matrix.mod.smooth <- function(object, data) {\n  insight::check_if_installed(\"splines2\")\n\n  # Ensure extrapolation is flat (1st degree penalty behaviour)\n  x <- data[[object$term]]\n  boundary <- object$boundary\n  x[x > max(boundary)] <- max(boundary)\n  x[x < min(boundary)] <- min(boundary)\n  Xp <- suppressWarnings(splines2::iSpline(\n    x,\n    knots = object$knots,\n    degree = object$bs.dim / 2,\n    Boundary.knots = boundary,\n    intercept = TRUE\n  ))\n  return(as.matrix(Xp))\n}\n\nadd_mono_model_file = function(model_file, model_data, mgcv_model) {\n  # Which smooths are monotonic?\n  smooth_labs <- do.call(\n    rbind,\n    lapply(seq_along(mgcv_model$smooth), function(x) {\n      data.frame(\n        label = mgcv_model$smooth[[x]]$label,\n        class = class(mgcv_model$smooth[[x]])[1]\n      )\n    })\n  )\n\n  # Clean labels for inclusion in Stan code\n  mono_names <- smooth_labs$label[which(\n    smooth_labs$class %in% c('moi.smooth', 'mod.smooth')\n  )]\n  mono_names_clean <- clean_gpnames(mono_names)\n\n  # What directions are the constraints?\n  mono_directions <- smooth_labs %>%\n    dplyr::filter(class %in% c('moi.smooth', 'mod.smooth')) %>%\n    dplyr::mutate(\n      direction = dplyr::case_when(\n        class == 'moi.smooth' ~ 1,\n        class == 'mod.smooth' ~ -1,\n        TRUE ~ -1\n      )\n    ) %>%\n    dplyr::pull(direction)\n\n  # Update model file to include constrained coefficients\n  b_line <- max(grep('b[', model_file, fixed = TRUE))\n  b_edits <- paste0(\n    'b[b_idx_',\n    mono_names_clean,\n    '] = abs(b_raw[b_idx_',\n    mono_names_clean,\n    ']) * ',\n    mono_directions,\n    ';',\n    collapse = '\\n'\n  )\n  model_file[b_line] <- paste0(model_file[b_line], '\\n', b_edits)\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add the necessary indices to the model_data and data block\n  mono_stan_lines <- ''\n  for (covariate in seq_along(mono_names)) {\n    coef_indices <- which(\n      grepl(mono_names[covariate], names(coef(mgcv_model)), fixed = TRUE) &\n        !grepl(\n          paste0(mono_names[covariate], ':'),\n          names(coef(mgcv_model)),\n          fixed = TRUE\n        ) ==\n          TRUE\n    )\n    mono_stan_lines <- paste0(\n      mono_stan_lines,\n      paste0(\n        'array[',\n        length(coef_indices),\n        '] int b_idx_',\n        mono_names_clean[covariate],\n        '; // monotonic basis coefficient indices\\n'\n      )\n    )\n    mono_idx_data <- list(coef_indices)\n    names(mono_idx_data) <- paste0('b_idx_', mono_names_clean[covariate])\n    model_data <- append(model_data, mono_idx_data)\n  }\n\n  model_file[grep(\n    'int<lower=0> ytimes[n, n_series];',\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      model_file[grep(\n        'int<lower=0> ytimes[n, n_series];',\n        model_file,\n        fixed = TRUE\n      )],\n      '\\n',\n      mono_stan_lines\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  return(list(model_file = model_file, model_data = model_data))\n}\n"
  },
  {
    "path": "R/mvgam-class.R",
    "content": "#' Fitted `mvgam` object description\n#'\n#' A fitted \\code{mvgam} object returned by function \\code{\\link{mvgam}}.\n#' Run `methods(class = \"mvgam\")` to see an overview of available methods.\n#'\n#' @details A `mvgam` object contains the following elements:\n#'\n#'   - `call` the original observation model formula\n#'\n#'   - `trend_call` If a `trend_formula was supplied`, the original trend model\n#'     formula is returned. Otherwise `NULL`\n#'\n#'   - `family` \\code{character} description of the observation distribution\n#'\n#'   - `trend_model` \\code{character} description of the latent trend model\n#'\n#'   - `trend_map` \\code{data.frame} describing the mapping of trend states to\n#'     observations, if supplied in the original model. Otherwise `NULL`\n#'\n#'   - `drift` Logical specifying whether a drift term was used in the trend\n#'     model\n#'\n#'   - `priors` If the model priors were updated from their defaults, the prior\n#'     `dataframe` will be returned. Otherwise `NULL`\n#'\n#'   - `model_output` The `MCMC` object returned by the fitting engine. If the\n#'     model was fitted using `Stan`, this will be an object of class `stanfit`\n#'     (see \\code{\\link[rstan]{stanfit-class}} for details). If `JAGS` was used\n#'     as the backend, this will be an object of class `runjags` (see\n#'     \\code{\\link[runjags]{runjags-class}} for details)\n#'\n#'   - `model_file` The `character` string model file used to describe the model\n#'     in either `Stan` or `JAGS` syntax\n#'\n#'   - `model_data` If `return_model_data` was set to `TRUE` when fitting the\n#'     model, the `list` object containing all data objects needed to condition\n#'     the model is returned. Each item in the `list` is described in detail at\n#'     the top of the `model_file`. Otherwise `NULL`\n#'\n#'   - `inits` If `return_model_data` was set to `TRUE` when fitting the model,\n#'     the initial value functions used to initialise the MCMC chains will be\n#'     returned. Otherwise `NULL`\n#'\n#'   - `monitor_pars` The parameters that were monitored during MCMC sampling\n#'     are returned as a `character vector`\n#'\n#'   - `sp_names` A `character vector` specifying the names for each smoothing\n#'     parameter\n#'\n#'   - `mgcv_model` An object of class `gam` containing the `mgcv` version of\n#'     the observation model. This object is used for generating the linear\n#'     predictor matrix when making predictions for new data. The coefficients\n#'     in this model object will contain the posterior median coefficients from\n#'     the GAM linear predictor, but these are only used if generating plots of\n#'     smooth functions that `mvgam` currently cannot handle (such as plots for\n#'     three-dimensional smooths). This model therefore should not be used for\n#'     inference. See \\code{\\link[mgcv]{gamObject}} for details\n#'\n#'   - `trend_mgcv_model` If a `trend_formula was supplied`, an object of class\n#'     `gam` containing the `mgcv` version of the trend model. Otherwise `NULL`\n#'\n#'   - `ytimes` The `matrix` object used in model fitting for indexing which\n#'     series and timepoints were observed in each row of the supplied data.\n#'     Used internally by some downstream plotting and prediction functions\n#'\n#'   - `resids` A named `list` object containing posterior draws of Dunn-Smyth\n#'     randomized quantile residuals\n#'\n#'   - `use_lv` Logical flag indicating whether latent dynamic factors were used\n#'     in the model\n#'\n#'   - `n_lv` If `use_lv == TRUE`, the number of latent dynamic factors used in\n#'     the model\n#'\n#'   - `upper_bounds` If bounds were supplied in the original model fit, they\n#'     will be returned. Otherwise `NULL`\n#'\n#'   - `obs_data` The original data object (either a `list` or `dataframe`)\n#'     supplied in model fitting.\n#'\n#'   - `test_data` If test data were supplied (as argument `newdata` in the\n#'     original model), it will be returned. Othwerise `NULL`\n#'\n#'   - `fit_engine` `Character` describing the fit engine, either as `stan` or\n#'     `jags`\n#'\n#'   - `backend` `Character` describing the backend used for modelling, either\n#'     as `rstan`, `cmdstanr` or `rjags`\n#'\n#'   - `algorithm` `Character` describing the algorithm used for finding the\n#'     posterior, either as `sampling`, `laplace`, `pathfinder`, `meanfield` or\n#'     `fullrank`\n#'\n#'   - `max_treedepth` If the model was fitted using `Stan`, the value supplied\n#'     for the maximum treedepth tuning parameter is returned (see\n#'     \\code{\\link[rstan]{stan}} for details). Otherwise `NULL`\n#'\n#'   - `adapt_delta` If the model was fitted using `Stan`, the value supplied\n#'     for the adapt_delta tuning parameter is returned (see\n#'     \\code{\\link[rstan]{stan}} for details). Otherwise `NULL`\n#'\n#' @seealso [mvgam]\n#'\n#' @author Nicholas J Clark\n#'\n#' @name mvgam-class\nNULL\n"
  },
  {
    "path": "R/mvgam-package.R",
    "content": "#' @keywords internal\n\"_PACKAGE\"\n\n## usethis namespace: start\n## usethis namespace: end\nNULL\n"
  },
  {
    "path": "R/mvgam.R",
    "content": "#' Fit a Bayesian Dynamic GAM to Univariate or Multivariate Time Series\n#'\n#' @description\n#' This function estimates the posterior distribution for Generalised Additive\n#' Models (GAMs) that can include smooth spline functions, specified in the GAM\n#' formula, as well as latent temporal processes, specified by `trend_model`.\n#'\n#' Further modelling options include State-Space representations to allow covariates\n#' and dynamic processes to occur on the latent 'State' level while also capturing\n#' observation-level effects. Prior specifications are flexible and explicitly\n#' encourage users to apply prior distributions that actually reflect their beliefs.\n#'\n#' In addition, model fits can easily be assessed and compared with posterior\n#' predictive checks, forecast comparisons and leave-one-out / leave-future-out\n#' cross-validation.\n#'\n#' @importFrom parallel clusterExport stopCluster setDefaultCluster\n#' @importFrom stats formula terms rnorm update.formula predict\n#' @importFrom rlang missing_arg\n#'\n#' @param formula A `formula` object specifying the GAM observation model formula.\n#'   These are exactly like the formula for a GLM except that smooth terms, `s()`,\n#'   `te()`, `ti()`, `t2()`, as well as time-varying `dynamic()` terms,\n#'   nonparametric `gp()` terms and offsets using `offset()`, can be added to the\n#'   right hand side to specify that the linear predictor depends on smooth\n#'   functions of predictors (or linear functionals of these).\n#'\n#'   In `nmix()` family models, the `formula` is used to set up a linear predictor\n#'   for the detection probability. Details of the formula syntax used by\n#'   \\pkg{mvgam} can be found in \\code{\\link{mvgam_formulae}}\n#'\n#' @param trend_formula An optional `formula` object specifying the GAM process\n#'   model formula. If supplied, a linear predictor will be modelled for the\n#'   latent trends to capture process model evolution separately from the\n#'   observation model.\n#'\n#'   **Important notes:**\n#'   - Should not have a response variable specified on the left-hand side\n#'     (e.g., `~ season + s(year)`)\n#'   - Use `trend` instead of `series` for effects that vary across time series\n#'   - Only available for `RW()`, `AR()` and `VAR()` trend models\n#'   - In `nmix()` family models, sets up linear predictor for latent abundance\n#'   - Consider dropping one intercept using `- 1` convention to avoid\n#'     estimation challenges\n#'\n#' @param knots An optional `list` containing user specified knot values for\n#'   basis construction. For most bases the user simply supplies the knots to be\n#'   used, which must match up with the `k` value supplied. Different terms can\n#'   use different numbers of knots, unless they share a covariate.\n#'\n#' @param trend_knots As for `knots` above, this is an optional `list` of knot\n#'   values for smooth functions within the `trend_formula`.\n#'\n#' @param data A `dataframe` or `list` containing the model response variable\n#'   and covariates required by the GAM `formula` and optional `trend_formula`.\n#'\n#'   **Required columns for most models:**\n#'   - `series`: A `factor` index of the series IDs (number of levels should equal\n#'     number of unique series labels)\n#'   - `time`: `numeric` or `integer` index of time points. For most dynamic trend\n#'     types, time should be measured in discrete, regularly spaced intervals\n#'     (i.e., `c(1, 2, 3, ...)`). Irregular spacing is allowed for `trend_model = CAR(1)`,\n#'     but zero intervals are adjusted to `1e-12` to prevent sampling errors.\n#'\n#'   **Special cases:**\n#'   - Models with hierarchical temporal correlation (e.g., `AR(gr = region, subgr = species)`)\n#'     should NOT include a `series` identifier\n#'   - Models without temporal dynamics (`trend_model = 'None'` or `trend_model = ZMVN()`)\n#'     don't require a `time` variable\n#'\n#' @param newdata Optional `dataframe` or `list` of test data containing the same\n#'   variables as in `data`. If included, observations in variable `y` will be\n#'   set to `NA` when fitting the model so that posterior simulations can be obtained.\n#'\n#' @param run_model `logical`. If `FALSE`, the model is not fitted but instead\n#'   the function returns the model file and the data/initial values needed to\n#'   fit the model outside of `mvgam`.\n#'\n#' @param prior_simulation `logical`. If `TRUE`, no observations are fed to the\n#'   model, and instead simulations from prior distributions are returned.\n#'\n#' @param return_model_data `logical`. If `TRUE`, the list of data needed to fit\n#'   the model is returned, along with initial values for smooth and AR parameters,\n#'   once the model is fitted. Helpful for users who wish to modify the model file\n#'   to add other stochastic elements. Default is `FALSE` unless `run_model == FALSE`.\n#'\n#' @param family `family` specifying the exponential observation family for the series.\n#'\n#'   **Supported families:**\n#'   - `gaussian()`: Real-valued data\n#'   - `betar()`: Proportional data on `(0,1)`\n#'   - `lognormal()`: Non-negative real-valued data\n#'   - `student_t()`: Real-valued data\n#'   - `Gamma()`: Non-negative real-valued data\n#'   - `bernoulli()`: Binary data\n#'   - `poisson()`: Count data (default)\n#'   - `nb()`: Overdispersed count data\n#'   - `binomial()`: Count data with imperfect detection when number of trials is known\n#'     (use `cbind()` to bind observations and trials)\n#'   - `beta_binomial()`: As `binomial()` but allows for overdispersion\n#'   - `nmix()`: Count data with imperfect detection when number of trials is unknown\n#'     (State-Space N-Mixture model with Poisson latent states and Binomial observations)\n#'\n#'   See \\code{\\link{mvgam_families}} for more details.\n#'\n#' @param share_obs_params `logical`. If `TRUE` and the `family` has additional\n#'   family-specific observation parameters (e.g., variance components, dispersion\n#'   parameters), these will be shared across all outcome variables. Useful when\n#'   multiple outcomes share properties. Default is `FALSE`.\n#'\n#' @param use_lv `logical`. If `TRUE`, use dynamic factors to estimate series'\n#'   latent trends in a reduced dimension format. Only available for `RW()`,\n#'   `AR()` and `GP()` trend models. Default is `FALSE`.\n#'   See \\code{\\link{lv_correlations}} for examples.\n#'\n#' @param n_lv `integer` specifying the number of latent dynamic factors to use\n#'   if `use_lv == TRUE`. Cannot exceed `n_series`. Default is\n#'   `min(2, floor(n_series / 2))`.\n#'\n#' @param trend_model `character` or `function` specifying the time series dynamics\n#'   for the latent trend.\n#'\n#'   **Available options:**\n#'   - `None`: No latent trend component (GAM component only, like \\code{\\link[mgcv]{gam}})\n#'   - `ZMVN` or `ZMVN()`: Zero-Mean Multivariate Normal (Stan only)\n#'   - `'RW'` or `RW()`: Random Walk\n#'   - `'AR1'`, `'AR2'`, `'AR3'` or `AR(p = 1, 2, 3)`: Autoregressive models\n#'   - `'CAR1'` or `CAR(p = 1)`: Continuous-time AR (Ornstein–Uhlenbeck process)\n#'   - `'VAR1'` or `VAR()`: Vector Autoregressive (Stan only)\n#'   - `'PWlogistic'`, `'PWlinear'` or `PW()`: Piecewise trends (Stan only)\n#'   - `'GP'` or `GP()`: Gaussian Process with squared exponential kernel (Stan only)\n#'\n#'   **Additional features:**\n#'   - Moving average and/or correlated process error terms available for most types\n#'     (e.g., `RW(cor = TRUE)` for multivariate Random Walk)\n#'   - Hierarchical correlations possible for structured data\n#'   - See [mvgam_trends] for details and [ZMVN()] for examples\n#'\n#' @param trend_map Optional `data.frame` specifying which series should depend on\n#'   which latent trends. Enables multiple series to depend on the same latent\n#'   trend process with different observation processes.\n#'\n#'   **Required structure:**\n#'   - Column `series`: Single unique entry for each series (matching factor levels in data)\n#'   - Column `trend`: Integer values indicating which trend each series depends on\n#'\n#'   **Notes:**\n#'   - Sets up latent factor model by enabling `use_lv = TRUE`\n#'   - Process model intercept is NOT automatically suppressed\n#'   - Not yet supported for continuous time models (`CAR()`)\n#'\n#' @param noncentred `logical`. Use non-centred parameterisation for autoregressive\n#'   trend models? Can improve efficiency by avoiding degeneracies in latent dynamic\n#'   random effects estimation. Benefits vary by model - highly informative data\n#'   may perform worse with this option. Available for `RW()`, `AR()`, `CAR()`,\n#'   or `trend = 'None'` with `trend_formula`. Not available for moving average\n#'   or correlated error models.\n#'\n#' @param chains `integer` specifying the number of parallel chains for the model.\n#'   Ignored for variational inference algorithms.\n#'\n#' @param burnin `integer` specifying the number of warmup iterations to tune\n#'   sampling algorithms. Ignored for variational inference algorithms.\n#'\n#' @param samples `integer` specifying the number of post-warmup iterations for\n#'   sampling the posterior distribution.\n#'\n#' @param thin Thinning interval for monitors. Ignored for variational inference\n#'   algorithms.\n#'\n#' @param parallel `logical` specifying whether to use multiple cores for parallel\n#'   MCMC simulation. If `TRUE`, uses `min(c(chains, parallel::detectCores() - 1))` cores.\n#'\n#' @param threads `integer`. Experimental option for within-chain parallelisation\n#'   in Stan using `reduce_sum`. Recommended only for experienced Stan users with\n#'   slow models. Currently works for all families except `nmix()` and when using\n#'   Cmdstan backend.\n#'\n#' @param priors An optional `data.frame` with prior definitions or, preferably,\n#'   a vector of `brmsprior` objects (see \\code{\\link[brms]{prior}()}).\n#'   See [get_mvgam_priors()] and Details for more information.\n#'\n#' @param refit `logical`. Indicates whether this is a refit called using\n#'   [update.mvgam()]. Users should leave as `FALSE`.\n#'\n#' @param lfo `logical`. Indicates whether this is part of [lfo_cv.mvgam] call.\n#'   Returns lighter model version for speed. Users should leave as `FALSE`.\n#'\n#' @param residuals `logical`. Whether to compute series-level randomized quantile\n#'   residuals. Default is `TRUE`. Set to `FALSE` to save time and reduce object\n#'   size (can add later using [add_residuals]).\n#'\n#' @param backend Character string naming the package for Stan model fitting.\n#'   Options are `\"cmdstanr\"` (default) or `\"rstan\"`. Can be set globally via\n#'   `\"brms.backend\"` option. See https://mc-stan.org/rstan/ and\n#'   https://mc-stan.org/cmdstanr/ for details.\n#'\n#' @param algorithm Character string naming the estimation approach:\n#'   - `\"sampling\"`: MCMC (default)\n#'   - `\"meanfield\"`: Variational inference with factorized normal distributions\n#'   - `\"fullrank\"`: Variational inference with multivariate normal distribution\n#'   - `\"laplace\"`: Laplace approximation (cmdstanr only)\n#'   - `\"pathfinder\"`: Pathfinder algorithm (cmdstanr only)\n#'\n#'   Can be set globally via `\"brms.algorithm\"` option. Limited testing suggests\n#'   `\"meanfield\"` performs best among non-MCMC approximations for dynamic GAMs.\n#'\n#' @param autoformat `logical`. Use `stanc` parser to automatically format Stan\n#'   code and check for deprecations. For development purposes - leave as `TRUE`.\n#'\n#' @param save_all_pars `logical`. Save draws from all variables defined in Stan's\n#'   `parameters` block. Default is `FALSE`.\n#'\n#' @param control Named `list` for controlling sampler behaviour. Valid elements\n#'   include `max_treedepth`, `adapt_delta` and `init`.\n#'\n#' @param silent Verbosity level between `0` and `2`. If `1` (default), most\n#'   informational messages are suppressed. If `2`, even more messages are\n#'   suppressed. Sampling progress is still printed - set `refresh = 0` to\n#'   disable. For `backend = \"rstan\"`, also set `open_progress = FALSE` to\n#'   prevent additional progress bars.\n#'\n#' @param ... Further arguments passed to Stan:\n#'   - For `backend = \"rstan\"`: passed to \\code{\\link[rstan]{sampling}()} or\n#'     \\code{\\link[rstan]{vb}()}\n#'   - For `backend = \"cmdstanr\"`: passed to `cmdstanr::sample`,\n#'     `cmdstanr::variational`, `cmdstanr::laplace` or `cmdstanr::pathfinder` methods\n#'\n#' @details\n#' Dynamic GAMs are useful when we wish to predict future values from time series\n#' that show temporal dependence but we do not want to rely on extrapolating from\n#' a smooth term (which can sometimes lead to unpredictable and unrealistic behaviours).\n#' In addition, smooths can often try to wiggle excessively to capture any\n#' autocorrelation that is present in a time series, which exacerbates the problem\n#' of forecasting ahead.\n#'\n#' As GAMs are very naturally viewed through a Bayesian lens, and we often must\n#' model time series that show complex distributional features and missing data,\n#' parameters for \\pkg{mvgam} models are estimated in a Bayesian framework using\n#' Markov Chain Monte Carlo by default.\n#'\n#' **Getting Started Resources:**\n#' - General overview: `vignette(\"mvgam_overview\")` and `vignette(\"data_in_mvgam\")`\n#' - Full list of vignettes: `vignette(package = \"mvgam\")`\n#' - Real-world examples: \\code{\\link{mvgam_use_cases}}\n#' - Quick reference: [mvgam cheatsheet](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf)\n#'\n#' @section Model Specification Details:\n#'\n#' **Formula Syntax:** Details of the formula syntax used by \\pkg{mvgam} can be\n#' found in \\code{\\link{mvgam_formulae}}. Note that it is possible to supply an\n#' empty formula where there are no predictors or intercepts in the observation\n#' model (i.e. `y ~ 0` or `y ~ -1`). In this case, an intercept-only observation\n#' model will be set up but the intercept coefficient will be fixed at zero. This\n#' can be handy if you wish to fit pure State-Space models where the variation in\n#' the dynamic trend controls the average expectation, and/or where intercepts are\n#' non-identifiable (as in piecewise trends).\n#'\n#' **Families and Link Functions:** Details of families supported by \\pkg{mvgam}\n#' can be found in \\code{\\link{mvgam_families}}.\n#'\n#' **Trend Models:** Details of latent error process models supported by \\pkg{mvgam}\n#' can be found in \\code{\\link{mvgam_trends}}.\n#'\n#' @section Prior Specifications:\n#' Default priors for intercepts and any variance parameters are chosen to be\n#' vaguely informative, but these should always be checked by the user. Prior\n#' distributions for most important model parameters can be altered (see\n#' [get_mvgam_priors()] for details). Note that latent trends are estimated on\n#' the link scale so choose priors accordingly.\n#'\n#' However more control over the model specification can be accomplished by setting\n#' \\code{run_model = FALSE} and then editing the model code (found in the\n#' `model_file` slot in the returned object) before running the model using either\n#' \\pkg{rstan} or \\pkg{cmdstanr}. This is encouraged for complex modelling tasks.\n#'\n#' **Important:** No priors are formally checked to ensure they are in the right\n#' syntax so it is up to the user to ensure these are correct.\n#'\n#' @section Model Components:\n#'\n#' **Random Effects:** For any smooth terms using the random effect basis\n#' (\\code{\\link[mgcv]{smooth.construct.re.smooth.spec}}), a non-centred\n#' parameterisation is automatically employed to avoid degeneracies that are common\n#' in hierarchical models. Note however that centred versions may perform better\n#' for series that are particularly informative, so as with any foray into Bayesian\n#' modelling, it is worth building an understanding of the model's assumptions and\n#' limitations by following a principled workflow. Also note that models are\n#' parameterised using `drop.unused.levels = FALSE` in \\code{\\link[mgcv]{jagam}}\n#' to ensure predictions can be made for all levels of the supplied factor variable.\n#'\n#' **Observation Level Parameters:** When more than one series is included in\n#' \\code{data} and an observation family that contains more than one parameter is\n#' used, additional observation family parameters (i.e. `phi` for `nb()` or `sigma`\n#' for `gaussian()`) are by default estimated independently for each series. But if\n#' you wish for the series to share the same observation parameters, set\n#' `share_obs_params = TRUE`.\n#'\n#' @section Model Diagnostics:\n#'\n#' **Residuals:** For each series, randomized quantile (i.e. Dunn-Smyth) residuals\n#' are calculated for inspecting model diagnostics. If the fitted model is\n#' appropriate then Dunn-Smyth residuals will be standard normal in distribution\n#' and no autocorrelation will be evident. When a particular observation is missing,\n#' the residual is calculated by comparing independent draws from the model's\n#' posterior distribution.\n#'\n#' @section Computational Backend:\n#'\n#' **Using Stan:** \\pkg{mvgam} is primarily designed to use Hamiltonian Monte Carlo\n#' for parameter estimation via the software `Stan` (using either the `cmdstanr`\n#' or `rstan` interface). There are great advantages when using `Stan` over Gibbs /\n#' Metropolis Hastings samplers, which includes the option to estimate nonlinear\n#' effects via [Hilbert space approximate Gaussian Processes](https://arxiv.org/abs/2004.11408),\n#' the availability of a variety of inference algorithms (i.e. variational inference,\n#' laplacian inference etc...) and [capabilities to enforce stationarity for complex Vector Autoregressions](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648).\n#'\n#' Because of the many advantages of `Stan` over `JAGS`, **further development of\n#' the package will only be applied to `Stan`**. This includes the planned addition\n#' of more response distributions, plans to handle zero-inflation, and plans to\n#' incorporate a greater variety of trend models. Users are strongly encouraged to\n#' opt for `Stan` over `JAGS` in any proceeding workflows.\n#'\n#' @section Recommended Workflow:\n#'\n#' **How to Start:** The [`mvgam` cheatsheet](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf)\n#' is a good starting place if you are just learning to use the package. It gives\n#' an overview of the package's key functions and objects, as well as providing a\n#' reasonable workflow that new users can follow.\n#'\n#' **Recommended Steps:**\n#'\n#' 1. **Data Preparation:** Check that your data are in a suitable tidy format for\n#'    \\pkg{mvgam} modeling (see the [data formatting vignette](https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html)\n#'    for guidance)\n#'\n#' 2. **Data Exploration:** Inspect features of the data using \\code{\\link{plot_mvgam_series}}.\n#'    Now is also a good time to familiarise yourself with the package's example\n#'    workflows that are detailed in the vignettes:\n#'    - [Getting started vignette](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html)\n#'    - [Shared latent states vignette](https://nicholasjclark.github.io/mvgam/articles/shared_states.html)\n#'    - [Time-varying effects vignette](https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html)\n#'    - [State-Space models vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html)\n#'    - [\"Fitting N-mixture models in `mvgam`\"](https://nicholasjclark.github.io/mvgam/articles/nmixtures.html)\n#'    - [\"Joint Species Distribution Models in `mvgam`\"](https://nicholasjclark.github.io/mvgam/reference/jsdgam.html)\n#'    - [\"Incorporating time-varying seasonality in forecast models\"](https://ecogambler.netlify.app/blog/time-varying-seasonality/)\n#'    - [\"Temporal autocorrelation in GAMs and the `mvgam` package\"](https://ecogambler.netlify.app/blog/autocorrelated-gams/)\n#'\n#' 3. **Model Structure:** Carefully think about how to structure linear predictor\n#'    effects (i.e. smooth terms using \\code{\\link[mgcv]{s}()}, \\code{\\link[mgcv]{te}()}\n#'    or \\code{\\link[mgcv]{ti}()}, GPs using \\code{\\link[brms]{gp}()}, dynamic\n#'    time-varying effects using [dynamic()], and parametric terms), latent temporal\n#'    trend components (see \\code{\\link{mvgam_trends}}) and the appropriate\n#'    observation family (see \\code{\\link{mvgam_families}}). Use [get_mvgam_priors()]\n#'    to see default prior distributions for stochastic parameters.\n#'\n#' 4. **Prior Specification:** Change default priors using appropriate prior knowledge\n#'    (see \\code{\\link[brms]{prior}()}). When using State-Space models with a\n#'    `trend_formula`, pay particular attention to priors for any variance parameters\n#'    such as process errors and observation errors. Default priors on these parameters\n#'    are chosen to be vaguely informative and to avoid zero (using Inverse Gamma\n#'    priors), but more informative priors will often help with model efficiency\n#'    and convergence.\n#'\n#' 5. **Model Fitting:** Fit the model using either Hamiltonian Monte Carlo or an\n#'    approximation algorithm (i.e. change the `backend` argument) and use\n#'    [summary.mvgam()], [conditional_effects.mvgam()], [mcmc_plot.mvgam()],\n#'    [pp_check.mvgam()], [pairs.mvgam()] and [plot.mvgam()] to inspect /\n#'    interrogate the model.\n#'\n#' 6. **Model Comparison:** Update the model as needed and use [loo_compare.mvgam()]\n#'    for in-sample model comparisons, or alternatively use [forecast.mvgam()],\n#'    [lfo_cv.mvgam()] and [score.mvgam_forecast()] to compare models based on\n#'    out-of-sample forecasts (see the [forecast evaluation vignette](https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html)\n#'    for guidance).\n#'\n#' 7. **Inference and Prediction:** When satisfied with the model structure, use\n#'    [predict.mvgam()], \\code{\\link[marginaleffects]{plot_predictions}()} and/or\n#'    \\code{\\link[marginaleffects]{plot_slopes}()} for more targeted simulation-based\n#'    inferences (see [\"How to interpret and report nonlinear effects from Generalized Additive Models\"](https://ecogambler.netlify.app/blog/interpreting-gams/)\n#'    for some guidance on interpreting GAMs). For time series models, use\n#'    [hindcast.mvgam()], [fitted.mvgam()], [augment.mvgam()] and [forecast.mvgam()]\n#'    to inspect posterior hindcast / forecast distributions.\n#'\n#' 8. **Documentation:** Use [how_to_cite()] to obtain a scaffold methods section\n#'    (with full references) to begin describing this model in scientific publications.\n#'\n#' @author Nicholas J Clark\n#'\n#' @references\n#' Nicholas J Clark & Konstans Wells (2023). Dynamic generalised additive models\n#' (DGAMs) for forecasting discrete ecological time series. Methods in Ecology and\n#' Evolution. 14:3, 771-784.\n#'\n#' Nicholas J Clark, SK Morgan Ernest, Henry Senyondo, Juniper Simonis, Ethan P White,\n#' Glenda M Yenni, KANK Karunarathna (2025). Beyond single-species models: leveraging\n#' multispecies forecasts to navigate the dynamics of ecological predictability.\n#' PeerJ. 13:e18929 https://doi.org/10.7717/peerj.18929\n#'\n#' @seealso \\code{\\link[mgcv]{jagam}()}, \\code{\\link[mgcv]{gam}()},\n#' \\code{\\link[mgcv]{gam.models}}, [get_mvgam_priors()], [jsdgam()],\n#' [hindcast.mvgam()], [forecast.mvgam()], [predict.mvgam()]\n#'\n#' @return A `list` object of class `mvgam` containing model output, the text\n#' representation of the model file, the mgcv model output (for easily generating\n#' simulations at unsampled covariate values), Dunn-Smyth residuals for each\n#' series and key information needed for other functions in the package. See\n#' \\code{\\link{mvgam-class}} for details. Use `methods(class = \"mvgam\")` for an\n#' overview on available methods.\n#'\n#' @examples\n#' \\dontrun{\n#' # =============================================================================\n#' # Basic Multi-Series Time Series Modeling\n#' # =============================================================================\n#'\n#' # Simulate three time series that have shared seasonal dynamics,\n#' # independent AR(1) trends, and Poisson observations\n#' set.seed(0)\n#' dat <- sim_mvgam(\n#'   T = 80,\n#'   n_series = 3,\n#'   mu = 2,\n#'   trend_model = AR(p = 1),\n#'   prop_missing = 0.1,\n#'   prop_trend = 0.6\n#' )\n#'\n#' # Plot key summary statistics for a single series\n#' plot_mvgam_series(data = dat$data_train, series = 1)\n#'\n#' # Plot all series together\n#' plot_mvgam_series(data = dat$data_train, series = \"all\")\n#'\n#' # Formulate a model using Stan where series share a cyclic smooth for\n#' # seasonality and each series has an independent AR1 temporal process.\n#' # Note that 'noncentred = TRUE' will likely give performance gains.\n#' # Set run_model = FALSE to inspect the returned objects\n#' mod1 <- mvgam(\n#'   formula = y ~ s(season, bs = \"cc\", k = 6),\n#'   data = dat$data_train,\n#'   trend_model = AR(),\n#'   family = poisson(),\n#'   noncentred = TRUE,\n#'   run_model = FALSE\n#' )\n#'\n#' # View the model code in Stan language\n#' stancode(mod1)\n#'\n#' # View the data objects needed to fit the model in Stan\n#' sdata1 <- standata(mod1)\n#' str(sdata1)\n#'\n#' # Now fit the model\n#' mod1 <- mvgam(\n#'   formula = y ~ s(season, bs = \"cc\", k = 6),\n#'   data = dat$data_train,\n#'   trend_model = AR(),\n#'   family = poisson(),\n#'   noncentred = TRUE,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract the model summary\n#' summary(mod1)\n#'\n#' # Plot the historical trend and hindcast distributions for one series\n#' hc_trend <- hindcast(mod1, type = \"trend\")\n#' plot(hc_trend)\n#'\n#' hc_predicted <- hindcast(mod1, type = \"response\")\n#' plot(hc_predicted)\n#'\n#' # Residual diagnostics\n#' plot(mod1, type = \"residuals\", series = 1)\n#' resids <- residuals(mod1)\n#' str(resids)\n#'\n#' # Fitted values and residuals can be added directly to the training data\n#' augment(mod1)\n#'\n#' # Compute the forecast using covariate information in data_test\n#' fc <- forecast(mod1, newdata = dat$data_test)\n#' str(fc)\n#' fc_summary <- summary(fc)\n#' head(fc_summary, 12)\n#' plot(fc)\n#'\n#' # Plot the estimated seasonal smooth function\n#' plot(mod1, type = \"smooths\")\n#'\n#' # Plot estimated first derivatives of the smooth\n#' plot(mod1, type = \"smooths\", derivatives = TRUE)\n#'\n#' # Plot partial residuals of the smooth\n#' plot(mod1, type = \"smooths\", residuals = TRUE)\n#'\n#' # Plot posterior realisations for the smooth\n#' plot(mod1, type = \"smooths\", realisations = TRUE)\n#'\n#' # Plot conditional response predictions using marginaleffects\n#' conditional_effects(mod1)\n#' plot_predictions(mod1, condition = \"season\", points = 0.5)\n#'\n#' # Generate posterior predictive checks using bayesplot\n#' pp_check(mod1)\n#'\n#' # Extract observation model beta coefficient draws as a data.frame\n#' beta_draws_df <- as.data.frame(mod1, variable = \"betas\")\n#' head(beta_draws_df)\n#' str(beta_draws_df)\n#'\n#' # Investigate model fit\n#' mc.cores.def <- getOption(\"mc.cores\")\n#' options(mc.cores = 1)\n#' loo(mod1)\n#' options(mc.cores = mc.cores.def)\n#'\n#'\n#' # =============================================================================\n#' # Vector Autoregressive (VAR) Models\n#' # =============================================================================\n#'\n#' # Fit a model to the portal time series that uses a latent\n#' # Vector Autoregression of order 1\n#' mod <- mvgam(\n#'   formula = captures ~ -1,\n#'   trend_formula = ~ trend,\n#'   trend_model = VAR(cor = TRUE),\n#'   family = poisson(),\n#'   data = portal_data,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot the autoregressive coefficient distributions;\n#' # use 'dir = \"v\"' to arrange the order of facets correctly\n#' mcmc_plot(\n#'   mod,\n#'   variable = 'A',\n#'   regex = TRUE,\n#'   type = 'hist',\n#'   facet_args = list(dir = 'v')\n#' )\n#'\n#' # Plot the process error variance-covariance matrix in the same way\n#' mcmc_plot(\n#'   mod,\n#'   variable = 'Sigma',\n#'   regex = TRUE,\n#'   type = 'hist',\n#'   facet_args = list(dir = 'v')\n#' )\n#'\n#' # Calculate Generalized Impulse Response Functions for each series\n#' irfs <- irf(\n#'   mod,\n#'   h = 12,\n#'   cumulative = FALSE\n#' )\n#'\n#' # Plot some of them\n#' plot(irfs, series = 1)\n#' plot(irfs, series = 2)\n#'\n#' # Calculate forecast error variance decompositions for each series\n#' fevds <- fevd(mod, h = 12)\n#'\n#' # Plot median contributions to forecast error variance\n#' plot(fevds)\n#'\n#'\n#' # =============================================================================\n#' # Dynamic Factor Models\n#' # =============================================================================\n#'\n#' # Now fit a model that uses two RW dynamic factors to model\n#' # the temporal dynamics of the four rodent species\n#' mod <- mvgam(\n#'   captures ~ series,\n#'   trend_model = RW(),\n#'   use_lv = TRUE,\n#'   n_lv = 2,\n#'   data = portal_data,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot the factors\n#' plot(mod, type = 'factors')\n#'\n#' # Plot the hindcast distributions\n#' hcs <- hindcast(mod)\n#' plot(hcs, series = 1)\n#' plot(hcs, series = 2)\n#' plot(hcs, series = 3)\n#' plot(hcs, series = 4)\n#'\n#' # Use residual_cor() to calculate temporal correlations among the series\n#' # based on the factor loadings\n#' lvcors <- residual_cor(mod)\n#' names(lvcors)\n#' lvcors$cor\n#'\n#' # For those correlations whose credible intervals did not include\n#' # zero, plot them as a correlation matrix (all other correlations\n#' # are shown as zero on this plot)\n#' plot(lvcors, cluster = TRUE)\n#'\n#'\n#' # =============================================================================\n#' # Shared Latent Trends with Custom Trend Mapping\n#' # =============================================================================\n#'\n#' # Example of supplying a trend_map so that some series can share\n#' # latent trend processes\n#' sim <- sim_mvgam(n_series = 3)\n#' mod_data <- sim$data_train\n#'\n#' # Here, we specify only two latent trends; series 1 and 2 share a trend,\n#' # while series 3 has its own unique latent trend\n#' trend_map <- data.frame(\n#'   series = unique(mod_data$series),\n#'   trend = c(1, 1, 2)\n#' )\n#'\n#' # Fit the model using AR1 trends\n#' mod <- mvgam(\n#'   formula = y ~ s(season, bs = \"cc\", k = 6),\n#'   trend_map = trend_map,\n#'   trend_model = AR(),\n#'   data = mod_data,\n#'   return_model_data = TRUE,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # The mapping matrix is now supplied as data to the model in the 'Z' element\n#' mod$model_data$Z\n#'\n#' # The first two series share an identical latent trend; the third is different\n#' plot(residual_cor(mod))\n#' plot(mod, type = \"trend\", series = 1)\n#' plot(mod, type = \"trend\", series = 2)\n#' plot(mod, type = \"trend\", series = 3)\n#'\n#'\n#' # =============================================================================\n#' # Time-Varying (Dynamic) Coefficients\n#' # =============================================================================\n#'\n#' # Example of how to use dynamic coefficients\n#' # Simulate a time-varying coefficient for the effect of temperature\n#' set.seed(123)\n#' N <- 200\n#' beta_temp <- vector(length = N)\n#' beta_temp[1] <- 0.4\n#' for (i in 2:N) {\n#'   beta_temp[i] <- rnorm(1, mean = beta_temp[i - 1] - 0.0025, sd = 0.05)\n#' }\n#' plot(beta_temp)\n#'\n#' # Simulate a covariate called 'temp'\n#' temp <- rnorm(N, sd = 1)\n#'\n#' # Simulate some noisy Gaussian observations\n#' out <- rnorm(N,\n#'   mean = 4 + beta_temp * temp,\n#'   sd = 0.5\n#' )\n#'\n#' # Gather necessary data into a data.frame; split into training / testing\n#' data <- data.frame(out, temp, time = seq_along(temp))\n#' data_train <- data[1:180, ]\n#' data_test <- data[181:200, ]\n#'\n#' # Fit the model using the dynamic() function\n#' mod <- mvgam(\n#'   formula = out ~ dynamic(\n#'     temp,\n#'     scale = FALSE,\n#'     k = 40\n#'   ),\n#'   family = gaussian(),\n#'   data = data_train,\n#'   newdata = data_test,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Inspect the model summary, forecast and time-varying coefficient distribution\n#' summary(mod)\n#' plot(mod, type = \"smooths\")\n#' fc <- forecast(mod, newdata = data_test)\n#' plot(fc)\n#'\n#' # Propagating the smooth term shows how the coefficient is expected to evolve\n#' plot_mvgam_smooth(mod, smooth = 1, newdata = data)\n#' abline(v = 180, lty = \"dashed\", lwd = 2)\n#' points(beta_temp, pch = 16)\n#'\n#'\n#' # =============================================================================\n#' # Working with Offset Terms\n#' # =============================================================================\n#'\n#' # Example showing how to incorporate an offset; simulate some count data\n#' # with different means per series\n#' set.seed(100)\n#' dat <- sim_mvgam(\n#'   prop_trend = 0,\n#'   mu = c(0, 2, 2),\n#'   seasonality = \"hierarchical\"\n#' )\n#'\n#' # Add offset terms to the training and testing data\n#' dat$data_train$offset <- 0.5 * as.numeric(dat$data_train$series)\n#' dat$data_test$offset <- 0.5 * as.numeric(dat$data_test$series)\n#'\n#' # Fit a model that includes the offset in the linear predictor as well as\n#' # hierarchical seasonal smooths\n#' mod <- mvgam(\n#'   formula = y ~ offset(offset) +\n#'     s(series, bs = \"re\") +\n#'     s(season, bs = \"cc\") +\n#'     s(season, by = series, m = 1, k = 5),\n#'   data = dat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Inspect the model file to see the modification to the linear predictor (eta)\n#' stancode(mod)\n#'\n#' # Forecasts for the first two series will differ in magnitude\n#' fc <- forecast(mod, newdata = dat$data_test)\n#' plot(fc, series = 1, ylim = c(0, 75))\n#' plot(fc, series = 2, ylim = c(0, 75))\n#'\n#' # Changing the offset for the testing data should lead to changes in\n#' # the forecast\n#' dat$data_test$offset <- dat$data_test$offset - 2\n#' fc <- forecast(mod, newdata = dat$data_test)\n#' plot(fc)\n#'\n#' # Relative Risks can be computed by fixing the offset to the same value\n#' # for each series\n#' dat$data_test$offset <- rep(1, NROW(dat$data_test))\n#' preds_rr <- predict(mod,\n#'   type = \"link\",\n#'   newdata = dat$data_test,\n#'   summary = FALSE\n#' )\n#' series1_inds <- which(dat$data_test$series == \"series_1\")\n#' series2_inds <- which(dat$data_test$series == \"series_2\")\n#'\n#' # Relative Risks are now more comparable among series\n#' layout(matrix(1:2, ncol = 2))\n#' plot(preds_rr[1, series1_inds],\n#'   type = \"l\", col = \"grey75\",\n#'   ylim = range(preds_rr),\n#'   ylab = \"Series1 Relative Risk\", xlab = \"Time\"\n#' )\n#' for (i in 2:50) {\n#'   lines(preds_rr[i, series1_inds], col = \"grey75\")\n#' }\n#'\n#' plot(preds_rr[1, series2_inds],\n#'   type = \"l\", col = \"darkred\",\n#'   ylim = range(preds_rr),\n#'   ylab = \"Series2 Relative Risk\", xlab = \"Time\"\n#' )\n#' for (i in 2:50) {\n#'   lines(preds_rr[i, series2_inds], col = \"darkred\")\n#' }\n#' layout(1)\n#'\n#'\n#' # =============================================================================\n#' # Binomial Family Models\n#' # =============================================================================\n#'\n#' # Example showcasing how cbind() is needed for Binomial observations\n#' # Simulate two time series of Binomial trials\n#' trials <- sample(c(20:25), 50, replace = TRUE)\n#' x <- rnorm(50)\n#' detprob1 <- plogis(-0.5 + 0.9 * x)\n#' detprob2 <- plogis(-0.1 - 0.7 * x)\n#' dat <- rbind(\n#'   data.frame(\n#'     y = rbinom(n = 50, size = trials, prob = detprob1),\n#'     time = 1:50,\n#'     series = \"series1\",\n#'     x = x,\n#'     ntrials = trials\n#'   ),\n#'   data.frame(\n#'     y = rbinom(n = 50, size = trials, prob = detprob2),\n#'     time = 1:50,\n#'     series = \"series2\",\n#'     x = x,\n#'     ntrials = trials\n#'   )\n#' )\n#' dat <- dplyr::mutate(dat, series = as.factor(series))\n#' dat <- dplyr::arrange(dat, time, series)\n#' plot_mvgam_series(data = dat, series = \"all\")\n#'\n#' # Fit a model using the binomial() family; must specify observations\n#' # and number of trials in the cbind() wrapper\n#' mod <- mvgam(\n#'   formula = cbind(y, ntrials) ~ series + s(x, by = series),\n#'   family = binomial(),\n#'   data = dat,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#' summary(mod)\n#' pp_check(mod,\n#'   type = \"bars_grouped\",\n#'   group = \"series\", ndraws = 50\n#' )\n#' pp_check(mod,\n#'   type = \"ecdf_overlay_grouped\",\n#'   group = \"series\", ndraws = 50\n#' )\n#' conditional_effects(mod, type = \"link\")\n#'\n#' # To view predictions on the probability scale,\n#' # use ntrials = 1 in datagrid()\n#' plot_predictions(\n#'   mod,\n#'   by = c('x', 'series'),\n#'   newdata = datagrid(\n#'     x = runif(100, -2, 2),\n#'     series = unique,\n#'     ntrials = 1\n#'   ),\n#'   type = 'expected'\n#' )\n#'\n#' # Not needed for general use; cleans up connections for automated testing\n#' closeAllConnections()\n#' }\n#' @export\n\nmvgam <- function(\n  formula,\n  trend_formula,\n  knots,\n  trend_knots,\n  trend_model = \"None\",\n  noncentred = FALSE,\n  family = poisson(),\n  share_obs_params = FALSE,\n  data,\n  newdata,\n  use_lv = FALSE,\n  n_lv,\n  trend_map,\n  priors,\n  run_model = TRUE,\n  prior_simulation = FALSE,\n  residuals = TRUE,\n  return_model_data = FALSE,\n  backend = getOption(\"brms.backend\", \"cmdstanr\"),\n  algorithm = getOption(\"brms.algorithm\", \"sampling\"),\n  control = list(max_treedepth = 10, adapt_delta = 0.8),\n  chains = 4,\n  burnin = 500,\n  samples = 500,\n  thin = 1,\n  parallel = TRUE,\n  threads = 1,\n  save_all_pars = FALSE,\n  silent = 1,\n  autoformat = TRUE,\n  refit = FALSE,\n  lfo = FALSE,\n  ...\n) {\n  # Check data arguments\n  dots <- list(...)\n  if (missing(\"data\")) {\n    if (\"data_train\" %in% names(dots)) {\n      message('argument \"data_train\" is deprecated; supply as \"data\" instead')\n      data <- dots$data_train\n      dots$data_train <- NULL\n    } else {\n      stop('Argument \"data\" is missing with no default', call. = FALSE)\n    }\n  }\n\n  if (missing(\"newdata\")) {\n    if (\"data_test\" %in% names(dots)) {\n      message('argument \"data_test\" is deprecated; supply as \"newdata\" instead')\n      data_test <- dots$data_train\n      dots$data_test <- NULL\n    } else {\n      data_test <- rlang::missing_arg()\n    }\n  }\n\n  if (!missing(\"data\")) {\n    data_train <- data\n  }\n  if (!missing(\"newdata\")) {\n    data_test <- newdata\n  }\n  orig_data <- data_train\n\n  # Check sampler arguments\n  use_stan <- TRUE\n  if (\"adapt_delta\" %in% names(dots)) {\n    message(\n      'argument \"adapt_delta\" should be supplied as an element in \"control\"'\n    )\n    adapt_delta <- dots$adapt_delta\n    dots$adapt_delta <- NULL\n  } else {\n    adapt_delta <- control$adapt_delta\n    if (is.null(adapt_delta)) adapt_delta <- 0.8\n  }\n\n  if (\"max_treedepth\" %in% names(dots)) {\n    message(\n      'argument \"max_treedepth\" should be supplied as an element in \"control\"'\n    )\n    max_treedepth <- dots$max_treedepth\n    dots$max_treedepth <- NULL\n  } else {\n    max_treedepth <- control$max_treedepth\n    if (is.null(max_treedepth)) max_treedepth <- 10\n  }\n\n  # Validate trend_model\n  if (\"drift\" %in% names(dots) & silent < 2L) {\n    message(\n      'The \"drift\" argument is deprecated; use fixed effects of \"time\" instead'\n    )\n    dots$drift <- NULL\n  }\n  drift <- FALSE\n  orig_trend_model <- trend_model\n  trend_model <- validate_trend_model(\n    orig_trend_model,\n    drift = drift,\n    noncentred = noncentred\n  )\n\n  # Cannot yet map observations to trends that evolve as CAR1\n  if (trend_model == \"CAR1\" & !missing(trend_map)) {\n    stop(\"cannot yet use trend mapping for CAR1 dynamics\", call. = FALSE)\n  }\n\n  # Ensure series and time variables are present\n  data_train <- validate_series_time(\n    data_train,\n    name = \"data\",\n    trend_model = orig_trend_model\n  )\n\n  # Validate the formula to convert any dynamic() terms\n  formula <- interpret_mvgam(\n    formula,\n    N = max(data_train$index..time..index),\n    family = family\n  )\n\n  # Check sampler arguments\n  validate_pos_integer(chains)\n  validate_pos_integer(threads)\n  validate_pos_integer(burnin)\n  validate_pos_integer(samples)\n  validate_pos_integer(thin)\n  validate_silent(silent)\n\n  # Upper bounds no longer supported as they are fairly useless\n  upper_bounds <- rlang::missing_arg()\n\n  # Check for gp terms in the validated formula\n  list2env(\n    check_gp_terms(formula, data_train, family = family),\n    envir = environment()\n  )\n\n  # Check for missing rhs in formula\n  list2env(check_obs_intercept(formula, orig_formula), envir = environment())\n\n  # Check for brmspriors\n  if (!missing(priors)) {\n    if (inherits(priors, \"brmsprior\") & !lfo & use_stan) {\n      priors <- adapt_brms_priors(\n        priors = priors,\n        formula = orig_formula,\n        trend_formula = trend_formula,\n        data = data_train,\n        family = family,\n        use_lv = use_lv,\n        n_lv = n_lv,\n        trend_model = orig_trend_model,\n        trend_map = trend_map,\n        drift = drift,\n        warnings = TRUE,\n        knots = knots\n      )\n    }\n  }\n\n  # Ensure series and time variables are present\n  data_train <- validate_series_time(\n    data_train,\n    name = \"data\",\n    trend_model = orig_trend_model\n  )\n  if (!missing(data_test)) {\n    data_test <- validate_series_time(\n      data_test,\n      name = \"newdata\",\n      trend_model = orig_trend_model\n    )\n    if (trend_model == \"CAR1\") {\n      data_test$index..time..index <- data_test$index..time..index +\n        max(data_train$index..time..index)\n    }\n  }\n\n  # Lighten the final object if this is an lfo run\n  if (lfo) {\n    return_model_data <- FALSE\n  }\n\n  # Validate observation formula\n  formula <- interpret_mvgam(formula, N = max(data_train$index..time..index))\n  data_train <- validate_obs_formula(formula, data = data_train, refit = refit)\n\n  if (!missing(data_test)) {\n    data_test <- validate_obs_formula(formula, data = data_test, refit = refit)\n  }\n  if (is.null(attr(terms(formula(formula)), \"offset\"))) {\n    offset <- FALSE\n  } else {\n    offset <- TRUE\n  }\n\n  # Ensure fitting software can be located\n  if (!use_stan & run_model) {\n    find_jags()\n  }\n  if (use_stan & run_model) {\n    find_stan()\n  }\n\n  # Validate the family and threads arguments\n  family <- validate_family(family, use_stan = use_stan)\n  family_char <- match.arg(arg = family$family, choices = family_char_choices())\n  threads <- validate_threads(family_char, threads)\n\n  # Nmixture additions?\n  list2env(\n    check_nmix(\n      family,\n      family_char,\n      trend_formula,\n      trend_model,\n      trend_map,\n      data_train\n    ),\n    envir = environment()\n  )\n\n  # Validate remaining trend arguments\n  trend_val <- validate_trend_restrictions(\n    trend_model = trend_model,\n    formula = formula,\n    trend_formula = trend_formula,\n    trend_map = trend_map,\n    drift = drift,\n    drop_obs_intercept = drop_obs_intercept,\n    use_lv = use_lv,\n    n_lv = n_lv,\n    data_train = data_train,\n    use_stan = use_stan\n  )\n  list2env(trend_val, envir = environment())\n  if (is.null(trend_map)) {\n    trend_map <- rlang::missing_arg()\n  }\n  if (is.null(n_lv)) {\n    n_lv <- rlang::missing_arg()\n  }\n\n  # Some general family-level restrictions can now be checked\n  orig_y <- data_train$y\n  if (any(!is.na(orig_y))) {\n    validate_family_restrictions(response = orig_y, family = family)\n  }\n\n  # Fill in missing observations in data_train so the size of the dataset is correct when\n  # building the initial JAGS model\n  resp_terms <- as.character(terms(formula(formula))[[2]])\n  if (length(resp_terms) == 1) {\n    out_name <- as.character(terms(formula(formula))[[2]])\n  } else {\n    if (any(grepl(\"cbind\", resp_terms))) {\n      resp_terms <- resp_terms[-grepl(\"cbind\", resp_terms)]\n      out_name <- resp_terms[1]\n    }\n  }\n  data_train[[out_name]] <- replace_nas(data_train[[out_name]])\n\n  # Compute default priors\n  if (use_stan) {\n    def_priors <- adapt_brms_priors(\n      c(\n        make_default_scales(orig_y, family),\n        make_default_int(\n          orig_y,\n          family = if (add_nmix) {\n            nmix()\n          } else {\n            family\n          }\n        )\n      ),\n      formula = orig_formula,\n      trend_formula = trend_formula,\n      data = orig_data,\n      family = family,\n      use_lv = use_lv,\n      n_lv = n_lv,\n      trend_model = orig_trend_model,\n      trend_map = trend_map,\n      drift = drift,\n      knots = knots\n    )\n  }\n\n  # Initiate the GAM model using mgcv so that the linear predictor matrix can be easily calculated\n  # when simulating from the Bayesian model later on;\n  ss_gam <- try(\n    mvgam_setup(\n      formula = formula,\n      knots = knots,\n      family = family_to_mgcvfam(family),\n      dat = data_train\n    ),\n    silent = TRUE\n  )\n  if (inherits(ss_gam, \"try-error\")) {\n    if (grepl(\"missing values\", ss_gam[1])) {\n      stop(\n        paste(\n          \"Missing values found in data predictors:\\n\",\n          attr(ss_gam, \"condition\")\n        ),\n        call. = FALSE\n      )\n    } else {\n      stop(paste(ss_gam[1]), call. = FALSE)\n    }\n  }\n\n  # Check the test data for NAs as well using predict.gam\n  testdat_pred <- try(\n    predict(ss_gam, newdata = data_test, na.action = na.fail),\n    silent = TRUE\n  )\n  if (inherits(testdat_pred, \"try-error\")) {\n    if (grepl(\"missing values\", testdat_pred[1])) {\n      stop(\n        paste(\n          \"Missing values found in newdata predictors:\\n\",\n          attr(testdat_pred, \"condition\")\n        ),\n        call. = FALSE\n      )\n    }\n  }\n\n  # Make JAGS file and appropriate data structures\n  list2env(\n    jagam_setup(\n      ss_gam = ss_gam,\n      formula = formula,\n      data_train = data_train,\n      family = family,\n      family_char = family_char,\n      knots = knots\n    ),\n    envir = environment()\n  )\n\n  # Update initial values of lambdas using the full estimates from the\n  # fitted gam model to speed convergence; remove initial betas so that the\n  # chains can start in very different regions of the parameter space\n  ss_jagam$jags.ini$b <- NULL\n  if (length(ss_gam$sp) == length(ss_jagam$jags.ini$lambda)) {\n    ss_jagam$jags.ini$lambda <- ss_gam$sp\n    ss_jagam$jags.ini$lambda[log(ss_jagam$jags.ini$lambda) > 10] <- exp(10)\n  }\n  if (length(ss_gam$smooth) == 0) {\n    ss_jagam$jags.ini$lambda <- NULL\n  }\n\n  # Fill y with NAs if this is a simulation from the priors;\n  # otherwise replace with the original supplied values\n  data_train <- check_priorsim(prior_simulation, data_train, orig_y, formula)\n\n  # Read in the base (unmodified) jags model file\n  base_model <- suppressWarnings(readLines(file_name))\n\n  # Remove lines from the linear predictor section\n  lines_remove <- c(1:grep(\"## response\", base_model))\n  base_model <- base_model[-lines_remove]\n\n  if (any(grepl(\"scale <- 1/tau\", base_model, fixed = TRUE))) {\n    base_model <- base_model[-grep(\"scale <- 1/tau\", base_model, fixed = TRUE)]\n  }\n\n  if (any(grepl(\"tau ~ dgamma(.05,.005)\", base_model, fixed = TRUE))) {\n    base_model <- base_model[\n      -grep(\"tau ~ dgamma(.05,.005)\", base_model, fixed = TRUE)\n    ]\n  }\n\n  # Any parametric effects in the gam (particularly the intercept) need sensible priors to ensure they\n  # do not directly compete with the latent trends\n  if (any(grepl(\"Parametric effect priors\", base_model))) {\n    in_parenth <- regmatches(\n      base_model[grep(\"Parametric effect priors\", base_model) + 1],\n      gregexpr(\n        \"(?<=\\\\().+?(?=\\\\))\",\n        base_model[grep(\"Parametric effect priors\", base_model) + 1],\n        perl = T\n      )\n    )[[1]][1]\n    n_terms <- as.numeric(sub(\".*:\", \"\", in_parenth))\n    ss_jagam$jags.data$p_coefs <- coef(ss_gam)[1:n_terms]\n\n    # Use the initialised GAM's estimates for parametric effects, but widen them\n    # substantially to allow for better exploration\n    beta_sims <- rmvn(100, coef(ss_gam), ss_gam$Vp)\n    ss_jagam$jags.data$p_taus <- apply(\n      as.matrix(beta_sims[, 1:n_terms]),\n      2,\n      function(x) 1 / (sd(x)^2)\n    )\n\n    base_model[grep(\"Parametric effect priors\", base_model) + 1] <- paste0(\n      \"  for (i in 1:\",\n      n_terms,\n      \") { b[i] ~ dnorm(p_coefs[i], p_taus[i]) }\"\n    )\n    base_model[grep(\"Parametric effect priors\", base_model)] <- c(\n      \"  ## parametric effect priors (regularised for identifiability)\"\n    )\n  }\n\n  # For any random effect smooths, use non-centred parameterisation to avoid degeneracies\n  # For monotonic smooths, need to determine which direction to place\n  # coefficient constraints\n  smooth_labs <- do.call(\n    rbind,\n    lapply(seq_along(ss_gam$smooth), function(x) {\n      data.frame(\n        label = ss_gam$smooth[[x]]$label,\n        class = class(ss_gam$smooth[[x]])[1],\n        id = ifelse(is.null(ss_gam$smooth[[x]]$id), NA, ss_gam$smooth[[x]]$id)\n      )\n    })\n  )\n\n  # Check for 'id' arguments, which are not yet supported\n  if (any(!is.na(smooth_labs$id))) {\n    stop(\n      'smooth terms with the \"id\" argument not yet supported by mvgam',\n      call. = FALSE\n    )\n  }\n\n  if (any(smooth_labs$class == \"random.effect\")) {\n    re_smooths <- smooth_labs %>%\n      dplyr::filter(class == \"random.effect\") %>%\n      dplyr::pull(label)\n\n    for (i in 1:length(re_smooths)) {\n      # If there are multiple smooths with this label, find out where the random effect\n      # smooth sits\n      smooth_labs %>%\n        dplyr::filter(label == re_smooths[i]) %>%\n        dplyr::mutate(smooth_number = dplyr::row_number()) %>%\n        dplyr::filter(class == \"random.effect\") %>%\n        dplyr::pull(smooth_number) -> smooth_number\n\n      in_parenth <- regmatches(\n        base_model[\n          grep(re_smooths[i], base_model, fixed = T)[smooth_number] + 1\n        ],\n        gregexpr(\n          \"(?<=\\\\().+?(?=\\\\))\",\n          base_model[\n            grep(re_smooths[i], base_model, fixed = T)[smooth_number] + 1\n          ],\n          perl = T\n        )\n      )[[1]][1]\n      n_terms <- as.numeric(sub(\".*:\", \"\", in_parenth))\n      n_start <- as.numeric(strsplit(sub(\".*\\\\(\", \"\", in_parenth), \":\")[[1]][1])\n      base_model[\n        grep(re_smooths[i], base_model, fixed = T)[smooth_number] + 1\n      ] <- paste0(\n        \"  for (i in \",\n        n_start,\n        \":\",\n        n_terms,\n        \") {\\n   b_raw[i] ~ dnorm(0, 1)\\n\",\n        \"b[i] <- \",\n        paste0(\"mu_raw\", i),\n        \" + b_raw[i] * \",\n        paste0(\"sigma_raw\", i),\n        \"\\n  }\\n  \",\n        paste0(\"sigma_raw\", i),\n        \" ~ dexp(0.5)\\n\",\n        paste0(\"mu_raw\", i),\n        \" ~ dnorm(0, 1)\"\n      )\n      base_model[grep(re_smooths[i], base_model, fixed = T)[\n        smooth_number\n      ]] <- paste0(\"  ## prior (non-centred) for \", re_smooths[i], \"...\")\n    }\n  }\n\n  base_model[grep(\"smoothing parameter priors\", base_model)] <- c(\n    \"   ## smoothing parameter priors...\"\n  )\n\n  # Remove the fakery lines if they were added\n  if (!smooths_included) {\n    base_model <- base_model[\n      -c(\n        grep(\"## prior for s(fakery)\", trimws(base_model), fixed = TRUE):(grep(\n          \"## prior for s(fakery)\",\n          trimws(base_model),\n          fixed = TRUE\n        ) +\n          7)\n      )\n    ]\n  }\n\n  # Add replacement lines for priors, trends and the linear predictor\n  fil <- tempfile(fileext = \".xt\")\n  modification <- add_base_dgam_lines(use_lv)\n  cat(\n    c(readLines(textConnection(modification)), base_model),\n    file = fil,\n    sep = \"\\n\"\n  )\n  model_file <- trimws(readLines(fil, n = -1))\n\n  # Modify observation distribution lines\n  if (family_char == \"tweedie\") {\n    model_file <- add_tweedie_lines(model_file, upper_bounds = upper_bounds)\n  } else if (family_char == \"poisson\") {\n    model_file <- add_poisson_lines(model_file, upper_bounds = upper_bounds)\n  } else {\n    if (missing(upper_bounds)) {\n      model_file[grep(\n        \"y\\\\[i, s\\\\] ~\",\n        model_file\n      )] <- \"  y[i, s] ~ dnegbin(rate[i, s], phi[s])\"\n      model_file[grep(\n        \"ypred\\\\[i, s\\\\] ~\",\n        model_file\n      )] <- \"  ypred[i, s] ~ dnegbin(rate[i, s], phi[s])\"\n    }\n  }\n\n  # Modify lines needed for the specified trend model\n  model_file <- add_trend_lines(\n    model_file,\n    stan = FALSE,\n    use_lv = use_lv,\n    trend_model = if (\n      trend_model %in%\n        c(\"RW\", \"VAR1\", \"PWlinear\", \"PWlogistic\", \"ZMVN\")\n    ) {\n      \"RW\"\n    } else {\n      trend_model\n    },\n    drift = drift\n  )\n\n  # Use informative priors based on the fitted mgcv model to speed convergence\n  # and eliminate searching over strange parameter spaces\n  if (length(ss_gam$sp) == length(ss_jagam$jags.ini$lambda)) {\n    model_file[grep(\n      \"lambda\\\\[i\\\\] ~\",\n      model_file\n    )] <- \"   lambda[i] ~ dexp(1/sp[i])\"\n  } else {\n    model_file[grep(\n      \"lambda\\\\[i\\\\] ~\",\n      model_file\n    )] <- \"   lambda[i] ~ dexp(0.05)\"\n  }\n\n  # Final tidying of the JAGS model for readability\n  clean_up <- vector()\n  for (x in 1:length(model_file)) {\n    clean_up[x] <- model_file[x - 1] == \"\" & model_file[x] == \"\"\n  }\n  clean_up[is.na(clean_up)] <- FALSE\n  model_file <- model_file[!clean_up]\n\n  # Add in the offset if needed\n  if (offset) {\n    model_file[grep(\"eta <- X %*% b\", model_file, fixed = TRUE)] <-\n      \"eta <- X %*% b + offset\"\n    model_file[grep(\"eta <- X * b\", model_file, fixed = TRUE)] <-\n      \"eta <- X * b + offset\"\n    if (!missing(data_test) & !prior_simulation) {\n      ss_jagam$jags.data$offset <- c(\n        ss_jagam$jags.data$offset,\n        data_test[[get_offset(ss_gam)]]\n      )\n    }\n  }\n\n  model_file_jags <- textConnection(model_file)\n\n  # Covariate dataframe including training and testing observations\n  if (!missing(data_test) & !prior_simulation) {\n    suppressWarnings(\n      lp_test <- try(\n        predict(ss_gam, newdata = data_test, type = \"lpmatrix\"),\n        silent = TRUE\n      )\n    )\n\n    if (inherits(lp_test, \"try-error\")) {\n      testdat <- data.frame(time = data_test$index..time..index)\n\n      terms_include <- names(ss_gam$coefficients)[which(\n        !names(ss_gam$coefficients) %in% \"(Intercept)\"\n      )]\n      if (length(terms_include) > 0) {\n        newnames <- vector()\n        newnames[1] <- \"time\"\n        for (i in 1:length(terms_include)) {\n          testdat <- cbind(testdat, data.frame(data_test[[terms_include[i]]]))\n          newnames[i + 1] <- terms_include[i]\n        }\n        colnames(testdat) <- newnames\n      }\n      suppressWarnings(\n        lp_test <- predict(ss_gam, newdata = testdat, type = \"lpmatrix\")\n      )\n    }\n\n    # Remove fakery columns from design matrix if no smooth terms were included\n    if (!smooths_included) {\n      ss_jagam$jags.data$X <- as.matrix(\n        ss_jagam$jags.data$X[, -c(xcols_drop)],\n        ncol = NCOL(lp_test)\n      )\n    }\n\n    X <- data.frame(rbind(ss_jagam$jags.data$X, lp_test))\n\n    # Add a time variable\n    if (inherits(data_train, \"list\")) {\n      temp_dat_train <- data.frame(\n        index..time..index = data_train$index..time..index,\n        series = data_train$series\n      )\n      temp_dat_test <- data.frame(\n        index..time..index = data_test$index..time..index,\n        series = data_test$series\n      )\n\n      X$index..time..index <- rbind(temp_dat_train, temp_dat_test) %>%\n        dplyr::left_join(\n          rbind(temp_dat_train, temp_dat_test) %>%\n            dplyr::select(index..time..index) %>%\n            dplyr::distinct() %>%\n            dplyr::arrange(index..time..index) %>%\n            dplyr::mutate(index..time..index = dplyr::row_number()),\n          by = c(\"index..time..index\")\n        ) %>%\n        dplyr::pull(index..time..index)\n\n      # Add a series identifier variable\n      X$series <- as.numeric(rbind(temp_dat_train, temp_dat_test)$series)\n\n      # Add an outcome variable\n      X$outcome <- c(orig_y, rep(NA, NROW(temp_dat_test)))\n    } else {\n      if (NCOL(data_train) != NCOL(data_test)) {\n        stop(\n          '\"data\" and \"newdata\" have different numbers of columns',\n          call. = FALSE\n        )\n      }\n\n      X$index..time..index <- dplyr::bind_rows(data_train, data_test) %>%\n        dplyr::left_join(\n          dplyr::bind_rows(data_train, data_test) %>%\n            dplyr::select(index..time..index) %>%\n            dplyr::distinct() %>%\n            dplyr::arrange(index..time..index) %>%\n            dplyr::mutate(index..time..index = dplyr::row_number()),\n          by = c(\"index..time..index\")\n        ) %>%\n        dplyr::pull(index..time..index)\n\n      # Add a series identifier variable\n      X$series <- as.numeric(dplyr::bind_rows(data_train, data_test)$series)\n\n      # Add an outcome variable\n      X$outcome <- c(data_train$y, rep(NA, NROW(data_test)))\n    }\n  } else {\n    X <- data.frame(ss_jagam$jags.data$X)\n\n    # Remove fakery columns from design matrix if no smooth terms were included\n    if (!smooths_included) {\n      X[, xcols_drop] <- NULL\n    }\n\n    if (inherits(data_train, \"list\")) {\n      temp_dat <- data.frame(index..time..index = data_train$index..time..index)\n      X$index..time..index <- temp_dat %>%\n        dplyr::left_join(\n          temp_dat %>%\n            dplyr::select(index..time..index) %>%\n            dplyr::distinct() %>%\n            dplyr::arrange(index..time..index) %>%\n            dplyr::mutate(index..time..index = dplyr::row_number()),\n          by = c(\"index..time..index\")\n        ) %>%\n        dplyr::pull(index..time..index)\n    } else {\n      X$index..time..index <- data_train %>%\n        dplyr::left_join(\n          data_train %>%\n            dplyr::select(index..time..index) %>%\n            dplyr::distinct() %>%\n            dplyr::arrange(index..time..index) %>%\n            dplyr::mutate(index..time..index = dplyr::row_number()),\n          by = c(\"index..time..index\")\n        ) %>%\n        dplyr::pull(index..time..index)\n    }\n\n    X$outcome <- c(data_train$y)\n    X$series <- as.numeric(data_train$series)\n  }\n\n  # Arrange by time then by series\n  X %>% dplyr::arrange(index..time..index, series) -> X\n\n  # Matrix of indices in X that correspond to timepoints for each series\n  ytimes <- matrix(\n    NA,\n    nrow = length(unique(X$index..time..index)),\n    ncol = length(unique(X$series))\n  )\n  for (i in 1:length(unique(X$series))) {\n    ytimes[, i] <- which(X$series == i)\n  }\n  ss_jagam$jags.data$ytimes <- ytimes\n\n  # Matrix of outcomes in X that correspond to each series at each timepoint\n  ys_mat <- matrix(NA, nrow = NROW(ytimes), ncol = NCOL(ytimes))\n  for (i in 1:length(unique(X$series))) {\n    ys_mat[, i] <- X$outcome[which(X$series == i)]\n  }\n  ss_jagam$jags.data$y <- ys_mat\n\n  # Other necessary variables\n  ss_jagam$jags.data$n <- NROW(ytimes)\n  ss_jagam$jags.data$n_series <- NCOL(ytimes)\n  ss_jagam$jags.data$X <- as.matrix(\n    X %>%\n      dplyr::select(-index..time..index, -series, -outcome)\n  )\n  if (NCOL(ss_jagam$jags.data$X) == 1) {\n    if (offset) {\n      model_file[grep(\n        \"eta <-\",\n        model_file,\n        fixed = TRUE\n      )] <- \"eta <- X * b + offset\"\n    } else {\n      model_file[grep(\"eta <-\", model_file, fixed = TRUE)] <- \"eta <- X * b\"\n    }\n  }\n\n  if (!missing(upper_bounds)) {\n    ss_jagam$jags.data$upper_bound <- upper_bounds\n  }\n\n  if (length(ss_gam$sp) == length(ss_jagam$jags.ini$lambda)) {\n    ss_jagam$jags.data$sp <- ss_gam$sp\n  }\n\n  # Machine epsilon for minimum allowable non-zero rate\n  if (family_char == \"negative binomial\") {\n    ss_jagam$jags.data$min_eps <- .Machine$double.eps\n  }\n\n  # Number of latent variables to use\n  if (use_lv) {\n    if (missing(n_lv)) {\n      ss_jagam$jags.data$n_lv <- min(2, floor(ss_jagam$jags.data$n_series / 2))\n    } else {\n      ss_jagam$jags.data$n_lv <- n_lv\n      ss_jagam$jags.ini$X1 <- rep(1, n_lv)\n      ss_jagam$jags.ini$X2 <- 1\n    }\n    if (ss_jagam$jags.data$n_lv > ss_jagam$jags.data$n_series) {\n      stop(\"Number of latent variables cannot be greater than number of series\")\n    }\n  }\n\n  if (missing(upper_bounds)) {\n    upper_bounds <- NULL\n  }\n\n  if (use_lv) {\n    n_lv <- ss_jagam$jags.data$n_lv\n  } else {\n    if (missing(trend_map)) {\n      n_lv <- NULL\n    }\n  }\n\n  if (missing(data_test)) {\n    data_test <- NULL\n  }\n\n  # Remove Smooth penalty matrix if no smooths were used in the formula\n  if (!smooths_included) {\n    if (any(grepl(\"S.*\", names(ss_jagam$jags.data)))) {\n      ss_jagam$jags.data[[grep(\"S.*\", names(ss_jagam$jags.data))]] <- NULL\n      ss_jagam$jags.data$sp <- NULL\n    }\n    ss_jagam$jags.data$zero <- NULL\n  }\n\n  # Add information about the call and necessary data structures to the model file\n  # Get dimensions and numbers of smooth terms\n  snames <- names(ss_jagam$jags.data)[grep(\"S.*\", names(ss_jagam$jags.data))]\n  if (length(snames) == 0) {\n    smooth_penalty_data <- NULL\n  } else {\n    smooth_dims <- matrix(NA, ncol = 2, nrow = length(snames))\n    for (i in 1:length(snames)) {\n      smooth_dims[i, ] <- dim(ss_jagam$jags.data[[snames[i]]])\n    }\n    smooth_penalty_data <- vector()\n    for (i in 1:length(snames)) {\n      smooth_penalty_data[i] <- paste0(\n        \"matrix \",\n        snames[i],\n        \";  mgcv smooth penalty matrix \",\n        snames[i]\n      )\n    }\n  }\n\n  if (\"sp\" %in% names(ss_jagam$jags.data)) {\n    if (length(ss_jagam$jags.data$sp) == 1) {\n      sp_data <- c(\n        paste0(\n          \"real sp;  inverse exponential location prior for smoothing parameter \",\n          paste0(names(ss_jagam$jags.data$sp))\n        ),\n        \"___________values ranging 5 - 50 are a good start\"\n      )\n    } else {\n      sp_data <- c(\n        paste0(\n          \"vector sp;  inverse exponential location priors for smoothing parameters: \",\n          paste0(names(ss_jagam$jags.data$sp), collapse = \"; \")\n        ),\n        \"___________values ranging 5 - 50 are a good start\"\n      )\n    }\n  } else {\n    sp_data <- NULL\n  }\n\n  if (\"p_coefs\" %in% names(ss_jagam$jags.data)) {\n    parametric_ldata <- paste0(\n      \"vector p_coefs;  vector (length = \",\n      length(ss_jagam$jags.data$p_coefs),\n      \") of prior Gaussian means for parametric effects\"\n    )\n  } else {\n    parametric_ldata <- NULL\n  }\n\n  if (\"p_taus\" %in% names(ss_jagam$jags.data)) {\n    parametric_tdata <- paste0(\n      \"vector p_taus;  vector (length = \",\n      length(ss_jagam$jags.data$p_coefs),\n      \") of prior Gaussian precisions for parametric effects\"\n    )\n  } else {\n    parametric_tdata <- NULL\n  }\n\n  # A second check for any smooth parameters\n  if (any(grep(\"lambda\", model_file, fixed = TRUE))) {\n    smooths_included <- TRUE\n  } else {\n    smooths_included <- smooths_included\n  }\n\n  if (any(grep(\"K.* <- \", model_file))) {\n    smooths_included <- TRUE\n  } else {\n    smooths_included <- smooths_included\n  }\n\n  # Add in additional data structure information for the model file heading\n  if (family_char == \"negative binomial\") {\n    min_eps <- paste0(\n      \"min_eps; .Machine$double.eps (smallest floating-point number x such that 1 + x != 1)\\n\"\n    )\n  } else {\n    min_eps <- NULL\n  }\n\n  if (smooths_included) {\n    zeros <- paste0(\n      \"vector zero;  prior basis coefficient locations vector of length ncol(X)\\n\"\n    )\n  } else {\n    zeros <- NULL\n  }\n\n  if (offset) {\n    offset_line <- paste0(\"offset; offset vector of length (n x n_series)\\n\")\n  } else {\n    offset_line <- NULL\n  }\n\n  model_file <- c(\n    \"JAGS model code generated by package mvgam\",\n    \"\\n\",\n    \"GAM formula:\",\n    gsub('\\\"', \"\", paste(formula[2], formula[3], sep = \" ~ \")),\n    \"\\n\",\n    \"Trend model:\",\n    trend_model,\n    \"\\n\",\n    \"Required data:\",\n    \"integer n;  number of timepoints per series\\n\",\n    \"integer n_series;  number of series\\n\",\n    \"matrix y;  time-ordered observations of dimension n x n_series (missing values allowed)\\n\",\n    \"matrix ytimes;  time-ordered n x n_series matrix (which row in X belongs to each [time, series] observation?)\\n\",\n    \"matrix X;  mgcv GAM design matrix of dimension (n x n_series) x basis dimension\\n\",\n    paste0(smooth_penalty_data),\n    offset_line,\n    zeros,\n    paste0(parametric_ldata),\n    paste0(parametric_tdata),\n    sp_data,\n    min_eps,\n    \"\\n\",\n    model_file\n  )\n\n  # Get names of smoothing parameters\n  if (smooths_included) {\n    ss_gam$off <- ss_jagam$pregam$off\n    ss_gam$S <- ss_jagam$pregam$S\n    name_starts <- unlist(purrr::map(ss_jagam$pregam$smooth, \"first.sp\"))\n    name_ends <- unlist(purrr::map(ss_jagam$pregam$smooth, \"last.sp\"))\n\n    rho_names <- unlist(lapply(seq(1:length(ss_gam$smooth)), function(i) {\n      number_seq <- seq(1:(1 + name_ends[i] - name_starts[i]))\n      number_seq[1] <- \"\"\n\n      paste0(rep(ss_gam$smooth[[i]]$label, length(number_seq)), number_seq)\n    }))\n  } else {\n    rho_names <- NA\n  }\n\n  #### Set up model file and modelling data ####\n  if (use_stan) {\n    algorithm <- match.arg(\n      algorithm,\n      c(\"sampling\", \"meanfield\", \"fullrank\", \"pathfinder\", \"laplace\")\n    )\n    backend <- match.arg(backend, c(\"rstan\", \"cmdstanr\"))\n\n    cmdstan_avail <- insight::check_if_installed(\n      \"cmdstanr\",\n      stop = FALSE,\n      quietly = TRUE\n    )\n\n    if (isTRUE(cmdstan_avail)) {\n      if (is.null(cmdstanr::cmdstan_version(error_on_NA = FALSE))) {\n        backend <- \"rstan\"\n      }\n    }\n    fit_engine <- \"stan\"\n    use_cmdstan <- ifelse(backend == \"cmdstanr\", TRUE, FALSE)\n\n    # Import the base Stan model file\n    modification <- add_base_dgam_lines(stan = TRUE, use_lv = use_lv)\n    unlink(\"base_gam_stan.txt\")\n\n    stanfile_name <- tempfile(pattern = \"base_gam_stan\", fileext = \".txt\")\n    cat(modification, file = stanfile_name, sep = \"\\n\", append = T)\n    base_stan_model <- trimws(suppressWarnings(readLines(stanfile_name)))\n    unlink(stanfile_name)\n\n    # Add necessary trend structure\n    base_stan_model <- add_trend_lines(\n      model_file = base_stan_model,\n      stan = TRUE,\n      trend_model = if (\n        trend_model %in% c(\"RW\", \"VAR1\", \"PWlinear\", \"PWlogistic\", \"ZMVN\")\n      ) {\n        \"RW\"\n      } else {\n        trend_model\n      },\n      use_lv = use_lv,\n      drift = drift\n    )\n\n    # Add remaining data, model and parameters blocks to the Stan model file;\n    # gather Stan data structure\n    stan_objects <- add_stan_data(\n      jags_file = trimws(model_file),\n      stan_file = base_stan_model,\n      ss_gam = ss_gam,\n      use_lv = use_lv,\n      n_lv = n_lv,\n      jags_data = ss_jagam$jags.data,\n      family = ifelse(\n        family_char %in% c(\"binomial\", \"bernoulli\", \"beta_binomial\"),\n        \"poisson\",\n        family_char\n      ),\n      upper_bounds = upper_bounds\n    )\n\n    if (use_lv || !missing(trend_map)) {\n      stan_objects$model_data$n_lv <- n_lv\n    }\n\n    # Set monitor parameters\n    param <- get_monitor_pars(\n      family = family_char,\n      use_lv = use_lv,\n      trend_model = trend_model,\n      smooths_included = stan_objects$smooths_included,\n      drift = drift\n    )\n    if (any(smooth_labs$class == \"random.effect\")) {\n      param <- c(param, \"mu_raw\", \"sigma_raw\")\n    }\n\n    # Don't place inits when using Stan; may add options later for users\n    # to supply them though\n    inits <- NULL\n\n    # Include any GP term updates\n    if (!is.null(gp_terms)) {\n      gp_additions <- make_gp_additions(\n        gp_details = gp_details,\n        orig_formula = orig_formula,\n        data = data_train,\n        newdata = data_test,\n        model_data = stan_objects$model_data,\n        mgcv_model = ss_gam,\n        gp_terms = gp_terms,\n        family = family,\n        rho_names = rho_names\n      )\n      stan_objects$model_data <- gp_additions$model_data\n      ss_gam <- gp_additions$mgcv_model\n      rho_names <- gp_additions$rho_names\n    }\n\n    # Vectorise likelihoods\n    vectorised <- vectorise_stan_lik(\n      model_file = stan_objects$stan_file,\n      model_data = stan_objects$model_data,\n      family = family_char,\n      threads = threads,\n      trend_model = trend_model,\n      use_lv = use_lv,\n      offset = offset,\n      drift = drift\n    )\n\n    # If a VAR model is used, enforce stationarity using methods described by\n    # Heaps 2022 (Enforcing stationarity through the prior in vector autoregressions)\n    if (use_var1) {\n      vectorised$model_file <- stationarise_VAR(vectorised$model_file)\n    }\n\n    if (use_var1cor) {\n      param <- c(param, \"L_Omega\")\n      vectorised$model_file <- stationarise_VARcor(vectorised$model_file)\n    }\n\n    # Add modifications for trend mapping and trend predictors, if\n    # supplied\n    trend_sp_names <- NA\n    if (!missing(trend_map)) {\n      trend_map_setup <- trend_map_mods(\n        model_file = vectorised$model_file,\n        model_data = vectorised$model_data,\n        trend_map = trend_map,\n        data_train = data_train,\n        ytimes = ytimes,\n        n_lv = n_lv,\n        trend_model = trend_model\n      )\n      vectorised$model_file <- trend_map_setup$model_file\n      vectorised$model_data <- trend_map_setup$model_data\n\n      if (\n        trend_model %in% c(\"None\", \"RW\", \"AR1\", \"AR2\", \"AR3\", \"CAR1\", \"ZMVN\")\n      ) {\n        param <- unique(c(param, \"trend\", \"sigma\"))\n      }\n\n      # If trend formula specified, add the predictors for the trend models\n      if (!missing(trend_formula)) {\n        if (missing(trend_knots)) {\n          trend_knots <- missing_arg()\n        }\n\n        trend_pred_setup <- add_trend_predictors(\n          trend_formula = trend_formula,\n          trend_knots = trend_knots,\n          trend_map = trend_map,\n          trend_model = trend_model,\n          data_train = data_train,\n          data_test = if (missing(data_test)) {\n            NULL\n          } else {\n            data_test\n          },\n          model_file = vectorised$model_file,\n          model_data = vectorised$model_data,\n          drop_trend_int = FALSE,\n          drift = drift\n        )\n\n        vectorised$model_file <- trend_pred_setup$model_file\n        vectorised$model_data <- trend_pred_setup$model_data\n        trend_mgcv_model <- trend_pred_setup$trend_mgcv_model\n\n        param <- unique(c(param, \"trend\", \"b_trend\", \"trend_mus\"))\n\n        if (trend_pred_setup$trend_smooths_included) {\n          param <- c(param, \"rho_trend\", \"lambda_trend\")\n        }\n\n        if (trend_pred_setup$trend_random_included) {\n          param <- c(param, \"mu_raw_trend\", \"sigma_raw_trend\")\n        }\n\n        trend_sp_names <- trend_pred_setup$trend_sp_names\n      } else {}\n\n      if (trend_model == \"VAR1\") {\n        param <- c(param, \"lv_coefs\", \"LV\")\n        use_lv <- TRUE\n      }\n    }\n\n    # Update default priors\n    vectorised$model_file <- suppressWarnings(update_priors(\n      vectorised$model_file,\n      def_priors,\n      use_stan = TRUE\n    ))\n\n    # Drop observation intercept if specified\n    if (drop_obs_intercept) {\n      if (\n        any(grepl(\n          \"// observation model basis coefficients\",\n          vectorised$model_file,\n          fixed = TRUE\n        ))\n      ) {\n        vectorised$model_file[\n          grep(\n            \"// observation model basis coefficients\",\n            vectorised$model_file,\n            fixed = TRUE\n          ) +\n            1\n        ] <-\n          paste0(\n            vectorised$model_file[\n              grep(\n                \"// observation model basis coefficients\",\n                vectorised$model_file,\n                fixed = TRUE\n              ) +\n                1\n            ],\n            \"\\n\",\n            \"// (Intercept) fixed at zero\\n\",\n            \"b[1] = 0;\"\n          )\n      } else {\n        vectorised$model_file[grep(\n          \"b[1:num_basis] = b_raw[1:num_basis]\",\n          vectorised$model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            \"b[1:num_basis] = b_raw[1:num_basis];\\n\",\n            \"// (Intercept) fixed at zero\\n\",\n            \"b[1] = 0;\"\n          )\n      }\n\n      vectorised$model_file <- readLines(\n        textConnection(vectorised$model_file),\n        n = -1\n      )\n      attr(ss_gam, \"drop_obs_intercept\") <- TRUE\n    } else {\n      attr(ss_gam, \"drop_obs_intercept\") <- FALSE\n    }\n\n    # Remaining model file updates for any GP terms\n    if (!is.null(gp_terms)) {\n      final_gp_updates <- add_gp_model_file(\n        model_file = vectorised$model_file,\n        model_data = vectorised$model_data,\n        mgcv_model = ss_gam,\n        gp_additions = gp_additions\n      )\n      vectorised$model_file <- final_gp_updates$model_file\n      vectorised$model_data <- final_gp_updates$model_data\n    }\n\n    # Update monitor pars for any GP terms\n    if (\n      any(grepl(\n        \"real<lower=0> alpha_gp\",\n        vectorised$model_file,\n        fixed = TRUE\n      )) &\n        !lfo\n    ) {\n      alpha_params <- trimws(gsub(\n        \";\",\n        \"\",\n        gsub(\n          \"real<lower=0> \",\n          \"\",\n          grep(\n            \"real<lower=0> alpha_gp\",\n            vectorised$model_file,\n            fixed = TRUE,\n            value = TRUE\n          ),\n          fixed = TRUE\n        )\n      ))\n      rho_params <- trimws(gsub(\n        \";\",\n        \"\",\n        gsub(\n          \"real<lower=0> \",\n          \"\",\n          grep(\n            \"real<lower=0> rho_gp\",\n            vectorised$model_file,\n            fixed = TRUE,\n            value = TRUE\n          ),\n          fixed = TRUE\n        )\n      ))\n      param <- c(param, alpha_params, rho_params)\n    }\n\n    # Update for any monotonic term updates\n    if (any(smooth_labs$class %in% c(\"moi.smooth\", \"mod.smooth\"))) {\n      final_mono_updates <- add_mono_model_file(\n        model_file = vectorised$model_file,\n        model_data = vectorised$model_data,\n        mgcv_model = ss_gam\n      )\n      vectorised$model_file <- final_mono_updates$model_file\n      vectorised$model_data <- final_mono_updates$model_data\n    }\n\n    # Update for any piecewise trends\n    if (trend_model %in% c(\"PWlinear\", \"PWlogistic\")) {\n      pw_additions <- add_piecewise(\n        vectorised$model_file,\n        vectorised$model_data,\n        data_train,\n        data_test,\n        orig_trend_model,\n        family\n      )\n      vectorised$model_file <- pw_additions$model_file\n      vectorised$model_data <- pw_additions$model_data\n      orig_trend_model$changepoints <- pw_additions$model_data$t_change\n      orig_trend_model$change_freq <- pw_additions$model_data$change_freq\n      orig_trend_model$cap <- pw_additions$model_data$cap\n    }\n\n    # Update for CAR1 trends\n    if (trend_model == \"CAR1\") {\n      vectorised$model_data <- add_corcar(\n        vectorised$model_data,\n        data_train,\n        data_test\n      )\n    }\n\n    # Updates for Binomial and Bernoulli families\n    if (family_char %in% c(\"binomial\", \"bernoulli\", \"beta_binomial\")) {\n      bin_additions <- add_binomial(\n        formula,\n        vectorised$model_file,\n        vectorised$model_data,\n        data_train,\n        data_test,\n        family_char\n      )\n      vectorised$model_file <- bin_additions$model_file\n      vectorised$model_data <- bin_additions$model_data\n      attr(ss_gam, \"trials\") <- bin_additions$trials\n    }\n\n    # Add in any user-specified priors\n    if (!missing(priors)) {\n      vectorised$model_file <- update_priors(\n        vectorised$model_file,\n        priors,\n        use_stan = TRUE\n      )\n    } else {\n      priors <- NULL\n    }\n\n    # Check if non-centering can be used\n    nc_check <- check_noncent(\n      model_file = vectorised$model_file,\n      noncentred = noncentred,\n      use_lv = use_lv,\n      trend_map = trend_map,\n      add_ma = add_ma,\n      add_cor = add_cor,\n      trend_model = trend_model,\n      drift = drift,\n      silent = silent,\n      nmix = add_nmix\n    )\n    vectorised$model_file <- nc_check$model_file\n    noncentred <- nc_check$noncentred\n\n    # Add any correlated error or moving average processes; this comes after\n    # priors as currently there is no option to change priors on these parameters\n    if (add_ma | add_cor) {\n      MaCor_additions <- add_MaCor(\n        model_file = vectorised$model_file,\n        model_data = vectorised$model_data,\n        data_train = data_train,\n        data_test = data_test,\n        add_ma = add_ma,\n        add_cor = add_cor,\n        trend_model = orig_trend_model\n      )\n      vectorised$model_file <- MaCor_additions$model_file\n      vectorised$model_data <- MaCor_additions$model_data\n    }\n\n    # Add updates for an N-mixture model\n    if (add_nmix) {\n      nmix_additions <- add_nmixture(\n        vectorised$model_file,\n        vectorised$model_data,\n        orig_trend_model = orig_trend_model,\n        data_train = data_train,\n        data_test = data_test,\n        trend_map = trend_map,\n        nmix_trendmap = nmix_trendmap\n      )\n      vectorised$model_file <- nmix_additions$model_file\n      vectorised$model_data <- nmix_additions$model_data\n      family <- nmix()\n      family_char <- \"nmix\"\n\n      # Nmixtures don't use generated quantities because it is faster\n      # to produce these in R after sampling has finished\n      param <- c(param, \"p\")\n      param <- param[\n        !param %in%\n          c(\n            \"ypred\",\n            \"mus\",\n            \"theta\",\n            \"detprob\",\n            \"latent_ypred\",\n            \"lv_coefs\",\n            \"error\"\n          )\n      ]\n    }\n\n    # Updates for sharing of observation params\n    if (share_obs_params) {\n      vectorised$model_file <- shared_obs_params(\n        vectorised$model_file,\n        family_char\n      )\n    }\n\n    # Tidy the representation\n    vectorised$model_file <- sanitise_modelfile(vectorised$model_file)\n\n    if (requireNamespace(\"cmdstanr\", quietly = TRUE) & backend == \"cmdstanr\") {\n      # Replace new syntax if this is an older version of Stan\n      if (cmdstanr::cmdstan_version() < \"2.26\") {\n        warning(\n          \"Your version of CmdStan is out of date. Some features of mvgam may not work\"\n        )\n        vectorised$model_file <-\n          gsub(\n            \"array[n, n_series] int ypred;\",\n            \"int ypred[n, n_series];\",\n            vectorised$model_file,\n            fixed = TRUE\n          )\n        vectorised$model_file <-\n          gsub(\n            \"array[n, n_series] real ypred;\",\n            \"real ypred[n, n_series];\",\n            vectorised$model_file,\n            fixed = TRUE\n          )\n      }\n\n      # Auto-format the model file\n      if (autoformat) {\n        if (\n          requireNamespace(\"cmdstanr\") &\n            cmdstanr::cmdstan_version() >= \"2.29.0\"\n        ) {\n          vectorised$model_file <- .autoformat(\n            vectorised$model_file,\n            overwrite_file = FALSE,\n            backend = \"cmdstanr\",\n            silent = silent >= 1L\n          )\n        }\n        vectorised$model_file <- readLines(\n          textConnection(vectorised$model_file),\n          n = -1\n        )\n      }\n    } else {\n      if (autoformat) {\n        vectorised$model_file <- .autoformat(\n          vectorised$model_file,\n          overwrite_file = FALSE,\n          backend = \"rstan\",\n          silent = silent >= 1L\n        )\n        vectorised$model_file <- readLines(\n          textConnection(vectorised$model_file),\n          n = -1\n        )\n      }\n\n      # Replace new syntax if this is an older version of Stan\n      if (rstan::stan_version() < \"2.26\") {\n        warning(\n          \"Your version of rstan is out of date. Some features of mvgam may not work\"\n        )\n        vectorised$model_file <-\n          gsub(\n            \"array[n, n_series] int ypred;\",\n            \"int ypred[n, n_series];\",\n            vectorised$model_file,\n            fixed = TRUE\n          )\n      }\n    }\n    attr(vectorised$model_data, \"trend_model\") <- trend_model\n\n    # Remove data likelihood if this is a prior sampling run\n    if (prior_simulation) {\n      vectorised$model_file <- remove_likelihood(vectorised$model_file)\n    }\n  } else {\n    # Set up data and model file for JAGS\n    attr(ss_jagam$jags.data, \"trend_model\") <- trend_model\n    trend_sp_names <- NA\n    if (!smooths_included) {\n      inits <- NULL\n    } else {\n      inits <- ss_jagam$jags.ini\n    }\n    initlist <- replicate(chains, inits, simplify = FALSE)\n    inits <- initlist\n\n    if (!missing(priors)) {\n      model_file <- update_priors(model_file, priors, use_stan = FALSE)\n    } else {\n      priors <- NULL\n    }\n\n    # Set monitor parameters and initial values\n    param <- get_monitor_pars(\n      family_char,\n      smooths_included = smooths_included,\n      use_lv,\n      trend_model,\n      drift\n    )\n\n    # Add random effect parameters for monitoring\n    if (any(smooth_labs$class == \"random.effect\")) {\n      param <- c(param, paste0(\"mu_raw\", 1:length(re_smooths)))\n      param <- c(param, paste0(\"sigma_raw\", 1:length(re_smooths)))\n    }\n  }\n\n  # Remove lp__ from monitor params if VB is to be used\n  if (algorithm %in% c(\"meanfield\", \"fullrank\", \"pathfinder\", \"laplace\")) {\n    param <- param[!param %in% \"lp__\"]\n  }\n\n  # Lighten up the mgcv model(s) to reduce size of the returned object\n  ss_gam <- trim_mgcv(ss_gam)\n  if (!missing(trend_formula)) {\n    trend_mgcv_model <- trim_mgcv(trend_mgcv_model)\n  }\n\n  #### Return only the model file and all data / inits needed to run the model\n  # outside of mvgam ####\n  if (!run_model) {\n    unlink(\"base_gam.txt\")\n    output <- structure(\n      list(\n        call = orig_formula,\n        trend_call = if (!missing(trend_formula)) {\n          trend_formula\n        } else {\n          NULL\n        },\n        family = family_char,\n        share_obs_params = share_obs_params,\n        trend_model = orig_trend_model,\n        trend_map = if (!missing(trend_map)) {\n          trend_map\n        } else {\n          NULL\n        },\n        drift = FALSE,\n        priors = priors,\n        model_file = if (use_stan) {\n          vectorised$model_file\n        } else {\n          trimws(model_file)\n        },\n        model_data = if (use_stan) {\n          vectorised$model_data\n        } else {\n          ss_jagam$jags.data\n        },\n        inits = inits,\n        monitor_pars = param,\n        mgcv_model = ss_gam,\n        trend_mgcv_model = if (!missing(trend_formula)) {\n          trend_mgcv_model\n        } else {\n          NULL\n        },\n        sp_names = rho_names,\n        trend_sp_names = trend_sp_names,\n        ytimes = ytimes,\n        use_lv = use_lv,\n        n_lv = n_lv,\n        upper_bounds = upper_bounds,\n        obs_data = data_train,\n        test_data = data_test,\n        fit_engine = if (use_stan) {\n          \"stan\"\n        } else {\n          \"jags\"\n        },\n        backend = if (use_stan) {\n          backend\n        } else {\n          \"rjags\"\n        },\n        algorithm = if (use_stan) {\n          algorithm\n        } else {\n          \"sampling\"\n        },\n        max_treedepth = NULL,\n        adapt_delta = NULL\n      ),\n      class = \"mvgam_prefit\"\n    )\n\n    #### Else if running the model, complete the setup for fitting ####\n  } else {\n    # If this is a lfo_cv run, trim down parameters to monitor so post-processing\n    # is faster\n    if (lfo) {\n      to_remove <- c(\n        \"trend\",\n        \"b_trend\",\n        \"b\",\n        \"b_raw\",\n        \"rho\",\n        \"sigma\",\n        \"alpha_gp\",\n        \"rho_gp\",\n        \"ar1\",\n        \"ar2\",\n        \"ar3\",\n        \"LV\",\n        \"lv_coefs\",\n        \"penalty\",\n        \"Sigma\",\n        \"theta\",\n        \"error\"\n      )\n      param <- param[!param %in% to_remove]\n    }\n\n    if (use_stan) {\n      model_data <- vectorised$model_data\n\n      # Check if cmdstan is accessible; if not, use rstan\n      if (backend == \"cmdstanr\") {\n        if (!requireNamespace(\"cmdstanr\", quietly = TRUE)) {\n          if (silent < 2) {\n            message(\"cmdstanr library not found; defaulting to rstan\")\n          }\n          use_cmdstan <- FALSE\n        } else {\n          use_cmdstan <- TRUE\n          if (is.null(cmdstanr::cmdstan_version(error_on_NA = FALSE))) {\n            warning(\n              \"cmdstanr library found but Cmdstan not found. Defaulting to rstan\"\n            )\n            use_cmdstan <- FALSE\n          }\n        }\n      }\n\n      if (use_cmdstan) {\n        # Prepare threading and generate the model\n        cmd_mod <- .model_cmdstanr(\n          vectorised$model_file,\n          threads = threads,\n          silent = silent\n        )\n\n        # Condition the model using Cmdstan\n        out_gam_mod <- .sample_model_cmdstanr(\n          model = cmd_mod,\n          algorithm = algorithm,\n          prior_simulation = prior_simulation,\n          data = model_data,\n          chains = chains,\n          parallel = parallel,\n          silent = silent,\n          max_treedepth = max_treedepth,\n          adapt_delta = adapt_delta,\n          threads = threads,\n          burnin = burnin,\n          samples = samples,\n          param = param,\n          save_all_pars = save_all_pars,\n          dots\n        )\n      } else {\n        # Condition the model using rstan\n        requireNamespace(\"rstan\", quietly = TRUE)\n        out_gam_mod <- .sample_model_rstan(\n          model = vectorised$model_file,\n          algorithm = algorithm,\n          prior_simulation = prior_simulation,\n          data = model_data,\n          chains = chains,\n          parallel = parallel,\n          silent = silent,\n          max_treedepth = max_treedepth,\n          adapt_delta = adapt_delta,\n          threads = threads,\n          burnin = burnin,\n          samples = samples,\n          thin = thin,\n          dots\n        )\n      }\n    }\n\n    if (!use_stan) {\n      requireNamespace(\"runjags\", quietly = TRUE)\n      fit_engine <- \"jags\"\n      model_data <- ss_jagam$jags.data\n      runjags::runjags.options(silent.jags = TRUE, silent.runjags = TRUE)\n\n      # Initiate adaptation of the model for the full burnin period. This is necessary as JAGS\n      # will take a while to optimise the samplers, so long adaptation with little 'burnin'\n      # is more crucial than little adaptation but long 'burnin' https://mmeredith.net/blog/2016/Adapt_or_burn.htm\n      unlink(\"base_gam.txt\")\n      cat(model_file, file = \"base_gam.txt\", sep = \"\\n\", append = T)\n\n      message(\"Compiling the JAGS program...\")\n      message()\n\n      if (prior_simulation) {\n        n_adapt <- 500\n        n_burn <- 0\n        samples <- 1000\n        thin <- 1\n      } else {\n        n_burn <- burnin\n        # Rely on long adaptation to tune samplers appropriately\n        n_adapt <- max(1000, n_burn - 1000)\n      }\n\n      if (parallel) {\n        cl <- parallel::makePSOCKcluster(min(c(\n          chains,\n          parallel::detectCores() - 1\n        )))\n        setDefaultCluster(cl)\n        gam_mod <- runjags::run.jags(\n          model = \"base_gam.txt\",\n          data = ss_jagam$jags.data,\n          modules = \"glm\",\n          inits = initlist,\n          n.chains = chains,\n          adapt = n_adapt,\n          burnin = n_burn,\n          sample = samples,\n          jags = jags_path,\n          thin = thin,\n          method = \"rjparallel\",\n          monitor = param,\n          silent.jags = TRUE,\n          cl = cl\n        )\n        stopCluster(cl)\n      } else {\n        gam_mod <- runjags::run.jags(\n          model = \"base_gam.txt\",\n          data = ss_jagam$jags.data,\n          modules = \"glm\",\n          inits = initlist,\n          n.chains = chains,\n          adapt = n_adapt,\n          burnin = n_burn,\n          sample = samples,\n          jags = jags_path,\n          thin = thin,\n          method = \"rjags\",\n          monitor = param,\n          silent.jags = TRUE\n        )\n      }\n      out_gam_mod <- coda::as.mcmc.list(gam_mod)\n    }\n\n    unlink(file_name)\n    unlink(fil)\n\n    # Add generated quantities for N-mixture models\n    if (family_char == \"nmix\") {\n      out_gam_mod <- add_nmix_posterior(\n        model_output = out_gam_mod,\n        obs_data = data_train,\n        test_data = data_test,\n        mgcv_model = trend_mgcv_model,\n        Z = model_data$Z,\n        n_lv = n_lv,\n        K_inds = model_data$K_inds_all\n      )\n    }\n\n    # Get Dunn-Smyth Residual distributions for each series if this\n    # is not a prior simulation or an lfo fit\n    if (prior_simulation || lfo || !residuals) {\n      series_resids <- NULL\n    } else {\n      object <- list(\n        model_output = out_gam_mod,\n        call = orig_formula,\n        mgcv_model = ss_gam,\n        model_data = if (use_stan) {\n          vectorised$model_data\n        } else {\n          ss_jagam$jags.data\n        },\n        fit_engine = fit_engine,\n        family = family_char,\n        share_obs_params = share_obs_params,\n        obs_data = data_train,\n        test_data = data_test,\n        ytimes = ytimes\n      )\n      class(object) <- \"mvgam\"\n      # Use the much faster vectorized residual\n      # calculation function now\n      series_resids <- dsresids_vec(object)\n    }\n\n    if (prior_simulation) {\n      data_train$y <- orig_y\n    }\n\n    # Add Bayesian coefficients to the mgcv model to help with plotting of\n    # smooths that aren't yet supported by mvgam plotting functions; this is\n    # also necessary for computing EDFs and approximate p-values of smooths\n    if (!lfo) {\n      V <- cov(mcmc_chains(out_gam_mod, \"b\"))\n      ss_gam$Vp <- ss_gam$Vc <- V\n\n      # Add the posterior median coefficients\n      p <- mcmc_summary(\n        out_gam_mod,\n        \"b\",\n        variational = algorithm %in%\n          c(\"meanfield\", \"fullrank\", \"pathfinder\", \"laplace\")\n      )[, c(4)]\n      names(p) <- names(ss_gam$coefficients)\n      ss_gam$coefficients <- p\n\n      # Repeat for any trend-specific mgcv model\n      if (!missing(trend_formula)) {\n        V <- cov(mcmc_chains(out_gam_mod, \"b_trend\"))\n        trend_mgcv_model$Vp <- trend_mgcv_model$Vc <- V\n        p <- mcmc_summary(\n          out_gam_mod,\n          \"b_trend\",\n          variational = algorithm %in%\n            c(\"meanfield\", \"fullrank\", \"pathfinder\", \"laplace\")\n        )[, c(4)]\n        names(p) <- names(trend_mgcv_model$coefficients)\n        trend_mgcv_model$coefficients <- p\n      }\n    }\n\n    #### Return the output as class mvgam ####\n    trim_data <- list()\n    attr(model_data, \"trend_model\") <- trend_model\n    attr(trim_data, \"trend_model\") <- trend_model\n    attr(model_data, \"noncentred\") <- if (noncentred) TRUE else NULL\n    attr(trim_data, \"noncentred\") <- if (noncentred) TRUE else NULL\n    attr(model_data, \"threads\") <- threads\n    attr(trim_data, \"threads\") <- threads\n\n    output <- structure(\n      list(\n        call = orig_formula,\n        trend_call = if (!missing(trend_formula)) {\n          trend_formula\n        } else {\n          NULL\n        },\n        family = family_char,\n        share_obs_params = share_obs_params,\n        trend_model = orig_trend_model,\n        trend_map = if (!missing(trend_map)) {\n          trend_map\n        } else {\n          NULL\n        },\n        drift = FALSE,\n        priors = priors,\n        model_output = out_gam_mod,\n        model_file = if (use_stan) {\n          vectorised$model_file\n        } else {\n          trimws(model_file)\n        },\n        model_data = if (return_model_data) {\n          model_data\n        } else {\n          trim_data\n        },\n        inits = if (return_model_data) {\n          inits\n        } else {\n          NULL\n        },\n        monitor_pars = param,\n        sp_names = rho_names,\n        trend_sp_names = trend_sp_names,\n        mgcv_model = ss_gam,\n        trend_mgcv_model = if (!missing(trend_formula)) {\n          trend_mgcv_model\n        } else {\n          NULL\n        },\n        ytimes = ytimes,\n        resids = series_resids,\n        use_lv = use_lv,\n        n_lv = n_lv,\n        upper_bounds = upper_bounds,\n        obs_data = data_train,\n        test_data = data_test,\n        fit_engine = fit_engine,\n        backend = if (use_stan) {\n          backend\n        } else {\n          \"rjags\"\n        },\n        algorithm = if (use_stan) {\n          algorithm\n        } else {\n          \"sampling\"\n        },\n        max_treedepth = if (use_stan & algorithm == \"sampling\") {\n          max_treedepth\n        } else {\n          NULL\n        },\n        adapt_delta = if (use_stan & algorithm == \"sampling\") {\n          adapt_delta\n        } else {\n          NULL\n        }\n      ),\n      class = \"mvgam\"\n    )\n  }\n\n  return(output)\n}\n"
  },
  {
    "path": "R/mvgam_diagnostics.R",
    "content": "#' Extract diagnostic quantities of \\pkg{mvgam} models\n#'\n#' Extract quantities that can be used to diagnose sampling behavior\n#' of the algorithms applied by \\pkg{Stan} at the back-end of \\pkg{mvgam}.\n#'\n#' @name mvgam_diagnostics\n#' @aliases nuts_params rhat neff_ratio\n#'\n#' @param object,x A \\code{mvgam} or \\code{jsdgam} object.\n#' @param pars An optional character vector of parameter names.\n#'   For \\code{nuts_params} these will be NUTS sampler parameter\n#'   names rather than model parameters. If pars is omitted\n#'   all parameters are included.\n#' @param ... Arguments passed to individual methods.\n#'\n#' @return The exact form of the output depends on the method.\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1')\n#' mod <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n#'             trend_model = AR(),\n#'             noncentred = TRUE,\n#'             data = simdat$data_train,\n#'             chains = 2)\n#' np <- nuts_params(mod)\n#' head(np)\n#'\n#' # extract the number of divergence transitions\n#' sum(subset(np, Parameter == \"divergent__\")$Value)\n#'\n#' head(neff_ratio(mod))\n#' }\n#' @details For more details see\n#'   \\code{\\link[bayesplot:bayesplot-extractors]{bayesplot-extractors}}.\n#'\nNULL\n\n#' @rdname mvgam_diagnostics\n#' @importFrom bayesplot nuts_params\n#' @export nuts_params\n#' @export\nnuts_params.mvgam <- function(object, pars = NULL, ...) {\n  bayesplot::nuts_params(object$model_output, pars = pars, ...)\n}\n\n#' @rdname mvgam_diagnostics\n#' @importFrom bayesplot log_posterior\n#' @export\nlog_posterior.mvgam <- function(object, ...) {\n  bayesplot::log_posterior(object$model_output, ...)\n}\n\n#' @rdname mvgam_diagnostics\n#' @importFrom posterior rhat\n#' @export rhat\n#' @export\nrhat.mvgam <- function(x, pars = NULL, ...) {\n  # bayesplot uses outdated rhat code from rstan\n  # bayesplot::rhat(object$fit, pars = pars, ...)\n  if (is.null(pars)) {\n    vars_extract <- variables(x)\n    draws <- as_draws_array(\n      x,\n      variable = unlist(purrr::map(vars_extract, 'orig_name')),\n      use_alias = FALSE\n    )\n  } else {\n    draws <- as_draws_array(x, variable = pars)\n  }\n\n  tmp <- posterior::summarise_draws(draws, rhat = posterior::rhat)\n  rhat <- tmp$rhat\n  names(rhat) <- tmp$variable\n  rhat\n}\n\n#' @rdname mvgam_diagnostics\n#' @importFrom bayesplot neff_ratio\n#' @importFrom brms ndraws\n#' @export neff_ratio\n#' @export\nneff_ratio.mvgam <- function(object, pars = NULL, ...) {\n  insight::check_if_installed(\n    \"matrixStats\",\n    reason = 'to calculate effective sample sizes'\n  )\n  if (is.null(pars)) {\n    vars_extract <- unlist(purrr::map(variables(object), 'orig_name'))\n    vars_extract <- vars_extract[-grep('ypred', vars_extract)]\n    draws <- as_draws_array(object, variable = vars_extract, use_alias = FALSE)\n  } else {\n    draws <- as_draws_array(object, variable = pars)\n  }\n  tmp <- posterior::summarise_draws(\n    draws,\n    ess_bulk = posterior::ess_bulk,\n    ess_tail = posterior::ess_tail\n  )\n  # min of ess_bulk and ess_tail mimics definition of posterior::rhat.default\n  ess <- matrixStats::rowMins(cbind(tmp$ess_bulk, tmp$ess_tail))\n  names(ess) <- tmp$variable\n  ess / brms::ndraws(draws)\n}\n"
  },
  {
    "path": "R/mvgam_fevd-class.R",
    "content": "#' `mvgam_fevd` object description\n#'\n#' A \\code{mvgam_fevd} object returned by function [fevd()]. Run\n#' `methods(class = \"mvgam_fevd\")` to see an overview of available methods.\n#'\n#' @details A forecast error variance decomposition is useful for quantifying\n#'   the amount of information each series that in a Vector Autoregression\n#'   contributes to the forecast distributions of the other series in the\n#'   autoregression. This object contains the forecast error variance\n#'   decomposition using the orthogonalised impulse response coefficient\n#'   matrices \\eqn{\\Psi_h}, which can be used to quantify the contribution of\n#'   series \\eqn{j} to the h-step forecast error variance of series \\eqn{k}:\n#'   \\deqn{\n#'   \\sigma_k^2(h) = \\sum_{j=1}^K(\\psi_{kj, 0}^2 + \\ldots + \\psi_{kj,\n#'   h-1}^2) \\quad\n#'   }\n#'   If the orthogonalised impulse reponses \\eqn{(\\psi_{kj, 0}^2 + \\ldots +\n#'   \\psi_{kj, h-1}^2)} are divided by the variance of the forecast error\n#'   \\eqn{\\sigma_k^2(h)}, this yields an interpretable percentage representing\n#'   how much of the forecast error variance for \\eqn{k} can be explained by an\n#'   exogenous shock to \\eqn{j}. This percentage is what is calculated and\n#'   returned in objects of class `mvgam_fevd`, where the posterior\n#'   distribution of variance decompositions for each variable in the original\n#'   model is contained in a separate slot within the returned `list` object\n#'\n#' @seealso [mvgam()], [VAR()]\n#'\n#' @references Lütkepohl, H (2006). New Introduction to Multiple Time Series\n#'   Analysis. Springer, New York.\n#'\n#' @author Nicholas J Clark\n#'\n#' @name mvgam_fevd-class\nNULL\n\n#' @title Posterior summary of forecast error variance decompositions\n#'\n#' @description This function takes an \\code{mvgam_fevd} object and calculates\n#'   a posterior summary of the error variance decompositions of each series,\n#'   at all horizons\n#'\n#' @param object an object of class `mvgam_fevd` obtained using the\n#'   \\code{fevd()} function. This object will contain draws from the posterior\n#'   distribution of the forecast error variance decompositions.\n#'\n#' @param probs The upper and lower percentiles to be computed by the\n#'   `quantile` function, in addition to the median\n#'\n#' @param ... ignored\n#'\n#' @return A long-format `tibble` / `data.frame` reporting the posterior median,\n#'   upper and lower percentiles of the error variance decompositions of each\n#'   series at all horizons.\n#'\n#' @method summary mvgam_fevd\n#'\n#' @seealso \\code{\\link{fevd}}, \\code{\\link{plot.mvgam_fevd}}\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nsummary.mvgam_fevd = function(object, probs = c(0.025, 0.975), ...) {\n  if (length(probs) != 2L) {\n    stop(\"argument 'probs' must be a vector of length 2\", call. = FALSE)\n  }\n  validate_proportional(min(probs))\n  validate_proportional(max(probs))\n\n  # Calculate posterior quantiles of error variance contributions\n  ynames <- names(object[[1]])\n  out <- do.call(\n    rbind,\n    lapply(seq_len(length(object)), function(draw) {\n      fevd_df(object[[draw]], ynames = ynames) %>%\n        dplyr::mutate(draw = draw)\n    })\n  ) %>%\n    dplyr::group_by(horizon, target, draw) %>%\n    dplyr::mutate(total_evd = sum(evd)) %>%\n    dplyr::ungroup() %>%\n    dplyr::mutate(evd = evd / total_evd) %>%\n    dplyr::group_by(horizon, target, Series) %>%\n    dplyr::mutate(\n      fevdQ50 = median(evd),\n      fevd_Qlower = quantile(evd, min(probs), na.rm = TRUE),\n      fevd_Qupper = quantile(evd, max(probs), na.rm = TRUE)\n    ) %>%\n    dplyr::ungroup() %>%\n    dplyr::mutate(\n      shock = gsub('process', 'Process', paste0(Series, ' -> ', target))\n    ) %>%\n    dplyr::select(shock, horizon, fevdQ50, fevd_Qlower, fevd_Qupper) %>%\n    dplyr::distinct()\n  colnames(out) <- c(\n    'shock',\n    'horizon',\n    'fevdQ50',\n    paste0('fevdQ', 100 * min(probs)),\n    paste0('fevdQ', 100 * max(probs))\n  )\n\n  return(out)\n}\n\n#'Plot forecast error variance decompositions from an `mvgam_fevd` object\n#'\n#'This function takes an \\code{mvgam_fevd} object and produces\n#'a plot of the posterior median contributions to forecast variance for each series\n#'in the fitted Vector Autoregression\n#'\n#'@importFrom ggplot2 ggplot aes geom_bar facet_wrap labs\n#'\n#'@param x \\code{list} object of class \\code{mvgam_fevd}. See [fevd()]\n#'\n#'@param ... ignored\n#'\n#'@return A \\code{\\link[ggplot2]{ggplot}} object,\n#'  which can be further customized using the \\pkg{ggplot2} package\n#'\n#'@author Nicholas J Clark\n#'\n#'@export\nplot.mvgam_fevd = function(x, ...) {\n  # Calculate posterior median error variance contributions\n  ynames <- names(x[[1]])\n  do.call(\n    rbind,\n    lapply(seq_len(length(x)), function(draw) {\n      fevd_df(x[[draw]], ynames = ynames)\n    })\n  ) %>%\n    dplyr::group_by(horizon, target, Series) %>%\n    dplyr::summarise(mean_evd = median(evd)) %>%\n    dplyr::ungroup() %>%\n    dplyr::group_by(horizon, target) %>%\n    dplyr::mutate(\n      total_evd = sum(mean_evd),\n      mean_evd = mean_evd / total_evd\n    ) %>%\n    dplyr::ungroup() %>%\n    dplyr::mutate(\n      Series = gsub('process', 'Process', Series),\n      target = gsub('process', 'Process', target)\n    ) -> mean_evds\n\n  # Plot as a ggplot object\n  ggplot2::ggplot(\n    mean_evds,\n    ggplot2::aes(fill = Series, y = mean_evd, x = horizon)\n  ) +\n    ggplot2::geom_bar(position = \"stack\", stat = \"identity\") +\n    ggplot2::facet_wrap(~target) +\n    ggplot2::theme_bw() +\n    ggplot2::labs(\n      x = 'Forecast horizon',\n      y = 'Median contribution to forecast variance'\n    )\n}\n\n#'@noRd\nfevd_df = function(x, ynames) {\n  do.call(\n    rbind,\n    lapply(seq_len(length(x)), function(process) {\n      data.frame(\n        horizon = 1:NROW(x[[process]]),\n        evd = as.vector(x[[process]]),\n        Series = paste0(\n          'process_',\n          sort(rep(\n            1:length(ynames),\n            NROW(x[[process]])\n          ))\n        ),\n        target = ynames[process]\n      )\n    })\n  )\n}\n"
  },
  {
    "path": "R/mvgam_forecast-class.R",
    "content": "#' `mvgam_forecast` object description\n#'\n#' A \\code{mvgam_forecast} object returned by function \\code{\\link{hindcast}}\n#' or \\code{\\link{forecast}}. Run `methods(class = \"mvgam_forecast\")` to see\n#' an overview of available methods.\n#'\n#' @details A `mvgam_forecast` object contains the following elements:\n#'\n#' \\itemize{\n#'   \\item `call` the original observation model formula\n#'\n#'   \\item `trend_call` If a `trend_formula was supplied`, the original trend\n#'     model formula is returned. Otherwise `NULL`\n#'\n#'   \\item `family` \\code{character} description of the observation distribution\n#'\n#'   \\item `family_pars` \\code{list} containing draws of family-specific\n#'     parameters (i.e. shape, scale or overdispersion parameters). Only\n#'     returned if `type = link`. Otherwise `NULL`\n#'\n#'   \\item `trend_model` \\code{character} description of the latent trend model\n#'\n#'   \\item `drift` Logical specifying whether a drift term was used in the\n#'     trend model\n#'\n#'   \\item `use_lv` Logical flag indicating whether latent dynamic factors were\n#'     used in the model\n#'\n#'   \\item `fit_engine` `Character` describing the fit engine, either as `stan`\n#'     or `jags`\n#'\n#'   \\item `type` The type of predictions included (either `link`, `response`\n#'     or `trend`)\n#'\n#'   \\item `series_names` Names of the time series, taken from\n#'     `levels(data$series)` in the original model fit\n#'\n#'   \\item `train_observations` A `list` of training observation vectors of\n#'     length `n_series`\n#'\n#'   \\item `train_times` A `list` of the unique training times of length\n#'     `n_series`\n#'\n#'   \\item `test_observations` If the \\code{\\link{forecast}} function was used,\n#'     a `list` of test observation vectors of length `n_series`. Otherwise\n#'     `NULL`\n#'\n#'   \\item `test_times` If the \\code{\\link{forecast}} function was used, a\n#'     `list` of the unique testing (validation) times of length `n_series`.\n#'     Otherwise `NULL`\n#'\n#'   \\item `hindcasts` A `list` of posterior hindcast distributions of length\n#'     `n_series`.\n#'\n#'   \\item `forecasts` If the \\code{\\link{forecast}} function was used, a\n#'     `list` of posterior forecast distributions of length `n_series`.\n#'     Otherwise `NULL`\n#' }\n#'\n#' @seealso [mvgam], [hindcast.mvgam], [forecast.mvgam]\n#'\n#' @author Nicholas J Clark\n#'\n#' @name mvgam_forecast-class\nNULL\n\n#' @title Posterior summary of hindcast and forecast objects\n#'\n#' @description This function takes an \\code{mvgam_forecast} object and\n#'   calculates a posterior summary of the hindcast and forecast distributions\n#'   of each series, along with any true values that were included in `data`\n#'   and `newdata` if `type = 'response'` was used in the call to\n#'   \\code{hindcast()} or \\code{function()}\n#'\n#' @param object an object of class `mvgam_forecast` obtained using either the\n#'   \\code{hindcast()} or \\code{function()} function. This object will contain\n#'   draws from the posterior distribution of hindcasts and forecasts.\n#'\n#' @param probs The upper and lower percentiles to be computed by the\n#'   `quantile` function, in addition to the median\n#'\n#' @param ... ignored\n#'\n#' @return A long-format `tibble` / `data.frame` reporting the posterior median,\n#'   upper and lower percentiles of the predictions for each series at each of\n#'   the timepoints that were originally supplied in `data` and, optionally,\n#'   in `newdata`.\n#'\n#' @method summary mvgam_forecast\n#'\n#' @seealso \\code{\\link{forecast.mvgam}}, \\code{\\link{plot.mvgam_forecast}}\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nsummary.mvgam_forecast = function(object, probs = c(0.025, 0.975), ...) {\n  if (length(probs) != 2L) {\n    stop(\"argument 'probs' must be a vector of length 2\", call. = FALSE)\n  }\n  validate_proportional(min(probs))\n  validate_proportional(max(probs))\n\n  n_series <- length(object$series_names)\n  type <- object$type\n\n  # Extract predictions and truths (if type = 'response')\n  fc_preds <- do.call(\n    rbind,\n    lapply(1:n_series, function(x) {\n      s_name <- object$series_names[x]\n      preds <- cbind(\n        object$hindcasts[[which(names(object$hindcasts) == s_name)]],\n        object$forecasts[[which(names(object$forecasts) == s_name)]]\n      )\n\n      # Calculate quantiles of the forecast distribution\n      cred <- sapply(\n        1:NCOL(preds),\n        function(n) quantile(preds[, n], probs = probs, na.rm = TRUE)\n      )\n      meds <- apply(preds, 2, median)\n\n      # Put into a long \"tidy\" dataframe\n      if (type == 'response') {\n        df <- data.frame(\n          series = s_name,\n          time = c(\n            object$train_times[[which(names(object$hindcasts) == s_name)]],\n            object$test_times[[which(names(object$hindcasts) == s_name)]]\n          ),\n          pred_median = meds,\n          pred_Qlower = cred[1, ],\n          pred_Qupper = cred[2, ],\n          truth = c(\n            object$train_observations[[s_name]],\n            object$test_observations[[s_name]]\n          ),\n          type = 'response'\n        )\n        colnames(df) <- c(\n          'series',\n          'time',\n          'predQ50',\n          paste0('predQ', 100 * min(probs)),\n          paste0('predQ', 100 * max(probs)),\n          'truth',\n          'type'\n        )\n        rownames(df) <- NULL\n      } else {\n        df <- data.frame(\n          series = s_name,\n          time = c(\n            object$train_times[[which(names(object$hindcasts) == s_name)]],\n            object$test_times[[which(names(object$hindcasts) == s_name)]]\n          ),\n          predQ50 = meds,\n          predQlower = cred[1, ],\n          predQupper = cred[2, ],\n          type = type\n        )\n        colnames(df) <- c(\n          'series',\n          'time',\n          'predQ50',\n          paste0('predQ', 100 * min(probs)),\n          paste0('predQ', 100 * max(probs)),\n          'type'\n        )\n        rownames(df) <- NULL\n      }\n      df\n    })\n  ) %>%\n    dplyr::mutate(\n      series = factor(series, levels = object$series_names)\n    )\n  class(fc_preds) <- c(\"tbl_df\", \"tbl\", \"data.frame\")\n\n  return(fc_preds)\n}\n"
  },
  {
    "path": "R/mvgam_formulae.R",
    "content": "#' Details of formula specifications in \\pkg{mvgam} models\n#' @details \\code{\\link{mvgam}} will accept an observation model formula and an optional\n#' process model formula (via the argument `trend_formula`). Neither of these formulae can\n#' be specified as lists, contrary to the accepted behaviour in some `mgcv` or `brms` models.\n#' \\cr\n#' \\cr\n#' Note that it is possible to supply an empty formula where\n#' there are no predictors or intercepts in the observation model (i.e. `y ~ 0` or `y ~ -1`).\n#' In this case, an intercept-only observation model will be set up but the intercept coefficient\n#' will be fixed at zero. This can be handy if you wish to fit pure State-Space models where\n#' the variation in the dynamic trend controls the average expectation, and/or where intercepts\n#' are non-identifiable.\n#' \\cr\n#' \\cr\n#' The formulae supplied to \\code{\\link{mvgam}} and \\code{\\link{jsdgam}}\n#' are exactly like those supplied to\n#' \\code{\\link{glm}} except that smooth terms,\n#' \\code{\\link[mgcv]{s}},\n#' \\code{\\link[mgcv]{te}},\n#' \\code{\\link[mgcv]{ti}} and\n#' \\code{\\link[mgcv]{t2}},\n#' time-varying effects using \\code{\\link{dynamic}},\n#' monotonically increasing (using `s(x, bs = 'moi')`)\n#' or decreasing splines (using `s(x, bs = 'mod')`;\n#' see \\code{\\link{smooth.construct.moi.smooth.spec}} for\n#' details), as well as\n#' Gaussian Process functions using \\code{\\link[brms]{gp}} and offsets using\n#' \\code{\\link[stats]{offset}}\n#' can be added to the right hand side (and \\code{.} is not supported in \\code{mvgam} formulae).\n#' \\cr\n#' \\cr\n#' Further details on specifying different kinds of smooth functions, and how to control their behaviours\n#' by modifying their potential complexities and / or how the penalties behave, can be found in the\n#' extensive documentation for the `mgcv` package.\n#' @seealso \\code{\\link{mvgam}},\n#' \\code{\\link[mgcv]{formula.gam}},\n#' \\code{\\link[mgcv]{gam.models}},\n#' \\code{\\link[mgcv]{jagam}},\n#' \\code{\\link[mgcv]{gam}},\n#' \\code{\\link[mgcv]{s}},\n#' \\code{\\link[brms]{gp}},\n#' \\code{\\link[stats]{formula}}\n#' @author Nicholas J Clark\n#' @name mvgam_formulae\nNULL\n\n#' @export\n#' @importFrom brms gp\nbrms::gp\n\n#' @export\n#' @importFrom mgcv s\nmgcv::s\n\n#' @export\n#' @importFrom mgcv te\nmgcv::te\n\n#' @export\n#' @importFrom mgcv ti\nmgcv::ti\n\n#' @export\n#' @importFrom mgcv t2\nmgcv::t2\n"
  },
  {
    "path": "R/mvgam_irf-class.R",
    "content": "#' `mvgam_irf` object description\n#'\n#' A \\code{mvgam_irf} object returned by function \\code{\\link{irf}}.\n#' Run `methods(class = \"mvgam_irf\")` to see an overview of available methods.\n#'\n#' @details Generalized or Orthogonalized Impulse Response Functions can be\n#'   computed using the posterior estimates of Vector Autoregressive parameters.\n#'   This function generates a positive \"shock\" for a target process at time\n#'   `t = 0` and then calculates how each of the remaining processes in the\n#'   latent VAR are expected to respond over the forecast horizon `h`. The\n#'   function computes IRFs for all processes in the object and returns them in\n#'   an array that can be plotted using the S3 `plot` function. To inspect\n#'   community-level metrics of stability using latent VAR processes, you can\n#'   use the related [stability()] function.\n#'\n#'   A `mvgam_irf` object contains a `list` of posterior impulse response\n#'   functions, each stored as its own `list`\n#'\n#' @seealso [mvgam], [VAR]\n#'\n#' @references PH Pesaran & Shin Yongcheol (1998).\n#'   Generalized impulse response analysis in linear multivariate models.\n#'   Economics Letters 58: 17–29.\n#'\n#' @author Nicholas J Clark\n#'\n#' @name mvgam_irf-class\nNULL\n\n#' @title Posterior summary of impulse responses\n#'\n#' @description This function takes an \\code{mvgam_irf} object and\n#'   calculates a posterior summary of the impulse responses of each\n#'   series to shocks from each of the other series, at all horizons\n#'\n#' @param object an object of class `mvgam_irf` obtained using the\n#'   \\code{irf()} function. This object will contain draws from the posterior\n#'   distribution of the impulse responses.\n#'\n#' @param probs The upper and lower percentiles to be computed by the\n#'   `quantile` function, in addition to the median\n#'\n#' @param ... ignored\n#'\n#' @return A long-format `tibble` / `data.frame` reporting the posterior median,\n#'   upper and lower percentiles of the impulse responses of each series to\n#'   shocks from each of the other series at all horizons.\n#'\n#' @method summary mvgam_irf\n#'\n#' @seealso \\code{\\link{irf}}, \\code{\\link{plot.mvgam_irf}}\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nsummary.mvgam_irf = function(object, probs = c(0.025, 0.975), ...) {\n  if (length(probs) != 2L) {\n    stop(\"argument 'probs' must be a vector of length 2\", call. = FALSE)\n  }\n  validate_proportional(min(probs))\n  validate_proportional(max(probs))\n\n  n_processes <- dim(object[[1]][[1]])[2]\n  h <- dim(object[[1]][[1]])[1]\n  n_draws <- length(object)\n\n  out <- do.call(\n    rbind,\n    lapply(1:n_processes, function(series) {\n      # Extract IRFs for the specific series\n      impulse_responses <- lapply(seq_along(object), function(j) {\n        object[[j]][series]\n      })\n\n      responses <- do.call(\n        rbind,\n        lapply(seq_along(impulse_responses), function(j) {\n          data.frame(\n            horizon = 1:h,\n            imp_resp = as.vector(impulse_responses[[j]][[1]]),\n            resp_var = paste0(\n              'Process_',\n              sort(rep(\n                1:n_processes,\n                NROW(impulse_responses[[j]][[1]])\n              ))\n            )\n          )\n        })\n      ) %>%\n        dplyr::mutate(shock = paste0('Process_', series, ' -> ', resp_var)) %>%\n\n        # Calculate posterior empirical quantiles of impulse responses\n        dplyr::group_by(shock, horizon) %>%\n        dplyr::summarise(\n          irfQ50 = median(imp_resp),\n          irfQlower = quantile(imp_resp, min(probs), na.rm = TRUE),\n          irfQupper = quantile(imp_resp, max(probs), na.rm = TRUE),\n          .groups = 'keep'\n        ) %>%\n        dplyr::ungroup()\n      colnames(responses) <- c(\n        'shock',\n        'horizon',\n        'irfQ50',\n        paste0('irfQ', 100 * min(probs)),\n        paste0('irfQ', 100 * max(probs))\n      )\n      responses\n    })\n  )\n\n  return(out)\n}\n\n#' Plot impulse responses from an `mvgam_irf` object\n#'\n#' This function takes an \\code{mvgam_irf} object and produces plots of\n#' Impulse Response Functions\n#'\n#' @param x \\code{list} object of class \\code{mvgam_irf}. See [irf()]\n#'\n#' @param series \\code{integer} specifying which process series should be\n#'   given the shock\n#'\n#' @param ... ignored\n#'\n#' @return A `ggplot` object showing the expected response of each latent time\n#'   series to a shock of the focal `series`\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nplot.mvgam_irf = function(x, series = 1, ...) {\n  all_irfs <- x\n  validate_pos_integer(series)\n  n_processes <- dim(all_irfs[[1]][[1]])[2]\n  if (series > n_processes) {\n    stop(paste0(\"argument 'series' must be <= \", n_processes), call. = FALSE)\n  }\n  h <- dim(all_irfs[[1]][[1]])[1]\n\n  # Extract IRFs for the specific series\n  impulse_responses <- lapply(seq_along(all_irfs), function(j) {\n    all_irfs[[j]][series]\n  })\n\n  # Extract impulse responses to a shock in the focal series\n  # in tidy format for ggploting\n  responses <- do.call(\n    rbind,\n    lapply(seq_along(impulse_responses), function(j) {\n      data.frame(\n        horizon = 1:h,\n        imp_resp = as.vector(impulse_responses[[j]][[1]]),\n        resp_var = sort(rep(\n          paste0('Process_~', 1:n_processes),\n          NROW(impulse_responses[[j]][[1]])\n        ))\n      )\n    })\n  ) %>%\n    dplyr::mutate(\n      resp_var = paste0('Process_~', series, ' %->% ', resp_var)\n    ) %>%\n\n    # Calculate posterior empirical quantiles of impulse responses\n    dplyr::group_by(resp_var, horizon) %>%\n    dplyr::summarise(\n      med = median(imp_resp),\n      lower1 = quantile(imp_resp, 0.1, na.rm = TRUE),\n      lower2 = quantile(imp_resp, 0.2, na.rm = TRUE),\n      lower3 = quantile(imp_resp, 0.3, na.rm = TRUE),\n      lower4 = quantile(imp_resp, 0.4, na.rm = TRUE),\n      upper1 = quantile(imp_resp, 0.9, na.rm = TRUE),\n      upper2 = quantile(imp_resp, 0.8, na.rm = TRUE),\n      upper3 = quantile(imp_resp, 0.7, na.rm = TRUE),\n      upper4 = quantile(imp_resp, 0.6, na.rm = TRUE),\n      .groups = 'keep'\n    ) %>%\n    dplyr::ungroup()\n\n  # Plot the IRFs\n  ggplot2::ggplot(data = responses, ggplot2::aes(x = horizon, y = med)) +\n    ggplot2::geom_ribbon(\n      mapping = ggplot2::aes(ymin = lower1, ymax = upper1),\n      fill = \"#DCBCBC\"\n    ) +\n    ggplot2::geom_ribbon(\n      mapping = ggplot2::aes(ymin = lower2, ymax = upper2),\n      fill = \"#C79999\"\n    ) +\n    ggplot2::geom_ribbon(\n      mapping = ggplot2::aes(ymin = lower3, ymax = upper3),\n      fill = \"#B97C7C\"\n    ) +\n    ggplot2::geom_ribbon(\n      mapping = ggplot2::aes(ymin = lower4, ymax = upper4),\n      fill = \"#A25050\"\n    ) +\n    ggplot2::geom_line(col = \"#8F2727\", linewidth = 1) +\n    ggplot2::geom_hline(yintercept = 0, linetype = \"dashed\", colour = \"black\") +\n    ggplot2::facet_wrap(\n      ~resp_var,\n      scales = 'free_y',\n      labeller = ggplot2::label_parsed\n    ) +\n    ggplot2::labs(\n      x = \"Horizon\",\n      y = paste0(attr(x, 'irf_type'), \" impulse response\")\n    ) +\n    ggplot2::theme_bw()\n}\n"
  },
  {
    "path": "R/mvgam_residcor-class.R",
    "content": "#' `mvgam_residcor` object description\n#'\n#' A \\code{mvgam_residcor} object returned by function [residual_cor()].\n#' Run `methods(class = \"mvgam_residcor\")` to see an overview of available methods.\n#' @return Objects of this class are structured as a `list` with the following components:\n#'\n#'  \\item{cor, cor_lower, cor_upper}{A set of \\eqn{p \\times p} correlation matrices,\n#'  containing either the posterior median or mean estimate, plus lower and upper limits\n#'  of the corresponding credible intervals supplied to `probs`}\n#'  \\item{sig_cor}{A \\eqn{p \\times p} correlation matrix containing only those correlations whose credible\n#'  interval does not contain zero. All other correlations are set to zero}\n#'  \\item{prec, prec_lower, prec_upper}{A set of \\eqn{p \\times p} precision matrices,\n#'  containing either the posterior median or mean estimate, plus lower and upper limits\n#'  of the corresponding credible intervals supplied to `probs`}\n#'  \\item{sig_prec}{A \\eqn{p \\times p} precision matrix containing only those precisions whose credible\n#'  interval does not contain zero. All other precisions are set to zero}\n#'   \\item{cov}{A \\eqn{p \\times p} posterior median or mean covariance matrix}\n#'   \\item{trace}{The median/mean point estimator of the trace (sum of the diagonal elements)\n#'   of the residual covariance matrix `cov`}\n#'\n#' @details\n#' Hui (2016) provides an excellent description of the quantities that this function calculates, so this passage\n#' is heavily paraphrased from his associated \\pkg{boral} package.\n#'\n#' In latent factor models, the residual covariance matrix is calculated\n#' based on the matrix of latent factor loading matrix \\eqn{\\Theta}, where the residual covariance\n#' matrix \\eqn{\\Sigma = \\Theta\\Theta'}. A strong residual covariance/correlation matrix\n#' between two species can be interpreted as evidence of species interactions (e.g.,\n#' facilitation or competition),\n#' missing covariates, as well as any additional species correlation not accounted for by shared\n#' environmental captured in `formula`.\n#'\n#' The residual precision matrix (also known as partial correlation matrix, Ovaskainen et al., 2016)\n#' is defined as the inverse of the residual correlation matrix. The precision matrix is often used to\n#' identify direct or causal relationships between two species e.g., two species can have a zero\n#' precision but still be correlated, which can be interpreted as saying that two species are not\n#' directly associated, but they are still correlated *through* other species. In other words, they\n#' are conditionally independent given the other species. It is important that the precision matrix\n#' does not exhibit the exact same properties of the correlation e.g., the diagonal elements are\n#' not equal to 1. Nevertheless, relatively larger values of precision may imply stronger\n#' direct relationships between two species.\n#'\n#' In addition to the residual correlation and precision matrices, the median or mean point estimator\n#' of trace of the residual covariance matrix is returned,\n#' \\eqn{\\sum\\limits_{j=1}^p [\\Theta\\Theta']_{jj}}. Often used in other areas of multivariate\n#' statistics, the trace may be interpreted as the amount of covariation explained by the latent factors.\n#' One situation where the trace may be useful is when comparing a pure latent factor model\n#' (where no terms are suppled to `formula`) versus a model with latent\n#' factors and some additional predictors in `formula` -- the proportional difference in trace\n#' between these two models may be interpreted as the proportion of covariation between species explained\n#' by the predictors in `formula`. Of course, the trace itself is random due to the MCMC sampling, and so it\n#' is not always guaranteed to produce sensible answers.\n#' @author Nicholas J Clark\n#' @references\n#' Francis KC Hui (2016). BORAL - Bayesian ordination and regression analysis of\n#' multivariate abundance data in R. Methods in Ecology and Evolution. 7, 744-750.\n#' \\cr\n#' \\cr\n#' Otso Ovaskainen et al. (2016). Using latent variable models to identify large networks of\n#' species-to-species associations at different spatial scales. Methods in Ecology and Evolution,\n#' 7, 549-555.\n#' @seealso [jsdgam()], [residual_cor()]\n#' @author Nicholas J Clark\n#' @name mvgam_residcor-class\nNULL\n\n#' Plot residual correlations based on latent factors\n#'\n#' Plot residual correlation estimates from Joint Species Distribution\n#' (\\code{jsdgam}) or dynamic factor (\\code{mvgam}) models\n#' @param x \\code{list} object of class \\code{mvgam_residcor} resulting from a\n#' call to `residual_cor(..., summary = TRUE)`\n#' @param cluster Logical. Should the variables be re-arranged within the plot\n#' to group the correlation matrix into clusters of positive and negative correlations?\n#' Defaults to `FALSE`\n#' @param ... ignored\n#' @method plot mvgam_residcor\n#' @details This function plots the significant residual correlations from a\n#' \\code{mvgam_residcor} object, whereby the posterior mean (if `robust = FALSE`)\n#' or posterior median (if `robust = TRUE`) correlations are shown\n#' only those correlations whose credible interval does not contain zero. All other\n#' correlations are set to zero in the returned plot\n#' @return A `ggplot` object\n#' @seealso [jsdgam()], [lv_correlations()], [residual_cor()]\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nplot.mvgam_residcor = function(x, cluster = FALSE, ...) {\n  # Extract significant correlations\n  corrmat <- x$sig_cor\n\n  # Re-order into clusters, if specified\n  if (cluster) {\n    idx <- cluster_cormat(corrmat)\n  } else {\n    idx <- 1:NROW(corrmat)\n  }\n\n  # Plot the correlation matrix\n  ggplot2::ggplot(\n    data = gather_matrix(corrmat[idx, idx]),\n    mapping = ggplot2::aes(\n      x = Var1,\n      y = Var2,\n      fill = correlation\n    )\n  ) +\n    ggplot2::geom_tile(colour = 'grey50') +\n    ggplot2::scale_fill_gradient2(\n      breaks = seq(-1, 1, by = 0.5),\n      limits = c(-1, 1)\n    ) +\n    ggplot2::labs(x = '', y = '') +\n    ggplot2::scale_x_discrete(guide = ggplot2::guide_axis(angle = 45)) +\n    ggplot2::theme_minimal()\n}\n\n#' Melt a symmetric matrix into a long data.frame\n#' @noRd\ngather_matrix <- function(mat) {\n  mat[upper.tri(mat)] <- NA\n  if (is.null(dimnames(mat))) {\n    grid <- expand.grid(seq.int(NROW(mat)), seq.int(NCOL(mat)))\n  } else {\n    grid <- expand.grid(dimnames(mat))\n  }\n  out <- as.data.frame(cbind(grid, value = as.vector(mat)))\n  colnames(out) <- c('Var1', 'Var2', 'correlation')\n  return(out)\n}\n\n#' Order a symmetric correlation matrix using approximate Robinson\n#' ordering, for better visualisation of \"clusters\"\n#' Credit for these functions goes to the maintainers of the gclus R package\n#' @importFrom stats hclust as.dist\n#' @noRd\ncluster_cormat <- function(cormat, ...) {\n  dis <- -cormat\n  dis_d <- as.dist(dis)\n  n <- NROW(dis)\n  if (n <= 2) {\n    idx <- 1:n\n  } else {\n    clusters <- stats::hclust(dis_d, ...)\n    clusters <- reorder_clusters(clusters, dis)\n    idx <- clusters$order\n  }\n  return(idx)\n}\n\n#' @noRd\nreorder_clusters <- function(x, dis, ...) {\n  if (!is.matrix(dis)) {\n    dis <- as.matrix(dis)\n  }\n  merges <- x$merge\n  n <- NROW(merges)\n  endpoints <- matrix(0, n, 2)\n  dir <- matrix(1L, n, 2)\n  for (i in 1L:n) {\n    j <- merges[i, 1]\n    k <- merges[i, 2]\n    if ((j < 0) && (k < 0)) {\n      endpoints[i, 1] <- -j\n      endpoints[i, 2] <- -k\n    } else if (j < 0) {\n      j <- -j\n      endpoints[i, 1] <- j\n      e1 <- endpoints[k, 1]\n      e2 <- endpoints[k, 2]\n      if (dis[j, e1] < dis[j, e2]) {\n        endpoints[i, 2] <- e2\n      } else {\n        endpoints[i, 2] <- e1\n        dir[i, 2] <- -1\n      }\n    } else if (k < 0) {\n      k <- -k\n      endpoints[i, 2] <- k\n      e1 <- endpoints[j, 1]\n      e2 <- endpoints[j, 2]\n      if (dis[k, e1] < dis[k, e2]) {\n        endpoints[i, 1] <- e2\n        dir[i, 1] <- -1\n      } else {\n        endpoints[i, 1] <- e1\n      }\n    } else {\n      ek1 <- endpoints[k, 1]\n      ek2 <- endpoints[k, 2]\n      ej1 <- endpoints[j, 1]\n      ej2 <- endpoints[j, 2]\n\n      d11 <- dis[ej1, ek1]\n      d12 <- dis[ej1, ek2]\n      d21 <- dis[ej2, ek1]\n      d22 <- dis[ej2, ek2]\n      dmin <- min(d11, d12, d21, d22)\n      if (dmin == d21) {\n        endpoints[i, 1] <- ej1\n        endpoints[i, 2] <- ek2\n      } else if (dmin == d11) {\n        endpoints[i, 1] <- ej2\n        endpoints[i, 2] <- ek2\n        dir[i, 1] <- -1\n      } else if (dmin == d12) {\n        endpoints[i, 1] <- ej2\n        endpoints[i, 2] <- ek1\n        dir[i, 1] <- -1\n        dir[i, 2] <- -1\n      } else {\n        endpoints[i, 1] <- ej1\n        endpoints[i, 2] <- ek1\n        dir[i, 2] <- -1\n      }\n    }\n  }\n  for (i in n:2L) {\n    if (dir[i, 1] == -1) {\n      m <- merges[i, 1]\n      if (m > 0) {\n        m1 <- merges[m, 1]\n        merges[m, 1] <- merges[m, 2]\n        merges[m, 2] <- m1\n        if (dir[m, 1] == dir[m, 2]) {\n          dir[m, ] <- -dir[m, ]\n        }\n      }\n    }\n    if (dir[i, 2] == -1) {\n      m <- merges[i, 2]\n      if (m > 0) {\n        m1 <- merges[m, 1]\n        merges[m, 1] <- merges[m, 2]\n        merges[m, 2] <- m1\n        if (dir[m, 1] == dir[m, 2]) {\n          dir[m, ] <- -dir[m, ]\n        }\n      }\n    }\n  }\n  clusters <- as.list(1:n)\n  for (i in 1:n) {\n    j <- merges[[i, 1]]\n    k <- merges[[i, 2]]\n    if ((j < 0) && (k < 0)) {\n      clusters[[i]] <- c(-j, -k)\n    } else if (j < 0) {\n      clusters[[i]] <- c(-j, clusters[[k]])\n    } else if (k < 0) {\n      clusters[[i]] <- c(clusters[[j]], -k)\n    } else {\n      clusters[[i]] <- c(clusters[[j]], clusters[[k]])\n    }\n  }\n\n  x1 <- x\n  x1$merge <- merges\n  x1$order <- clusters[[n]]\n  return(x1)\n}\n"
  },
  {
    "path": "R/mvgam_setup.R",
    "content": "#' Generic GAM setup function\n#' @importFrom stats na.fail\n#' @noRd\nmvgam_setup <- function(\n  formula,\n  knots,\n  family = gaussian(),\n  dat = list(),\n  na.action,\n  drop.unused.levels = FALSE,\n  maxit = 5\n) {\n  if (missing(knots)) {\n    out <- init_gam(formula(formula), data = dat, family = family)\n    attr(out, 'knots') <- NULL\n  } else {\n    if (!is.list(knots)) {\n      stop('all \"knot\" arguments must be supplied as lists', call. = FALSE)\n    }\n    out <- init_gam(\n      formula(formula),\n      data = dat,\n      family = family,\n      knots = knots\n    )\n    attr(out, 'knots') <- knots\n  }\n  out\n}\n\n#' Generic JAGAM setup function\n#' @noRd\n#'\njagam_setup <- function(\n  ss_gam,\n  formula,\n  data_train,\n  family,\n  family_char,\n  knots\n) {\n  # Change the formula to a Poisson-like formula if this is a cbind Binomial,\n  # as jagam will fail if it sees that\n  if (family$family %in% c('binomial', 'beta_binomial')) {\n    resp_terms <- as.character(terms(formula(formula))[[2]])\n    if (any(grepl('cbind', resp_terms))) {\n      resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n      out_name <- resp_terms[1]\n    } else {\n      stop(\n        'Binomial family requires the cbind() left-hand side formula syntax',\n        call. = FALSE\n      )\n    }\n    formula <- update(formula, paste(out_name, '~ .'))\n    family <- poisson()\n  }\n\n  # Set file save location in tempdir\n  file_name <- tempfile(pattern = 'base_gam', fileext = '.txt')\n  if (length(ss_gam$smooth) == 0) {\n    smooths_included <- FALSE\n\n    # If no smooth terms are included, jagam will fail; so add a fake one and remove\n    # it from the model and data structures later\n    data_train$fakery <- rnorm(length(data_train$y))\n    form_fake <- update.formula(formula, ~ . + s(fakery, k = 3))\n    fakery_names <- names(\n      mvgam_setup(\n        formula = form_fake,\n        family = family_to_mgcvfam(family),\n        dat = data_train,\n        drop.unused.levels = FALSE\n      )$coefficients\n    )\n    xcols_drop <- grep('s(fakery', fakery_names, fixed = TRUE)\n\n    if (!missing(knots)) {\n      ss_jagam <- mgcv::jagam(\n        form_fake,\n        data = data_train,\n        family = family_to_jagamfam(family_char),\n        file = file_name,\n        sp.prior = 'gamma',\n        diagonalize = FALSE,\n        knots = knots,\n        drop.unused.levels = FALSE\n      )\n    } else {\n      ss_jagam <- mgcv::jagam(\n        form_fake,\n        data = data_train,\n        family = family_to_jagamfam(family_char),\n        file = file_name,\n        sp.prior = 'gamma',\n        diagonalize = FALSE,\n        drop.unused.levels = FALSE\n      )\n    }\n    data_train$fakery <- NULL\n  } else {\n    smooths_included <- TRUE\n    xcols_drop <- NULL\n\n    # If smooth terms included, use the original formula\n    if (!missing(knots)) {\n      ss_jagam <- mgcv::jagam(\n        formula,\n        data = data_train,\n        family = family_to_jagamfam(family_char),\n        file = file_name,\n        sp.prior = 'gamma',\n        diagonalize = FALSE,\n        knots = knots,\n        drop.unused.levels = FALSE\n      )\n    } else {\n      ss_jagam <- mgcv::jagam(\n        formula,\n        data = data_train,\n        family = family_to_jagamfam(family_char),\n        file = file_name,\n        sp.prior = 'gamma',\n        diagonalize = FALSE,\n        drop.unused.levels = FALSE\n      )\n    }\n  }\n  return(list(\n    file_name = file_name,\n    ss_jagam = ss_jagam,\n    smooths_included = smooths_included,\n    xcols_drop = xcols_drop\n  ))\n}\n\n#' @noRd\nget_offset <- function(model) {\n  nm1 <- names(attributes(model$terms)$dataClasses)\n  if ('(offset)' %in% nm1) {\n    deparse(as.list(model$call)$offset)\n  } else {\n    sub(\"offset\\\\((.*)\\\\)$\", \"\\\\1\", grep('offset', nm1, value = TRUE))\n  }\n}\n\n#' @noRd\ntrim_mgcv <- function(mgcv_model) {\n  mgcv_model$fitted.values <- mgcv_model$residuals <- mgcv_model$linear.predictors <-\n    mgcv_model$working.weights <- mgcv_model$z <- NULL\n\n  mgcv_model\n}\n\n#' Fill in missing observations in data_train so the size of the dataset is correct when\n#' building the initial JAGS model\n#' @noRd\nreplace_nas = function(var) {\n  if (all(is.na(var))) {\n    # Sampling from uniform[0.1,0.99] will allow all the gam models\n    # to work, even though the Poisson / Negative Binomial will issue\n    # warnings. This is ok as we just need to produce the linear predictor matrix\n    # and store the coefficient names\n    var <- runif(length(var), 0.1, 0.99)\n  } else {\n    # If there are some non-missing observations,\n    # sample from the observed values to ensure\n    # distributional assumptions are met without warnings\n    var[which(is.na(var))] <-\n      sample(var[which(!is.na(var))], length(which(is.na(var))), replace = TRUE)\n  }\n  var\n}\n\n#' The below functions are mostly perfect copies of functions\n#' written originally by Prof Simon Wood\n#' All credit goes to Prof Wood and the mgcv development team.\n#' They only exist in mvgam because of CRAN restrictions on\n#' calling internal functions from other packages\n\n#' @noRd\nrmvn <- function(n, mu, sig) {\n  L <- mgcv::mroot(sig)\n  m <- ncol(L)\n  t(mu + L %*% matrix(rnorm(m * n), m, n))\n}\n\n#' @noRd\ninit_gam <- function(\n  formula,\n  family = gaussian(),\n  data = list(),\n  na.action = na.omit,\n  knots = NULL,\n  drop.unused.levels = FALSE,\n  control = mgcv::gam.control(),\n  centred = TRUE,\n  diagonalize = FALSE,\n  sp = NULL\n) {\n  if (is.character(family)) {\n    family <- eval(parse(text = family))\n  }\n  if (is.function(family)) {\n    family <- family()\n  }\n  if (is.null(family$family)) {\n    stop(\"family not recognized\")\n  }\n  gp <- mgcv::interpret.gam(formula) # interpret the formula\n  cl <- match.call() # call needed in gam object for update to work\n  mf <- match.call(expand.dots = FALSE)\n  mf$formula <- gp$fake.formula\n  mf$family <- mf$knots <- mf$sp <- mf$file <- mf$control <-\n    mf$centred <- mf$sp.prior <- mf$diagonalize <- NULL\n  mf$drop.unused.levels <- drop.unused.levels\n  mf[[1]] <- quote(stats::model.frame) ##as.name(\"model.frame\")\n  pmf <- mf\n\n  pmf$formula <- gp$pf\n  pmf <- eval(pmf, parent.frame())\n  pterms <- attr(pmf, \"terms\")\n  rm(pmf)\n\n  mf <- eval(mf, parent.frame())\n  if (nrow(mf) < 2) {\n    stop(\"Not enough (non-NA) data to do anything meaningful\")\n  }\n  terms <- attr(mf, \"terms\")\n\n  ## summarize the *raw* input variables\n  ## note can't use get_all_vars here -- buggy with matrices\n  vars <- all.vars(gp$fake.formula[-2]) ## drop response here\n  inp <- parse(text = paste(\"list(\", paste(vars, collapse = \",\"), \")\"))\n  if (!is.list(data) && !is.data.frame(data)) {\n    data <- as.data.frame(data)\n  }\n\n  dl <- eval(inp, data, parent.frame())\n  if (!control$keepData) {\n    rm(data)\n  } ## save space\n  names(dl) <- vars ## list of all variables needed\n  var.summary <- variable_summary(gp$pf, dl, nrow(mf)) ## summarize the input data\n  rm(dl)\n\n  G <- gam_setup(\n    gp,\n    pterms = pterms,\n    data = mf,\n    knots = knots,\n    sp = sp,\n    H = NULL,\n    absorb.cons = centred,\n    sparse.cons = FALSE,\n    select = TRUE,\n    idLinksBases = TRUE,\n    scale.penalty = control$scalePenalty,\n    diagonal.penalty = diagonalize\n  )\n  G$model <- mf\n  G$terms <- terms\n  G$family <- family\n  G$call <- cl\n  G$var.summary <- var.summary\n\n  lambda <- initial_spg(\n    G$X,\n    G$y,\n    G$w,\n    family,\n    G$S,\n    G$rank,\n    G$off,\n    offset = G$offset,\n    L = G$L\n  )\n  jags.ini <- list()\n  lam <- if (is.null(G$L)) lambda else G$L %*% lambda\n  #jin <- mgcv:::jini(G,lam)\n  G$formula <- formula\n  G$coefficients <- rep(0, length(G$term.names))\n  names(G$coefficients) <- G$term.names\n  G$residuals <- rnorm(NROW(G$X))\n  G$edf <- rep(1, length(G$coefficients))\n  names(G$edf) <- G$term.names\n  G$edf1 <- rep(1, length(G$coefficients))\n  names(G$edf1) <- G$term.names\n  G$sig2 <- 1\n  G$rank <- ncol(G$X)\n  G$Vp <- G$Ve <- diag(rep(1, length(G$coefficients)))\n  G$sp <- exp(G$sp)\n  G$scale.estimated <- FALSE\n  G$method <- 'UBRE'\n  G$pred.formula <- gp$pred.formula\n  class(G) <- c('gam', 'glm', 'lm')\n  G$R <- model.matrix(G)\n  return(G)\n}\n\n#'@importFrom mgcv gam.side smoothCon get.var Rrank interpret.gam initial.sp\n#'@importFrom stats .getXlevels model.matrix model.offset na.omit\n#'@importFrom methods cbind2\n#'@noRd\ngam_setup <- function(\n  formula,\n  pterms,\n  data = stop(\"No data supplied to gam_setup\"),\n  knots = NULL,\n  sp = NULL,\n  min.sp = NULL,\n  H = NULL,\n  absorb.cons = TRUE,\n  sparse.cons = 0,\n  select = FALSE,\n  idLinksBases = TRUE,\n  scale.penalty = TRUE,\n  paraPen = NULL,\n  gamm.call = FALSE,\n  drop.intercept = FALSE,\n  diagonal.penalty = FALSE,\n  apply.by = TRUE,\n  list.call = FALSE,\n  modCon = 0\n) {\n  if (inherits(formula, \"split.gam.formula\")) {\n    split <- formula\n  } else if (inherits(formula, \"formula\")) {\n    split <- mgcv::interpret.gam(formula)\n  } else {\n    stop(\"First argument is no sort of formula!\")\n  }\n  if (length(split$smooth.spec) == 0) {\n    if (split$pfok == 0) {\n      stop(\"You've got no model....\")\n    }\n    m <- 0\n  } else {\n    m <- length(split$smooth.spec)\n  }\n  G <- list(\n    m = m,\n    min.sp = min.sp,\n    H = H,\n    pearson.extra = 0,\n    dev.extra = 0,\n    n.true = -1,\n    pterms = pterms\n  )\n  if (is.null(attr(data, \"terms\"))) {\n    mf <- model.frame(split$pf, data, drop.unused.levels = FALSE)\n  } else {\n    mf <- data\n  }\n  G$intercept <- attr(attr(mf, \"terms\"), \"intercept\") > 0\n  if (list.call) {\n    offi <- attr(pterms, \"offset\")\n    if (!is.null(offi)) {\n      G$offset <- mf[[names(attr(pterms, \"dataClasses\"))[offi]]]\n    }\n  } else {\n    G$offset <- model.offset(mf)\n  }\n  if (!is.null(G$offset)) {\n    G$offset <- as.numeric(G$offset)\n  }\n  if (drop.intercept) {\n    attr(pterms, \"intercept\") <- 1\n  }\n  X <- model.matrix(pterms, mf)\n  if (drop.intercept) {\n    xat <- attributes(X)\n    ind <- xat$assign > 0\n    X <- X[, ind, drop = FALSE]\n    xat$assign <- xat$assign[ind]\n    xat$dimnames[[2]] <- xat$dimnames[[2]][ind]\n    xat$dim[2] <- xat$dim[2] - 1\n    attributes(X) <- xat\n    G$intercept <- FALSE\n  }\n  rownames(X) <- NULL\n  G$nsdf <- ncol(X)\n  G$contrasts <- attr(X, \"contrasts\")\n  G$xlevels <- .getXlevels(pterms, mf)\n  G$assign <- attr(X, \"assign\")\n  PP <- parametric_penalty(pterms, G$assign, paraPen, sp)\n  if (!is.null(PP)) {\n    ind <- 1:length(PP$sp)\n    if (!is.null(sp)) {\n      sp <- sp[-ind]\n    }\n    if (!is.null(min.sp)) {\n      PP$min.sp <- min.sp[ind]\n      min.sp <- min.sp[-ind]\n    }\n  }\n  G$smooth <- list()\n  G$S <- list()\n  if (gamm.call) {\n    if (m > 0) {\n      for (i in 1:m) {\n        attr(split$smooth.spec[[i]], \"gamm\") <- TRUE\n      }\n    }\n  }\n  if (m > 0 && idLinksBases) {\n    id.list <- list()\n    for (i in 1:m) {\n      if (!is.null(split$smooth.spec[[i]]$id)) {\n        id <- as.character(split$smooth.spec[[i]]$id)\n        if (length(id.list) && id %in% names(id.list)) {\n          ni <- length(id.list[[id]]$sm.i)\n          id.list[[id]]$sm.i[ni + 1] <- i\n          base.i <- id.list[[id]]$sm.i[1]\n          split$smooth.spec[[i]] <- clone_smooth_spec(\n            split$smooth.spec[[base.i]],\n            split$smooth.spec[[i]]\n          )\n          temp.term <- split$smooth.spec[[i]]$term\n          for (j in 1:length(temp.term)) {\n            id.list[[id]]$data[[j]] <- cbind(\n              id.list[[id]]$data[[j]],\n              mgcv::get.var(temp.term[j], data, vecMat = FALSE)\n            )\n          }\n        } else {\n          id.list[[id]] <- list(sm.i = i)\n          id.list[[id]]$data <- list()\n          term <- split$smooth.spec[[i]]$term\n          for (j in 1:length(term)) {\n            id.list[[id]]$data[[j]] <- mgcv::get.var(\n              term[j],\n              data,\n              vecMat = FALSE\n            )\n          }\n        }\n      }\n    }\n  }\n  G$off <- array(0, 0)\n  first.para <- G$nsdf + 1\n  sm <- list()\n  newm <- 0\n  if (m > 0) {\n    for (i in 1:m) {\n      id <- split$smooth.spec[[i]]$id\n      if (is.null(id) || !idLinksBases) {\n        sml <- mgcv::smoothCon(\n          split$smooth.spec[[i]],\n          data,\n          knots,\n          absorb.cons,\n          scale.penalty = scale.penalty,\n          null.space.penalty = select,\n          sparse.cons = sparse.cons,\n          diagonal.penalty = diagonal.penalty,\n          apply.by = apply.by,\n          modCon = modCon\n        )\n      } else {\n        names(id.list[[id]]$data) <- split$smooth.spec[[i]]$term\n        sml <- mgcv::smoothCon(\n          split$smooth.spec[[i]],\n          id.list[[id]]$data,\n          knots,\n          absorb.cons,\n          n = nrow(data),\n          dataX = data,\n          scale.penalty = scale.penalty,\n          null.space.penalty = select,\n          sparse.cons = sparse.cons,\n          diagonal.penalty = diagonal.penalty,\n          apply.by = apply.by,\n          modCon = modCon\n        )\n      }\n      ind <- 1:length(sml)\n      sm[ind + newm] <- sml[ind]\n      newm <- newm + length(sml)\n    }\n  }\n  G$m <- m <- newm\n  if (m > 0) {\n    sm <- mgcv::gam.side(sm, X, tol = .Machine$double.eps^0.5)\n    if (!apply.by) {\n      for (i in 1:length(sm)) {\n        if (!is.null(sm[[i]]$X0)) {\n          ind <- attr(sm[[i]], \"del.index\")\n          sm[[i]]$X <- if (is.null(ind)) {\n            sm[[i]]$X0\n          } else {\n            sm[[i]]$X0[, -ind, drop = FALSE]\n          }\n        }\n      }\n    }\n  }\n  idx <- list()\n  L <- matrix(0, 0, 0)\n  lsp.names <- sp.names <- rep(\"\", 0)\n  if (m > 0) {\n    for (i in 1:m) {\n      id <- sm[[i]]$id\n      length.S <- if (is.null(sm[[i]]$updateS)) {\n        length(sm[[i]]$S)\n      } else {\n        sm[[i]]$n.sp\n      }\n      Li <- if (is.null(sm[[i]]$L)) diag(length.S) else sm[[i]]$L\n      if (length.S > 0) {\n        if (length.S == 1) {\n          lspn <- sm[[i]]$label\n        } else {\n          Sname <- names(sm[[i]]$S)\n          lspn <- if (is.null(Sname)) {\n            paste(sm[[i]]$label, 1:length.S, sep = \"\")\n          } else {\n            paste(sm[[i]]$label, Sname, sep = \"\")\n          }\n        }\n        spn <- lspn[1:ncol(Li)]\n      }\n      if (is.null(id) || is.null(idx[[id]])) {\n        if (!is.null(id)) {\n          idx[[id]]$c <- ncol(L) + 1\n          idx[[id]]$nc <- ncol(Li)\n        }\n        L <- rbind(\n          cbind(L, matrix(0, nrow(L), ncol(Li))),\n          cbind(matrix(0, nrow(Li), ncol(L)), Li)\n        )\n        if (length.S > 0) {\n          sp.names <- c(sp.names, spn)\n          lsp.names <- c(lsp.names, lspn)\n        }\n      } else {\n        L0 <- matrix(0, nrow(Li), ncol(L))\n        if (ncol(Li) > idx[[id]]$nc) {\n          stop(\n            \"Later terms sharing an `id' can not have more smoothing parameters than the first such term\"\n          )\n        }\n        L0[, idx[[id]]$c:(idx[[id]]$c + ncol(Li) - 1)] <- Li\n        L <- rbind(L, L0)\n        if (length.S > 0) {\n          lsp.names <- c(lsp.names, lspn)\n        }\n      }\n    }\n  }\n  Xp <- NULL\n  if (m > 0) {\n    for (i in 1:m) {\n      n.para <- ncol(sm[[i]]$X)\n      sm[[i]]$first.para <- first.para\n      first.para <- first.para + n.para\n      sm[[i]]$last.para <- first.para - 1\n      Xoff <- attr(sm[[i]]$X, \"offset\")\n      if (!is.null(Xoff)) {\n        if (is.null(G$offset)) G$offset <- Xoff else G$offset <- G$offset + Xoff\n      }\n      if (is.null(sm[[i]]$Xp)) {\n        if (!is.null(Xp)) Xp <- cbind2(Xp, sm[[i]]$X)\n      } else {\n        if (is.null(Xp)) {\n          Xp <- X\n        }\n        Xp <- cbind2(Xp, sm[[i]]$Xp)\n        sm[[i]]$Xp <- NULL\n      }\n      X <- cbind2(X, sm[[i]]$X)\n      sm[[i]]$X <- NULL\n      G$smooth[[i]] <- sm[[i]]\n    }\n  }\n  if (is.null(Xp)) {\n    G$cmX <- colMeans(X)\n  } else {\n    G$cmX <- colMeans(Xp)\n    qrx <- qr(Xp, LAPACK = TRUE)\n    R <- qr.R(qrx)\n    p <- ncol(R)\n    rank <- mgcv::Rrank(R)\n    QtX <- qr.qty(qrx, X)[1:rank, ]\n    if (rank < p) {\n      R <- R[1:rank, ]\n      qrr <- qr(t(R), tol = 0)\n      R <- qr.R(qrr)\n      G$P <- forwardsolve(t(R), QtX)\n    } else {\n      G$P <- backsolve(R, QtX)\n    }\n    if (rank < p) {\n      G$P <- qr.qy(qrr, rbind(G$P, matrix(0, p - rank, p)))\n    }\n    G$P[qrx$pivot, ] <- G$P\n  }\n  G$X <- X\n  rm(X)\n  n.p <- ncol(G$X)\n  if (!is.null(sp)) {\n    ok <- TRUE\n    if (length(sp) < ncol(L)) {\n      warning(\"Supplied smoothing parameter vector is too short - ignored.\")\n      ok <- FALSE\n    }\n    if (sum(is.na(sp))) {\n      warning(\"NA's in supplied smoothing parameter vector - ignoring.\")\n      ok <- FALSE\n    }\n  } else {\n    ok <- FALSE\n  }\n  G$sp <- if (ok) sp[1:ncol(L)] else rep(-1, ncol(L))\n  names(G$sp) <- sp.names\n  k <- 1\n  if (m > 0) {\n    for (i in 1:m) {\n      id <- sm[[i]]$id\n      if (is.null(sm[[i]]$L)) {\n        Li <- diag(length(sm[[i]]$S))\n      } else {\n        Li <- sm[[i]]$L\n      }\n      if (is.null(id)) {\n        spi <- sm[[i]]$sp\n        if (!is.null(spi)) {\n          if (length(spi) != ncol(Li)) {\n            stop(\n              \"incorrect number of smoothing parameters supplied for a smooth term\"\n            )\n          }\n          G$sp[k:(k + ncol(Li) - 1)] <- spi\n        }\n        k <- k + ncol(Li)\n      } else {\n        spi <- sm[[i]]$sp\n        if (is.null(idx[[id]]$sp.done)) {\n          if (!is.null(spi)) {\n            if (length(spi) != ncol(Li)) {\n              stop(\n                \"incorrect number of smoothing parameters supplied for a smooth term\"\n              )\n            }\n            G$sp[idx[[id]]$c:(idx[[id]]$c + idx[[id]]$nc - 1)] <- spi\n          }\n          idx[[id]]$sp.done <- TRUE\n          k <- k + idx[[id]]$nc\n        }\n      }\n    }\n  }\n  k <- 1\n  if (length(idx)) {\n    for (i in 1:length(idx)) {\n      idx[[i]]$sp.done <- FALSE\n    }\n  }\n  if (m > 0) {\n    for (i in 1:m) {\n      id <- sm[[i]]$id\n      if (!is.null(id)) {\n        if (idx[[id]]$nc > 0) {\n          G$smooth[[i]]$sp <- G$sp[\n            idx[[id]]$c:(idx[[id]]$c +\n              idx[[id]]$nc -\n              1)\n          ]\n        }\n        if (!idx[[id]]$sp.done) {\n          idx[[id]]$sp.done <- TRUE\n          k <- k + idx[[id]]$nc\n        }\n      } else {\n        if (is.null(sm[[i]]$L)) {\n          nc <- length(sm[[i]]$S)\n        } else {\n          nc <- ncol(sm[[i]]$L)\n        }\n        if (nc > 0) {\n          G$smooth[[i]]$sp <- G$sp[k:(k + nc - 1)]\n        }\n        k <- k + nc\n      }\n    }\n  }\n  if (!is.null(min.sp)) {\n    if (length(min.sp) < nrow(L)) {\n      stop(\"length of min.sp is wrong.\")\n    }\n    if (nrow(L) > 0) {\n      min.sp <- min.sp[1:nrow(L)]\n    }\n    if (sum(is.na(min.sp))) {\n      stop(\"NA's in min.sp.\")\n    }\n    if (sum(min.sp < 0)) stop(\"elements of min.sp must be non negative.\")\n  }\n  k.sp <- 0\n  G$rank <- array(0, 0)\n  if (m > 0) {\n    for (i in 1:m) {\n      sm <- G$smooth[[i]]\n      if (length(sm$S) > 0) {\n        for (j in 1:length(sm$S)) {\n          k.sp <- k.sp + 1\n          G$off[k.sp] <- sm$first.para\n          G$S[[k.sp]] <- sm$S[[j]]\n          G$rank[k.sp] <- sm$rank[j]\n          if (!is.null(min.sp)) {\n            if (is.null(H)) {\n              H <- matrix(0, n.p, n.p)\n            }\n            H[sm$first.para:sm$last.para, sm$first.para:sm$last.para] <- H[\n              sm$first.para:sm$last.para,\n              sm$first.para:sm$last.para\n            ] +\n              min.sp[k.sp] *\n                sm$S[[j]]\n          }\n        }\n      }\n    }\n  }\n  if (!is.null(PP)) {\n    L <- rbind(\n      cbind(L, matrix(0, nrow(L), ncol(PP$L))),\n      cbind(matrix(0, nrow(PP$L), ncol(L)), PP$L)\n    )\n    G$off <- c(PP$off, G$off)\n    G$S <- c(PP$S, G$S)\n    G$rank <- c(PP$rank, G$rank)\n    G$sp <- c(PP$sp, G$sp)\n    lsp.names <- c(PP$full.sp.names, lsp.names)\n    G$n.paraPen <- length(PP$off)\n    if (!is.null(PP$min.sp)) {\n      if (is.null(H)) {\n        H <- matrix(0, n.p, n.p)\n      }\n      for (i in 1:length(PP$S)) {\n        ind <- PP$off[i]:(PP$off[i] + ncol(PP$S[[i]]) - 1)\n        H[ind, ind] <- H[ind, ind] + PP$min.sp[i] * PP$S[[i]]\n      }\n    }\n  } else {\n    G$n.paraPen <- 0\n  }\n  fix.ind <- G$sp >= 0\n  if (sum(fix.ind)) {\n    lsp0 <- G$sp[fix.ind]\n    ind <- lsp0 == 0\n    ef0 <- indi <- (1:length(ind))[ind]\n    if (length(indi) > 0) {\n      for (i in 1:length(indi)) {\n        ii <- G$off[i]:(G$off[i] + ncol(G$S[[i]]) - 1)\n        ef0[i] <- norm(G$X[, ii], type = \"F\")^2 /\n          norm(G$S[[i]], type = \"F\") *\n          .Machine$double.eps *\n          0.1\n      }\n    }\n    lsp0[!ind] <- log(lsp0[!ind])\n    lsp0[ind] <- log(ef0)\n    lsp0 <- as.numeric(L[, fix.ind, drop = FALSE] %*% lsp0)\n    L <- L[, !fix.ind, drop = FALSE]\n    G$sp <- G$sp[!fix.ind]\n  } else {\n    lsp0 <- rep(0, nrow(L))\n  }\n  G$H <- H\n  if (ncol(L) == nrow(L) && !sum(L != diag(ncol(L)))) {\n    L <- NULL\n  }\n  G$L <- L\n  G$lsp0 <- lsp0\n  names(G$lsp0) <- lsp.names\n  if (absorb.cons == FALSE) {\n    G$C <- matrix(0, 0, n.p)\n    if (m > 0) {\n      for (i in 1:m) {\n        if (is.null(G$smooth[[i]]$C)) {\n          n.con <- 0\n        } else {\n          n.con <- nrow(G$smooth[[i]]$C)\n        }\n        C <- matrix(0, n.con, n.p)\n        C[, G$smooth[[i]]$first.para:G$smooth[[i]]$last.para] <- G$smooth[[i]]$C\n        G$C <- rbind(G$C, C)\n        G$smooth[[i]]$C <- NULL\n      }\n      rm(C)\n    }\n  }\n  G$y <- drop(data[[split$response]])\n  ydim <- dim(G$y)\n  if (!is.null(ydim) && length(ydim) < 2) {\n    dim(G$y) <- NULL\n  }\n  G$n <- nrow(data)\n  if (is.null(data$\"(weights)\")) {\n    G$w <- rep(1, G$n)\n  } else {\n    G$w <- data$\"(weights)\"\n  }\n  if (G$nsdf > 0) {\n    term.names <- colnames(G$X)[1:G$nsdf]\n  } else {\n    term.names <- array(\"\", 0)\n  }\n  n.smooth <- length(G$smooth)\n  n.sp0 <- 0\n  if (n.smooth) {\n    for (i in 1:n.smooth) {\n      k <- 1\n      jj <- G$smooth[[i]]$first.para:G$smooth[[i]]$last.para\n      if (G$smooth[[i]]$df > 0) {\n        for (j in jj) {\n          term.names[j] <- paste(\n            G$smooth[[i]]$label,\n            \".\",\n            as.character(k),\n            sep = \"\"\n          )\n          k <- k + 1\n        }\n      }\n      n.sp <- length(G$smooth[[i]]$S)\n      if (n.sp) {\n        G$smooth[[i]]$first.sp <- n.sp0 + 1\n        n.sp0 <- G$smooth[[i]]$last.sp <- n.sp0 + n.sp\n      }\n      if (!is.null(G$smooth[[i]]$g.index)) {\n        if (is.null(G$g.index)) {\n          G$g.index <- rep(FALSE, n.p)\n        }\n        G$g.index[jj] <- G$smooth[[i]]$g.index\n      }\n    }\n  }\n  G$term.names <- term.names\n  G$pP <- PP\n  G\n}\n\n#' @noRd\nparametric_penalty <- function(pterms, assign, paraPen, sp0) {\n  S <- list()\n  off <- rep(0, 0)\n  rank <- rep(0, 0)\n  sp <- rep(0, 0)\n  full.sp.names <- rep(\"\", 0)\n  L <- matrix(0, 0, 0)\n  k <- 0\n  tind <- unique(assign)\n  n.t <- length(tind)\n  if (n.t > 0) {\n    for (j in 1:n.t) {\n      if (tind[j] > 0) {\n        term.label <- attr(pterms[tind[j]], \"term.label\")\n        P <- paraPen[[term.label]]\n        if (!is.null(P)) {\n          ind <- (1:length(assign))[assign == tind[j]]\n          Li <- P$L\n          P$L <- NULL\n          spi <- P$sp\n          P$sp <- NULL\n          ranki <- P$rank\n          P$rank <- NULL\n          np <- length(P)\n          if (!is.null(ranki) && length(ranki) != np) {\n            stop(\"`rank' has wrong length in `paraPen'\")\n          }\n          if (np) {\n            for (i in 1:np) {\n              k <- k + 1\n              S[[k]] <- P[[i]]\n              off[k] <- min(ind)\n              if (ncol(P[[i]]) != nrow(P[[i]]) || nrow(P[[i]]) != length(ind)) {\n                stop(\" a parametric penalty has wrong dimension\")\n              }\n              if (is.null(ranki)) {\n                ev <- eigen(S[[k]], symmetric = TRUE, only.values = TRUE)$values\n                rank[k] <- sum(ev > max(ev) * .Machine$double.eps * 10)\n              } else {\n                rank[k] <- ranki[i]\n              }\n            }\n          }\n          if (np) {\n            if (is.null(Li)) {\n              Li <- diag(np)\n            }\n            if (nrow(Li) != np) {\n              stop(\"L has wrong dimension in `paraPen'\")\n            }\n            L <- rbind(\n              cbind(L, matrix(0, nrow(L), ncol(Li))),\n              cbind(matrix(0, nrow(Li), ncol(L)), Li)\n            )\n            ind <- (length(sp) + 1):(length(sp) + ncol(Li))\n            ind2 <- (length(sp) + 1):(length(sp) + nrow(Li))\n            if (is.null(spi)) {\n              sp[ind] <- -1\n            } else {\n              if (length(spi) != ncol(Li)) {\n                stop(\"`sp' dimension wrong in `paraPen'\")\n              }\n              sp[ind] <- spi\n            }\n            if (length(ind) > 1) {\n              names(sp)[ind] <- paste(\n                term.label,\n                ind -\n                  ind[1] +\n                  1,\n                sep = \"\"\n              )\n            } else {\n              names(sp)[ind] <- term.label\n            }\n            if (length(ind2) > 1) {\n              full.sp.names[ind2] <- paste(\n                term.label,\n                ind2 - ind2[1] + 1,\n                sep = \"\"\n              )\n            } else {\n              full.sp.names[ind2] <- term.label\n            }\n          }\n        }\n      }\n    }\n  }\n  if (k == 0) {\n    return(NULL)\n  }\n  if (!is.null(sp0)) {\n    if (length(sp0) < length(sp)) {\n      stop(\"`sp' too short\")\n    }\n    sp0 <- sp0[1:length(sp)]\n    sp[sp < 0] <- sp0[sp < 0]\n  }\n  list(\n    S = S,\n    off = off,\n    sp = sp,\n    L = L,\n    rank = rank,\n    full.sp.names = full.sp.names\n  )\n}\n\n#' @noRd\nclone_smooth_spec <- function(specb, spec) {\n  if (specb$dim != spec$dim) {\n    stop(\"`id' linked smooths must have same number of arguments\")\n  }\n  if (inherits(specb, c(\"tensor.smooth.spec\", \"t2.smooth.spec\"))) {\n    specb$term <- spec$term\n    specb$label <- spec$label\n    specb$by <- spec$by\n    k <- 1\n    for (i in 1:length(specb$margin)) {\n      if (is.null(spec$margin)) {\n        for (j in 1:length(specb$margin[[i]]$term)) {\n          specb$margin[[i]]$term[j] <- spec$term[k]\n          k <- k + 1\n        }\n        specb$margin[[i]]$label <- \"\"\n      } else {\n        specb$margin[[i]]$term <- spec$margin[[i]]$term\n        specb$margin[[i]]$label <- spec$margin[[i]]$label\n        specb$margin[[i]]$xt <- spec$margin[[i]]$xt\n      }\n    }\n  } else {\n    specb$term <- spec$term\n    specb$label <- spec$label\n    specb$by <- spec$by\n    specb$xt <- spec$xt\n  }\n  specb\n}\n\n#' Summarize all the variables in a list of variables\n#'\n#' This function is derived from \\code{mgcv:::variable.summary}\n#'\n#' @author Simon N Wood with modifications by Nicholas Clark\n#' @noRd\nvariable_summary <- function(pf, dl, n) {\n  v.n <- length(dl)\n  v.name <- v.name1 <- names(dl)\n  if (v.n) {\n    k <- 0\n    for (i in 1:v.n) {\n      if (length(dl[[i]]) >= n) {\n        k <- k + 1\n        v.name[k] <- v.name1[i]\n      }\n    }\n    if (k > 0) v.name <- v.name[1:k] else v.name <- rep(\"\", k)\n  }\n  p.name <- all.vars(pf[-2])\n  vs <- list()\n  v.n <- length(v.name)\n  if (v.n > 0) {\n    for (i in 1:v.n) {\n      if (v.name[i] %in% p.name) {\n        para <- TRUE\n      } else {\n        para <- FALSE\n      }\n      if (para && is.matrix(dl[[v.name[i]]]) && ncol(dl[[v.name[i]]]) > 1) {\n        x <- matrix(\n          apply(\n            dl[[v.name[i]]],\n            2,\n            quantile,\n            probs = 0.5,\n            type = 3,\n            na.rm = TRUE\n          ),\n          1,\n          ncol(dl[[v.name[i]]])\n        )\n      } else {\n        x <- dl[[v.name[i]]]\n        if (is.character(x)) {\n          x <- as.factor(x)\n        }\n        if (is.factor(x)) {\n          x <- x[!is.na(x)]\n          lx <- levels(x)\n          freq <- tabulate(x)\n          ii <- min((1:length(lx))[freq == max(freq)])\n          x <- factor(lx[ii], levels = lx)\n        } else {\n          x <- as.numeric(x)\n          x <- c(\n            min(x, na.rm = TRUE),\n            as.numeric(quantile(x, probs = 0.5, type = 3, na.rm = TRUE)),\n            max(x, na.rm = TRUE)\n          )\n        }\n      }\n      vs[[v.name[i]]] <- x\n    }\n  }\n  vs\n}\n\n#' @importFrom stats lm\n#' @noRd\ninitial_spg <- function(\n  x,\n  y,\n  weights,\n  family,\n  S,\n  rank,\n  off,\n  offset = NULL,\n  L = NULL,\n  lsp0 = NULL,\n  type = 1,\n  start = NULL,\n  mustart = NULL,\n  etastart = NULL,\n  E = NULL,\n  ...\n) {\n  if (length(S) == 0) {\n    return(rep(0, 0))\n  }\n  nobs <- nrow(x)\n  if (is.null(mustart)) {\n    mukeep <- NULL\n  } else {\n    mukeep <- mustart\n  }\n  eval(family$initialize)\n  if (inherits(family, \"general.family\")) {\n    lbb <- family$ll(\n      y,\n      x,\n      start,\n      weights,\n      family,\n      offset = offset,\n      deriv = 1\n    )$lbb\n    pcount <- rep(0, ncol(lbb))\n    for (i in 1:length(S)) {\n      ind <- off[i]:(off[i] + ncol(S[[i]]) - 1)\n      dlb <- -diag(lbb[ind, ind, drop = FALSE])\n      indp <- rowSums(abs(S[[i]])) > max(S[[i]]) * .Machine$double.eps^0.75 &\n        dlb != 0\n      ind <- ind[indp]\n      pcount[ind] <- pcount[ind] + 1\n    }\n    lambda <- rep(0, length(S))\n    for (i in 1:length(S)) {\n      ind <- off[i]:(off[i] + ncol(S[[i]]) - 1)\n      lami <- 1\n      dlb <- abs(diag(lbb[ind, ind, drop = FALSE]))\n      dS <- diag(S[[i]])\n      pc <- pcount[ind]\n      ind <- rowSums(abs(S[[i]])) > max(S[[i]]) * .Machine$double.eps^0.75 &\n        dlb != 0\n      dlb <- dlb[ind] / pc[ind]\n      dS <- dS[ind]\n      rm <- max(length(dS) / rank[i], 1)\n      while (\n        sqrt(\n          mean(dlb / (dlb + lami * dS * rm)) *\n            mean(dlb) /\n            mean(\n              dlb +\n                lami * dS * rm\n            )\n        ) >\n          0.4\n      ) {\n        lami <- lami * 5\n      }\n      while (\n        sqrt(\n          mean(dlb / (dlb + lami * dS * rm)) *\n            mean(dlb) /\n            mean(\n              dlb +\n                lami * dS * rm\n            )\n        ) <\n          0.4\n      ) {\n        lami <- lami / 5\n      }\n      lambda[i] <- lami\n    }\n  } else {\n    if (is.null(mukeep)) {\n      if (!is.null(start)) {\n        etastart <- drop(x %*% start)\n      }\n      if (!is.null(etastart)) mustart <- family$linkinv(etastart)\n    } else {\n      mustart <- mukeep\n    }\n    if (inherits(family, \"extended.family\")) {\n      theta <- family$getTheta()\n      Ddo <- family$Dd(y, mustart, theta, weights)\n      mu.eta2 <- family$mu.eta(family$linkfun(mustart))^2\n      w <- 0.5 * as.numeric(Ddo$Dmu2 * mu.eta2)\n      if (any(w < 0)) w <- 0.5 * as.numeric(Ddo$EDmu2 * mu.eta2)\n    } else {\n      w <- as.numeric(\n        weights *\n          family$mu.eta(family$linkfun(mustart))^2 /\n          family$variance(mustart)\n      )\n    }\n    w <- sqrt(w)\n    if (type == 1) {\n      lambda <- mgcv::initial.sp(w * x, S, off)\n    } else {\n      csX <- colSums((w * x)^2)\n      lambda <- rep(0, length(S))\n      for (i in 1:length(S)) {\n        ind <- off[i]:(off[i] + ncol(S[[i]]) - 1)\n        lambda[i] <- sum(csX[ind]) / sqrt(sum(S[[i]]^2))\n      }\n    }\n  }\n  if (!is.null(L)) {\n    lsp <- log(lambda)\n    if (is.null(lsp0)) {\n      lsp0 <- rep(0, nrow(L))\n    }\n    lsp <- as.numeric(coef(lm(lsp ~ L - 1 + offset(lsp0))))\n    lambda <- exp(lsp)\n  }\n  lambda\n}\n\n#' Set up JAGS data and model file for fitting GAMs\n#'\n#' This function is derived from \\code{mgcv:::jagam}\n#'\n#' @author Simon N Wood with modifications by Nicholas Clark\n#' @importFrom mgcv gam.control interpret.gam\n#' @noRd\njagam <- function(\n  formula,\n  family = gaussian,\n  data = list(),\n  file,\n  weights = NULL,\n  na.action,\n  offset = NULL,\n  knots = NULL,\n  sp = NULL,\n  drop.unused.levels = FALSE,\n  control = mgcv::gam.control(),\n  centred = TRUE,\n  diagonalize = FALSE\n) {\n  ## Start the model specification\n  cat(\"model {\\n\", file = file)\n  sp.prior <- 'gamma'\n\n  # Evaluate family\n  if (is.character(family)) {\n    family <- eval(parse(text = family))\n  }\n  if (is.function(family)) {\n    family <- family()\n  }\n  if (is.null(family$family)) {\n    stop(\"family not recognized\")\n  }\n\n  # Interpret the formula and initialize the model.frame object\n  gp <- mgcv::interpret.gam(formula)\n  gp$pfok <- 1\n  cl <- match.call()\n  mf <- match.call(expand.dots = FALSE)\n  mf$formula <- gp$fake.formula\n  mf$family <- mf$knots <- mf$sp <- mf$file <- mf$control <-\n    mf$centred <- mf$sp.prior <- mf$diagonalize <- NULL\n  mf$drop.unused.levels <- drop.unused.levels\n  mf[[1]] <- quote(stats::model.frame)\n  pmf <- mf\n\n  # Extract fixed effect terms\n  # Multiple formula objects\n  if (is.list(formula)) {\n    environment(formula) <- environment(formula[[1]])\n    pterms <- list()\n    tlab <- rep(\"\", 0)\n    for (i in 1:length(formula)) {\n      pmf$formula <- gp[[i]]$pf\n      pterms[[i]] <- attr(eval(pmf, parent.frame()), \"terms\")\n      tlabi <- attr(pterms[[i]], \"term.labels\")\n      if (i > 1 && length(tlabi) > 0) {\n        tlabi <- paste(tlabi, i - 1, sep = \".\")\n      }\n      tlab <- c(tlab, tlabi)\n    }\n    attr(pterms, \"term.labels\") <- tlab\n\n    # Single linear predictor case\n  } else {\n    pmf$formula <- gp$pf\n    pmf <- eval(pmf, parent.frame())\n    pterms <- attr(pmf, \"terms\")\n  }\n\n  mf <- eval(mf, parent.frame())\n  if (nrow(mf) < 2) {\n    stop(\"Not enough (non-NA) data to do anything meaningful\")\n  }\n  terms <- attr(mf, \"terms\")\n\n  # Summarize the *raw* input variables\n  vars <- all.vars(gp$fake.formula[-2])\n  inp <- parse(text = paste(\"list(\", paste(vars, collapse = \",\"), \")\"))\n  if (!is.list(data) && !is.data.frame(data)) {\n    data <- as.data.frame(data)\n  }\n  dl <- eval(inp, data, parent.frame())\n  rm(data)\n  names(dl) <- vars\n  var.summary <- variable_summary(gp$pf, dl, nrow(mf))\n  rm(dl)\n\n  gsname <- if (is.list(formula)) \"gam_setup.list\" else \"gam_setup\"\n\n  G <- do.call(\n    gsname,\n    list(\n      formula = gp,\n      pterms = pterms,\n      data = mf,\n      knots = knots,\n      sp = sp,\n      H = NULL,\n      absorb.cons = TRUE,\n      sparse.cons = FALSE,\n      select = TRUE,\n      idLinksBases = TRUE,\n      scale.penalty = control$scalePenalty\n    )\n  )\n\n  G$model <- mf\n  G$terms <- terms\n  G$family <- family\n  G$call <- cl\n  G$var.summary <- var.summary\n\n  ## write JAGS code producing linear predictor and linking linear predictor to\n  ## response....\n  use.weights <- if (is.null(weights)) FALSE else TRUE\n  use.weights <- write_jagslp(\n    \"y\",\n    family = poisson(),\n    file,\n    use.weights,\n    !is.null(G$offset)\n  )\n\n  if (is.null(weights) && use.weights) {\n    weights <- rep(1, nrow(G$X))\n  }\n\n  ## start the JAGS data list...\n\n  jags.stuff <- list(y = G$y, n = length(G$y), X = G$X)\n  if (!is.null(G$offset)) {\n    jags.stuff$offset <- G$offset\n  }\n  if (use.weights) {\n    jags.stuff$w <- weights\n  }\n\n  if (family$family == \"binomial\") {\n    jags.stuff$y <- G$y * weights\n  }\n\n  ## set the fixed effect priors...\n  lambda <- rep(1, length(G$S))\n  jags.ini <- list()\n  jags.ini$b <- rep(0, NCOL(G$X))\n  prior.tau <- 10\n  ptau <- 10\n  if (is.list(formula)) {\n    for (i in 1:length(G$nsdf)) {\n      if (G$nsdf[i] > 0) {\n        if (i == 1) {\n          cat(\n            \"  ## Parametric effect priors CHECK tau=1/\",\n            signif(1 / sqrt(ptau), 2),\n            \"^2 is appropriate!\\n\",\n            file = file,\n            append = TRUE,\n            sep = \"\"\n          )\n          cat(\n            \"  for (i in 1:\",\n            G$nsdf[i],\n            \") { b[i] ~ dnorm(0,\",\n            ptau,\n            \") }\\n\",\n            file = file,\n            append = TRUE,\n            sep = \"\"\n          )\n        } else {\n          cat(\n            \"  ## Parametric effect priors CHECK tau=1/\",\n            signif(1 / sqrt(ptau), 2),\n            \"^2 is appropriate!\\n\",\n            file = file,\n            append = TRUE,\n            sep = \"\"\n          )\n          cat(\n            \"  for (i in \",\n            attr(G$nsdf, 'pstart')[i],\n            ':',\n            attr(G$nsdf, 'pstart')[i] + G$nsdf[i],\n            \") { b[i] ~ dnorm(0,\",\n            ptau,\n            \") }\\n\",\n            file = file,\n            append = TRUE,\n            sep = \"\"\n          )\n        }\n      }\n    }\n  } else {\n    if (sum(G$nsdf) > 0) {\n      cat(\n        \"  ## Parametric effect priors CHECK tau=1/\",\n        signif(1 / sqrt(ptau), 2),\n        \"^2 is appropriate!\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      cat(\n        \"  for (i in 1:\",\n        sum(G$nsdf),\n        \") { b[i] ~ dnorm(0,\",\n        ptau,\n        \") }\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n    }\n  }\n\n  ## Work through smooths.\n  n.sp <- 0 ## count the smoothing parameters....\n  for (i in 1:length(G$smooth)) {\n    ## Are penalties seperable...\n    seperable <- FALSE\n    M <- length(G$smooth[[i]]$S)\n    p <- G$smooth[[i]]$last.para - G$smooth[[i]]$first.para + 1 ## number of params\n    if (M <= 1) {\n      seperable <- TRUE\n    } else {\n      overlap <- rowSums(G$smooth[[i]]$S[[1]])\n      for (j in 2:M) {\n        overlap <- overlap & rowSums(G$smooth[[i]]$S[[j]])\n      }\n      if (!sum(overlap)) seperable <- TRUE\n    }\n    if (seperable) {\n      ## double check that they are diagonal\n      if (M > 0) {\n        for (j in 1:M) {\n          if (\n            max(abs(\n              G$smooth[[i]]$S[[j]] - diag(diag(G$smooth[[i]]$S[[j]]), nrow = p)\n            )) >\n              0\n          ) {\n            seperable <- FALSE\n          }\n        }\n      }\n    }\n    cat(\n      \"  ## prior for \",\n      G$smooth[[i]]$label,\n      \"... \\n\",\n      file = file,\n      append = TRUE,\n      sep = \"\"\n    )\n    if (seperable) {\n      b0 <- G$smooth[[i]]$first.para\n      b1 <- G$smooth[[i]]$last.para\n      if (M == 0) {\n        cat(\n          \"  ## Note fixed vague prior, CHECK tau = 1/\",\n          signif(1 / sqrt(ptau), 2),\n          \"^2...\\n\",\n          file = file,\n          append = TRUE,\n          sep = \"\"\n        )\n        #b1 <- G$smooth[[i]]$last.para\n        ptau <- min(prior.tau[b0:b1])\n        cat(\n          \"  for (i in \",\n          b0,\n          \":\",\n          b1,\n          \") { b[i] ~ dnorm(0,\",\n          ptau,\n          \") }\\n\",\n          file = file,\n          append = TRUE,\n          sep = \"\"\n        )\n      } else {\n        for (j in 1:M) {\n          D <- diag(G$smooth[[i]]$S[[j]]) > 0\n          #b1 <- sum(as.numeric(D)) + b0 - 1\n          n.sp <- n.sp + 1\n          #cat(\"  for (i in \",b0,\":\",b1,\") { b[i] ~ dnorm(0, lambda[\",n.sp,\"]) }\\n\",file=file,append=TRUE,sep=\"\")\n          #b0 <- b1 + 1\n          cat(\n            \"  for (i in \",\n            compress_iseq((b0:b1)[D]),\n            \") { b[i] ~ dnorm(0, lambda[\",\n            n.sp,\n            \"]) }\\n\",\n            file = file,\n            append = TRUE,\n            sep = \"\"\n          )\n        }\n      }\n    } else {\n      ## inseperable - requires the penalty matrices to be supplied to JAGS...\n      b0 <- G$smooth[[i]]$first.para\n      b1 <- G$smooth[[i]]$last.para\n      Kname <- paste(\"K\", i, sep = \"\") ## total penalty matrix in JAGS\n      Sname <- paste(\"S\", i, sep = \"\") ## components of total penalty in R & JAGS\n      cat(\n        \"  \",\n        Kname,\n        \" <- \",\n        Sname,\n        \"[1:\",\n        p,\n        \",1:\",\n        p,\n        \"] * lambda[\",\n        n.sp + 1,\n        \"] \",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      if (M > 1) {\n        ## code to form total precision matrix...\n        for (j in 2:M) {\n          cat(\n            \" + \",\n            Sname,\n            \"[1:\",\n            p,\n            \",\",\n            (j - 1) * p + 1,\n            \":\",\n            j * p,\n            \"] * lambda[\",\n            n.sp + j,\n            \"]\",\n            file = file,\n            append = TRUE,\n            sep = \"\"\n          )\n        }\n      }\n      cat(\n        \"\\n  b[\",\n        b0,\n        \":\",\n        b1,\n        \"] ~ dmnorm(zero[\",\n        b0,\n        \":\",\n        b1,\n        \"],\",\n        Kname,\n        \") \\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      n.sp <- n.sp + M\n      Sc <- G$smooth[[i]]$S[[1]]\n      if (M > 1) {\n        for (j in 2:M) {\n          Sc <- cbind(Sc, G$smooth[[i]]$S[[j]])\n        }\n      }\n      jags.stuff[[Sname]] <- Sc\n      jags.stuff$zero <- rep(0, ncol(G$X))\n    }\n  } ## smoothing penalties finished\n\n  ## Write the smoothing parameter prior code, using L if it exists.\n\n  cat(\n    \"  ## smoothing parameter priors CHECK...\\n\",\n    file = file,\n    append = TRUE,\n    sep = \"\"\n  )\n  if (is.null(G$L)) {\n    if (sp.prior == \"log.uniform\") {\n      cat(\"  for (i in 1:\", n.sp, \") {\\n\", file = file, append = TRUE, sep = \"\")\n      cat(\"    rho[i] ~ dunif(-12,12)\\n\", file = file, append = TRUE, sep = \"\")\n      cat(\n        \"    lambda[i] <- exp(rho[i])\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      cat(\"  }\\n\", file = file, append = TRUE, sep = \"\")\n      jags.ini$rho <- log(lambda)\n    } else {\n      ## gamma priors\n      cat(\"  for (i in 1:\", n.sp, \") {\\n\", file = file, append = TRUE, sep = \"\")\n      cat(\n        \"    lambda[i] ~ dgamma(.05,.005)\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      cat(\n        \"    rho[i] <- log(lambda[i])\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      cat(\"  }\\n\", file = file, append = TRUE, sep = \"\")\n      jags.ini$lambda <- lambda\n    }\n  } else {\n    jags.stuff$L <- G$L\n    rho.lo <- FALSE\n    if (any(G$lsp0 != 0)) {\n      jags.stuff$rho.lo <- G$lsp0\n      rho.lo <- TRUE\n    }\n    nr <- ncol(G$L)\n    if (sp.prior == \"log.uniform\") {\n      cat(\n        \"  for (i in 1:\",\n        nr,\n        \") { rho0[i] ~ dunif(-12,12) }\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      if (rho.lo) {\n        cat(\n          \"  rho <- rho.lo + L %*% rho0\\n\",\n          file = file,\n          append = TRUE,\n          sep = \"\"\n        )\n      } else {\n        cat(\"  rho <- L %*% rho0\\n\", file = file, append = TRUE, sep = \"\")\n      }\n      cat(\n        \"  for (i in 1:\",\n        n.sp,\n        \") { lambda[i] <- exp(rho[i]) }\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      jags.ini$rho0 <- log(lambda)\n    } else {\n      ## gamma prior\n      cat(\"  for (i in 1:\", nr, \") {\\n\", file = file, append = TRUE, sep = \"\")\n      cat(\n        \"    lambda0[i] ~ dgamma(.05,.005)\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      cat(\n        \"    rho0[i] <- log(lambda0[i])\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      cat(\"  }\\n\", file = file, append = TRUE, sep = \"\")\n      if (rho.lo) {\n        cat(\n          \"  rho <- rho.lo + L %*% rho0\\n\",\n          file = file,\n          append = TRUE,\n          sep = \"\"\n        )\n      } else {\n        cat(\"  rho <- L %*% rho0\\n\", file = file, append = TRUE, sep = \"\")\n      }\n      cat(\n        \"  for (i in 1:\",\n        n.sp,\n        \") { lambda[i] <- exp(rho[i]) }\\n\",\n        file = file,\n        append = TRUE,\n        sep = \"\"\n      )\n      jags.ini$lambda0 <- lambda\n    }\n  }\n  cat(\"}\", file = file, append = TRUE)\n\n  G$formula = formula\n  G$rank = ncol(G$X) ## to Gibbs sample we force full rank!\n  list(pregam = G, jags.data = jags.stuff, jags.ini = jags.ini)\n} ## new_jagam\n\n\n#' Initialize a gam object using a list of formulae\n#'\n#' This function is derived from \\code{mgcv:::gam.setup.list}\n#'\n#' @author Simon N Wood with modifications by Nicholas Clark\n#' @noRd\ngam_setup.list <- function(\n  formula,\n  pterms,\n  data = stop(\"No data supplied to gam.setup\"),\n  knots = NULL,\n  sp = NULL,\n  min.sp = NULL,\n  H = NULL,\n  absorb.cons = TRUE,\n  sparse.cons = 0,\n  select = FALSE,\n  idLinksBases = TRUE,\n  scale.penalty = TRUE,\n  paraPen = NULL,\n  gamm.call = FALSE,\n  drop.intercept = NULL,\n  apply.by = TRUE,\n  modCon = 0\n) {\n  # version of gam.setup for when gam is called with a list of formulae,\n  # specifying several linear predictors...\n  # key difference to gam.setup is an attribute to the model matrix,\n  # \"lpi\", which is a list\n  # of column indices for each linear predictor\n  d <- length(pterms)\n  if (is.null(drop.intercept)) {\n    drop.intercept <- rep(FALSE, d)\n  }\n  if (length(drop.intercept) != d) {\n    stop(\"length(drop.intercept) should be equal to number of model formulas\")\n  }\n\n  lp.overlap <- if (formula$nlp < d) TRUE else FALSE\n\n  G <- gam_setup(\n    formula[[1]],\n    pterms[[1]],\n    data,\n    knots,\n    sp,\n    min.sp,\n    H,\n    absorb.cons,\n    sparse.cons,\n    select,\n    idLinksBases,\n    scale.penalty,\n    paraPen,\n    gamm.call,\n    drop.intercept[1],\n    apply.by = apply.by,\n    list.call = TRUE,\n    modCon = modCon\n  )\n\n  G$pterms <- pterms\n  G$offset <- list(G$offset)\n  G$xlevels <- list(G$xlevels)\n  G$assign <- list(G$assign)\n  used.sp <- length(G$lsp0)\n\n  if (!is.null(sp) && used.sp > 0) {\n    sp <- sp[-(1:used.sp)]\n  }\n  if (!is.null(min.sp) && nrow(G$L) > 0) {\n    min.sp <- min.sp[-(1:nrow(G$L))]\n  }\n\n  flpi <- lpi <- list()\n  for (i in 1:formula$nlp) {\n    lpi[[i]] <- rep(0, 0)\n  }\n  lpi[[1]] <- 1:ncol(G$X)\n  flpi[[1]] <- formula[[1]]$lpi\n\n  pof <- ncol(G$X)\n  pstart <- rep(0, d)\n  pstart[1] <- 1\n  if (d > 1) {\n    for (i in 2:d) {\n      if (is.null(formula[[i]]$response)) {\n        formula[[i]]$response <- formula$response\n        mv.response <- FALSE\n      } else {\n        mv.response <- TRUE\n      }\n      formula[[i]]$pfok <- 1\n      um <- gam_setup(\n        formula[[i]],\n        pterms[[i]],\n        data,\n        knots,\n        sp,\n        min.sp,\n        H,\n        absorb.cons,\n        sparse.cons,\n        select,\n        idLinksBases,\n        scale.penalty,\n        paraPen,\n        gamm.call,\n        drop.intercept[i],\n        apply.by = apply.by,\n        list.call = TRUE,\n        modCon = modCon\n      )\n      used.sp <- length(um$lsp0)\n      if (!is.null(sp) && used.sp > 0) {\n        sp <- sp[-(1:used.sp)]\n      }\n      if (!is.null(min.sp) && nrow(um$L) > 0) {\n        min.sp <- min.sp[-(1:nrow(um$L))]\n      }\n\n      flpi[[i]] <- formula[[i]]$lpi\n      for (j in formula[[i]]$lpi) {\n        lpi[[j]] <- c(lpi[[j]], pof + 1:ncol(um$X))\n      }\n      if (mv.response) {\n        G$y <- cbind(G$y, um$y)\n      }\n      if (i > formula$nlp && !is.null(um$offset)) {\n        stop(\"shared offsets not allowed\")\n      }\n      G$offset[[i]] <- um$offset\n      if (!is.null(um$contrasts)) {\n        G$contrasts <- c(G$contrasts, um$contrasts)\n      }\n      G$xlevels[[i]] <- um$xlevels\n      G$assign[[i]] <- um$assign\n      G$rank <- c(G$rank, um$rank)\n      pstart[i] <- pof + 1\n      G$X <- cbind(G$X, um$X)\n      k <- G$m\n      if (um$m) {\n        for (j in 1:um$m) {\n          um$smooth[[j]]$first.para <- um$smooth[[j]]$first.para + pof\n          um$smooth[[j]]$last.para <- um$smooth[[j]]$last.para + pof\n          k <- k + 1\n          G$smooth[[k]] <- um$smooth[[j]]\n        }\n      }\n      ks <- length(G$S)\n      M <- length(um$S)\n\n      if (!is.null(um$L) || !is.null(G$L)) {\n        if (is.null(G$L)) {\n          G$L <- diag(1, nrow = ks)\n        }\n        if (is.null(um$L)) {\n          um$L <- diag(1, nrow = M)\n        }\n        G$L <- rbind(\n          cbind(G$L, matrix(0, nrow(G$L), ncol(um$L))),\n          cbind(matrix(0, nrow(um$L), ncol(G$L)), um$L)\n        )\n      }\n\n      G$off <- c(G$off, um$off + pof)\n      if (M) {\n        for (j in 1:M) {\n          ks <- ks + 1\n          G$S[[ks]] <- um$S[[j]]\n        }\n      }\n\n      G$m <- G$m + um$m\n      G$nsdf[i] <- um$nsdf\n      if (!is.null(um$P) || !is.null(G$P)) {\n        if (is.null(G$P)) {\n          G$P <- diag(1, nrow = pof)\n        }\n        k <- ncol(um$X)\n        if (is.null(um$P)) {\n          um$P <- diag(1, nrow = k)\n        }\n        G$P <- rbind(\n          cbind(G$P, matrix(0, pof, k)),\n          cbind(matrix(0, k, pof), um$P)\n        )\n      }\n      G$cmX <- c(G$cmX, um$cmX)\n      if (um$nsdf > 0) {\n        um$term.names[1:um$nsdf] <- paste(\n          um$term.names[1:um$nsdf],\n          i - 1,\n          sep = \".\"\n        )\n      }\n      G$term.names <- c(G$term.names, um$term.names)\n      G$lsp0 <- c(G$lsp0, um$lsp0)\n      G$sp <- c(G$sp, um$sp)\n      pof <- ncol(G$X)\n    }\n  }\n\n  ## If there is overlap then there is a danger of lack of identifiability of the\n  ## parameteric terms, especially if there are factors present in shared components.\n  ## The following code deals with this possibility...\n  if (lp.overlap) {\n    rt <- olid(G$X, G$nsdf, pstart, flpi, lpi)\n    if (length(rt$dind) > 0) {\n      warning(\n        \"dropping unidentifiable parametric terms from model\",\n        call. = FALSE\n      )\n      G$X <- G$X[, -rt$dind]\n      G$cmX <- G$cmX[-rt$dind]\n      G$term.names <- G$term.names[-rt$dind]\n      for (i in 1:length(G$smooth)) {\n        k <- sum(rt$dind < G$smooth[[i]]$first.para)\n        G$smooth[[i]]$first.para <- G$smooth[[i]]$first.para - k\n        G$smooth[[i]]$last.para <- G$smooth[[i]]$last.para - k\n      }\n      for (i in 1:length(G$off)) {\n        G$off[i] <- G$off[i] - sum(rt$dind < G$off[i])\n      }\n      attr(G$nsdf, \"drop.ind\") <- rt$dind ## store drop index\n    }\n  }\n  attr(lpi, \"overlap\") <- lp.overlap\n  attr(G$X, \"lpi\") <- lpi\n  attr(G$nsdf, \"pstart\") <- pstart\n\n  G$g.index <- rep(FALSE, ncol(G$X))\n  n.sp0 <- 0\n  if (length(G$smooth)) {\n    for (i in 1:length(G$smooth)) {\n      if (!is.null(G$smooth[[i]]$g.index)) {\n        G$g.index[\n          G$smooth[[i]]$first.para:G$smooth[[i]]$last.para\n        ] <- G$smooth[[i]]$g.index\n      }\n      n.sp <- length(G$smooth[[i]]$S)\n      if (n.sp) {\n        G$smooth[[i]]$first.sp <- n.sp0 + 1\n        n.sp0 <- G$smooth[[i]]$last.sp <- n.sp0 + n.sp\n      }\n    }\n  }\n  if (!any(G$g.index)) {\n    G$g.index <- NULL\n  }\n\n  G\n}\n\n\n#' Takes a set of non-negative integers and returns minimal code for generating it\n#'\n#' This function is derived from \\code{mgcv:::compress.iseq}\n#'\n#' @author Simon N Wood with modifications by Nicholas Clark\n#' @noRd\ncompress_iseq <- function(x) {\n  x1 <- sort(x)\n  br <- diff(x1) != 1 ## TRUE at sequence breaks\n  txt <- paste(x1[c(TRUE, br)], x1[c(br, TRUE)], sep = \":\") ## subsequences\n  txt1 <- paste(x1[c(TRUE, br)]) ## subseq starts\n  ii <- x1[c(TRUE, br)] == x1[c(br, TRUE)] ## index start and end equal\n  txt[ii] <- txt1[ii] ## replace length on sequences with integers\n  paste(\"c(\", paste(txt, collapse = \",\"), \")\", sep = \"\")\n}\n\n#' Returns a vector dind of columns of X to drop for identifiability\n#'\n#' This function is derived from \\code{mgcv:::olid}\n#'\n#' @author Simon N Wood with modifications by Nicholas Clark\n#' @noRd\nolid <- function(X, nsdf, pstart, flpi, lpi) {\n  nlp <- length(lpi) ## number of linear predictors\n  n <- nrow(X)\n  nf <- length(nsdf) ## number of formulae blocks\n  Xp <- matrix(0, n * nlp, sum(nsdf))\n  start <- 1\n  ii <- 1:n\n  tind <- rep(0, 0) ## complete index of all parametric columns in X\n  ## create a block matrix, Xp, with the same identifiability properties as\n  ## unpenalized part of model...\n  for (i in 1:nf) {\n    stop <- start - 1 + nsdf[i]\n    if (stop >= start) {\n      ind <- pstart[i] + 1:nsdf[i] - 1\n      for (k in flpi[[i]]) {\n        Xp[ii + (k - 1) * n, start:stop] <- X[, ind]\n      }\n      tind <- c(tind, ind)\n      start <- start + nsdf[i]\n    }\n  }\n  ## rank deficiency of Xp will reveal number of redundant parametric\n  ## terms, and a pivoted QR will reveal which to drop to restore\n  ## full rank...\n  qrx <- qr(Xp, LAPACK = TRUE, tol = 0.0) ## unidentifiable columns get pivoted to final cols\n  r <- mgcv::Rrank(qr.R(qrx)) ## get rank from R factor of pivoted QR\n  if (r == ncol(Xp)) {\n    ## full rank, all fine, drop nothing\n    dind <- rep(0, 0)\n  } else {\n    ## reduced rank, drop some columns\n    dind <- tind[sort(qrx$pivot[(r + 1):ncol(X)], decreasing = TRUE)] ## columns to drop\n    ## now we need to adjust nsdf, pstart and lpi\n    for (d in dind) {\n      ## working down through drop indices\n      ## following commented out code is useful should it ever prove necessary to\n      ## adjust pstart and nsdf, but at present these are only used in prediction,\n      ## and it is cleaner to leave them unchanged, and simply drop using dind during prediction.\n      #k <- if (d>=pstart[nf]) nlp else which(d >= pstart[1:(nf-1)] & d < pstart[2:nf])\n      #nsdf[k] <- nsdf[k] - 1 ## one less unpenalized column in this block\n      #if (k<nf) pstart[(k+1):nf] <-  pstart[(k+1):nf] - 1 ## later block starts move down 1\n      for (i in 1:nlp) {\n        k <- which(d == lpi[[i]])\n        if (length(k) > 0) {\n          lpi[[i]] <- lpi[[i]][-k]\n        } ## drop row\n        k <- which(lpi[[i]] > d)\n        if (length(k) > 0) lpi[[i]][k] <- lpi[[i]][k] - 1 ## close up\n      }\n    } ## end of drop index loop\n  }\n  list(dind = dind, lpi = lpi) ##,pstart=pstart,nsdf=nsdf)\n}\n\n\n#' Write linear predictor section of a jagam file\n#'\n#' This function is derived from \\code{mgcv:::write.jagslp}\n#'\n#' @author Simon N Wood with modifications by Nicholas Clark\n#' @noRd\nwrite_jagslp <- function(resp, family, file, use.weights, offset = FALSE) {\n  ## write the JAGS code for the linear predictor\n  ## and response distribution.\n  iltab <- ## table of inverse link functions\n    c(\n      \"eta[i]\",\n      \"exp(eta[i])\",\n      \"ilogit(eta[i])\",\n      \"phi(eta[i])\",\n      \"1/eta[i]\",\n      \"eta[i]^2\"\n    )\n  names(iltab) <- c(\"identity\", \"log\", \"logit\", \"probit\", \"inverse\", \"sqrt\")\n  if (!family$link %in% names(iltab)) {\n    stop(\"sorry link not yet handled\")\n  }\n\n  ## code linear predictor and expected response...\n  if (family$link == \"identity\") {\n    if (offset) {\n      cat(\n        \"  mu <- X %*% b + offset ## expected response\\n\",\n        file = file,\n        append = TRUE\n      )\n    } else {\n      cat(\"  mu <- X %*% b ## expected response\\n\", file = file, append = TRUE)\n    }\n  } else {\n    if (offset) {\n      cat(\n        \"  eta <- X %*% b + offset ## linear predictor\\n\",\n        file = file,\n        append = TRUE\n      )\n    } else {\n      cat(\"  eta <- X %*% b ## linear predictor\\n\", file = file, append = TRUE)\n    }\n    cat(\n      \"  for (i in 1:n) { mu[i] <- \",\n      iltab[family$link],\n      \"} ## expected response\\n\",\n      file = file,\n      append = TRUE\n    )\n  }\n  ## code the response given mu and any scale parameter prior...\n  #scale <- TRUE ## is scale parameter free?\n  cat(\"  for (i in 1:n) { \", file = file, append = TRUE)\n  if (family$family == \"gaussian\") {\n    if (use.weights) {\n      cat(\n        resp,\n        \"[i] ~ dnorm(mu[i],tau*w[i]) } ## response \\n\",\n        sep = \"\",\n        file = file,\n        append = TRUE\n      )\n    } else {\n      cat(\n        resp,\n        \"[i] ~ dnorm(mu[i],tau) } ## response \\n\",\n        sep = \"\",\n        file = file,\n        append = TRUE\n      )\n    }\n    cat(\n      \"  scale <- 1/tau ## convert tau to standard GLM scale\\n\",\n      file = file,\n      append = TRUE\n    )\n    cat(\n      \"  tau ~ dgamma(.05,.005) ## precision parameter prior \\n\",\n      file = file,\n      append = TRUE\n    )\n  } else if (family$family == \"poisson\") {\n    # scale <- FALSE\n    cat(\n      resp,\n      \"[i] ~ dpois(mu[i]) } ## response \\n\",\n      sep = \"\",\n      file = file,\n      append = TRUE\n    )\n    if (use.weights) {\n      warning(\"weights ignored\")\n    }\n    use.weights <- FALSE\n  } else if (family$family == \"binomial\") {\n    # scale <- FALSE\n    cat(\n      resp,\n      \"[i] ~ dbin(mu[i],w[i]) } ## response \\n\",\n      sep = \"\",\n      file = file,\n      append = TRUE\n    )\n    use.weights <- TRUE\n  } else if (family$family == \"Gamma\") {\n    if (use.weights) {\n      cat(\n        resp,\n        \"[i] ~ dgamma(r*w[i],r*w[i]/mu[i]) } ## response \\n\",\n        sep = \"\",\n        file = file,\n        append = TRUE\n      )\n    } else {\n      cat(\n        resp,\n        \"[i] ~ dgamma(r,r/mu[i]) } ## response \\n\",\n        sep = \"\",\n        file = file,\n        append = TRUE\n      )\n    }\n    cat(\n      \"  r ~ dgamma(.05,.005) ## scale parameter prior \\n\",\n      file = file,\n      append = TRUE\n    )\n    cat(\n      \"  scale <- 1/r ## convert r to standard GLM scale\\n\",\n      file = file,\n      append = TRUE\n    )\n  } else {\n    stop(\"family not implemented yet\")\n  }\n  use.weights\n}\n"
  },
  {
    "path": "R/mvgam_trend_types.R",
    "content": "#' Specify autoregressive dynamic processes in \\pkg{mvgam}\n#'\n#' Set up autoregressive or autoregressive moving average trend models in\n#' \\pkg{mvgam}. These functions do not evaluate their arguments – they exist\n#' purely to help set up a model with particular autoregressive trend models.\n#'\n#' @param ma \\code{Logical}. Include moving average terms of order \\code{1}?\n#'   Default is \\code{FALSE}.\n#'\n#' @param cor \\code{Logical}. Include correlated process errors as part of a\n#'   multivariate normal process model? If \\code{TRUE} and if\n#'   \\code{n_series > 1} in the supplied data, a fully structured covariance\n#'   matrix will be estimated for the process errors. Default is \\code{FALSE}.\n#'\n#' @param p A non-negative integer specifying the autoregressive (AR) order.\n#'   Default is \\code{1}. Cannot currently be larger than \\code{3} for `AR`\n#'   terms, and cannot be anything other than `1` for continuous time AR\n#'   (`CAR`) terms.\n#'\n#' @param gr An optional grouping variable, which must be a `factor` in the\n#'   supplied `data`, for setting up hierarchical residual correlation\n#'   structures. If specified, this will automatically set `cor = TRUE` and set\n#'   up a model where the residual correlations for a specific level of `gr`\n#'   are modelled hierarchically:\n#'\n#'   \\eqn{\\Omega_{group} = \\alpha_{cor}\\Omega_{global} +\n#'   (1 - \\alpha_{cor})\\Omega_{group, local}},\n#'\n#'   where \\eqn{\\Omega_{global}} is a *global* correlation matrix,\n#'   \\eqn{\\Omega_{group, local}} is a *local deviation* correlation matrix and\n#'   \\eqn{\\alpha_{cor}} is a weighting parameter controlling how strongly the\n#'   local correlation matrix \\eqn{\\Omega_{group}} is shrunk towards the global\n#'   correlation matrix \\eqn{\\Omega_{global}} (larger values of\n#'   \\eqn{\\alpha_{cor}} indicate a greater degree of shrinkage, i.e. a greater\n#'   degree of partial pooling).\n#'\n#'   When used within a `VAR()` model, this essentially sets up a hierarchical\n#'   panel vector autoregression where both the autoregressive and correlation\n#'   matrices are learned hierarchically. If `gr` is supplied then `subgr`\n#'   *must* also be supplied.\n#'\n#' @param subgr A subgrouping `factor` variable specifying which element in\n#'   `data` represents the different time series. Defaults to `series`, but\n#'   note that models that use the hierarchical correlations, where the\n#'   `subgr` time series are measured in each level of `gr`, *should not*\n#'   include a `series` element in `data`. Rather, this element will be created\n#'   internally based on the supplied variables for `gr` and `subgr`.\n#'\n#'   For example, if you are modelling temporal counts for a group of species\n#'   (labelled as `species` in `data`) across three different geographical\n#'   regions (labelled as `region`), and you would like the residuals to be\n#'   correlated within regions, then you should specify `gr = region` and\n#'   `subgr = species`. Internally, `mvgam()` will create the `series` element\n#'   for the data using:\n#'\n#'   `series = interaction(group, subgroup, drop = TRUE)`\n#'\n#' @return An object of class \\code{mvgam_trend}, which contains a list of\n#'   arguments to be interpreted by the parsing functions in \\pkg{mvgam}.\n#'\n#' @rdname RW\n#'\n#' @details Use `vignette(\"mvgam_overview\")` to see the full details of\n#'   available stochastic trend types in \\pkg{mvgam}, or view the rendered\n#'   version on the package website at:\n#'   https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' # A short example to illustrate CAR(1) models\n#' # Function to simulate CAR1 data with seasonality\n#' sim_corcar1 = function(n = 125,\n#'                        phi = 0.5,\n#'                        sigma = 2,\n#'                        sigma_obs = 0.75) {\n#'   # Sample irregularly spaced time intervals\n#'   time_dis <- c(1, runif(n - 1, 0, 5))\n#'\n#'   # Set up the latent dynamic process\n#'   x <- vector(length = n); x[1] <- -0.3\n#'   for (i in 2:n) {\n#'     # zero-distances will cause problems in sampling, so mvgam uses a\n#'     # minimum threshold; this simulation function emulates that process\n#'     if (time_dis[i] == 0) {\n#'       x[i] <- rnorm(\n#'         1,\n#'         mean = (phi^1e-3) * x[i - 1],\n#'         sd = sigma * (1 - phi^(2 * 1e-3)) / (1 - phi^2)\n#'       )\n#'     } else {\n#'       x[i] <- rnorm(\n#'         1,\n#'         mean = (phi^time_dis[i]) * x[i - 1],\n#'         sd = sigma * (1 - phi^(2 * time_dis[i])) / (1 - phi^2)\n#'       )\n#'     }\n#'   }\n#'\n#'   # Add 12-month seasonality\n#'   cov1 <- sin(2 * pi * (1:n) / 12)\n#'   cov2 <- cos(2 * pi * (1:n) / 12)\n#'   beta1 <- runif(1, 0.3, 0.7)\n#'   beta2 <- runif(1, 0.2, 0.5)\n#'   seasonality <- beta1 * cov1 + beta2 * cov2\n#'\n#'   # Take Gaussian observations with error and return\n#'   data.frame(\n#'     y = rnorm(n, mean = x + seasonality, sd = sigma_obs),\n#'     season = rep(1:12, 20)[1:n],\n#'     time = cumsum(time_dis)\n#'   )\n#' }\n#'\n#' # Sample two time series\n#' dat <- rbind(\n#'   dplyr::bind_cols(\n#'     sim_corcar1(phi = 0.65, sigma_obs = 0.55),\n#'     data.frame(series = 'series1')\n#'   ),\n#'   dplyr::bind_cols(\n#'     sim_corcar1(phi = 0.8, sigma_obs = 0.35),\n#'     data.frame(series = 'series2')\n#'   )\n#' ) %>%\n#'   dplyr::mutate(series = as.factor(series))\n#'\n#' # mvgam with CAR(1) trends and series-level seasonal smooths\n#' mod <- mvgam(\n#'   formula = y ~ -1,\n#'   trend_formula = ~ s(season, bs = 'cc', k = 5, by = trend),\n#'   trend_model = CAR(),\n#'   priors = c(\n#'     prior(exponential(3), class = sigma),\n#'     prior(beta(4, 4), class = sigma_obs)\n#'   ),\n#'   data = dat,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # View usual summaries and plots\n#' summary(mod)\n#' conditional_effects(mod, type = 'expected')\n#' plot(mod, type = 'trend', series = 1)\n#' plot(mod, type = 'trend', series = 2)\n#' plot(mod, type = 'residuals', series = 1)\n#' plot(mod, type = 'residuals', series = 2)\n#' mcmc_plot(\n#'   mod,\n#'   variable = 'ar1',\n#'   regex = TRUE,\n#'   type = 'hist'\n#' )\n#'\n#' # Now an example illustrating hierarchical dynamics\n#' set.seed(123)\n#'\n#' # Simulate three species monitored in three different regions\n#' simdat1 <- sim_mvgam(\n#'   trend_model = VAR(cor = TRUE),\n#'   prop_trend = 0.95,\n#'   n_series = 3,\n#'   mu = c(1, 2, 3)\n#' )\n#' simdat2 <- sim_mvgam(\n#'   trend_model = VAR(cor = TRUE),\n#'   prop_trend = 0.95,\n#'   n_series = 3,\n#'   mu = c(1, 2, 3)\n#' )\n#' simdat3 <- sim_mvgam(\n#'   trend_model = VAR(cor = TRUE),\n#'   prop_trend = 0.95,\n#'   n_series = 3,\n#'   mu = c(1, 2, 3)\n#' )\n#'\n#' # Set up the data but DO NOT include 'series'\n#' all_dat <- rbind(\n#'   simdat1$data_train %>%\n#'     dplyr::mutate(region = 'qld'),\n#'   simdat2$data_train %>%\n#'     dplyr::mutate(region = 'nsw'),\n#'   simdat3$data_train %>%\n#'     dplyr::mutate(region = 'vic')\n#' ) %>%\n#'   dplyr::mutate(\n#'     species = gsub('series', 'species', series),\n#'     species = as.factor(species),\n#'     region = as.factor(region)\n#'   ) %>%\n#'   dplyr::arrange(series, time) %>%\n#'   dplyr::select(-series)\n#'\n#' # Check priors for a hierarchical AR1 model\n#' get_mvgam_priors(\n#'   formula = y ~ species,\n#'   trend_model = AR(gr = region, subgr = species),\n#'   data = all_dat\n#' )\n#'\n#' # Fit the model\n#' mod <- mvgam(\n#'   formula = y ~ species,\n#'   trend_model = AR(gr = region, subgr = species),\n#'   data = all_dat,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Check standard outputs\n#' summary(mod)\n#'\n#' # Inspect posterior estimates for the correlation weighting parameter\n#' mcmc_plot(mod, variable = 'alpha_cor', type = 'hist')\n#' }\n#' @export\nRW = function(ma = FALSE, cor = FALSE, gr = NA, subgr = NA) {\n  # Validate the supplied groupings and correlation argument\n  gr <- deparse0(substitute(gr))\n  subgr <- deparse0(substitute(subgr))\n\n  if (gr == 'NA') {\n    subgr <- 'series'\n  }\n\n  if (gr != 'NA') {\n    if (subgr == 'NA') {\n      stop(\n        'argument \"subgr\" must be supplied if \"gr\" is also supplied',\n        call. = FALSE\n      )\n    } else if (subgr == 'series') {\n      stop(\n        'argument \"subgr\" cannot be set to \"series\" if \"gr\" is also supplied',\n        call. = FALSE\n      )\n    } else {\n      cor <- TRUE\n    }\n  }\n\n  out <- structure(\n    list(\n      trend_model = 'RW',\n      ma = ma,\n      cor = cor,\n      unit = 'time',\n      gr = gr,\n      subgr = subgr,\n      label = match.call()\n    ),\n    class = 'mvgam_trend',\n    param_info = list(\n      param_names = c(\n        'trend',\n        'tau',\n        'sigma',\n        'theta',\n        'Sigma',\n        'error',\n        'drift'\n      ),\n      labels = c(\n        'trend_estimates',\n        'precision_parameter',\n        'standard_deviation',\n        'moving_average_coef',\n        'covariance_matrix',\n        'process_errors',\n        'drift_parameter'\n      )\n    )\n  )\n}\n\n#' @rdname RW\n#' @export\nAR = function(p = 1, ma = FALSE, cor = FALSE, gr = NA, subgr = NA) {\n  validate_pos_integer(p)\n  if (p > 3) {\n    stop(\"Argument 'p' must be <= 3\", call. = FALSE)\n  }\n\n  # Validate the supplied groupings and correlation argument\n  gr <- deparse0(substitute(gr))\n  subgr <- deparse0(substitute(subgr))\n\n  if (gr == 'NA') {\n    subgr <- 'series'\n  }\n\n  if (gr != 'NA') {\n    if (subgr == 'NA') {\n      stop(\n        'argument \"subgr\" must be supplied if \"gr\" is also supplied',\n        call. = FALSE\n      )\n    } else if (subgr == 'series') {\n      stop(\n        'argument \"subgr\" cannot be set to \"series\" if \"gr\" is also supplied',\n        call. = FALSE\n      )\n    } else {\n      cor <- TRUE\n    }\n  }\n\n  # Determine parameter names based on AR order\n  ar_params <- paste0('ar', 1:p)\n  param_names <- c(\n    'trend',\n    'tau',\n    'sigma',\n    ar_params,\n    'theta',\n    'Sigma',\n    'error',\n    'drift'\n  )\n  param_labels <- c(\n    'trend_estimates',\n    'precision_parameter',\n    'standard_deviation',\n    paste0('autoregressive_coef_', 1:p),\n    'moving_average_coef',\n    'covariance_matrix',\n    'process_errors',\n    'drift_parameter'\n  )\n\n  out <- structure(\n    list(\n      trend_model = paste0('AR', p),\n      ma = ma,\n      cor = cor,\n      unit = 'time',\n      gr = gr,\n      subgr = subgr,\n      label = match.call()\n    ),\n    class = 'mvgam_trend',\n    param_info = list(\n      param_names = param_names,\n      labels = param_labels\n    )\n  )\n}\n\n#' @rdname RW\n#' @export\nCAR = function(p = 1) {\n  validate_pos_integer(p)\n  if (p > 1) {\n    stop(\"Argument 'p' must be = 1\", call. = FALSE)\n  }\n  out <- structure(\n    list(\n      trend_model = paste0('CAR', p),\n      ma = FALSE,\n      cor = FALSE,\n      unit = 'time',\n      gr = 'NA',\n      subgr = 'series',\n      label = match.call()\n    ),\n    class = 'mvgam_trend',\n    param_info = list(\n      param_names = c('trend', 'tau', 'sigma', 'ar1', 'Sigma'),\n      labels = c(\n        'trend_estimates',\n        'precision_parameter',\n        'standard_deviation',\n        'autoregressive_coef',\n        'covariance_matrix'\n      )\n    )\n  )\n}\n\n#' @rdname RW\n#' @export\nVAR = function(ma = FALSE, cor = FALSE, gr = NA, subgr = NA) {\n  # Validate the supplied groupings and correlation argument\n  gr <- deparse0(substitute(gr))\n  subgr <- deparse0(substitute(subgr))\n\n  if (gr == 'NA') {\n    subgr <- 'series'\n  }\n\n  if (gr != 'NA') {\n    if (subgr == 'NA') {\n      stop(\n        'argument \"subgr\" must be supplied if \"gr\" is also supplied',\n        call. = FALSE\n      )\n    } else if (subgr == 'series') {\n      stop(\n        'argument \"subgr\" cannot be set to \"series\" if \"gr\" is also supplied',\n        call. = FALSE\n      )\n    } else {\n      cor <- TRUE\n    }\n  }\n\n  out <- structure(\n    list(\n      trend_model = 'VAR',\n      ma = ma,\n      cor = cor,\n      unit = 'time',\n      gr = gr,\n      subgr = subgr,\n      label = match.call()\n    ),\n    class = 'mvgam_trend',\n    param_info = list(\n      param_names = c(\n        'trend',\n        'A',\n        'Sigma',\n        'P_real',\n        'sigma',\n        'theta',\n        'error',\n        'drift'\n      ),\n      labels = c(\n        'trend_estimates',\n        'var_coefficient_matrix',\n        'covariance_matrix',\n        'stationary_precision',\n        'standard_deviation',\n        'moving_average_matrix',\n        'process_errors',\n        'drift_parameter'\n      )\n    )\n  )\n}\n\n#' Specify dynamic Gaussian process trends in \\pkg{mvgam} models\n#'\n#' Set up low-rank approximate Gaussian Process trend models using Hilbert\n#' basis expansions in \\pkg{mvgam}. This function does not evaluate its\n#' arguments – it exists purely to help set up a model with particular GP\n#' trend models.\n#'\n#' @param ... unused\n#'\n#' @return An object of class \\code{mvgam_trend}, which contains a list of\n#'   arguments to be interpreted by the parsing functions in \\pkg{mvgam}.\n#'\n#' @details A GP trend is estimated for each series using Hilbert space\n#'   approximate Gaussian Processes. In `mvgam`, latent squared exponential GP\n#'   trends are approximated using by default \\code{20} basis functions and\n#'   using a multiplicative factor of `c = 5/4`, which saves computational\n#'   costs compared to fitting full GPs while adequately estimating GP\n#'   \\code{alpha} and \\code{rho} parameters.\n#'\n#' @rdname GP\n#'\n#' @author Nicholas J Clark\n#'\n#' @references Riutort-Mayol G, Burkner PC, Andersen MR, Solin A and Vehtari A\n#'   (2023). Practical Hilbert space approximate Bayesian Gaussian processes for\n#'   probabilistic programming. Statistics and Computing 33, 1.\n#'   https://doi.org/10.1007/s11222-022-10167-2\n#'\n#' @seealso \\code{\\link[brms]{gp}}\n#'\n#' @export\nGP = function(...) {\n  out <- structure(\n    list(\n      trend_model = 'GP',\n      ma = FALSE,\n      cor = FALSE,\n      unit = 'time',\n      gr = 'NA',\n      subgr = 'series',\n      label = match.call()\n    ),\n    class = 'mvgam_trend',\n    param_info = list(\n      param_names = c('trend', 'alpha_gp', 'rho_gp', 'b_gp'),\n      labels = c(\n        'trend_estimates',\n        'marginal_deviation',\n        'length_scale',\n        'basis_coefficients'\n      )\n    )\n  )\n}\n\n#' Specify piecewise linear or logistic trends in \\pkg{mvgam} models\n#'\n#' Set up piecewise linear or logistic trend models in \\code{mvgam}. These\n#' functions do not evaluate their arguments – they exist purely to help set up\n#' a model with particular piecewise trend models.\n#'\n#' @param n_changepoints A non-negative integer specifying the number of\n#'   potential changepoints. Potential changepoints are selected uniformly from\n#'   the first `changepoint_range` proportion of timepoints in \\code{data}.\n#'   Default is `10`.\n#'\n#' @param changepoint_range Proportion of history in \\code{data} in which trend\n#'   changepoints will be estimated. Defaults to `0.8` for the first 80%.\n#'\n#' @param changepoint_scale Parameter modulating the flexibility of the\n#'   automatic changepoint selection by altering the scale parameter of a\n#'   Laplace distribution. The resulting prior will be\n#'   `double_exponential(0, changepoint_scale)`. Large values will allow many\n#'   changepoints and a more flexible trend, while small values will allow few\n#'   changepoints. Default is `0.05`.\n#'\n#' @param growth Character string specifying either `'linear'` or `'logistic'`\n#'   growth of the trend. If `'logistic'`, a variable labelled `cap` MUST be in\n#'   \\code{data} to specify the maximum saturation point for the trend (see\n#'   details and examples in \\code{\\link{mvgam}} for more information). Default\n#'   is `'linear'`.\n#'\n#' @author Nicholas J Clark\n#'\n#' @references Taylor, Sean J., and Benjamin Letham. \"Forecasting at scale.\"\n#'   The American Statistician 72.1 (2018): 37–45.\n#'\n#' @return An object of class \\code{mvgam_trend}, which contains a list of\n#'   arguments to be interpreted by the parsing functions in \\code{mvgam}.\n#'\n#' @details\n#' *Offsets and intercepts*:\n#' For each of these trend models, an offset parameter is included in the trend\n#' estimation process. This parameter will be incredibly difficult to identify\n#' if you also include an intercept in the observation formula. For that\n#' reason, it is highly recommended that you drop the intercept from the\n#' formula (i.e. `y ~ x + 0` or `y ~ x - 1`, where `x` are your optional\n#' predictor terms).\n#'\n#' *Logistic growth and the cap variable*:\n#' When forecasting growth, there is often some maximum achievable point that a\n#' time series can reach. For example, total market size, total population size\n#' or carrying capacity in population dynamics. It can be advantageous for the\n#' forecast to saturate at or near this point so that predictions are more\n#' sensible.\n#'\n#' This function allows you to make forecasts using a logistic growth trend\n#' model, with a specified carrying capacity. Note that this capacity does not\n#' need to be static over time; it can vary with each series × timepoint\n#' combination if necessary. But you must supply a `cap` value for each\n#' observation in the data when using `growth = 'logistic'`.\n#'\n#' For observation families that use a non-identity link function, the `cap`\n#' value will be internally transformed to the link scale (i.e. your specified\n#' `cap` will be log-transformed if you are using a `poisson()` or `nb()`\n#' family). It is therefore important that you specify the `cap` values on the\n#' scale of your outcome. Note also that no missing values are allowed in\n#' `cap`.\n#'\n#' @rdname piecewise_trends\n#'\n#' @examples\n#' \\dontrun{\n#' # Example of logistic growth with possible changepoints\n#' dNt = function(r, N, k) {\n#'   r * N * (k - N)\n#' }\n#'\n#' Nt = function(r, N, t, k) {\n#'   for (i in 1:(t - 1)) {\n#'     if (i %in% c(5, 15, 25, 41, 45, 60, 80)) {\n#'       N[i + 1] <- max(\n#'         1,\n#'         N[i] + dNt(r + runif(1, -0.1, 0.1), N[i], k)\n#'       )\n#'     } else {\n#'       N[i + 1] <- max(1, N[i] + dNt(r, N[i], k))\n#'     }\n#'   }\n#'   N\n#' }\n#'\n#' set.seed(11)\n#' expected <- Nt(0.004, 2, 100, 30)\n#' plot(expected, xlab = 'Time')\n#'\n#' y <- rpois(100, expected)\n#' plot(y, xlab = 'Time')\n#'\n#' mod_data <- data.frame(\n#'   y = y,\n#'   time = 1:100,\n#'   cap = 35,\n#'   series = as.factor('series_1')\n#' )\n#' plot_mvgam_series(data = mod_data)\n#'\n#' mod <- mvgam(\n#'   y ~ 0,\n#'   trend_model = PW(growth = 'logistic'),\n#'   family = poisson(),\n#'   data = mod_data,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#' summary(mod)\n#'\n#' hc <- hindcast(mod)\n#' plot(hc)\n#'\n#' library(ggplot2)\n#' mcmc_plot(mod, variable = 'delta_trend', regex = TRUE) +\n#'   scale_y_discrete(labels = mod$trend_model$changepoints) +\n#'   labs(\n#'     y = 'Potential changepoint',\n#'     x = 'Rate change'\n#'   )\n#'\n#' how_to_cite(mod)\n#' }\n#'\n#' @export\nPW = function(\n  n_changepoints = 10,\n  changepoint_range = 0.8,\n  changepoint_scale = 0.05,\n  growth = 'linear'\n) {\n  growth <- match.arg(growth, choices = c('linear', 'logistic'))\n  validate_proportional(changepoint_range)\n  validate_pos_integer(n_changepoints)\n  validate_pos_real(changepoint_scale)\n\n  trend_model <- 'PWlinear'\n  if (growth == 'logistic') {\n    trend_model = 'PWlogistic'\n  }\n  out <- structure(\n    list(\n      trend_model = trend_model,\n      n_changepoints = n_changepoints,\n      changepoint_range = changepoint_range,\n      changepoint_scale = changepoint_scale,\n      ma = FALSE,\n      cor = FALSE,\n      unit = 'time',\n      gr = 'NA',\n      subgr = 'series',\n      label = match.call()\n    ),\n    class = 'mvgam_trend',\n    param_info = list(\n      param_names = c('trend', 'delta_trend', 'k_trend', 'm_trend'),\n      labels = c(\n        'trend_estimates',\n        'rate_changes',\n        'growth_rate',\n        'offset_parameter'\n      )\n    )\n  )\n}\n\n#' Specify correlated residual processes in \\pkg{mvgam}\n#'\n#' Set up latent correlated multivariate Gaussian residual processes in\n#' \\pkg{mvgam}. This function does not evaluate its arguments – it exists\n#' purely to help set up a model with particular error processes\n#'\n#' @param unit The unquoted name of the variable that represents the unit of\n#'   analysis in `data` over which latent residuals should be correlated. This\n#'   variable should be either a `numeric` or `integer` variable in the\n#'   supplied `data`. Defaults to `time` to be consistent with other\n#'   functionalities in \\pkg{mvgam}, though note that the data need not be time\n#'   series in this case. See examples below for further details and\n#'   explanations\n#'\n#' @param gr An optional grouping variable, which must be a `factor` in the\n#'   supplied `data`, for setting up hierarchical residual correlation\n#'   structures. If specified, this will automatically set up a model where the\n#'   residual correlations for a specific level of `gr` are modelled\n#'   hierarchically:\n#'\n#'   \\eqn{\\Omega_{group} = p\\Omega_{global} + (1 - p)\\Omega_{group, local}},\n#'\n#'   where \\eqn{\\Omega_{global}} is a *global* correlation matrix,\n#'   \\eqn{\\Omega_{group, local}} is a *local deviation* correlation matrix, and\n#'   \\eqn{p} is a weighting parameter controlling how strongly the local\n#'   correlation matrix \\eqn{\\Omega_{group}} is shrunk towards the global\n#'   correlation matrix \\eqn{\\Omega_{global}}. If `gr` is supplied then `subgr`\n#'   *must* also be supplied\n#'\n#' @param subgr A subgrouping `factor` variable specifying which element in\n#'   `data` represents the different observational units. Defaults to `series`\n#'   to be consistent with other functionalities in \\pkg{mvgam}, though note\n#'   that the data need not be time series in this case\n#'\n#'   Models that use the hierarchical correlations (by supplying a value for\n#'   `gr`) *should not* include a `series` element in `data`. Rather, this\n#'   element will be created internally based on the supplied variables for `gr`\n#'   and `subgr`\n#'\n#'   For example, if you are modelling counts for a group of species (labelled\n#'   as `species` in the data) across sampling sites (labelled as `site` in the\n#'   data) in three different geographical regions (labelled as `region`), and\n#'   you would like the residuals to be correlated within regions, then you\n#'   should specify `unit = site`, `gr = region`, and `subgr = species`\n#'\n#'   Internally, `mvgam()` will appropriately order the data by `unit` (in this\n#'   case, by `site`) and create the `series` element for the data using\n#'   something like:\n#'\n#'   `series = as.factor(paste0(group, '_', subgroup))`\n#'\n#' @return An object of class \\code{mvgam_trend}, which contains a list of\n#'   arguments to be interpreted by the parsing functions in \\pkg{mvgam}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate counts of four species over ten sampling locations\n#' site_dat <- data.frame(\n#'   site = rep(1:10, 4),\n#'   species = as.factor(sort(rep(letters[1:4], 10))),\n#'   y = c(NA, rpois(39, 3))\n#' )\n#' head(site_dat)\n#'\n#' # Set up a correlated residual (i.e. Joint Species Distribution) model\n#' trend_model <- ZMVN(unit = site, subgr = species)\n#' mod <- mvgam(\n#'   y ~ species,\n#'   trend_model = ZMVN(unit = site, subgr = species),\n#'   data = site_dat,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Inspect the estimated species-species residual covariances\n#' mcmc_plot(mod, variable = 'Sigma', regex = TRUE, type = 'hist')\n#'\n#' # A hierarchical correlation example\n#' Sigma <- matrix(\n#'   c(1, -0.4, 0.5,\n#'     -0.4, 1, 0.3,\n#'     0.5, 0.3, 1),\n#'   byrow = TRUE,\n#'   nrow = 3\n#' )\n#'\n#' make_site_dat <- function(...) {\n#'   errors <- mgcv::rmvn(\n#'     n = 30,\n#'     mu = c(0.6, 0.8, 1.8),\n#'     V = Sigma\n#'   )\n#'   site_dat <- do.call(rbind, lapply(1:3, function(spec) {\n#'     data.frame(\n#'       y = rpois(30, lambda = exp(errors[, spec])),\n#'       species = paste0('species', spec),\n#'       site = 1:30\n#'     )\n#'   }))\n#'   site_dat\n#' }\n#'\n#' site_dat <- rbind(\n#'   make_site_dat() %>%\n#'     dplyr::mutate(group = 'group1'),\n#'   make_site_dat() %>%\n#'     dplyr::mutate(group = 'group2')\n#' ) %>%\n#'   dplyr::mutate(\n#'     species = as.factor(species),\n#'     group = as.factor(group)\n#'   )\n#'\n#' # Fit the hierarchical correlated residual model\n#' mod <- mvgam(\n#'   y ~ species,\n#'   trend_model = ZMVN(unit = site, gr = group, subgr = species),\n#'   data = site_dat,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Inspect the estimated species-species residual covariances\n#' mcmc_plot(mod, variable = 'Sigma', regex = TRUE, type = 'hist')\n#' }\n#'\n#' @export\nZMVN = function(unit = time, gr = NA, subgr = series) {\n  # Validate the supplied groupings and correlation argument\n  unit <- deparse0(substitute(unit))\n  gr <- deparse0(substitute(gr))\n  subgr <- deparse0(substitute(subgr))\n  if (subgr == 'NA') {\n    stop('argument \"subgr\" cannot be NA', call. = FALSE)\n  }\n\n  if (unit == 'NA') {\n    stop('argument \"unit\" cannot be NA', call. = FALSE)\n  }\n\n  out <- structure(\n    list(\n      trend_model = 'ZMVN',\n      ma = FALSE,\n      cor = TRUE,\n      unit = unit,\n      gr = gr,\n      subgr = subgr,\n      label = match.call()\n    ),\n    class = 'mvgam_trend',\n    param_info = list(\n      param_names = c('trend', 'tau', 'sigma', 'theta', 'Sigma', 'error'),\n      labels = c(\n        'trend_estimates',\n        'precision_parameter',\n        'standard_deviation',\n        'correlation_parameter',\n        'covariance_matrix',\n        'process_errors'\n      )\n    )\n  )\n}\n"
  },
  {
    "path": "R/noncent_trend.R",
    "content": "#' Internal functiosn to change dynamic AR or RW trends\n#' to a non-centred parameterisation for potentially big speed gains\n#' @noRd\nnoncent_trend = function(model_file, trend_model, drift) {\n  # Replace trend with trend_raw in params\n  model_file[grep(\"matrix[n, n_series] trend;\", model_file, fixed = TRUE)] <-\n    \"matrix[n, n_series] trend_raw;\"\n  model_file[grep(\"// latent trends\", model_file, fixed = TRUE)] <-\n    \"// raw latent trends\"\n\n  # Add trend to transformed params\n  if (drift) {\n    drift_text <- ' drift[s] +'\n  } else {\n    drift_text <- NULL\n  }\n  if (trend_model == 'RW') {\n    model_file[grep(\"vector[num_basis] b;\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"vector[num_basis] b;\\n\\n\",\n        \"// latent trends\\n\",\n        \"matrix[n, n_series] trend;\\n\",\n        \"trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));\\n\",\n        \"for (s in 1 : n_series) {\\n\",\n        \"trend[2 : n, s] +=\",\n        drift_text,\n        \" trend[1 : (n - 1), s];\\n\",\n        \"}\\n\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR1') {\n    model_file[grep(\"vector[num_basis] b;\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"vector[num_basis] b;\\n\\n\",\n        \"// latent trends\\n\",\n        \"matrix[n, n_series] trend;\\n\",\n        \"trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));\\n\",\n        \"for (s in 1 : n_series) {\\n\",\n        \"trend[2 : n, s] +=\",\n        drift_text,\n        \" ar1[s] * trend[1 : (n - 1), s];\\n\",\n        \"}\\n\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'CAR1') {\n    model_file[grep(\"vector[num_basis] b;\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"vector[num_basis] b;\\n\\n\",\n        \"// latent trends\\n\",\n        \"matrix[n, n_series] trend;\\n\",\n        \"trend = trend_raw .* rep_matrix(sigma', n) .*\",\n        \"(1 - rep_matrix(ar1', n) .^ (2 * to_matrix(time_dis))) ./\",\n        \"(1 - rep_matrix(ar1', n) .^ 2);\\n\",\n        \"for (s in 1 : n_series) {\\n\",\n        \"trend[2 : n, s] +=\",\n        drift_text,\n        \" pow(ar1[s], to_vector(time_dis[2 : n, s])) .* trend[1 : (n - 1), s];\\n\",\n        \"}\\n\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR2') {\n    model_file[grep(\"vector[num_basis] b;\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"vector[num_basis] b;\\n\\n\",\n        \"// latent trends\\n\",\n        \"matrix[n, n_series] trend;\\n\",\n        \"trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));\\n\",\n        \"for (s in 1 : n_series) {\\n\",\n        \"trend[2, s] +=\",\n        drift_text,\n        \" ar1[s] * trend[1, s];\\n\",\n        \"trend[3 : n, s] +=\",\n        drift_text,\n        \" ar1[s] * trend[2 : (n - 1), s] + ar2[s] * trend[1:(n - 2), s];\\n\",\n        \"}\\n\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR3') {\n    model_file[grep(\"vector[num_basis] b;\", model_file, fixed = TRUE)] <-\n      paste0(\n        \"vector[num_basis] b;\\n\\n\",\n        \"// latent trends\\n\",\n        \"matrix[n, n_series] trend;\\n\",\n        \"trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));\\n\",\n        \"for (s in 1 : n_series) {\\n\",\n        \"trend[2, s] +=\",\n        drift_text,\n        \" ar1[s] * trend[1, s];\\n\",\n        \"trend[3, s] +=\",\n        drift_text,\n        \" ar1[s] * trend[2, s] + ar2[s] * trend[1, s] ;\\n\",\n        \"trend[4 : n, s] +=\",\n        drift_text,\n        \" ar1[s] * trend[3 : (n - 1), s] + ar2[s] * trend[2:(n - 2), s] + ar3[s] * trend[1:(n - 3), s];\\n\",\n        \"}\\n\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Remove trend statements from model block and replace with the\n  # z scores\n  trend_start <- grep(\"// trend estimates\", model_file, fixed = TRUE)\n  end_braces <- grep(\"}\", model_file, fixed = TRUE)\n  p <- function(f, b) function(a) f(a, b)\n  trend_end <- end_braces[Position(p(`==`, 1), sign(end_braces - trend_start))]\n  model_file <- model_file[-(trend_start:trend_end)]\n\n  model_file[\n    grep(\n      \"// priors for latent trend variance parameters\",\n      model_file,\n      fixed = TRUE\n    ) +\n      1\n  ] <-\n    paste0(\n      model_file[\n        grep(\n          \"// priors for latent trend variance parameters\",\n          model_file,\n          fixed = TRUE\n        ) +\n          1\n      ],\n      '\\n',\n      \"to_vector(trend_raw) ~ std_normal();\"\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n  model_file\n}\n\n#' @noRd\nnoncent_lv = function(model_file, trend_model, drift) {\n  # Replace LV with LV_raw in params\n  model_file[grep(\"matrix[n, n_lv] LV;\", model_file, fixed = TRUE)] <-\n    \"matrix[n, n_lv] LV_raw;\"\n  model_file[grep(\"// latent states\", model_file, fixed = TRUE)] <-\n    \"// raw latent states\"\n\n  # Add LV to transformed params\n  model_file[grep(\"vector[num_basis] b;\", model_file, fixed = TRUE)] <-\n    paste0(\n      \"vector[num_basis] b;\\n\\n\",\n      \"// latent states\\n\",\n      \"matrix[n, n_lv] LV;\\n\"\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add LV calculations in transformed params\n  if (trend_model == 'None') {\n    model_file[grep(\n      \"trend_mus = X_trend * b_trend;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"trend_mus = X_trend * b_trend;\\n\\n\",\n        \"LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));\\n\",\n        \"for(j in 1:n_lv){\\n\",\n        \"for(i in 1:n){\\n\",\n        \"LV[i, j] += trend_mus[ytimes_trend[i, j]];\\n\",\n        \"}\\n\",\n        \"}\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'RW') {\n    model_file[grep(\n      \"trend_mus = X_trend * b_trend;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"trend_mus = X_trend * b_trend;\\n\\n\",\n        \"LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));\\n\",\n        \"for(j in 1:n_lv){\\n\",\n        \"LV[1, j] += trend_mus[ytimes_trend[1, j]];\\n\",\n        \"for(i in 2:n){\\n\",\n        \"LV[i, j] += trend_mus[ytimes_trend[i, j]] + 1 * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]);\\n\",\n        \"}\\n\",\n        \"}\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR1') {\n    model_file[grep(\n      \"trend_mus = X_trend * b_trend;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"trend_mus = X_trend * b_trend;\\n\\n\",\n        \"LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));\\n\",\n        \"for(j in 1:n_lv){\\n\",\n        \"LV[1, j] += trend_mus[ytimes_trend[1, j]];\\n\",\n        \"for(i in 2:n){\\n\",\n        \"LV[i, j] += trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]);\\n\",\n        \"}\\n\",\n        \"}\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'CAR1') {\n    model_file[grep(\n      \"trend_mus = X_trend * b_trend;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"trend_mus = X_trend * b_trend;\\n\\n\",\n        \"LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));\\n\",\n        \"for(j in 1:n_lv){\\n\",\n        \"LV[1, j] += trend_mus[ytimes_trend[1, j]];\\n\",\n        \"for(i in 2:n){\\n\",\n        \"LV[i, j] += trend_mus[ytimes_trend[i, j]] + pow(ar1[j], time_dis[i, j]) * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]);\\n\",\n        \"}\\n\",\n        \"}\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR2') {\n    model_file[grep(\n      \"trend_mus = X_trend * b_trend;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"trend_mus = X_trend * b_trend;\\n\\n\",\n        \"LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));\\n\",\n        \"for(j in 1:n_lv){\\n\",\n        \"LV[1, j] += trend_mus[ytimes_trend[1, j]];\\n\",\n        \"LV[2, j] += trend_mus[ytimes_trend[2, j]] + ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]);\\n\",\n        \"for(i in 3:n){\\n\",\n        \"LV[i, j] += trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]);\\n\",\n        \"}\\n\",\n        \"}\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR3') {\n    model_file[grep(\n      \"trend_mus = X_trend * b_trend;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"trend_mus = X_trend * b_trend;\\n\\n\",\n        \"LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));\\n\",\n        \"for(j in 1:n_lv){\\n\",\n        \"LV[1, j] += trend_mus[ytimes_trend[1, j]];\\n\",\n        \"LV[2, j] += trend_mus[ytimes_trend[2, j]] + ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]);\\n\",\n        \"LV[3, j] += trend_mus[ytimes_trend[2, j]] + ar1[j] * (LV[2, j] - trend_mus[ytimes_trend[2, j]]) + ar2[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]);\\n\",\n        \"for(i in 4:n){\\n\",\n        \"LV[i, j] += trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]) + ar3[j] * (LV[i - 3, j] - trend_mus[ytimes_trend[i - 3, j]]);\\n\",\n        \"}\\n\",\n        \"}\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Remove LV statements from model block and replace with the\n  # z scores\n  if (trend_model == 'None') {\n    trend_start <- grep(\n      \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]], sigma[j]);\",\n      model_file,\n      fixed = TRUE\n    ) -\n      2\n    trend_end <- grep(\n      \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]], sigma[j]);\",\n      model_file,\n      fixed = TRUE\n    ) +\n      2\n  } else {\n    if (\n      any(grepl(\n        \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\",\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      trend_start <- grep(\n        \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\",\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n    } else {\n      trend_start <- grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n    }\n\n    end_braces <- grep(\"}\", model_file, fixed = TRUE)\n    p <- function(f, b) function(a) f(a, b)\n    trend_end <- end_braces[Position(\n      p(`==`, 1),\n      sign(end_braces - trend_start)\n    )] +\n      1\n  }\n\n  model_file <- model_file[-(trend_start:trend_end)]\n\n  if (\n    any(grepl(\n      \"// priors for latent state SD parameters\",\n      model_file,\n      fixed = TRUE\n    ))\n  ) {\n    model_file[\n      grep(\n        \"// priors for latent state SD parameters\",\n        model_file,\n        fixed = TRUE\n      ) +\n        1\n    ] <-\n      paste0(\n        model_file[\n          grep(\n            \"// priors for latent state SD parameters\",\n            model_file,\n            fixed = TRUE\n          ) +\n            1\n        ],\n        '\\n',\n        \"to_vector(LV_raw) ~ std_normal();\"\n      )\n  } else {\n    model_file[\n      grep(\"// priors for factor SD parameters\", model_file, fixed = TRUE) + 1\n    ] <-\n      paste0(\n        model_file[\n          grep(\"// priors for factor SD parameters\", model_file, fixed = TRUE) +\n            1\n        ],\n        '\\n',\n        \"to_vector(LV_raw) ~ std_normal();\"\n      )\n  }\n\n  model_file <- readLines(textConnection(model_file), n = -1)\n  model_file\n}\n\n#' @noRd\ncheck_noncent = function(\n  model_file,\n  noncentred,\n  use_lv,\n  trend_map,\n  add_ma,\n  add_cor,\n  trend_model,\n  drift,\n  silent,\n  nmix\n) {\n  if (!missing(trend_map)) {\n    trendmap <- TRUE\n  } else {\n    trendmap <- FALSE\n  }\n\n  # Haven't yet implemented noncentering for trend_map models that don't\n  # use the trend_formula\n  if (\n    trendmap &\n      !any(grepl('trend_mus', model_file, fixed = TRUE)) &\n      use_lv\n  ) {\n    trendmap <- FALSE\n    noncentred <- FALSE\n  }\n\n  if (!noncentred & use_lv & trendmap & trend_model == 'None' & !nmix) {\n    if (silent <= 1L) {\n      message('Your model may benefit from using \"noncentred = TRUE\"')\n    }\n  }\n\n  if (\n    !noncentred &\n      !add_ma &\n      !add_cor &\n      !nmix &\n      trend_model %in% c('RW', 'AR1', 'AR2', 'AR3', 'CAR1')\n  ) {\n    if (use_lv & trendmap) {\n      if (silent <= 1L) {\n        message('Your model may benefit from using \"noncentred = TRUE\"')\n      }\n    }\n\n    if (!use_lv) {\n      if (silent <= 1L) {\n        message('Your model may benefit from using \"noncentred = TRUE\"')\n      }\n    }\n  }\n\n  if (\n    noncentred &\n      !add_ma &\n      !add_cor &\n      trend_model %in% c('RW', 'AR1', 'AR2', 'AR3', 'CAR1', 'None')\n  ) {\n    if (use_lv & trendmap) {\n      model_file <- noncent_lv(\n        model_file = model_file,\n        trend_model = trend_model,\n        drift = FALSE\n      )\n    } else {\n      model_file <- noncent_trend(\n        model_file = model_file,\n        trend_model = trend_model,\n        drift = drift\n      )\n    }\n  }\n\n  return(list(model_file = model_file, noncentred = noncentred))\n}\n"
  },
  {
    "path": "R/onAttach.R",
    "content": ".onAttach = function(libname, pkgname) {\n  options(\"marginaleffects_model_classes\" = \"mvgam\")\n  version <- utils::packageVersion(\"mvgam\")\n  packageStartupMessage(\n    insight::format_message(\n      paste0(\n        \"Loading 'mvgam' (version \",\n        version,\n        \"). Useful instructions can be found by typing help('mvgam'). A more detailed introduction to the package is available through vignette('mvgam_overview').\"\n      )\n    )\n  )\n}\n"
  },
  {
    "path": "R/ordinate.jsdgam.R",
    "content": "#' Latent variable ordination plots from jsdgam objects\n#'\n#' Plot an ordination of latent variables and their factor loadings from\n#' \\code{jsdgam} models\n#'\n#' @name ordinate.jsdgam\n#'\n#' @param object \\code{list} object of class \\code{jsdgam} resulting from a\n#'   call to [jsdgam()]\n#'\n#' @param which_lvs A `vector` of indices indicating the two latent variables\n#'   to be plotted (if number of the latent variables specified in the model\n#'   was more than 2). Defaults to \\code{c(1, 2)}\n#'\n#' @param biplot `Logical`. If `TRUE`, both the site and the species scores\n#'   will be plotted, with names for the taxa interpreted based on the\n#'   `species` argument in the original call to [jsdgam()]. If `FALSE`, only\n#'   the site scores will be plotted\n#'\n#' @param alpha A proportional numeric scalar between `0` and `1` that\n#'   controls the relative scaling of the latent variables and their loading\n#'   coefficients\n#'\n#' @param label_sites \\code{Logical} flag. If `TRUE`, site scores will be\n#'   plotted as labels using names based on the `unit` argument in the\n#'   original call to [jsdgam()]. If `FALSE`, site scores will be shown as\n#'   points only\n#'\n#' @param ... ignored\n#'\n#' @details\n#' This function constructs a two-dimensional scatterplot in ordination space.\n#' The chosen latent variables are first re-rotated using singular value\n#' decomposition, so that the first plotted latent variable does not have to\n#' be the first latent variable that was estimated in the original model.\n#' Posterior median estimates of the variables and the species' loadings on\n#' these variables are then used to construct the resulting plot. Some attempt\n#' at de-cluttering the resulting plot is made by using `geom_label_repel()`\n#' and `geom_text_repel` from the \\pkg{ggrepel} package, but if there are many\n#' sites and/or species then some labels may be removed automatically. Note\n#' that you can typically get better, more readable plot layouts if you also\n#' have the \\pkg{ggarrow} and \\pkg{ggpp} packages installed\n#'\n#' @return An `ggplot` object\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso [jsdgam()], [residual_cor()]\n#'\n#' @examples\n#'\\dontrun{\n#' # Fit a JSDGAM to the portal_data captures\n#' mod <- jsdgam(\n#'   formula = captures ~\n#'     # Fixed effects of NDVI and mintemp, row effect as a GP of time\n#'     ndvi_ma12:series + mintemp:series + gp(time, k = 15),\n#'   factor_formula = ~ -1,\n#'   data = portal_data,\n#'   unit = time,\n#'   species = series,\n#'   family = poisson(),\n#'   n_lv = 2,\n#'   silent = 2,\n#'   chains = 2\n#' )\n#'\n#' # Plot a residual ordination biplot\n#' ordinate(\n#'   mod,\n#'   alpha = 0.7\n#' )\n#'\n#' # Compare to a residual correlation plot\n#' plot(\n#'   residual_cor(mod)\n#' )\n#' }\n#'\n#' @export\nordinate <- function(object, ...) {\n  UseMethod(\"ordinate\", object)\n}\n\n#' @rdname ordinate.jsdgam\n#' @method ordinate jsdgam\n#' @importFrom grid arrow unit\n#' @export\nordinate.jsdgam <- function(\n  object,\n  which_lvs = c(1, 2),\n  biplot = TRUE,\n  alpha = 0.5,\n  label_sites = TRUE,\n  ...\n) {\n  insight::check_if_installed(\n    'ggrepel',\n    reason = 'to adequately plot ordination scores'\n  )\n\n  if (!requireNamespace('ggpp', quietly = TRUE)) {\n    rlang::inform(\n      message = paste0(\n        'Package \"ggpp\" can enable more readable ordination plots\\n',\n        'Please consider installing it'\n      ),\n      .frequency = 'once',\n      .frequency_id = 'ggpp_ordinate'\n    )\n  }\n\n  if (!requireNamespace('ggarrow', quietly = TRUE)) {\n    rlang::inform(\n      message = paste0(\n        'Package \"ggarrow\" can enable more readable ordination plots\\n',\n        'Please consider installing it'\n      ),\n      .frequency = 'once',\n      .frequency_id = 'ggarrow_ordinate'\n    )\n  }\n\n  # Check arguments\n  if (length(which_lvs) != 2L) {\n    stop(\"argument 'which_lvs' must be a vector of length 2\", call. = FALSE)\n  }\n  if (object$n_lv > 2 & any(which_lvs > object$n_lv)) {\n    stop(\n      \"Fewer latent variables available than those chosen by which_lvs\",\n      call. = FALSE\n    )\n  }\n  validate_proportional(alpha)\n\n  # Get indices of LV estimates\n  ends <- seq(\n    0,\n    dim(mcmc_chains(object$model_output, 'LV'))[2],\n    length.out = object$n_lv + 1\n  )\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, object$n_lv + 1)])\n  ends <- ends[-1]\n\n  # Loop across each lv and calculate median estimates\n  lv_estimates <- do.call(\n    cbind,\n    lapply(1:object$n_lv, function(x) {\n      inds_lv <- seq(\n        x,\n        dim(mcmc_chains(object$model_output, 'LV'))[2],\n        by = object$n_lv\n      )\n      preds <- mcmc_chains(object$model_output, 'LV')[, inds_lv]\n\n      # Keep only the in-sample observations of the factors\n      preds <- preds[, 1:(length(object$obs_data$y) / NCOL(object$ytimes))]\n\n      # Calculate posterior medians\n      apply(preds, 2, median)\n    })\n  )\n\n  # Extract loadings, compute the SVD to re-rotate the variables and loadings\n  # Credit for much of this code goes to Francis Hui, original author of the BORAL\n  # R package (https://github.com/emitanaka/boral)\n  lv_estimates <- as.matrix(lv_estimates)\n  lv_coefs <- apply(mcmc_chains(object$model_output, 'lv_coefs'), 2, median)\n  lv_coefs <- t(matrix(lv_coefs, nrow = object$n_lv))\n  testcov <- tcrossprod(lv_estimates, lv_coefs)\n  do_svd <- svd(testcov, object$n_lv, object$n_lv)\n  choose_lvs <- scale(\n    do_svd$u *\n      matrix(\n        do_svd$d[1:object$n_lv]^alpha,\n        nrow = NROW(lv_estimates),\n        ncol = object$n_lv,\n        byrow = TRUE\n      ),\n    center = TRUE,\n    scale = FALSE\n  )\n  choose_lv_coefs <- scale(\n    do_svd$v *\n      matrix(\n        do_svd$d[1:object$n_lv]^(1 - alpha),\n        nrow = NROW(lv_coefs),\n        ncol = object$n_lv,\n        byrow = TRUE\n      ),\n    center = TRUE,\n    scale = FALSE\n  )\n\n  largest_lnorms <- order(\n    rowSums(choose_lv_coefs^2),\n    decreasing = TRUE\n  )[1:NROW(lv_coefs)]\n\n  # Extract site and species loadings into dataframes for plotting\n  sp_dat <- data.frame(choose_lv_coefs)[, which_lvs]\n  colnames(sp_dat) <- c('x', 'y')\n\n  site_dat <- data.frame(choose_lvs)[, which_lvs]\n  colnames(site_dat) <- c('x', 'y')\n\n  plot_dat <- rbind(\n    sp_dat,\n    site_dat\n  )\n\n  # Get taxa names\n  sp_names <- object$trend_map$series\n\n  # Get site names\n  unit_name <- attr(object$model_data, 'prepped_trend_model')$unit\n  site_names <- unique(\n    object$obs_data[[unit_name]]\n  )\n\n  # Create the base ggplot\n  base_plot <- ggplot2::ggplot(plot_dat, ggplot2::aes(x, y)) +\n    ggplot2::labs(\n      x = paste(\"Latent variable\", which_lvs[1]),\n      y = paste(\"Latent variable\", which_lvs[2])\n    )\n\n  # Add layers accordingly\n  if (label_sites) {\n    p <- base_plot +\n      ggrepel::geom_text_repel(\n        data = site_dat,\n        aes(label = site_names),\n        alpha = 0.75,\n        size = 3,\n        max.overlaps = 20,\n        colour = 'grey40',\n        segment.color = NA\n      ) +\n      ggplot2::geom_point(\n        data = site_dat,\n        pch = 21,\n        fill = 'grey20',\n        colour = 'white'\n      )\n  } else {\n    p <- base_plot +\n      ggplot2::geom_point(\n        data = site_dat,\n        pch = 21,\n        fill = 'grey20',\n        colour = 'white'\n      )\n  }\n\n  if (biplot) {\n    if (\n      requireNamespace('ggarrow', quietly = TRUE) &\n        requireNamespace('ggpp', quietly = TRUE)\n    ) {\n      sp_dat$group <- paste('gr', 1:NROW(sp_dat))\n      sp_arrow_dat <- do.call(\n        rbind,\n        lapply(1:nlevels(sp_names), function(x) {\n          data.frame(\n            x = seq(0, sp_dat$x[x], length.out = 20),\n            y = seq(0, sp_dat$y[x], length.out = 20),\n            group = sp_dat$group[x]\n          )\n        })\n      ) %>%\n        dplyr::mutate(lw = abs(x) + abs(y))\n\n      p <- p +\n        ggarrow::geom_arrow(\n          data = sp_arrow_dat,\n          ggplot2::aes(\n            x = x,\n            y = y,\n            group = group,\n            linewidth = lw\n          ),\n          colour = 'darkred',\n          stroke_colour = 'white',\n          stroke_width = 0.1,\n          alpha = 0.5,\n          show.legend = FALSE\n        ) +\n        ggplot2::scale_linewidth(range = c(0.45, 1.75)) +\n        ggrepel::geom_label_repel(\n          data = sp_dat,\n          ggplot2::aes(label = sp_names),\n          color = 'darkred',\n          box.padding = 0.1,\n          label.size = 0.1,\n          alpha = 0.75,\n          max.overlaps = 20,\n          segment.color = NA,\n          position = ggpp::position_nudge_center(0.025, 0.025, 0, 0)\n        )\n    } else {\n      p <- p +\n        ggplot2::geom_segment(\n          data = sp_dat,\n          ggplot2::aes(\n            x = 0,\n            y = 0,\n            xend = x,\n            yend = y\n          ),\n          arrow = arrow(\n            length = unit(0.1, \"cm\"),\n            type = 'closed'\n          ),\n          alpha = 0.5,\n          color = 'darkred'\n        ) +\n        ggrepel::geom_label_repel(\n          data = sp_dat,\n          ggplot2::aes(label = sp_names),\n          color = 'darkred',\n          box.padding = 0.1,\n          label.size = 0.1,\n          alpha = 0.75,\n          max.overlaps = 20\n        )\n    }\n  }\n\n  # Return the plot\n  p <- p + ggplot2::theme_classic()\n  return(p)\n}\n"
  },
  {
    "path": "R/pairs.mvgam.R",
    "content": "#' Create a matrix of output plots from a \\code{mvgam} object\n#'\n#' A \\code{\\link[graphics:pairs]{pairs}}\n#' method that is customized for MCMC output.\n#'\n#' @param x An object of class \\code{mvgam} or \\code{jsdgam}\n#' @inheritParams mcmc_plot.mvgam\n#' @param ... Further arguments to be passed to\n#'   \\code{\\link[bayesplot:MCMC-scatterplots]{mcmc_pairs}}.\n#'\n#' @return Plottable objects whose classes depend on the arguments supplied.\n#' See \\code{\\link[bayesplot:MCMC-scatterplots]{mcmc_pairs}} for details.\n#' @details For a detailed description see\n#'   \\code{\\link[bayesplot:MCMC-scatterplots]{mcmc_pairs}}.\n#'\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1')\n#' mod <- mvgam(y ~ s(season, bs = 'cc'),\n#'              trend_model = AR(),\n#'              noncentred = TRUE,\n#'              data = simdat$data_train,\n#'              chains = 2)\n#' pairs(mod)\n#' pairs(mod, variable = c('ar1', 'sigma'), regex = TRUE)\n#' }\n#'\n#' @export\npairs.mvgam <- function(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  use_alias = TRUE,\n  ...\n) {\n  # Set red colour scheme\n  col_scheme <- attr(color_scheme_get(), 'scheme_name')\n  color_scheme_set('red')\n\n  # Set default params to plot\n  # By default, don't plot the Betas as there can be hundreds\n  # of them in spline models\n  if (is.null(variable)) {\n    all_pars <- variables(x)\n    variable <- c(\n      all_pars$observation_pars[, 1],\n      all_pars$observation_smoothpars[, 1],\n      all_pars$observation_re_params[, 1],\n      all_pars$trend_pars[, 1],\n      all_pars$trend_smoothpars[, 1],\n      all_pars$trend_re_params[, 1]\n    )\n    regex <- FALSE\n  }\n  draws <- as.array(\n    x,\n    variable = variable,\n    regex = regex,\n    use_alias = use_alias\n  )\n\n  # Generate plot and reset colour scheme\n  out_plot <- bayesplot::mcmc_pairs(draws, ...)\n  color_scheme_set(col_scheme)\n\n  # Return the plot\n  return(out_plot)\n}\n"
  },
  {
    "path": "R/piecewise_trends.R",
    "content": "#' Updates for adding piecewise trends\n#' @noRd\nadd_piecewise = function(\n  model_file,\n  model_data,\n  data_train,\n  data_test = NULL,\n  orig_trend_model,\n  family\n) {\n  trend_model <- orig_trend_model$trend_model\n  n_changepoints <- orig_trend_model$n_changepoints\n  changepoint_range <- orig_trend_model$changepoint_range\n  changepoint_scale <- orig_trend_model$changepoint_scale\n\n  if (family$family == 'Gamma') {\n    family <- Gamma(link = 'log')\n  }\n\n  if (trend_model == 'PWlogistic') {\n    if (!(exists('cap', where = data_train))) {\n      stop(\n        'Capacities must be supplied as a variable named \"cap\" for logistic growth',\n        call. = FALSE\n      )\n    }\n\n    if (any(is.na(data_train$cap))) {\n      stop('Missing values found for some \"cap\" terms', call. = FALSE)\n    }\n\n    if (any(is.infinite(data_train$cap))) {\n      stop('Infinite values found for some \"cap\" terms', call. = FALSE)\n    }\n\n    # Matrix of capacities per series (these must operate on the link scale)\n    all_caps <- data.frame(\n      series = as.numeric(data_train$series),\n      time = data_train$time,\n      cap = suppressWarnings(linkfun(data_train$cap, link = family$link))\n    ) %>%\n      dplyr::arrange(time, series)\n\n    if (any(is.na(all_caps$cap)) | any(is.infinite(all_caps$cap))) {\n      stop(\n        paste0(\n          'Missing or infinite values found for some \"cap\" terms\\n',\n          'after transforming to the ',\n          family$link,\n          ' link scale'\n        ),\n        call. = FALSE\n      )\n    }\n\n    if (!is.null(data_test)) {\n      if (!(exists('cap', where = data_test))) {\n        stop(\n          'Capacities must also be supplied in \"newdata\" for logistic growth predictions',\n          call. = FALSE\n        )\n      }\n\n      all_caps <- rbind(\n        all_caps,\n        data.frame(\n          series = as.numeric(data_test$series),\n          time = data_test$time,\n          cap = suppressWarnings(linkfun(data_test$cap, link = family$link))\n        )\n      ) %>%\n        dplyr::arrange(time, series)\n\n      if (any(is.na(all_caps$cap)) | any(is.infinite(all_caps$cap))) {\n        stop(\n          paste0(\n            'Missing or infinite values found for some \"cap\" terms\\n',\n            'after transforming to the ',\n            family$link,\n            ' link scale'\n          ),\n          call. = FALSE\n        )\n      }\n    }\n\n    cap <- matrix(\n      NA,\n      nrow = length(unique(all_caps$time)),\n      ncol = length(unique(all_caps$series))\n    )\n    for (i in 1:length(unique(all_caps$series))) {\n      cap[, i] <- all_caps$cap[which(all_caps$series == i)]\n    }\n  } else {\n    cap <- NULL\n  }\n\n  #### Distribute possible changepoints ####\n  scaled_time <- unique(data_train$time - min(data_train$time) + 1)\n  max_time <- max(scaled_time)\n  hist_size <- floor(max_time * changepoint_range)\n  t_change <- unique(round(seq.int(\n    1,\n    hist_size,\n    length.out = (n_changepoints + 1)\n  )[-1]))\n  n_changepoints <- length(t_change)\n  change_freq <- n_changepoints / hist_size\n\n  if (!is.null(data_test)) {\n    # Get forecast horizon changepoints\n    # This can go in with the data if newdata is supplied; else it needs\n    # to be used when extrapolating the trend forward\n    n_new_changes <- stats::rpois(\n      1,\n      (change_freq *\n        (max(data_test$time) -\n          min(data_test$time)))\n    )\n\n    # Spread the forecast changepoints evenly across the forecast\n    # horizon\n    scaled_test_time <- unique(data_test$time - min(data_train$time) + 1)\n    t_change_new <- unique(floor(seq.int(\n      min(scaled_test_time),\n      max(scaled_test_time),\n      length.out = n_new_changes\n    )))\n    t_change <- c(t_change, t_change_new)\n    n_changepoints <- n_changepoints + n_new_changes\n    scaled_time <- c(scaled_time, scaled_test_time)\n  }\n\n  # Add changepoint info to the data\n  model_data$n_changepoints <- n_changepoints\n  model_data$change_freq <- change_freq\n  model_data$t_change <- t_change\n  model_data$time <- scaled_time\n  model_data$changepoint_scale <- changepoint_scale\n  model_data$cap <- cap\n\n  #### Update the model file appropriately ####\n  # Add the piecewise functions\n  if (any(grepl('functions {', model_file, fixed = TRUE))) {\n    model_file[grep('functions {', model_file, fixed = TRUE)] <-\n      paste0(\n        'functions {\\n',\n        'matrix get_changepoint_matrix(vector t, vector t_change, int T, int S) {\\n',\n        '/* Function to sort changepoints */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'matrix[T, S] A;\\n',\n        'row_vector[S] a_row;\\n',\n        'int cp_idx;\\n',\n        'A = rep_matrix(0, T, S);\\n',\n        'a_row = rep_row_vector(0, S);\\n',\n        'cp_idx = 1;\\n',\n        'for (i in 1:T) {\\n',\n        'while ((cp_idx <= S) && (t[i] >= t_change[cp_idx])) {\\n',\n        'a_row[cp_idx] = 1;\\n',\n        'cp_idx = cp_idx + 1;\\n',\n        '}\\n',\n        'A[i] = a_row;\\n',\n        '}\\n',\n        'return A;\\n',\n        '}\\n',\n\n        '// logistic trend functions\\n',\n        'vector logistic_gamma(real k, real m, vector delta, vector t_change, int S) {\\n',\n        '/* Function to compute a logistic trend with changepoints */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'vector[S] gamma;  // adjusted offsets, for piecewise continuity\\n',\n        'vector[S + 1] k_s;  // actual rate in each segment\\n',\n        'real m_pr;\\n',\n        'k_s = append_row(k, k + cumulative_sum(delta));\\n',\n        'm_pr = m; // The offset in the previous segment\\n',\n        'for (i in 1:S) {\\n',\n        'gamma[i] = (t_change[i] - m_pr) * (1 - k_s[i] / k_s[i + 1]);\\n',\n        'm_pr = m_pr + gamma[i];  // update for the next segment\\n',\n        '}\\n',\n        'return gamma;\\n',\n        '}\\n',\n\n        'vector logistic_trend(\\n',\n        'real k,\\n',\n        'real m,\\n',\n        'vector delta,\\n',\n        'vector t,\\n',\n        'vector cap,\\n',\n        'matrix A,\\n',\n        'vector t_change,\\n',\n        'int S\\n',\n        ') {\\n',\n        '/* Function to adjust a logistic trend using a carrying capacity */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'vector[S] gamma;\\n',\n        'gamma = logistic_gamma(k, m, delta, t_change, S);\\n',\n        'return cap .* inv_logit((k + A * delta) .* (t - (m + A * gamma)));\\n',\n        '}\\n',\n\n        '// linear trend function\\n',\n        '/* Function to compute a linear trend with changepoints */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'vector linear_trend(\\n',\n        'real k,\\n',\n        'real m,\\n',\n        'vector delta,\\n',\n        'vector t,\\n',\n        'matrix A,\\n',\n        'vector t_change\\n',\n        ') {\\n',\n        'return (k + A * delta) .* t + (m + A * (-t_change .* delta));\\n',\n        '}\\n'\n      )\n  } else {\n    model_file[grep('Stan model code', model_file)] <-\n      paste0(\n        '// Stan model code generated by package mvgam\\n',\n        'functions {\\n',\n        'matrix get_changepoint_matrix(vector t, vector t_change, int T, int S) {\\n',\n        '/* Function to sort changepoints */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'matrix[T, S] A;\\n',\n        'row_vector[S] a_row;\\n',\n        'int cp_idx;\\n',\n        'A = rep_matrix(0, T, S);\\n',\n        'a_row = rep_row_vector(0, S);\\n',\n        'cp_idx = 1;\\n',\n        'for (i in 1:T) {\\n',\n        'while ((cp_idx <= S) && (t[i] >= t_change[cp_idx])) {\\n',\n        'a_row[cp_idx] = 1;\\n',\n        'cp_idx = cp_idx + 1;\\n',\n        '}\\n',\n        'A[i] = a_row;\\n',\n        '}\\n',\n        'return A;\\n',\n        '}\\n',\n\n        '// logistic trend functions\\n',\n        'vector logistic_gamma(real k, real m, vector delta, vector t_change, int S) {\\n',\n        '/* Function to compute a logistic trend with changepoints */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'vector[S] gamma;  // adjusted offsets, for piecewise continuity\\n',\n        'vector[S + 1] k_s;  // actual rate in each segment\\n',\n        'real m_pr;\\n',\n        'k_s = append_row(k, k + cumulative_sum(delta));\\n',\n        'm_pr = m; // The offset in the previous segment\\n',\n        'for (i in 1:S) {\\n',\n        'gamma[i] = (t_change[i] - m_pr) * (1 - k_s[i] / k_s[i + 1]);\\n',\n        'm_pr = m_pr + gamma[i];  // update for the next segment\\n',\n        '}\\n',\n        'return gamma;\\n',\n        '}\\n',\n\n        'vector logistic_trend(\\n',\n        'real k,\\n',\n        'real m,\\n',\n        'vector delta,\\n',\n        'vector t,\\n',\n        'vector cap,\\n',\n        'matrix A,\\n',\n        'vector t_change,\\n',\n        'int S\\n',\n        ') {\\n',\n        '/* Function to adjust a logistic trend using a carrying capacity */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'vector[S] gamma;\\n',\n        'gamma = logistic_gamma(k, m, delta, t_change, S);\\n',\n        'return cap .* inv_logit((k + A * delta) .* (t - (m + A * gamma)));\\n',\n        '}\\n',\n\n        '// linear trend function\\n',\n        '/* Function to compute a linear trend with changepoints */\\n',\n        '/* credit goes to the Prophet development team at Meta (https://github.com/facebook/prophet/tree/main)*/\\n',\n        'vector linear_trend(\\n',\n        'real k,\\n',\n        'real m,\\n',\n        'vector delta,\\n',\n        'vector t,\\n',\n        'matrix A,\\n',\n        'vector t_change\\n',\n        ') {\\n',\n        'return (k + A * delta) .* t + (m + A * (-t_change .* delta));\\n',\n        '}\\n}\\n'\n      )\n  }\n\n  # Update the data block\n  model_file[grep('int<lower=0> num_basis;', model_file, fixed = TRUE)] <-\n    paste0(\n      \"int<lower=0> num_basis; // total number of basis coefficients\\n\",\n      \"vector[n] time; // index of time for changepoint model\\n\",\n      \"int n_changepoints; // number of potential trend changepoints\\n\",\n      \"vector[n_changepoints] t_change; // times of potential changepoints\\n\",\n      if (trend_model == 'PWlogistic') {\n        \"matrix[n, n_series] cap; // carrying capacities for logistic trends\\n\"\n      } else {\n        NULL\n      },\n      'real changepoint_scale; // scale of changepoint shock prior\\n'\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update the transformed data block\n  if (any(grepl('transformed data {', model_file, fixed = TRUE))) {\n    model_file[grep('transformed data {', model_file, fixed = TRUE)] <-\n      paste0(\n        'transformed data {\\n',\n        '// sorted changepoint matrix\\n',\n        'matrix[n, n_changepoints] A = get_changepoint_matrix(time, t_change, n, n_changepoints);\\n'\n      )\n  } else {\n    model_file[grep('parameters {', model_file, fixed = TRUE)[1]] <-\n      paste0(\n        'transformed data {\\n',\n        '// sorted changepoint matrix\\n',\n        'matrix[n, n_changepoints] A = get_changepoint_matrix(time, t_change, n, n_changepoints);\\n',\n        '}\\nparameters {'\n      )\n  }\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update the parameters block\n  model_file <- model_file[\n    -c(\n      grep(\n        '// latent trend variance parameters',\n        model_file,\n        fixed = TRUE\n      ):(grep('// latent trend variance parameters', model_file, fixed = TRUE) +\n        1)\n    )\n  ]\n  model_file <- model_file[\n    -c(\n      grep('// latent trends', model_file, fixed = TRUE):(grep(\n        '// latent trends',\n        model_file,\n        fixed = TRUE\n      ) +\n        1)\n    )\n  ]\n  model_file[grep(\"vector[num_basis] b_raw;\", model_file, fixed = TRUE)] <-\n    paste0(\n      \"vector[num_basis] b_raw;\\n\",\n      \"// base trend growth rates\\n\",\n      \"vector[n_series] k_trend;\\n\\n\",\n      \"// trend offset parameters\\n\",\n      \"vector[n_series] m_trend;\\n\\n\",\n      \"// trend rate adjustments per series\\n\",\n      \"matrix[n_changepoints, n_series] delta_trend;\\n\"\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update the transformed parameters block\n  model_file[grep(\"transformed parameters {\", model_file, fixed = TRUE)] <-\n    paste0(\n      \"transformed parameters {\\n\",\n      \"// latent trends\\n\",\n      \"matrix[n, n_series] trend;\\n\"\n    )\n\n  max_rawline <- max(grep('= b_raw', model_file))\n  model_file[max_rawline] <- paste0(\n    model_file[max_rawline],\n    '\\n\\n',\n    '// trend estimates\\n',\n    'for (s in 1 : n_series) {\\n',\n    if (trend_model == 'PWlogistic') {\n      'trend[1 : n, s] = logistic_trend(k_trend[s], m_trend[s], to_vector(delta_trend[,s]), time, to_vector(cap[,s]), A, t_change, n_changepoints);\\n'\n    } else {\n      'trend[1 : n, s] = linear_trend(k_trend[s], m_trend[s], to_vector(delta_trend[,s]), time, A, t_change);\\n'\n    },\n\n    '}\\n'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update the model block\n  model_file <- model_file[\n    -c(\n      grep(\n        '// priors for latent trend variance parameters',\n        model_file,\n        fixed = TRUE\n      ):(grep(\n        '// priors for latent trend variance parameters',\n        model_file,\n        fixed = TRUE\n      ) +\n        1)\n    )\n  ]\n  rw_start <- grep(\n    \"trend[1, 1:n_series] ~ normal(0, sigma);\",\n    model_file,\n    fixed = TRUE\n  )\n  rw_lines <- (rw_start - 1):(rw_start + 3)\n  model_file <- model_file[-rw_lines]\n  model_file[grep(\"// likelihood functions\", model_file, fixed = TRUE) - 1] <-\n    paste0(\n      '// trend parameter priors\\n',\n      'm_trend ~ student_t(3, 0, 2.5);\\n',\n      'k_trend ~ std_normal();\\n',\n      'to_vector(delta_trend) ~ double_exponential(0, changepoint_scale);\\n',\n      model_file[grep(\"// likelihood functions\", model_file, fixed = TRUE) - 1]\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update the generated quantities block\n  model_file <- model_file[\n    -grep(\"vector[n_series] tau;\", model_file, fixed = TRUE)\n  ]\n  tau_start <- grep(\"tau[s] = pow(sigma[s], -2.0);\", model_file, fixed = TRUE) -\n    1\n  model_file <- model_file[-c(tau_start:(tau_start + 2))]\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  #### Return ####\n  return(list(model_file = model_file, model_data = model_data))\n}\n"
  },
  {
    "path": "R/plot.mvgam.R",
    "content": "#' Default plots for \\pkg{mvgam} models\n#'\n#' This function takes a fitted \\code{mvgam} object and produces plots of\n#' smooth functions, forecasts, trends and uncertainty components\n#'\n#' @param x \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @param type \\code{character} specifying which type of plot to return.\n#'   Options are: `\"series\"`, `\"residuals\"`, `\"smooths\"`, `\"re\"` (random effect smooths),\n#'   `\"pterms\"` (parametric effects), `\"forecast\"`, `\"trend\"`, `\"uncertainty\"`,\n#'   `\"factors\"`\n#'\n#' @param residuals \\code{logical}. If \\code{TRUE} and `type = 'smooths'`,\n#'   posterior quantiles of partial residuals are added to plots of 1-D\n#'   smooths as a series of ribbon rectangles. Partial residuals for a\n#'   smooth term are the median Dunn-Smyth residuals that would be obtained\n#'   by dropping the term concerned from the model, while leaving all other\n#'   estimates fixed (i.e. the estimates for the term plus the original\n#'   median Dunn-Smyth residuals). Note that because \\code{mvgam} works with\n#'   Dunn-Smyth residuals and not working residuals, which are used by\n#'   \\code{mgcv}, the magnitudes of partial residuals will be different to\n#'   what you would expect from \\code{\\link[mgcv]{plot.gam}}. Interpretation\n#'   is similar though, as these partial residuals should be evenly scattered\n#'   around the smooth function if the function is well estimated\n#'\n#' @param series \\code{integer} specifying which series in the set is to be\n#'   plotted. This is ignored if \\code{type == 're'}\n#'\n#' @param newdata Optional \\code{dataframe} or \\code{list} of test data\n#'   containing at least 'series' and 'time' in addition to any other\n#'   variables included in the linear predictor of the original\n#'   \\code{formula}. This argument is optional when plotting out of sample\n#'   forecast period observations (when \\code{type = forecast}) and required\n#'   when plotting uncertainty components (\\code{type = uncertainty}).\n#'\n#' @param trend_effects logical. If `TRUE` and a `trend_formula` was used in\n#'   model fitting, terms from the trend (i.e. process) model will be plotted\n#'\n#' @param data_test Deprecated. Still works in place of \\code{newdata} but\n#'   users are recommended to use \\code{newdata} instead for more seamless\n#'   integration into `R` workflows\n#'\n#' @param ... Additional arguments for each individual plotting function.\n#'\n#' @details These plots are useful for getting an overview of the fitted\n#'   model and its estimated random effects or smooth functions, but the\n#'   individual plotting functions and the functions from the `marginaleffects`\n#'   and `gratia` packages offer far more customisation.\n#'\n#' @seealso \\code{\\link{plot_mvgam_resids}},\n#'   \\code{\\link{plot_mvgam_smooth}},\n#'   \\code{\\link{plot_mvgam_fc}},\n#'   \\code{\\link{plot_mvgam_trend}},\n#'   \\code{\\link{plot_mvgam_uncertainty}},\n#'   \\code{\\link{plot_mvgam_factors}},\n#'   \\code{\\link{plot_mvgam_randomeffects}},\n#'   \\code{\\link{conditional_effects.mvgam}},\n#'   \\code{\\link[marginaleffects]{plot_predictions}},\n#'   \\code{\\link[marginaleffects]{plot_slopes}},\n#'   \\code{\\link{gratia_mvgam_enhancements}}\n#'\n#' @author Nicholas J Clark\n#'\n#' @return A base R plot or set of plots\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some time series\n#' dat <- sim_mvgam(\n#'   T = 80,\n#'   n_series = 3\n#' )\n#'\n#' # Fit a basic model\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc') + s(series, bs = 're'),\n#'   data = dat$data_train,\n#'   trend_model = RW(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot predictions and residuals for each series\n#' plot(mod, type = 'forecast', series = 1)\n#' plot(mod, type = 'forecast', series = 2)\n#' plot(mod, type = 'forecast', series = 3)\n#' plot(mod, type = 'residuals', series = 1)\n#' plot(mod, type = 'residuals', series = 2)\n#' plot(mod, type = 'residuals', series = 3)\n#'\n#' # Plot model effects\n#' plot(mod, type = 'smooths')\n#' plot(mod, type = 're')\n#'\n#' # More flexible plots with 'marginaleffects' utilities\n#' library(marginaleffects)\n#'\n#' plot_predictions(\n#'   mod,\n#'   condition = 'season',\n#'   type = 'link'\n#' )\n#'\n#' plot_predictions(\n#'   mod,\n#'   condition = c('season', 'series', 'series'),\n#'   type = 'link'\n#' )\n#'\n#' plot_predictions(\n#'   mod,\n#'   condition = 'series',\n#'   type = 'link'\n#' )\n#'\n#' # When using a State-Space model with predictors on the process\n#' # model, set trend_effects = TRUE to visualise process effects\n#' mod <- mvgam(\n#'   y ~ -1,\n#'   trend_formula = ~ s(season, bs = 'cc'),\n#'   data = dat$data_train,\n#'   trend_model = RW(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' plot(mod, type = 'smooths', trend_effects = TRUE)\n#'\n#' # But 'marginaleffects' functions work without any modification\n#' plot_predictions(\n#'   mod,\n#'   condition = 'season',\n#'   type = 'link'\n#' )\n#' }\n#'\n#' @export\nplot.mvgam = function(\n  x,\n  type = 'residuals',\n  series = 1,\n  residuals = FALSE,\n  newdata,\n  data_test,\n  trend_effects = FALSE,\n  ...\n) {\n  object <- x\n\n  # Argument checks\n  type <- match.arg(\n    arg = type,\n    choices = c(\n      \"residuals\",\n      \"smooths\",\n      \"re\",\n      \"pterms\",\n      \"forecast\",\n      \"trend\",\n      \"uncertainty\",\n      \"factors\",\n      \"series\"\n    )\n  )\n\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  if (!missing(\"newdata\")) {\n    data_test <- newdata\n  }\n\n  # Other errors and warnings will propagate from individual functions below\n  if (type == 'series') {\n    print(plot_mvgam_series(object, series = series, newdata = data_test, ...))\n  }\n\n  if (type == 're') {\n    plot_mvgam_randomeffects(object, trend_effects = trend_effects, ...)\n  }\n\n  if (type == 'pterms') {\n    plot_mvgam_pterms(object, trend_effects = trend_effects, ...)\n  }\n\n  if (type == 'residuals') {\n    return(plot_mvgam_resids(object, series = series, ...))\n  }\n\n  if (type == 'factors') {\n    if (!object$use_lv) {\n      stop('no latent variables were fitted in the model')\n    } else {\n      return(plot_mvgam_factors(object))\n    }\n  }\n\n  if (type == 'forecast') {\n    if (missing(data_test)) {\n      plot_mvgam_fc(object, series = series, ...)\n    } else {\n      plot_mvgam_fc(object, series = series, data_test = data_test, ...)\n    }\n  }\n\n  if (type == 'trend') {\n    if (missing(data_test)) {\n      return(plot_mvgam_trend(object, series = series, ...))\n    } else {\n      return(plot_mvgam_trend(\n        object,\n        series = series,\n        data_test = data_test,\n        ...\n      ))\n    }\n  }\n\n  if (type == 'uncertainty') {\n    if (missing(data_test)) {\n      stop('data_test is required for plotting uncertainty contributions')\n    } else {\n      plot_mvgam_uncertainty(\n        object,\n        series = series,\n        data_test = data_test,\n        ...\n      )\n    }\n  }\n\n  if (type == 'smooths') {\n    object2 <- object\n\n    if (trend_effects) {\n      if (is.null(object$trend_call)) {\n        stop('no trend_formula exists so there no trend-level smooths to plot')\n      }\n\n      object2$mgcv_model <- object2$trend_mgcv_model\n    }\n\n    # Get labels of all included smooths from the object2\n    smooth_labs <- do.call(\n      rbind,\n      lapply(seq_along(object2$mgcv_model$smooth), function(x) {\n        data.frame(\n          label = object2$mgcv_model$smooth[[x]]$label,\n          class = class(object2$mgcv_model$smooth[[x]])[1],\n          mgcv_plottable = object2$mgcv_model$smooth[[x]]$plot.me\n        )\n      })\n    )\n\n    n_smooths <- NROW(smooth_labs)\n    if (n_smooths == 0) {\n      stop(\n        \"No smooth terms to plot. Use plot_predictions() to visualise other effects\",\n        call. = FALSE\n      )\n    }\n    smooth_labs$smooth_index <- 1:NROW(smooth_labs)\n\n    # Leave out random effects and MRF smooths, and any others that are not\n    # considered plottable by mgcv\n    smooth_labs %>%\n      dplyr::filter(class != 'random.effect') %>%\n      dplyr::filter(class != 'mrf.smooth') %>%\n      dplyr::filter(mgcv_plottable) -> smooth_labs\n\n    if (length(smooth_labs$label) == 0) {\n      stop(\"No terms to plot - nothing for plot.mvgam() to do.\")\n    }\n\n    # Check which ones plot_mvgam_smooth can handle (no more than 3 dimensions)\n    plottable = function(x) {\n      length(unlist(strsplit(x, ','))) <= 3 &\n        length(unlist(strsplit(x, ':'))) <= 3\n    }\n    which_to_plot <- (smooth_labs$smooth_index)[sapply(\n      as.character(smooth_labs$label),\n      plottable\n    )]\n    n_smooths <- length(which_to_plot)\n\n    # For remaining plots, get the needed page numbers\n    n_plots <- n_smooths\n    if (n_plots == 0) {\n      stop(\n        \"No suitable terms to plot - plot.mvgam() only handles smooths of 2 or fewer dimensions.\"\n      )\n    }\n    pages <- 1\n\n    if (n_plots > 4) {\n      pages <- 2\n    }\n    if (n_plots > 8) {\n      pages <- 3\n    }\n    if (n_plots > 12) {\n      pages <- 4\n    }\n    if (pages != 0) {\n      ppp <- n_plots %/% pages\n\n      if (n_plots %% pages != 0) {\n        ppp <- ppp + 1\n        while (ppp * (pages - 1) >= n_plots) {\n          pages <- pages - 1\n        }\n      }\n\n      # Configure layout matrix\n      c <- r <- trunc(sqrt(ppp))\n      if (c < 1) {\n        r <- c <- 1\n      }\n      if (c * r < ppp) {\n        c <- c + 1\n      }\n      if (c * r < ppp) {\n        r <- r + 1\n      }\n\n      .pardefault <- par(no.readonly = T)\n      on.exit(par(.pardefault))\n      oldpar <- par(mfrow = c(r, c))\n    } else {\n      ppp <- 1\n      oldpar <- par()\n    }\n\n    # Plot the smooths\n    for (i in which_to_plot) {\n      plot_mvgam_smooth(\n        object = object2,\n        smooth = i,\n        series = series,\n        residuals = residuals,\n        trend_effects = trend_effects,\n        ...\n      )\n    }\n    layout(1)\n  }\n}\n"
  },
  {
    "path": "R/plot_mvgam_factors.R",
    "content": "#' Latent factor summaries for a fitted \\pkg{mvgam} object\n#'\n#' This function takes a fitted \\code{mvgam} object and returns plots and\n#' summary statistics for the latent dynamic factors\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @param plot \\code{logical} specifying whether factors should be plotted\n#'\n#' @author Nicholas J Clark\n#'\n#' @details If the model in \\code{object} was estimated using dynamic factors,\n#'   it is possible that not all factors contributed to the estimated trends.\n#'   This is due to the regularisation penalty that acts independently on each\n#'   factor's Gaussian precision, which will squeeze un-needed factors to a\n#'   white noise process (effectively dropping that factor from the model). In\n#'   this function, each factor is tested against a null hypothesis of white\n#'   noise by calculating the sum of the factor's 2nd derivatives. A factor\n#'   that has a larger contribution will have a larger sum due to the weaker\n#'   penalty on the factor's precision. If \\code{plot == TRUE}, the factors\n#'   are also plotted.\n#'\n#' @return A \\code{data.frame} of factor contributions\n#'\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam()\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   trend_model = AR(),\n#'   use_lv = TRUE,\n#'   n_lv = 2,\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' plot_mvgam_factors(mod)\n#' }\n#'\n#' @export\nplot_mvgam_factors = function(object, plot = TRUE) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  # Check object has latent dynamic factors\n  if (!object$use_lv) {\n    stop('No latent factors used in object')\n  }\n\n  # Get indices of LV estimates\n  ends <- seq(\n    0,\n    dim(mcmc_chains(object$model_output, 'LV'))[2],\n    length.out = object$n_lv + 1\n  )\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, object$n_lv + 1)])\n  ends <- ends[-1]\n  probs <- c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n\n  # Loop across each lv and calculate probability that the lv was dropped\n  lv_estimates <- do.call(\n    rbind,\n    lapply(1:object$n_lv, function(x) {\n      if (object$fit_engine == 'stan') {\n        inds_lv <- seq(\n          x,\n          dim(mcmc_chains(object$model_output, 'LV'))[2],\n          by = object$n_lv\n        )\n        preds <- mcmc_chains(object$model_output, 'LV')[, inds_lv]\n      } else {\n        preds <- mcmc_chains(object$model_output, 'LV')[, starts[x]:ends[x]]\n      }\n\n      # Keep only the in-sample observations for testing against the null of white noise\n      preds <- preds[, 1:(length(object$obs_data$y) / NCOL(object$ytimes))]\n\n      cred <- as.data.frame(t(sapply(\n        1:NCOL(preds),\n        function(n) quantile(preds[, n], probs = probs, na.rm = TRUE)\n      ))) %>%\n        dplyr::mutate(lv = paste0('Factor ', x), time = 1:NCOL(preds))\n      colnames(cred) <- c(\n        paste0('lower', 1:4),\n        'med',\n        paste0('upper', 4:1),\n        'lv',\n        'time'\n      )\n      cred\n    })\n  )\n\n  # If plot = TRUE, plot the LVs\n  if (plot) {\n    p <- ggplot2::ggplot(\n      data = lv_estimates,\n      mapping = ggplot2::aes(x = time, y = med)\n    ) +\n      ggplot2::facet_wrap(~lv) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower1, ymax = upper1),\n        fill = \"#DCBCBC\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower2, ymax = upper2),\n        fill = \"#C79999\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower3, ymax = upper3),\n        fill = \"#B97C7C\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower4, ymax = upper4),\n        fill = \"#A25050\"\n      ) +\n      ggplot2::geom_line(\n        mapping = ggplot2::aes(x = time, y = med),\n        col = \"#8F2727\",\n        linewidth = 1\n      ) +\n      ggplot2::theme_bw() +\n      ggplot2::labs(x = 'Time', y = 'Posterior prediction')\n  }\n\n  # Calculate second derivatives of empirical medians and upper / lower intervals;\n  # factors with small second derivatives are moving in roughly a straight line and not\n  # likely contributing much (or at all) to the latent trend estimates\n  lv_contributions <- lv_estimates %>%\n    dplyr::group_by(lv) %>%\n    dplyr::reframe(\n      med_deriv = abs(diff(diff(med))),\n      upper_deriv = abs(diff(diff(upper2))),\n      lower_deriv = abs(diff(diff(lower2)))\n    ) %>%\n    dplyr::rowwise() %>%\n    dplyr::mutate(contribution = sum(med_deriv, upper_deriv, lower_deriv)) %>%\n    dplyr::group_by(lv) %>%\n    dplyr::summarise(sum_contribution = sum(contribution)) %>%\n    dplyr::ungroup() %>%\n    dplyr::mutate(\n      total = sum(sum_contribution),\n      Contribution = sum_contribution / total,\n      Factor = lv\n    ) %>%\n    dplyr::select(Factor, Contribution)\n\n  if (plot) {\n    print(p)\n  }\n\n  lv_contributions\n}\n"
  },
  {
    "path": "R/plot_mvgam_fc.R",
    "content": "#' Plot posterior forecast predictions from \\pkg{mvgam} models\n#'\n#' @importFrom stats formula terms\n#'\n#' @param object \\code{list} object of class \\code{mvgam}. See [mvgam()]\n#'\n#' @param series \\code{integer} specifying which series in the set is to be\n#'   plotted\n#'\n#' @param newdata Optional \\code{dataframe} or \\code{list} of test data\n#'   containing at least 'series' and 'time' in addition to any other\n#'   variables included in the linear predictor of the original\n#'   \\code{formula}. If included, the covariate information in \\code{newdata}\n#'   will be used to generate forecasts from the fitted model equations. If\n#'   this same \\code{newdata} was originally included in the call to\n#'   \\code{mvgam}, then forecasts have already been produced by the generative\n#'   model and these will simply be extracted and plotted. However if no\n#'   \\code{newdata} was supplied to the original model call, an assumption is\n#'   made that the \\code{newdata} supplied here comes sequentially after the\n#'   data supplied as \\code{data} in the original model (i.e. we assume there\n#'   is no time gap between the last observation of series 1 in \\code{data}\n#'   and the first observation for series 1 in \\code{newdata}). If\n#'   \\code{newdata} contains observations in column \\code{y}, these\n#'   observations will be used to compute a Discrete Rank Probability Score\n#'   for the forecast distribution\n#'\n#' @param data_test Deprecated. Still works in place of \\code{newdata} but\n#'   users are recommended to use \\code{newdata} instead for more seamless\n#'   integration into `R` workflows\n#'\n#' @param realisations \\code{logical}. If \\code{TRUE}, forecast realisations\n#'   are shown as a spaghetti plot, making it easier to visualise the\n#'   diversity of possible forecasts. If \\code{FALSE}, the default, empirical\n#'   quantiles of the forecast distribution are shown\n#'\n#' @param n_realisations \\code{integer} specifying the number of posterior\n#'   realisations to plot, if \\code{realisations = TRUE}. Ignored otherwise\n#'\n#' @param n_cores \\code{integer} specifying number of cores for generating\n#'   forecasts in parallel\n#'\n#' @param hide_xlabels \\code{logical}. If \\code{TRUE}, no xlabels are printed\n#'   to allow the user to add custom labels using \\code{axis} from base\n#'   \\code{R}\n#'\n#' @param xlab Label for x axis\n#'\n#' @param ylab Label for y axis\n#'\n#' @param ylim Optional \\code{vector} of y-axis limits (min, max)\n#'\n#' @param ... Further \\code{\\link[graphics]{par}} graphical parameters\n#'\n#' @param return_forecasts \\code{logical}. If \\code{TRUE}, the function will\n#'   plot the forecast as well as returning the forecast object (as a\n#'   \\code{matrix} of dimension \\code{n_samples} x \\code{horizon})\n#'\n#' @param return_score \\code{logical}. If \\code{TRUE} and out of sample test\n#'   data is provided as \\code{newdata}, a probabilistic score will be\n#'   calculated and returned. The score used will depend on the observation\n#'   family from the fitted model. Discrete families (\\code{poisson},\n#'   \\code{negative binomial}, \\code{tweedie}) use the Discrete Rank\n#'   Probability Score. Other families use the Continuous Rank Probability\n#'   Score. The value returned is the \\code{sum} of all scores within the out\n#'   of sample forecast horizon\n#'\n#' @author Nicholas J Clark\n#'\n#' @details `plot_mvgam_fc` generates posterior predictions from an object of\n#'   class \\code{mvgam}, calculates posterior empirical quantiles and plots\n#'   them against the observed data. If `realisations = FALSE`, the returned\n#'   plot shows 90, 60, 40 and 20 percent posterior quantiles (as ribbons of\n#'   increasingly darker shades of red) as well as the posterior median (as a\n#'   dark red line). If `realisations = TRUE`, a set of `n_realisations`\n#'   posterior draws are shown. This function produces an older style base\n#'   \\code{R} plot, as opposed to `plot.mvgam_forecast`\n#'\n#'   `plot.mvgam_forecast` takes an object of class `mvgam_forecast`, in which\n#'   forecasts have already been computed, and plots the resulting forecast\n#'   distribution as a `ggplot` object. This function is therefore more\n#'   versatile and is recommended over the older and clunkier\n#'   `plot_mvgam_fc` version\n#'\n#'   If \\code{realisations = FALSE}, these posterior quantiles are plotted\n#'   along with the true observed data that was used to train the model.\n#'   Otherwise, a spaghetti plot is returned to show possible forecast paths.\n#'\n#' @return A base \\code{R} graphics plot (for `plot_mvgam_fc`) or a `ggplot`\n#'   object (for `plot.mvgam_forecast`) and an optional \\code{list} containing\n#'   the forecast distribution and the out of sample probabilistic forecast\n#'   score\n#'\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(\n#'   n_series = 3,\n#'   trend_model = AR()\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Hindcasts on response scale\n#' hc <- hindcast(mod)\n#' str(hc)\n#' plot(hc, series = 1)\n#' plot(hc, series = 2)\n#' plot(hc, series = 3)\n#'\n#' # Forecasts on response scale\n#' fc <- forecast(\n#'   mod,\n#'   newdata = simdat$data_test\n#' )\n#' str(fc)\n#' plot(fc, series = 1)\n#' plot(fc, series = 2)\n#' plot(fc, series = 3)\n#'\n#' # Forecasts as expectations\n#' fc <- forecast(\n#'   mod,\n#'   newdata = simdat$data_test,\n#'   type = 'expected'\n#' )\n#' plot(fc, series = 1)\n#' plot(fc, series = 2)\n#' plot(fc, series = 3)\n#'\n#' # Dynamic trend extrapolations\n#' fc <- forecast(\n#'   mod,\n#'   newdata = simdat$data_test,\n#'   type = 'trend'\n#' )\n#' plot(fc, series = 1)\n#' plot(fc, series = 2)\n#' plot(fc, series = 3)\n#' }\n#'\n#' @name plot_mvgam_forecasts\nNULL\n\n#' @rdname plot_mvgam_forecasts\n#' @export\nplot_mvgam_fc = function(\n  object,\n  series = 1,\n  newdata,\n  data_test,\n  realisations = FALSE,\n  n_realisations = 15,\n  hide_xlabels = FALSE,\n  xlab,\n  ylab,\n  ylim,\n  n_cores = 1,\n  return_forecasts = FALSE,\n  return_score = FALSE,\n  ...\n) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  if (sign(series) != 1) {\n    stop('argument \"series\" must be a positive integer', call. = FALSE)\n  } else {\n    if (series %% 1 != 0) {\n      stop('argument \"series\" must be a positive integer', call. = FALSE)\n    }\n  }\n\n  if (series > NCOL(object$ytimes)) {\n    stop(\n      paste0(\n        'object only contains data / predictions for ',\n        NCOL(object$ytimes),\n        ' series'\n      ),\n      call. = FALSE\n    )\n  }\n\n  if (sign(n_realisations) != 1) {\n    stop('argument \"n_realisations\" must be a positive integer', call. = FALSE)\n  } else {\n    if (n_realisations %% 1 != 0) {\n      stop(\n        'argument \"n_realisations\" must be a positive integer',\n        call. = FALSE\n      )\n    }\n  }\n\n  if (return_score) {\n    return_forecasts <- TRUE\n  }\n\n  if (missing(data_test) & missing(\"newdata\")) {\n    # Check if newdata already included in the model\n    if (!is.null(object$test_data)) {\n      data_test <- object$test_data\n    }\n  }\n\n  if (!missing(\"newdata\")) {\n    data_test <- newdata\n\n    # Ensure outcome is labelled 'y' when feeding data to the model for simplicity\n    if (terms(formula(object$call))[[2]] != 'y') {\n      data_test$y <- data_test[[terms(formula(object$call))[[2]]]]\n    }\n  }\n\n  # Prediction indices for the particular series\n  data_train <- object$obs_data\n  ends <- seq(\n    0,\n    dim(mcmc_chains(object$model_output, 'ypred'))[2],\n    length.out = NCOL(object$ytimes) + 1\n  )\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n  ends <- ends[-1]\n\n  if (object$fit_engine == 'stan') {\n    # For stan objects, ypred is stored as a vector in column-major order\n    preds <- mcmc_chains(object$model_output, 'ypred')[,\n      seq(\n        series,\n        dim(mcmc_chains(object$model_output, 'ypred'))[2],\n        by = NCOL(object$ytimes)\n      ),\n      drop = FALSE\n    ]\n  } else {\n    preds <- mcmc_chains(object$model_output, 'ypred')[,\n      starts[series]:ends[series],\n      drop = FALSE\n    ]\n  }\n\n  # Add variables to data_test if missing\n  s_name <- levels(data_train$series)[series]\n  if (!missing(data_test)) {\n    # Ensure outcome is labelled 'y' when feeding data to the model for simplicity\n    if (terms(formula(object$call))[[2]] != 'y') {\n      if (object$family %in% c('binomial', 'beta_binomial')) {\n        resp_terms <- as.character(terms(formula(object$call))[[2]])\n        resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n        trial_name <- resp_terms[2]\n        data_test$y <- data_test[[resp_terms[1]]]\n\n        if (!exists(trial_name, data_test)) {\n          stop(\n            paste0('Variable ', trial_name, ' not found in newdata'),\n            call. = FALSE\n          )\n        }\n      } else {\n        data_test$y <- data_test[[terms(formula(object$call))[[2]]]]\n      }\n    }\n\n    if (!'y' %in% names(data_test)) {\n      data_test$y <- rep(NA, NROW(data_test))\n    }\n\n    if (inherits(data_test, 'list')) {\n      if (!'time' %in% names(data_test)) {\n        stop('data_test does not contain a \"time\" column')\n      }\n\n      if (!'series' %in% names(data_test)) {\n        data_test$series <- factor('series1')\n      }\n    } else {\n      if (!'time' %in% colnames(data_test)) {\n        stop('data_test does not contain a \"time\" column')\n      }\n\n      if (!'series' %in% colnames(data_test)) {\n        data_test$series <- factor('series1')\n      }\n    }\n\n    # If the posterior predictions do not already cover the data_test period, the forecast needs to be\n    # generated using the latent trend dynamics; note, this assumes that there is no gap between the training and\n    # testing datasets\n    if (inherits(data_test, 'list')) {\n      all_obs <- c(\n        data.frame(\n          y = data_train$y,\n          series = data_train$series,\n          time = data_train$time\n        ) %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y),\n        data.frame(\n          y = data_test$y,\n          series = data_test$series,\n          time = data_test$time\n        ) %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y)\n      )\n    } else {\n      all_obs <- c(\n        data_train %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y),\n        data_test %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y)\n      )\n    }\n\n    if (dim(preds)[2] != length(all_obs)) {\n      s_name <- levels(object$obs_data$series)[series]\n\n      if (attr(object$model_data, 'trend_model') == 'None') {\n        if (class(object$obs_data)[1] == 'list') {\n          series_obs <- which(data_test$series == s_name)\n          series_test <- lapply(data_test, function(x) {\n            if (is.matrix(x)) {\n              matrix(x[series_obs, ], ncol = NCOL(x))\n            } else {\n              x[series_obs]\n            }\n          })\n        } else {\n          series_test = data_test %>%\n            dplyr::filter(series == s_name)\n        }\n\n        fc_preds <- predict.mvgam(\n          object,\n          newdata = series_test,\n          type = 'response',\n          n_cores = n_cores\n        )\n      } else {\n        fc_preds <- forecast.mvgam(\n          object,\n          data_test = data_test,\n          n_cores = n_cores\n        )$forecasts[[series]]\n      }\n      preds <- cbind(preds, fc_preds)\n    }\n  }\n\n  # Plot quantiles of the forecast distribution\n  preds_last <- preds[1, ]\n  probs = c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n  cred <- sapply(\n    1:NCOL(preds),\n    function(n) quantile(preds[, n], probs = probs, na.rm = TRUE)\n  )\n\n  c_light <- c(\"#DCBCBC\")\n  c_light_highlight <- c(\"#C79999\")\n  c_mid <- c(\"#B97C7C\")\n  c_mid_highlight <- c(\"#A25050\")\n  c_dark <- c(\"#8F2727\")\n  c_dark_highlight <- c(\"#7C0000\")\n\n  if (missing(ylim)) {\n    ytrain <- data.frame(\n      series = data_train$series,\n      time = data_train$time,\n      y = data_train$y\n    ) %>%\n      dplyr::filter(series == s_name) %>%\n      dplyr::select(time, y) %>%\n      dplyr::distinct() %>%\n      dplyr::arrange(time) %>%\n      dplyr::pull(y)\n\n    if (tolower(object$family) %in% c('beta', 'bernoulli')) {\n      ylim <- c(\n        min(cred, min(ytrain, na.rm = TRUE)),\n        max(cred, max(ytrain, na.rm = TRUE))\n      )\n      ymin <- max(0, ylim[1])\n      ymax <- min(1, ylim[2])\n      ylim <- c(ymin, ymax)\n    } else if (tolower(object$family) %in% c('lognormal', 'gamma')) {\n      ylim <- c(\n        min(cred, min(ytrain, na.rm = TRUE)),\n        max(cred, max(ytrain, na.rm = TRUE))\n      )\n      ymin <- max(0, ylim[1])\n      ymax <- max(ylim)\n      ylim <- c(ymin, ymax)\n    } else {\n      ylim <- c(\n        min(cred, min(ytrain, na.rm = TRUE)),\n        max(cred, max(ytrain, na.rm = TRUE))\n      )\n    }\n  }\n\n  if (missing(ylab)) {\n    ylab <- paste0('Predicitons for ', levels(data_train$series)[series])\n  }\n\n  if (missing(xlab)) {\n    xlab <- 'Time'\n  }\n\n  pred_vals <- seq(1:length(preds_last))\n  if (hide_xlabels) {\n    plot(\n      1,\n      type = \"n\",\n      bty = 'L',\n      xlab = '',\n      xaxt = 'n',\n      ylab = ylab,\n      xlim = c(0, length(preds_last)),\n      ylim = ylim,\n      ...\n    )\n  } else {\n    plot(\n      1,\n      type = \"n\",\n      bty = 'L',\n      xlab = xlab,\n      ylab = ylab,\n      xaxt = 'n',\n      xlim = c(0, length(preds_last)),\n      ylim = ylim,\n      ...\n    )\n\n    if (!missing(data_test)) {\n      axis(\n        side = 1,\n        at = floor(seq(\n          0,\n          max(data_test$time) -\n            (min(object$obs_data$time) - 1),\n          length.out = 6\n        )),\n        labels = floor(seq(\n          min(object$obs_data$time),\n          max(data_test$time),\n          length.out = 6\n        ))\n      )\n    } else {\n      axis(\n        side = 1,\n        at = floor(seq(\n          0,\n          max(object$obs_data$time) -\n            (min(object$obs_data$time) - 1),\n          length.out = 6\n        )),\n        labels = floor(seq(\n          min(object$obs_data$time),\n          max(object$obs_data$time),\n          length.out = 6\n        ))\n      )\n    }\n  }\n\n  if (realisations) {\n    for (i in 1:n_realisations) {\n      lines(x = pred_vals, y = preds[i, ], col = 'white', lwd = 2.5)\n      lines(\n        x = pred_vals,\n        y = preds[i, ],\n        col = sample(\n          c(\"#DCBCBC\", \"#C79999\", \"#B97C7C\", \"#A25050\", \"#7C0000\"),\n          1\n        ),\n        lwd = 2.25\n      )\n    }\n  } else {\n    polygon(\n      c(pred_vals, rev(pred_vals)),\n      c(cred[1, ], rev(cred[9, ])),\n      col = c_light,\n      border = NA\n    )\n    polygon(\n      c(pred_vals, rev(pred_vals)),\n      c(cred[2, ], rev(cred[8, ])),\n      col = c_light_highlight,\n      border = NA\n    )\n    polygon(\n      c(pred_vals, rev(pred_vals)),\n      c(cred[3, ], rev(cred[7, ])),\n      col = c_mid,\n      border = NA\n    )\n    polygon(\n      c(pred_vals, rev(pred_vals)),\n      c(cred[4, ], rev(cred[6, ])),\n      col = c_mid_highlight,\n      border = NA\n    )\n    lines(pred_vals, cred[5, ], col = c_dark, lwd = 2.5)\n  }\n  box(bty = 'L', lwd = 2)\n\n  if (!missing(data_test)) {\n    if (class(data_train)[1] == 'list') {\n      data_train <- data.frame(\n        series = data_train$series,\n        y = data_train$y,\n        time = data_train$time\n      )\n      data_test <- data.frame(\n        series = data_test$series,\n        y = data_test$y,\n        time = data_test$time\n      )\n    }\n\n    last_train <- (NROW(data_train) / NCOL(object$ytimes))\n\n    # Show historical (hindcast) distribution in grey\n    if (!realisations) {\n      polygon(\n        c(\n          pred_vals[1:(NROW(data_train) / NCOL(object$ytimes))],\n          rev(pred_vals[1:(NROW(data_train) / NCOL(object$ytimes))])\n        ),\n        c(\n          cred[1, 1:(NROW(data_train) / NCOL(object$ytimes))],\n          rev(cred[9, 1:(NROW(data_train) / NCOL(object$ytimes))])\n        ),\n        col = 'grey70',\n        border = NA\n      )\n      lines(\n        pred_vals[1:(NROW(data_train) / NCOL(object$ytimes))],\n        cred[5, 1:(NROW(data_train) / NCOL(object$ytimes))],\n        col = 'grey70',\n        lwd = 2.5\n      )\n    }\n\n    # Plot training and testing points\n    points(\n      dplyr::bind_rows(data_train, data_test) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y),\n      pch = 16,\n      col = \"white\",\n      cex = 0.8\n    )\n    points(\n      dplyr::bind_rows(data_train, data_test) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y),\n      pch = 16,\n      col = \"black\",\n      cex = 0.65\n    )\n    abline(v = last_train, col = '#FFFFFF60', lwd = 2.85)\n    abline(v = last_train, col = 'black', lwd = 2.5, lty = 'dashed')\n\n    # Calculate out of sample probabilistic score\n    truth <- as.matrix(\n      data_test %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n    )\n    last_train <- length(\n      data_train %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n    )\n\n    fc <- preds[, (last_train + 1):NCOL(preds)]\n\n    if (all(is.na(truth))) {\n      score <- NULL\n      message(\n        'No non-missing values in data_test$y; cannot calculate forecast score'\n      )\n    } else {\n      if (\n        object$family %in%\n          c(\n            'poisson',\n            'negative binomial',\n            'tweedie',\n            'binomial',\n            'beta_binomial'\n          )\n      ) {\n        if (max(fc, na.rm = TRUE) > 50000) {\n          score <- sum(\n            crps_mcmc_object(as.vector(truth), fc)[, 1],\n            na.rm = TRUE\n          )\n          message(paste0('Out of sample CRPS:\\n', score))\n        } else {\n          score <- sum(\n            drps_mcmc_object(as.vector(truth), fc)[, 1],\n            na.rm = TRUE\n          )\n          message(paste0('Out of sample DRPS:\\n', score))\n        }\n      } else {\n        score <- sum(crps_mcmc_object(as.vector(truth), fc)[, 1], na.rm = TRUE)\n        message(paste0('Out of sample CRPS:\\n', score))\n      }\n    }\n  } else {\n    if (class(data_train)[1] == 'list') {\n      data_train <- data.frame(\n        series = data_train$series,\n        y = data_train$y,\n        time = data_train$time\n      )\n    }\n\n    points(\n      data_train %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y),\n      pch = 16,\n      col = \"white\",\n      cex = 0.8\n    )\n    points(\n      data_train %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y),\n      pch = 16,\n      col = \"black\",\n      cex = 0.65\n    )\n  }\n\n  if (return_forecasts) {\n    if (return_score) {\n      if (!missing(data_test)) {\n        return(list(\n          forecast = preds[, (last_train + 1):NCOL(preds)],\n          score = score\n        ))\n      } else {\n        return(list(forecast = preds, score = NULL))\n      }\n    } else {\n      if (!missing(data_test)) {\n        return(preds[, (last_train + 1):NCOL(preds)])\n      } else {\n        return(preds)\n      }\n    }\n  }\n}\n\n#' @rdname plot_mvgam_forecasts\n#'\n#' @param x Object of class `mvgam_forecast`\n#'\n#' @method plot mvgam_forecast\n#'\n#' @export\nplot.mvgam_forecast = function(\n  x,\n  series = 1,\n  realisations = FALSE,\n  n_realisations = 15,\n  xlab,\n  ylab,\n  ylim,\n  ...\n) {\n  object <- x\n  validate_pos_integer(series)\n  validate_pos_integer(n_realisations)\n\n  if (series > length(object$series_names)) {\n    stop(\n      paste0(\n        'object only contains data / predictions for ',\n        length(object$series_names),\n        ' series'\n      ),\n      call. = FALSE\n    )\n  }\n\n  s_name <- object$series_names[series]\n  if (!s_name %in% names(object$hindcasts)) {\n    stop(\n      paste0('forecasts for ', s_name, ' have not yet been computed'),\n      call. = FALSE\n    )\n  }\n\n  # Extract hindcast and forecast predictions\n  type <- object$type\n\n  preds <- cbind(\n    object$hindcasts[[which(names(object$hindcasts) == s_name)]],\n    object$forecasts[[which(names(object$forecasts) == s_name)]]\n  )\n\n  # Plot quantiles of the forecast distribution\n  probs <- c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n  cred <- sapply(\n    1:NCOL(preds),\n    function(n) quantile(preds[, n], probs = probs, na.rm = TRUE)\n  )\n\n  if (type == 'trend') {\n    if (missing(ylab)) {\n      ylab <- paste0('Estimated trend for ', s_name)\n    }\n  }\n\n  if (type == 'link') {\n    if (missing(ylab)) {\n      ylab <- paste0('Linear predictions for ', s_name)\n    }\n  }\n\n  if (type == 'expected') {\n    if (missing(ylab)) {\n      ylab <- paste0('Expectations for ', s_name)\n    }\n  }\n\n  if (type == 'detection') {\n    if (missing(ylab)) {\n      ylab <- paste0('Pr(detection) for ', s_name)\n    }\n  }\n\n  if (type == 'latent_N') {\n    if (missing(ylab)) {\n      ylab <- paste0('Latent abundance for ', s_name)\n    }\n  }\n\n  if (type == 'response') {\n    if (missing(ylab)) {\n      ylab <- paste0('Predictions for ', s_name)\n    }\n  }\n\n  if (missing(xlab)) {\n    xlab <- 'Time'\n  }\n\n  # Create a base plot using posterior credible intervals and observations\n  # for the specified series\n  plot_dat <- data.frame(\n    time = c(\n      object$train_times[[which(names(object$hindcasts) == s_name)]],\n      object$test_times[[which(names(object$hindcasts) == s_name)]]\n    ),\n    med = cred[5, ],\n    lower1 = cred[1, ],\n    lower2 = cred[2, ],\n    lower3 = cred[3, ],\n    lower4 = cred[4, ],\n    upper1 = cred[9, ],\n    upper2 = cred[8, ],\n    upper3 = cred[7, ],\n    upper4 = cred[6, ],\n    truth = c(\n      object$train_observations[[s_name]],\n      object$test_observations[[s_name]]\n    )\n  )\n\n  base_plot <- ggplot2::ggplot(\n    data = plot_dat,\n    mapping = ggplot2::aes(x = time, y = truth)\n  ) +\n    ggplot2::theme_classic() +\n    ggplot2::labs(x = xlab, y = ylab)\n\n  # Add to the base plot accordingly\n  if (realisations) {\n    for (i in 1:n_realisations) {\n      base_plot <- base_plot +\n        ggplot2::geom_line(\n          data = data.frame(\n            y = preds[i, ],\n            time = c(\n              object$train_times[[which(names(object$hindcasts) == s_name)]],\n              object$test_times[[which(names(object$hindcasts) == s_name)]]\n            )\n          ),\n          mapping = ggplot2::aes(x = time, y = y),\n          col = \"white\",\n          linewidth = 1\n        ) +\n        ggplot2::geom_line(\n          data = data.frame(\n            y = preds[i, ],\n            time = c(\n              object$train_times[[which(names(object$hindcasts) == s_name)]],\n              object$test_times[[which(names(object$hindcasts) == s_name)]]\n            )\n          ),\n          mapping = ggplot2::aes(x = time, y = y),\n          col = sample(\n            c(\"#DCBCBC\", \"#C79999\", \"#B97C7C\", \"#A25050\", \"#7C0000\"),\n            1\n          ),\n          linewidth = 0.75\n        )\n    }\n  } else {\n    base_plot <- base_plot +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower1, ymax = upper1),\n        fill = \"#DCBCBC\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower2, ymax = upper2),\n        fill = \"#C79999\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower3, ymax = upper3),\n        fill = \"#B97C7C\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower4, ymax = upper4),\n        fill = \"#A25050\"\n      ) +\n      ggplot2::geom_line(\n        mapping = ggplot2::aes(x = time, y = med),\n        col = \"#8F2727\",\n        linewidth = 1\n      )\n  }\n\n  # Show historical (hindcast) distribution in grey if this object\n  # contains forecasts\n  train_times <- object$train_times[[s_name]]\n  last_train <- length(object$train_observations[[s_name]])\n  if (type == 'response' & !is.null(object$forecasts)) {\n    if (!realisations) {\n      base_plot <- base_plot +\n        ggplot2::geom_line(\n          data = data.frame(\n            time = train_times,\n            lower1 = cred[1, 1:last_train],\n            upper1 = cred[9, 1:last_train],\n            med = cred[5, 1:last_train],\n            truth = 0\n          ),\n          mapping = ggplot2::aes(x = time, y = med),\n          col = \"white\",\n          linewidth = 1\n        ) +\n        ggplot2::geom_ribbon(\n          data = data.frame(\n            time = train_times,\n            lower1 = cred[1, 1:last_train],\n            upper1 = cred[9, 1:last_train],\n            truth = 0\n          ),\n          mapping = ggplot2::aes(ymin = lower1, ymax = upper1),\n          fill = \"grey70\"\n        )\n    }\n  }\n\n  if (\n    type == 'response' || c(type == 'expected' & object$family == 'bernoulli')\n  ) {\n    # Plot training and testing points\n    base_plot <- base_plot +\n      ggplot2::geom_point(pch = 21, col = 'white', fill = 'black')\n\n    # Calculate out of sample probabilistic score;\n    # need to ensure fc is a matrix, even if only a single\n    # out of sample observation was forecasted (#111)\n    if (!is.null(object$forecasts)) {\n      fc <- as.matrix(object$forecasts[[s_name]])\n    } else {\n      fc <- NULL\n    }\n\n    truth <- object$test_observations[[s_name]]\n\n    if (all(is.na(truth))) {\n      score <- NULL\n      message(paste0(\n        'No non-missing values in test_observations; cannot calculate forecast score\\n'\n      ))\n    } else {\n      if (\n        object$family %in%\n          c(\n            'poisson',\n            'negative binomial',\n            'tweedie',\n            'binomial',\n            'beta_binomial'\n          )\n      ) {\n        if (max(fc, na.rm = TRUE) > 50000) {\n          score <- sum(\n            crps_mcmc_object(as.vector(truth), fc)[, 1],\n            na.rm = TRUE\n          )\n          message(paste0('Out of sample CRPS:\\n', score))\n        } else {\n          score <- sum(\n            drps_mcmc_object(as.vector(truth), fc)[, 1],\n            na.rm = TRUE\n          )\n          message(paste0('Out of sample DRPS:\\n', score))\n        }\n      } else if (object$family == 'bernoulli') {\n        score <- sum(brier_mcmc_object(as.vector(truth), fc)[, 1], na.rm = TRUE)\n        message(paste0('Out of sample Brier:\\n', score))\n      } else {\n        score <- sum(crps_mcmc_object(as.vector(truth), fc)[, 1], na.rm = TRUE)\n        message(paste0('Out of sample CRPS:\\n', score))\n      }\n    }\n  }\n\n  if (!is.null(object$forecasts)) {\n    base_plot <- base_plot +\n      ggplot2::geom_vline(\n        xintercept = max(train_times),\n        linetype = 'dashed'\n      )\n  }\n\n  if (!missing(ylim)) {\n    base_plot <- base_plot +\n      ggplot2::scale_y_continuous(limits = ylim)\n  }\n\n  base_plot\n}\n"
  },
  {
    "path": "R/plot_mvgam_pterms.R",
    "content": "#' Plot parametric term partial effects for \\pkg{mvgam} models\n#'\n#' This function plots posterior empirical quantiles for partial effects of\n#' parametric terms\n#'\n#' @importFrom graphics layout title rug bxp\n#'\n#' @importFrom stats coef predict\n#'\n#' @inheritParams plot.mvgam\n#'\n#' @param object \\code{list} object of class \\code{mvgam}. See [mvgam()]\n#'\n#' @details Posterior empirical quantiles of each parametric term's partial\n#'   effect estimates (on the link scale) are calculated and visualised as\n#'   ribbon plots. These effects can be interpreted as the partial effect that\n#'   a parametric term contributes when all other terms in the model have been\n#'   set to \\code{0}\n#'\n#' @return A base \\code{R} graphics plot\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nplot_mvgam_pterms = function(object, trend_effects = FALSE) {\n  # General plotting colours and empirical quantile probabilities\n  c_light <- c(\"#DCBCBC\")\n  c_light_trans <- c(\"#DCBCBC70\")\n  c_light_highlight <- c(\"#C79999\")\n  c_mid <- c(\"#B97C7C\")\n  c_mid_highlight <- c(\"#A25050\")\n  c_mid_highlight_trans <- c(\"#A2505095\")\n  c_dark <- c(\"#8F2727\")\n  c_dark_highlight <- c(\"#7C0000\")\n  probs = c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  object2 <- object\n\n  if (trend_effects) {\n    if (is.null(object$trend_call)) {\n      stop('no trend_formula exists so there no trend-level smooths to plot')\n    }\n\n    object2$mgcv_model <- object2$trend_mgcv_model\n  }\n\n  # Look for parametric terms in the model\n  pterms <- attr(object2$mgcv_model$pterms, 'term.labels')\n\n  if (length(pterms) > 0) {\n    # Graphical parameters\n    .pardefault <- par(no.readonly = T)\n    on.exit(par(.pardefault))\n\n    if (length(pterms) == 1) {\n      par(mfrow = c(1, 1), mar = c(4, 4.5, 3, 4))\n    }\n\n    if (length(pterms) == 2) {\n      par(\n        mfrow = c(2, 1),\n        mar = c(2.5, 2.3, 2, 2),\n        oma = c(1, 1, 0, 0),\n        mgp = c(1.5, 0.5, 0)\n      )\n    }\n\n    if (length(pterms) %in% c(3, 4)) {\n      par(\n        mfrow = c(2, 2),\n        mar = c(2.5, 2.3, 2, 2),\n        oma = c(1, 1, 0, 0),\n        mgp = c(1.5, 0.5, 0)\n      )\n    }\n\n    for (i in 1:length(pterms)) {\n      # Find out which beta corresponds to the associated parametric term\n      betas_keep <- grepl(\n        paste0('^(?=.*', pterms[i], ')(?!.*s\\\\()'),\n        colnames(predict(object2$mgcv_model, type = 'lpmatrix')),\n        perl = TRUE\n      )\n      if (trend_effects) {\n        betas <- mcmc_chains(object2$model_output, 'b_trend')[, betas_keep]\n      } else {\n        betas <- mcmc_chains(object2$model_output, 'b')[, betas_keep]\n      }\n\n      # Generate linear predictor matrix from fitted mgcv model\n      Xp <- obs_Xp_matrix(\n        newdata = object2$obs_data,\n        mgcv_model = object2$mgcv_model\n      )\n\n      # Zero out all other columns in Xp\n      Xp[, !betas_keep] <- 0\n\n      # X-axis values\n      if (inherits(object2$obs_data, 'list')) {\n        pred_vals_orig <- sort(object2$obs_data[[pterms[i]]])\n      } else {\n        pred_vals_orig <- sort(\n          object2$obs_data %>%\n            dplyr::pull(pterms[i])\n        )\n      }\n\n      if (inherits(object2$obs_data[[pterms[i]]], 'factor')) {\n        # Use a simple Boxplot for factor terms for now\n        if (is.matrix(betas)) {\n          beta_creds <- apply(\n            betas,\n            2,\n            function(x) {\n              quantile(\n                x,\n                probs = c(0, 0.05, 0.5, 0.95, 1),\n                na.rm = TRUE\n              )\n            }\n          )\n        } else {\n          beta_creds <- matrix(quantile(\n            betas,\n            probs = c(0, 0.05, 0.5, 0.95, 1),\n            na.rm = TRUE\n          ))\n        }\n\n        colnames(beta_creds) <-\n          substr(\n            names(coef(object2$mgcv_model))[grepl(\n              paste0('^(?=.*', pterms[i], ')(?!.*s\\\\()'),\n              colnames(predict(object2$mgcv_model, type = 'lpmatrix')),\n              perl = TRUE\n            )],\n            nchar(pterms[i]) + 1,\n            1000000L\n          )\n\n        bp <- boxplot(beta_creds, range = 0, plot = FALSE)\n        bxp(\n          bp,\n          whisklty = 0,\n          staplelty = 0,\n          boxfill = c_light,\n          boxcol = c_light,\n          medcol = c_dark,\n          frame.plot = FALSE,\n          ylab = paste0('Partial effect')\n        )\n\n        if (is.matrix(betas)) {\n          bp$stats <- apply(\n            betas,\n            2,\n            function(x) {\n              quantile(\n                x,\n                probs = c(0, 0.3, 0.5, 0.7, 1),\n                na.rm = TRUE\n              )\n            }\n          )\n        } else {\n          bp$stats <- matrix(quantile(\n            betas,\n            probs = c(0, 0.3, 0.5, 0.7, 1),\n            na.rm = TRUE\n          ))\n        }\n\n        bxp(\n          bp,\n          whisklty = 0,\n          staplelty = 0,\n          add = TRUE,\n          frame.plot = FALSE,\n          boxcol = c_light_highlight,\n          medcol = c_dark,\n          boxfill = c_light_highlight\n        )\n\n        if (is.matrix(betas)) {\n          bp$stats <- apply(\n            betas,\n            2,\n            function(x) {\n              quantile(\n                x,\n                probs = c(0, 0.2, 0.5, 0.8, 1),\n                na.rm = TRUE\n              )\n            }\n          )\n        } else {\n          bp$stats <- matrix(quantile(\n            betas,\n            probs = c(0, 0.2, 0.5, 0.8, 1),\n            na.rm = TRUE\n          ))\n        }\n\n        bxp(\n          bp,\n          whisklty = 0,\n          staplelty = 0,\n          add = TRUE,\n          frame.plot = FALSE,\n          boxcol = c_mid,\n          medcol = c_dark,\n          boxfill = c_mid\n        )\n\n        if (is.matrix(betas)) {\n          bp$stats <- apply(\n            betas,\n            2,\n            function(x) {\n              quantile(\n                x,\n                probs = c(0, 0.4, 0.5, 0.6, 1),\n                na.rm = TRUE\n              )\n            }\n          )\n        } else {\n          bp$stats <- matrix(quantile(\n            betas,\n            probs = c(0, 0.4, 0.5, 0.6, 1),\n            na.rm = TRUE\n          ))\n        }\n\n        bxp(\n          bp,\n          whisklty = 0,\n          staplelty = 0,\n          add = TRUE,\n          frame.plot = FALSE,\n          boxcol = c_mid_highlight,\n          medcol = c_dark,\n          boxfill = c_mid_highlight\n        )\n\n        box(bty = 'L', lwd = 2)\n        title(pterms[i], adj = 0)\n      } else {\n        beta_creds <- quantile(betas, probs = probs, na.rm = TRUE)\n        pred_vals <- seq(\n          min(pred_vals_orig),\n          max(pred_vals_orig),\n          length.out = 500\n        )\n        cred <- as.matrix(beta_creds) %*% pred_vals\n\n        # Plot\n        plot(\n          1,\n          type = \"n\",\n          bty = 'L',\n          xlab = pterms[i],\n          ylab = paste0('Partial effect'),\n          xlim = c(min(pred_vals), max(pred_vals)),\n          ylim = c(min(cred), max(cred))\n        )\n        title(pterms[i], adj = 0)\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[1, ], rev(cred[9, ])),\n          col = c_light,\n          border = NA\n        )\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[2, ], rev(cred[8, ])),\n          col = c_light_highlight,\n          border = NA\n        )\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[3, ], rev(cred[7, ])),\n          col = c_mid,\n          border = NA\n        )\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[4, ], rev(cred[6, ])),\n          col = c_mid_highlight,\n          border = NA\n        )\n        lines(pred_vals, cred[5, ], col = c_dark, lwd = 2.5)\n        rug(pred_vals_orig, lwd = 1.75, ticksize = 0.025, col = c_mid_highlight)\n        box(bty = 'L', lwd = 2)\n      }\n    }\n    layout(1)\n  } else {\n    message('No parametric terms in model formula')\n  }\n}\n"
  },
  {
    "path": "R/plot_mvgam_randomeffects.R",
    "content": "#' Plot random effect terms from \\pkg{mvgam} models\n#'\n#' This function plots posterior empirical quantiles for random effect\n#' smooths (bs = re)\n#'\n#' @importFrom graphics layout title\n#'\n#' @inheritParams plot.mvgam\n#'\n#' @param object \\code{list} object of class \\code{mvgam}. See [mvgam()]\n#'\n#' @details Posterior empirical quantiles of random effect coefficient\n#'   estimates (on the link scale) are calculated and visualised as ribbon\n#'   plots. Labels for coefficients are taken from the levels of the original\n#'   factor variable that was used to specify the smooth in the model's\n#'   formula\n#'\n#' @return A base \\code{R} graphics plot\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\n#'\nplot_mvgam_randomeffects = function(object, trend_effects = FALSE) {\n  # General plotting colours and empirical quantile probabilities\n  c_light <- c(\"#DCBCBC\")\n  c_light_trans <- c(\"#DCBCBC70\")\n  c_light_highlight <- c(\"#C79999\")\n  c_mid <- c(\"#B97C7C\")\n  c_mid_highlight <- c(\"#A25050\")\n  c_mid_highlight_trans <- c(\"#A2505095\")\n  c_dark <- c(\"#8F2727\")\n  c_dark_highlight <- c(\"#7C0000\")\n  probs = c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n\n  object2 <- object\n\n  if (trend_effects) {\n    if (is.null(object$trend_call)) {\n      stop('no trend_formula exists so there no trend-level smooths to plot')\n    }\n\n    object2$mgcv_model <- object2$trend_mgcv_model\n  }\n\n  # Labels of smooths in formula\n  smooth_labs <- do.call(\n    rbind,\n    lapply(seq_along(object2$mgcv_model$smooth), function(x) {\n      data.frame(\n        label = object2$mgcv_model$smooth[[x]]$label,\n        class = class(object2$mgcv_model$smooth[[x]])[1]\n      )\n    })\n  )\n\n  # Check if any smooths were bs = \"re\"; if not, return a message\n  if (any(smooth_labs$class == 'random.effect')) {\n    re_smooths <- smooth_labs %>%\n      dplyr::mutate(smooth_num = dplyr::row_number()) %>%\n      dplyr::filter(class == 'random.effect') %>%\n      dplyr::pull(label)\n\n    if (trend_effects) {\n      re_smooths <- gsub('series', 'trend', re_smooths, fixed = TRUE)\n    }\n\n    .pardefault <- par(no.readonly = T)\n    on.exit(par(.pardefault))\n\n    if (length(re_smooths) == 1) {\n      par(mfrow = c(1, 1))\n    }\n\n    if (length(re_smooths) == 2) {\n      par(mfrow = c(2, 1))\n    }\n\n    if (length(re_smooths) %in% c(3, 4)) {\n      par(mfrow = c(2, 2))\n    }\n\n    for (i in 1:length(re_smooths)) {\n      # Find out which betas correspond to the associated random effect estimates\n      (smooth_labs %>%\n        dplyr::mutate(smooth_num = dplyr::row_number()) %>%\n        dplyr::filter(class == 'random.effect') %>%\n        dplyr::pull(smooth_num))[i] -> smooth_number\n\n      betas_keep <- object2$mgcv_model$smooth[[\n        smooth_number\n      ]]$first.para:object2$mgcv_model$smooth[[smooth_number]]$last.para\n\n      if (trend_effects) {\n        betas <- mcmc_chains(object2$model_output, 'b_trend')[, betas_keep]\n      } else {\n        betas <- mcmc_chains(object2$model_output, 'b')[, betas_keep]\n      }\n\n      # Plot the random effect estimates\n      beta_creds <- sapply(\n        1:NCOL(betas),\n        function(n) quantile(betas[, n], probs = probs, na.rm = TRUE)\n      )\n      N <- NCOL(betas)\n      x <- 1:N\n      idx <- rep(1:N, each = 2)\n      repped_x <- rep(x, each = 2)\n      x <- sapply(\n        1:length(idx),\n        function(k) {\n          if (k %% 2 == 0) {\n            repped_x[k] + min(diff(x)) / 2\n          } else {\n            repped_x[k] - min(diff(x)) / 2\n          }\n        }\n      )\n\n      plot(\n        1,\n        type = \"n\",\n        bty = 'L',\n        ylab = 'Partial effect',\n        xlab = '',\n        xlim = range(x),\n        xaxt = 'n',\n        ylim = range(c(as.vector(beta_creds)))\n      )\n      title(re_smooths[i], adj = 0)\n      rect(\n        xleft = x[seq(1, N * 2, by = 2)],\n        xright = x[seq(2, N * 2, by = 2)],\n        ytop = as.numeric(c(beta_creds[9, ])),\n        ybottom = as.numeric(c(beta_creds[1, ])),\n        col = c_light,\n        border = 'transparent'\n      )\n      rect(\n        xleft = x[seq(1, N * 2, by = 2)],\n        xright = x[seq(2, N * 2, by = 2)],\n        ytop = as.numeric(c(beta_creds[8, ])),\n        ybottom = as.numeric(c(beta_creds[2, ])),\n        col = c_light_highlight,\n        border = 'transparent'\n      )\n      rect(\n        xleft = x[seq(1, N * 2, by = 2)],\n        xright = x[seq(2, N * 2, by = 2)],\n        ytop = as.numeric(c(beta_creds[7, ])),\n        ybottom = as.numeric(c(beta_creds[3, ])),\n        col = c_mid,\n        border = 'transparent'\n      )\n      rect(\n        xleft = x[seq(1, N * 2, by = 2)],\n        xright = x[seq(2, N * 2, by = 2)],\n        ytop = as.numeric(c(beta_creds[6, ])),\n        ybottom = as.numeric(c(beta_creds[4, ])),\n        col = c_mid_highlight,\n        border = 'transparent'\n      )\n\n      for (k in 1:(N)) {\n        lines(\n          x = c(x[seq(1, N * 2, by = 2)][k], x[seq(2, N * 2, by = 2)][k]),\n          y = c(beta_creds[5, k], beta_creds[5, k]),\n          col = c_dark,\n          lwd = 2\n        )\n      }\n      box(bty = 'L', lwd = 2)\n\n      # Label x-axis with the factor variable levels\n      factor_var_name <- tail(\n        strsplit(gsub('\\\\)', '', gsub('s\\\\(', '', re_smooths[i])), ',')[[1]],\n        1\n      )\n      if (trend_effects & factor_var_name == 'trend') {\n        # Just use trend labels\n        axis(side = 1, at = 1:N, labels = paste0('trend_', 1:N))\n      } else {\n        if (inherits(object2$obs_data, 'list')) {\n          axis(\n            side = 1,\n            at = 1:N,\n            labels = levels(object2$obs_data[[factor_var_name]])\n          )\n        } else {\n          axis(\n            side = 1,\n            at = 1:N,\n            labels = levels(\n              object2$obs_data %>%\n                dplyr::pull(factor_var_name)\n            )\n          )\n        }\n      }\n    }\n    layout(1)\n  } else {\n    message('No random effect smooths (bs = \"re\") in model formula')\n  }\n}\n"
  },
  {
    "path": "R/plot_mvgam_resids.R",
    "content": "#' Residual diagnostics for a fitted \\pkg{mvgam} object\n#'\n#' This function takes a fitted \\code{mvgam} object and returns various\n#' residual diagnostic plots\n#'\n#' @importFrom graphics layout title\n#'\n#' @importFrom stats complete.cases qqnorm qqline acf pacf na.pass\n#'\n#' @importFrom mgcv bam\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @param series \\code{integer} specifying which series in the set is to be\n#'   plotted\n#'\n#' @param n_draws \\code{integer} specifying the number of posterior residual\n#'   draws to use for calculating uncertainty in the `\"ACF\"` and `\"pACF\"` frames.\n#'   Default is `100`\n#'\n#' @param n_points \\code{integer} specifying the maximum number of points to\n#'   show in the \"Resids vs Fitted\" and \"Normal Q-Q Plot\" frames. Default is\n#'   `1000`\n#'\n#' @author Nicholas J Clark\n#'\n#' @details A total of four ggplot plots are generated to examine posterior\n#'   Dunn-Smyth residuals for the specified series. Plots include a residuals\n#'   vs fitted values plot, a Q-Q plot, and two plots to check for any\n#'   remaining temporal autocorrelation in the residuals. Note, all plots only\n#'   report statistics from a sample of up to `100` posterior draws (to save\n#'   computational time), so uncertainty in these relationships may not be\n#'   adequately represented.\n#'\n#' @return A facetted `ggplot` object\n#'\n#' @author Nicholas J Clark and Matthijs Hollanders\n#'\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(\n#'   n_series = 3,\n#'   trend_model = AR()\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Plot Dunn Smyth residuals for some series\n#' plot_mvgam_resids(mod)\n#' plot_mvgam_resids(mod, series = 2)\n#' }\n#'\n#' @export\nplot_mvgam_resids = function(\n  object,\n  series = 1,\n  n_draws = 100L,\n  n_points = 1000L\n) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  validate_pos_integer(series)\n  validate_pos_integer(n_draws)\n  validate_pos_integer(n_points)\n\n  if (series > NCOL(object$ytimes)) {\n    stop(\n      paste0(\n        'object only contains data / predictions for ',\n        NCOL(object$ytimes),\n        ' series'\n      ),\n      call. = FALSE\n    )\n  }\n\n  # Take a sample of posterior draws to compute autocorrelation statistics\n  # This is because acf(posterior_median_residual) can induce spurious patterns\n  # due to the randomness of DS residuals;\n  # rather, we want median(acf(residual_i)), where i indexes all possible draws\n  # But this is computationally expensive for some models so we compromise\n  # by only taking a few draws\n  n_total_draws <- NROW(object$resids[[series]])\n  n_samps <- min(n_draws, n_total_draws)\n  hcs <- hindcast(object, type = 'expected')$hindcasts[[series]]\n  resids <- object$resids[[series]]\n\n  resid_df <- do.call(\n    rbind,\n    lapply(seq_len(n_samps), function(x) {\n      data.frame(preds = hcs[x, ], resids = resids[x, ], .draw = x) %>%\n        dplyr::filter(!is.na(resids))\n    })\n  )\n\n  # Plot predictions and residuals (but limit number of points to n_points to\n  # speed up plotting)\n  if (NROW(resid_df) > n_points) {\n    resid_df <- resid_df[sample(1:NROW(resid_df), n_points, replace = FALSE), ]\n  }\n\n  fvr_plot <- ggplot2::ggplot(resid_df, ggplot2::aes(preds, resids)) +\n    ggplot2::geom_point(shape = 16, col = 'white', size = 1.25, alpha = 0.4) +\n    ggplot2::geom_point(shape = 16, col = 'black', size = 1, alpha = 0.4) +\n    ggplot2::geom_smooth(\n      method = \"gam\",\n      formula = y ~ s(x, bs = \"cs\"),\n      colour = \"#7C000060\",\n      fill = \"#7C000040\"\n    ) +\n    ggplot2::labs(\n      title = \"Resids vs Fitted\",\n      x = \"Fitted values\",\n      y = \"DS residuals\"\n    ) +\n    ggplot2::theme_bw()\n\n  # Q-Q plot\n  qq_plot <- ggplot2::ggplot(resid_df, ggplot2::aes(sample = resids)) +\n    ggplot2::stat_qq_line(colour = \"#8F2727\", linewidth = 1) +\n    ggplot2::stat_qq(shape = 16, col = 'white', size = 1.25, alpha = 0.4) +\n    ggplot2::stat_qq(shape = 16, col = 'black', size = 1, alpha = 0.4) +\n    ggplot2::labs(\n      title = \"Normal Q-Q Plot\",\n      x = \"Theoretical Quantiles\",\n      y = \"Sample Quantiles\"\n    ) +\n    ggplot2::theme_bw()\n\n  # ACF plot\n  acf_stats <- do.call(\n    rbind,\n    lapply(seq_len(n_samps), function(x) {\n      acf_calc <- acf(resids[x, ], plot = FALSE, na.action = na.pass)\n      data.frame(\n        acf = acf_calc$acf[,, 1],\n        lag = acf_calc$lag[, 1, 1],\n        denom = sqrt(acf_calc$n.used)\n      ) %>%\n        dplyr::filter(lag > 0)\n    })\n  ) %>%\n    dplyr::group_by(lag) %>%\n    dplyr::mutate(\n      ylow = quantile(acf, probs = 0.05, na.rm = TRUE),\n      yqlow = quantile(acf, probs = 0.2, na.rm = TRUE),\n      ymidlow = quantile(acf, probs = 0.25, na.rm = TRUE),\n      ymidhigh = quantile(acf, probs = 0.75, na.rm = TRUE),\n      yqhigh = quantile(acf, probs = 0.8, na.rm = TRUE),\n      yhigh = quantile(acf, probs = 0.95, na.rm = TRUE)\n    ) %>%\n    dplyr::select(-acf) %>%\n    dplyr::distinct()\n\n  acf_plot <- ggplot2::ggplot(acf_stats, ggplot2::aes(x = lag)) +\n    ggplot2::geom_hline(\n      yintercept = c(-1, 1) *\n        qnorm((1 + 0.95) / 2) /\n        acf_stats$denom[1],\n      linetype = \"dashed\"\n    ) +\n    ggplot2::geom_hline(yintercept = 0, colour = \"#7C0000\", linewidth = 0.25) +\n    ggplot2::geom_segment(\n      colour = \"#DCBCBC\",\n      linewidth = 1.5,\n      ggplot2::aes(y = ylow, yend = yhigh)\n    ) +\n    ggplot2::geom_segment(\n      colour = \"#B97C7C\",\n      linewidth = 1.5,\n      ggplot2::aes(y = yqlow, yend = yqhigh)\n    ) +\n    ggplot2::geom_segment(\n      colour = \"#7C0000\",\n      linewidth = 1.5,\n      ggplot2::aes(y = ymidlow, yend = ymidhigh)\n    ) +\n    ggplot2::labs(title = \"ACF\", x = \"Lag\", y = \"Autocorrelation\") +\n    ggplot2::theme_bw()\n\n  # PACF plot\n  pacf_stats <- do.call(\n    rbind,\n    lapply(seq_len(n_samps), function(x) {\n      acf_calc <- pacf(resids[x, ], plot = FALSE, na.action = na.pass)\n      data.frame(\n        pacf = acf_calc$acf[,, 1],\n        lag = acf_calc$lag[, 1, 1],\n        denom = sqrt(acf_calc$n.used)\n      ) %>%\n        dplyr::filter(lag > 0)\n    })\n  ) %>%\n    dplyr::group_by(lag) %>%\n    dplyr::mutate(\n      ylow = quantile(pacf, probs = 0.05, na.rm = TRUE),\n      yqlow = quantile(pacf, probs = 0.2, na.rm = TRUE),\n      ymidlow = quantile(pacf, probs = 0.25, na.rm = TRUE),\n      ymidhigh = quantile(pacf, probs = 0.75, na.rm = TRUE),\n      yqhigh = quantile(pacf, probs = 0.8, na.rm = TRUE),\n      yhigh = quantile(pacf, probs = 0.95, na.rm = TRUE)\n    ) %>%\n    dplyr::select(-pacf) %>%\n    dplyr::distinct()\n\n  pacf_plot <- ggplot2::ggplot(pacf_stats, ggplot2::aes(x = lag)) +\n    ggplot2::geom_hline(\n      yintercept = c(-1, 1) *\n        qnorm((1 + 0.95) / 2) /\n        pacf_stats$denom[1],\n      linetype = \"dashed\"\n    ) +\n    ggplot2::geom_hline(yintercept = 0, colour = \"#7C0000\", linewidth = 0.25) +\n    ggplot2::geom_segment(\n      colour = \"#DCBCBC\",\n      linewidth = 1.5,\n      ggplot2::aes(y = ylow, yend = yhigh)\n    ) +\n    ggplot2::geom_segment(\n      colour = \"#B97C7C\",\n      linewidth = 1.5,\n      ggplot2::aes(y = yqlow, yend = yqhigh)\n    ) +\n    ggplot2::geom_segment(\n      colour = \"#7C0000\",\n      linewidth = 1.5,\n      ggplot2::aes(y = ymidlow, yend = ymidhigh)\n    ) +\n    ggplot2::labs(title = \"pACF\", x = \"Lag\", y = \"Partial autocorrelation\") +\n    ggplot2::theme_bw()\n\n  # return\n  patchwork::wrap_plots(\n    fvr_plot,\n    qq_plot,\n    acf_plot,\n    pacf_plot,\n    ncol = 2,\n    nrow = 2,\n    byrow = TRUE\n  )\n}\n"
  },
  {
    "path": "R/plot_mvgam_series.R",
    "content": "#' Plot observed time series used for \\pkg{mvgam} modelling\n#'\n#' This function takes either a fitted \\code{mvgam} object or a\n#' \\code{data.frame} object and produces plots of observed time series, ACF,\n#' CDF and histograms for exploratory data analysis\n#'\n#' @importFrom stats lag\n#'\n#' @param object Optional \\code{list} object returned from \\code{mvgam}. Either\n#'   \\code{object} or \\code{data} must be supplied\n#'\n#' @param data Optional \\code{data.frame} or \\code{list} of training data\n#'   containing at least 'series' and 'time'. Use this argument if training\n#'   data have been gathered in the correct format for \\code{mvgam} modelling\n#'   but no model has yet been fitted.\n#'\n#' @param newdata Optional \\code{data.frame} or \\code{list} of test data\n#'   containing at least 'series' and 'time' for the forecast horizon, in\n#'   addition to any other variables included in the linear predictor of\n#'   \\code{formula}. If included, the observed values in the test data are\n#'   compared to the model's forecast distribution for exploring biases in\n#'   model predictions\n#'\n#' @param y Character. What is the name of the outcome variable in the supplied\n#'   data? Defaults to \\code{'y'}\n#'\n#' @param lines Logical. If \\code{TRUE}, line plots are used for visualizing\n#'   time series. If \\code{FALSE}, points are used.\n#'\n#' @param series Either an \\code{integer} specifying which series in the set is\n#'   to be plotted or the string 'all', which plots all series available in the\n#'   supplied data\n#'\n#' @param n_bins \\code{integer} specifying the number of bins to use for\n#'   binning observed values when plotting a histogram. Default is to use the\n#'   number of bins returned by a call to `hist` in base `R`\n#'\n#' @param log_scale \\code{logical}. If \\code{series == 'all'}, this flag is\n#'   used to control whether the time series plot is shown on the log scale\n#'   (using `log(Y + 1)`). This can be useful when visualizing many series that\n#'   may have different observed ranges. Default is \\code{FALSE}\n#'\n#' @author Nicholas J Clark and Matthijs Hollanders\n#'\n#' @return A set of ggplot objects. If \\code{series} is an integer, the plots\n#'   will show observed time series, autocorrelation and cumulative\n#'   distribution functions, and a histogram for the series. If\n#'   \\code{series == 'all'}, a set of observed time series plots is returned in\n#'   which all series are shown on each plot but only a single focal series is\n#'   highlighted, with all remaining series shown as faint gray lines.\n#'\n#' @examples\n#' # Simulate and plot series with observations bounded at 0 and 1 (Beta responses)\n#' sim_data <- sim_mvgam(\n#'   family = betar(),\n#'   trend_model = RW(),\n#'   prop_trend = 0.6\n#' )\n#'\n#' plot_mvgam_series(\n#'   data = sim_data$data_train,\n#'   series = 'all'\n#' )\n#'\n#' plot_mvgam_series(\n#'   data = sim_data$data_train,\n#'   newdata = sim_data$data_test,\n#'   series = 1\n#' )\n#'\n#' # Now simulate series with overdispersed discrete observations\n#' sim_data <- sim_mvgam(\n#'   family = nb(),\n#'   trend_model = RW(),\n#'   prop_trend = 0.6,\n#'   phi = 10\n#' )\n#'\n#' plot_mvgam_series(\n#'   data = sim_data$data_train,\n#'   series = 'all'\n#' )\n#'\n#' @export\nplot_mvgam_series <- function(\n  object,\n  data,\n  newdata,\n  y = 'y',\n  lines = TRUE,\n  series = 1,\n  n_bins = NULL,\n  log_scale = FALSE\n) {\n  # Validate series\n  if (is.character(series)) {\n    if (series != 'all') {\n      stop(\n        'argument \"series\" must be either a positive integer or \"all\"',\n        call. = FALSE\n      )\n    }\n  } else {\n    if (sign(series) != 1) {\n      stop(\n        'argument \"series\" must be either a positive integer or \"all\"',\n        call. = FALSE\n      )\n    } else {\n      if (series %% 1 != 0) {\n        stop(\n          'argument \"series\" must be either a positive integer or \"all\"',\n          call. = FALSE\n        )\n      }\n    }\n  }\n\n  # Extract training data\n  if (!missing(object)) {\n    if (!(inherits(object, \"mvgam\"))) {\n      stop('argument \"object\" must be of class \"mvgam\"')\n    }\n\n    if (!missing(\"data\")) {\n      warning('both \"object\" and \"data\" were supplied; only using \"object\"')\n    }\n\n    data_train <- object$obs_data\n\n    # What is the response variable?\n    resp_terms <- as.character(terms(formula(object$call))[[2]])\n    if (length(resp_terms) == 1) {\n      y <- as.character(terms(object$call)[[2]])\n    } else {\n      if (any(grepl('cbind', resp_terms))) {\n        resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n        y <- resp_terms[1]\n      }\n    }\n  } else {\n    data_train <- data\n  }\n\n  # Validate data\n  data_train <- validate_plot_data(data_train, y)\n  if (!missing(newdata)) {\n    data_test <- validate_plot_data(newdata, y)\n  }\n\n  # Determine what to plot\n  if (is.character(series) && series == 'all') {\n    # Only return a plot of the time series\n    dat <- dplyr::as_tibble(data_train) %>%\n      dplyr::distinct(time, y, series)\n\n    # Create time series plot\n    plot_ts <- plot_time_series(dat, lines, log_scale, y, series)\n\n    # Return\n    return(plot_ts)\n  } else {\n    # Return multiple plots for one time series\n    s_name <- levels(data_train$series)[series]\n\n    # Bind test data if supplied\n    dat <- dplyr::as_tibble(data_train) %>%\n      dplyr::filter(series == s_name) %>%\n      dplyr::distinct(time, y) %>%\n      dplyr::mutate(data = \"train\")\n\n    if (!missing(newdata)) {\n      dat <- dplyr::bind_rows(\n        dat,\n        dplyr::as_tibble(data_test) %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::distinct(time, y) %>%\n          dplyr::mutate(data = \"validate\")\n      )\n    }\n\n    # Create each plot component\n    plot_ts <- plot_time_series(dat, lines, log_scale, y, series)\n    plot_hist <- plot_histogram(dat, y, n_bins)\n    plot_acf_obj <- plot_acf(dat)\n    plot_ecdf_obj <- plot_ecdf(dat, y)\n\n    # Wrap plots using patchwork\n    return(\n      patchwork::wrap_plots(\n        plot_ts,\n        plot_hist,\n        plot_acf_obj,\n        plot_ecdf_obj,\n        ncol = 2,\n        nrow = 2,\n        byrow = TRUE\n      )\n    )\n  }\n}\n\n#' Helper function to validate and format input plotting data\n#' @noRd\nvalidate_plot_data <- function(data, y) {\n  # Check if data is not a list\n  if (!inherits(data, 'list')) {\n    # If 'series' column is missing, create a default factor\n    if (!'series' %in% colnames(data)) {\n      data$series <- factor('series1')\n    }\n    # If 'time' column is missing, stop with error\n    if (!'time' %in% colnames(data)) {\n      stop('data does not contain a \"time\" column', call. = FALSE)\n    }\n  } else {\n    # If data is a list, check for 'series' and 'time' in names\n    if (!'series' %in% names(data)) {\n      data$series <- factor('series1')\n    }\n    if (!'time' %in% names(data)) {\n      stop('data does not contain a \"time\" column')\n    }\n  }\n\n  # Check if the outcome variable 'y' exists in data\n  if (!y %in% names(data)) {\n    stop(paste0('variable \"', y, '\" not found in data'), call. = FALSE)\n  } else {\n    # Assign the outcome variable to a standard column 'y'\n    data$y <- data[[y]]\n  }\n\n  # Drop unused factor levels in 'series'\n  data$series <- droplevels(data$series)\n\n  # Return the validated and formatted data\n  return(data)\n}\n\n#' Function to generate time series plots\n#' @noRd\nplot_time_series <- function(\n  dat,\n  lines = TRUE,\n  log_scale = FALSE,\n  ylab = 'y',\n  series = 'all'\n) {\n  # Determine scale and y label\n  if (log_scale) {\n    dat$y <- log(dat$y + 1)\n    ylab <- paste0('log(', ylab, ' + 1)')\n  }\n\n  # Create time series plot\n  if (series == 'all') {\n    p <- ggplot2::ggplot(dat, ggplot2::aes(time, y)) +\n      ggplot2::facet_wrap(~series) +\n      ggplot2::labs(x = \"Time\", y = ylab) +\n      ggplot2::theme_bw()\n\n    if (lines) {\n      p <- p + ggplot2::geom_line(colour = \"#8F2727\", linewidth = 0.75)\n    } else {\n      p <- p + ggplot2::geom_point(colour = \"#8F2727\")\n    }\n  } else {\n    p <- ggplot2::ggplot(dat, ggplot2::aes(time, y, colour = data)) +\n      ggplot2::labs(title = \"Time series\", x = \"Time\", y = ylab) +\n      ggplot2::geom_vline(\n        xintercept = dat %>%\n          dplyr::filter(data == \"validate\") %>%\n          dplyr::pull(time) %>%\n          min(c(., Inf)),\n        linetype = \"dashed\",\n        colour = \"black\"\n      ) +\n      ggplot2::scale_colour_manual(values = c(\"#8F2727\", \"black\")) +\n      ggplot2::theme_bw()\n\n    if (lines) {\n      p <- p + ggplot2::geom_line(show.legend = F, linewidth = 0.75)\n    } else {\n      p <- p + ggplot2::geom_point(show.legend = F)\n    }\n  }\n  return(p)\n}\n\n#' Function to create histogram of observed values\n#' @noRd\nplot_histogram <- function(dat, ylab = 'y', n_bins = NULL) {\n  # Determine bins\n  if (is.null(n_bins)) {\n    n_bins <- max(c(length(hist(c(dat$y), plot = F)$breaks), 20))\n  }\n\n  # Plot the histogram\n  ggplot2::ggplot(dat, ggplot2::aes(y)) +\n    ggplot2::geom_histogram(bins = n_bins, fill = \"#8F2727\", col = 'white') +\n    ggplot2::labs(title = \"Histogram\", x = ylab, y = \"Count\") +\n    ggplot2::theme_bw()\n}\n\n#' Function to compute and plot autocorrelation\n#' @noRd\nplot_acf <- function(dat) {\n  # Compute empirical ACF\n  acf_y <- acf(dat$y, plot = F, na.action = na.pass)\n\n  # Plot\n  data.frame(acf = acf_y$acf[,, 1], lag = acf_y$lag[, 1, 1]) %>%\n    ggplot2::ggplot(ggplot2::aes(x = lag, y = 0, yend = acf)) +\n    ggplot2::geom_hline(\n      yintercept = c(-1, 1) * qnorm((1 + 0.95) / 2) / sqrt(acf_y$n.used),\n      linetype = \"dashed\"\n    ) +\n    ggplot2::geom_hline(\n      yintercept = 0,\n      colour = \"#8F2727\",\n      linewidth = 0.25\n    ) +\n    ggplot2::geom_segment(colour = \"#8F2727\", linewidth = 1) +\n    ggplot2::labs(title = \"ACF\", x = \"Lag\", y = \"Autocorrelation\") +\n    ggplot2::theme_bw()\n}\n\n#' Function to generate empirical cumulative distribution\n#' @noRd\nplot_ecdf <- function(dat, ylab = 'y') {\n  # Compute empriical ECDF\n  range_y <- range(dat$y, na.rm = T)\n  data.frame(x = seq(range_y[1], range_y[2], length.out = 100)) %>%\n    dplyr::mutate(y = ecdf(dat$y)(x)) %>%\n\n    # Plot\n    ggplot2::ggplot(ggplot2::aes(x, y)) +\n    ggplot2::geom_line(colour = \"#8F2727\", linewidth = 0.75) +\n    ggplot2::scale_y_continuous(limits = c(0, 1)) +\n    ggplot2::labs(\n      title = \"CDF\",\n      x = ylab,\n      y = \"Empirical CDF\"\n    ) +\n    ggplot2::theme_bw()\n}\n"
  },
  {
    "path": "R/plot_mvgam_smooth.R",
    "content": "#' Plot smooth terms from \\pkg{mvgam} models\n#'\n#' This function plots posterior empirical quantiles for a series-specific\n#' smooth term\n#'\n#' @importFrom grDevices hcl.colors\n#'\n#' @importFrom stats quantile predict\n#'\n#' @inheritParams plot.mvgam\n#'\n#' @param object \\code{list} object of class \\code{mvgam}. See [mvgam()]\n#'\n#' @param series \\code{integer} specifying which series in the set is to be\n#'   plotted\n#'\n#' @param smooth Either a \\code{character} or \\code{integer} specifying which\n#'   smooth term to be plotted\n#'\n#' @param residuals \\code{logical}. If \\code{TRUE}, posterior quantiles of\n#'   partial residuals are added to plots of 1-D smooths as a series of ribbon\n#'   rectangles. Partial residuals for a smooth term are the median Dunn-Smyth\n#'   residuals that would be obtained by dropping the term concerned from the\n#'   model, while leaving all other estimates fixed (i.e. the estimates for the\n#'   term plus the original median Dunn-Smyth residuals). Note that because\n#'   \\code{mvgam} works with Dunn-Smyth residuals and not working residuals,\n#'   which are used by \\code{mgcv}, the magnitudes of partial residuals will be\n#'   different to what you would expect from \\code{\\link[mgcv]{plot.gam}}.\n#'   Interpretation is similar though, as these partial residuals should be\n#'   evenly scattered around the smooth function if the function is well\n#'   estimated\n#'\n#' @param n_resid_bins \\code{integer} specifying the number of bins to group\n#'   the covariate into when plotting partial residuals. Setting this argument\n#'   too high can make for messy plots that are difficult to interpret, while\n#'   setting it too low will likely mask some potentially useful patterns in\n#'   the partial residuals. Default is \\code{25}\n#'\n#' @param derivatives \\code{logical}. If \\code{TRUE}, an additional plot will\n#'   be returned to show the estimated 1st derivative for the specified smooth\n#'   (Note: this only works for univariate smooths)\n#'\n#' @param realisations \\code{logical}. If \\code{TRUE}, posterior realisations\n#'   are shown as a spaghetti plot, making it easier to visualise the diversity\n#'   of possible functions. If \\code{FALSE}, the default, empirical quantiles\n#'   of the posterior distribution are shown\n#'\n#' @param n_realisations \\code{integer} specifying the number of posterior\n#'   realisations to plot, if \\code{realisations = TRUE}. Ignored otherwise\n#'\n#' @param newdata Optional \\code{dataframe} for predicting the smooth,\n#'   containing at least 'series' in addition to any other variables included\n#'   in the linear predictor of the original model's \\code{formula}. Note that\n#'   this currently is only supported for plotting univariate smooths\n#'\n#' @details Smooth functions are shown as empirical quantiles (or spaghetti\n#'   plots) of posterior partial expectations across a sequence of values\n#'   between the variable's \\code{min} and \\code{max}, while zeroing out\n#'   effects of all other variables. At present, only univariate and bivariate\n#'   smooth plots are allowed, though note that bivariate smooths rely on\n#'   default behaviour from \\code{\\link[mgcv]{plot.gam}}. `plot_mvgam_smooth`\n#'   generates posterior predictions from an object of class \\code{mvgam},\n#'   calculates posterior empirical quantiles and plots them. If\n#'   `realisations = FALSE`, the returned plot shows 90, 60, 40 and 20 percent\n#'   posterior quantiles (as ribbons of increasingly darker shades of red) as\n#'   well as the posterior median (as a dark red line). If\n#'   `realisations = TRUE`, a set of `n_realisations` posterior draws are\n#'   shown. For more nuanced visualisation, supply \\code{newdata} just as you\n#'   would when predicting from a \\code{\\link[mgcv]{gam}} model or use the more\n#'   flexible \\code{\\link{conditional_effects.mvgam}}. Alternatively, if you\n#'   prefer to use partial effect plots in the style of `gratia`, and if you\n#'   have the `gratia` package installed, you can use `draw.mvgam`. See\n#'   \\code{\\link{gratia_mvgam_enhancements}} for details.\n#'\n#' @return A base \\code{R} graphics plot\n#'\n#' @seealso \\code{\\link[mgcv]{plot.gam}},\n#'   \\code{\\link{conditional_effects.mvgam}},\n#'   \\code{\\link{gratia_mvgam_enhancements}}\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nplot_mvgam_smooth = function(\n  object,\n  trend_effects = FALSE,\n  series = 1,\n  smooth,\n  residuals = FALSE,\n  n_resid_bins = 25,\n  realisations = FALSE,\n  n_realisations = 15,\n  derivatives = FALSE,\n  newdata\n) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  object2 <- object\n\n  if (trend_effects) {\n    if (is.null(object$trend_call)) {\n      stop(\n        'no trend_formula exists so there are no trend-level smooths to plot'\n      )\n    }\n\n    residuals <- FALSE\n    object2$mgcv_model <- object2$trend_mgcv_model\n  }\n\n  if (sign(series) != 1) {\n    stop('argument \"series\" must be a positive integer', call. = FALSE)\n  } else {\n    if (series %% 1 != 0) {\n      stop('argument \"series\" must be a positive integer', call. = FALSE)\n    }\n  }\n\n  if (series > NCOL(object2$ytimes)) {\n    stop(\n      paste0(\n        'object only contains data / predictions for ',\n        NCOL(object2$ytimes),\n        ' series'\n      ),\n      call. = FALSE\n    )\n  }\n\n  if (sign(n_resid_bins) != 1) {\n    stop('argument \"n_resid_bins\" must be a positive integer', call. = FALSE)\n  } else {\n    if (n_resid_bins %% 1 != 0) {\n      stop('argument \"n_resid_bins\" must be a positive integer', call. = FALSE)\n    }\n  }\n\n  if (missing(smooth)) {\n    smooth <- 1\n  }\n\n  # Get smooth term names\n  s_name <- levels(object2$obs_data$series)[series]\n  data_train <- object2$obs_data\n  smooth_terms <- unlist(purrr::map(object2$mgcv_model$smooth, 'label'))\n\n  if (is.character(smooth)) {\n    if (!grepl('\\\\(', smooth)) {\n      smooth <- paste0('s(', smooth, ')')\n    }\n    if (!smooth %in% smooth_terms) {\n      stop(\n        smooth,\n        ' not found in smooth terms of object2\\nAppropriate names are: ',\n        paste(smooth_terms, collapse = ', ')\n      )\n    }\n    smooth_int <- which(smooth_terms == smooth)\n  } else {\n    smooth_int <- smooth\n  }\n\n  # Check whether this type of smooth is even plottable\n  if (!object2$mgcv_model$smooth[[smooth_int]]$plot.me) {\n    stop(\n      paste0(\n        'unable to plot ',\n        object2$mgcv_model$smooth[[smooth_int]]$label,\n        ' (class = ',\n        attr(object2$mgcv_model$smooth[[smooth_int]], 'class')[1]\n      ),\n      ')'\n    )\n  }\n\n  if (is.numeric(smooth)) {\n    if (!smooth %in% seq_along(smooth_terms)) {\n      stop(smooth, ' not found in smooth terms of object')\n    }\n    smooth_int <- smooth\n    smooth <- smooth_terms[smooth]\n  }\n\n  if (length(unlist(strsplit(smooth, ','))) > 3) {\n    stop('mvgam cannot yet plot smooths of more than 3 dimensions')\n  }\n\n  # Check that this is not a random effect smooth\n  smooth_labs <- do.call(\n    rbind,\n    lapply(seq_along(object2$mgcv_model$smooth), function(x) {\n      data.frame(\n        label = object2$mgcv_model$smooth[[x]]$label,\n        class = class(object2$mgcv_model$smooth[[x]])[1]\n      )\n    })\n  )\n\n  if (smooth_labs$class[smooth_int] == 'random.effect') {\n    message('use function \"plot_mvgam_randomeffects\" to plot \"re\" bases')\n    return(invisible)\n  }\n\n  # Be sure that parametric and by variables are included in newdata\n  smooth_terms <- unique(trimws(strsplit(\n    gsub('\\\\+', ',', as.character(object2$mgcv_model$pred.formula)[2]),\n    ','\n  )[[1L]]))\n\n  # Remove comma separated names as these won't match the column names in data\n  smooth_terms[!grepl(',', smooth_terms)] -> smooth_terms\n\n  # Change smooth name to the covariate that needs a sequence of prediction values\n  smooth <- all.vars(parse(text = object2$mgcv_model$smooth[[smooth_int]]$term))\n\n  # Predictions and plots for multi-dimensional smooths\n  if (length(unlist(strsplit(smooth, ','))) >= 2L) {\n    # Use default mgcv plotting for bivariate smooths as it is quicker\n    object2$mgcv_model <- relabel_gps(object2$mgcv_model)\n    if (\n      inherits(object2$mgcv_model$smooth[[smooth_int]], 'tprs.smooth') |\n        inherits(object2$mgcv_model$smooth[[smooth_int]], 't2smooth') |\n        inherits(object2$mgcv_model$smooth[[smooth_int]], 'tensor.smooth')\n    ) {\n      suppressWarnings(plot(\n        object2$mgcv_model,\n        select = smooth_int,\n        residuals = residuals,\n        scheme = 2,\n        main = '',\n        too.far = 0,\n        contour.col = 'black',\n        hcolors = hcl.colors(25, palette = 'Reds 2'),\n        lwd = 1,\n        seWithMean = TRUE\n      ))\n      box(col = 'white')\n      box(bty = 'l', lwd = 2)\n    } else {\n      suppressWarnings(plot(\n        object2$mgcv_model,\n        select = smooth_int,\n        residuals = residuals,\n        scheme = 2,\n        main = '',\n        too.far = 0,\n        contour.col = 'black',\n        hcolors = hcl.colors(25, palette = 'Reds 2'),\n        lwd = 1,\n        seWithMean = TRUE,\n        ylab = 'Partial effect'\n      ))\n      box(col = 'white')\n      box(bty = 'l', lwd = 2)\n    }\n\n    if (trend_effects) {\n      title(\n        sub(\n          'series',\n          'trend',\n          object2$mgcv_model$smooth[[smooth_int]]$label,\n          fixed = TRUE\n        ),\n        adj = 0\n      )\n    } else {\n      title(object2$mgcv_model$smooth[[smooth_int]]$label, adj = 0)\n    }\n  } else {\n    # Use posterior predictions to generate univariate smooth plots\n    if (missing(newdata) && !inherits(data_train, 'list')) {\n      data_train %>%\n        dplyr::select(c(series, smooth_terms)) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::mutate(series = s_name) -> pred_dat\n\n      # Use a larger sample size when estimating derivatives so they can be better approximated\n      if (derivatives) {\n        pred_dat %>%\n          dplyr::select(-smooth) %>%\n          dplyr::distinct() %>%\n          dplyr::slice_head(n = 1) %>%\n          dplyr::slice(rep(1:dplyr::n(), each = 1000)) %>%\n          dplyr::mutate(\n            smooth.var = seq(\n              min(pred_dat[, smooth]),\n              max(pred_dat[, smooth]),\n              length.out = 1000\n            )\n          ) -> pred_dat\n      } else {\n        pred_dat %>%\n          dplyr::select(-smooth) %>%\n          dplyr::distinct() %>%\n          dplyr::slice_head(n = 1) %>%\n          dplyr::slice(rep(1:dplyr::n(), each = 500)) %>%\n          dplyr::mutate(\n            smooth.var = seq(\n              min(pred_dat[, smooth]),\n              max(pred_dat[, smooth]),\n              length.out = 500\n            )\n          ) -> pred_dat\n      }\n      colnames(pred_dat) <- gsub('smooth.var', smooth, colnames(pred_dat))\n    } else if (missing(newdata) && inherits(object2$obs_data, 'list')) {\n      # Make fake data by zeroing all other terms apart from the selected smooth\n      # and the series indicator\n      pred_dat <- vector(mode = 'list')\n      for (x in 1:length(data_train)) {\n        if (is.matrix(data_train[[x]])) {\n          pred_dat[[x]] <- matrix(0, nrow = 500, ncol = NCOL(data_train[[x]]))\n        } else {\n          pred_dat[[x]] <- rep(0, 500)\n        }\n      }\n      names(pred_dat) <- names(object2$obs_data)\n      pred_dat$series <- rep((levels(data_train$series)[series]), 500)\n\n      if (!is.matrix(pred_dat[[smooth]])) {\n        pred_dat[[smooth]] <- seq(\n          min(data_train[[smooth]]),\n          max(data_train[[smooth]]),\n          length.out = 500\n        )\n      } else {\n        pred_dat[[smooth]] <- matrix(\n          seq(\n            min(data_train[[smooth]]),\n            max(data_train[[smooth]]),\n            length.out = length(pred_dat[[smooth]])\n          ),\n          nrow = nrow(pred_dat[[smooth]]),\n          ncol = ncol(pred_dat[[smooth]])\n        )\n      }\n\n      if ('lag' %in% names(pred_dat)) {\n        pred_dat[['lag']] <- matrix(\n          0:(NCOL(data_train$lag) - 1),\n          nrow(pred_dat$lag),\n          NCOL(data_train$lag),\n          byrow = TRUE\n        )\n      }\n    } else {\n      pred_dat <- newdata\n\n      # Add series factor variable if missing\n      if (class(pred_dat)[1] != 'list') {\n        if (!'series' %in% colnames(pred_dat)) {\n          pred_dat$series <- factor('series1')\n        }\n      }\n\n      if (class(pred_dat)[1] == 'list') {\n        if (!'series' %in% names(pred_dat)) {\n          pred_dat$series <- factor('series1')\n        }\n      }\n    }\n\n    # Generate linear predictor matrix from fitted mgcv model\n    if (trend_effects) {\n      Xp <- trend_Xp_matrix(\n        newdata = pred_dat,\n        trend_map = object2$trend_map,\n        mgcv_model = object2$trend_mgcv_model\n      )\n    } else {\n      Xp <- obs_Xp_matrix(newdata = pred_dat, mgcv_model = object2$mgcv_model)\n    }\n\n    # Zero out all other columns in Xp\n    keeps <- object2$mgcv_model$smooth[[\n      smooth_int\n    ]]$first.para:object2$mgcv_model$smooth[[smooth_int]]$last.para\n    Xp[, !seq_len(length.out = NCOL(Xp)) %in% keeps] <- 0\n\n    # Prediction x-axis values\n    if (class(pred_dat)[1] == 'list') {\n      if (is.matrix(pred_dat[[smooth]])) {\n        pred_vals <- as.vector(as.matrix(pred_dat[[smooth]][, 1]))\n      } else {\n        pred_vals <- as.vector(as.matrix(pred_dat[[smooth]]))\n      }\n    } else {\n      pred_vals <- as.vector(as.matrix(pred_dat[, smooth]))\n    }\n\n    # If this term has a by variable, need to use mgcv's plotting utilities\n    if (object2$mgcv_model$smooth[[smooth_int]]$by != \"NA\") {\n      # Check if this is a gp() term\n      gp_term <- FALSE\n      if (!is.null(attr(object2$mgcv_model, 'gp_att_table'))) {\n        gp_term <- object2$mgcv_model$smooth[[smooth_int]]$gp_term\n      }\n\n      if (gp_term) {\n        object2$mgcv_model$smooth[[smooth_int]]$label <-\n          gsub(\n            's\\\\(|ti\\\\(',\n            'gp(',\n            object2$mgcv_model$smooth[[smooth_int]]$label\n          )\n        # Check if this is a factor by variable\n        is_fac <- is.factor(object2$obs_data[[\n          object2$mgcv_model$smooth[[smooth_int]]$by\n        ]])\n\n        if (is_fac) {\n          fac_levels <- levels(object2$obs_data[[\n            object2$mgcv_model$smooth[[smooth_int]]$by\n          ]])\n          whichlevel <- vector()\n          for (i in seq_along(fac_levels)) {\n            whichlevel[i] <- grepl(\n              fac_levels[i],\n              object2$mgcv_model$smooth[[smooth_int]]$label,\n              fixed = TRUE\n            )\n          }\n\n          pred_dat[[object2$mgcv_model$smooth[[smooth_int]]$by]] <-\n            rep(fac_levels[whichlevel], length(pred_dat$series))\n        }\n\n        if (!is_fac) {\n          pred_dat[[object2$mgcv_model$smooth[[smooth_int]]$by]] <-\n            rep(1, length(pred_dat$series))\n        }\n\n        if (trend_effects) {\n          Xp_term <- trend_Xp_matrix(\n            newdata = pred_dat,\n            trend_map = object2$trend_map,\n            mgcv_model = object2$trend_mgcv_model\n          )\n        } else {\n          Xp_term <- obs_Xp_matrix(\n            newdata = pred_dat,\n            mgcv_model = object2$mgcv_model\n          )\n        }\n        Xp[,\n          object2$mgcv_model$smooth[[\n            smooth_int\n          ]]$first.para:object2$mgcv_model$smooth[[smooth_int]]$last.para\n        ] <-\n          Xp_term[,\n            object2$mgcv_model$smooth[[\n              smooth_int\n            ]]$first.para:object2$mgcv_model$smooth[[smooth_int]]$last.para\n          ]\n      } else {\n        # Deal with by variables in non-gp() smooths\n        by <- rep(1, length(pred_vals))\n        dat <- data.frame(x = pred_vals, by = by)\n        names(dat) <- c(\n          object2$mgcv_model$smooth[[smooth_int]]$term,\n          object2$mgcv_model$smooth[[smooth_int]]$by\n        )\n\n        Xp_term <- mgcv::PredictMat(\n          object2$mgcv_model$smooth[[smooth_int]],\n          dat\n        )\n        Xp[,\n          object2$mgcv_model$smooth[[\n            smooth_int\n          ]]$first.para:object2$mgcv_model$smooth[[smooth_int]]$last.para\n        ] <- Xp_term\n      }\n    }\n\n    # Extract GAM coefficients\n    if (trend_effects) {\n      betas <- mcmc_chains(object2$model_output, 'b_trend')\n    } else {\n      betas <- mcmc_chains(object2$model_output, 'b')\n    }\n\n    # Calculate posterior marginal predictions\n    preds <- matrix(NA, nrow = NROW(betas), ncol = NROW(Xp))\n    for (i in 1:NROW(betas)) {\n      preds[i, ] <- (Xp %*% betas[i, ])\n    }\n\n    if (residuals) {\n      # Need to predict from a reduced set that zeroes out all terms apart from the\n      # smooth of interest\n      if (trend_effects) {\n        Xp2 <- trend_Xp_matrix(\n          newdata = object2$obs_data,\n          trend_map = object2$trend_map,\n          mgcv_model = object2$trend_mgcv_model\n        )\n      } else {\n        Xp2 <- obs_Xp_matrix(\n          newdata = object2$obs_data,\n          mgcv_model = object2$mgcv_model\n        )\n      }\n\n      if (!missing(newdata)) {\n        stop('Partial residual plots not available when using newdata')\n      }\n\n      if (object2$mgcv_model$smooth[[smooth_int]]$by != \"NA\") {\n        by <- rep(1, length(object2$obs_data$series))\n        dat <- data.frame(\n          x = object2$obs_data[[object2$mgcv_model$smooth[[smooth_int]]$term]],\n          by = by\n        )\n        names(dat) <- c(\n          object2$mgcv_model$smooth[[smooth_int]]$term,\n          object2$mgcv_model$smooth[[smooth_int]]$by\n        )\n\n        Xp_term <- mgcv::PredictMat(\n          object2$mgcv_model$smooth[[smooth_int]],\n          dat\n        )\n        Xp2[,\n          object2$mgcv_model$smooth[[\n            smooth_int\n          ]]$first.para:object2$mgcv_model$smooth[[smooth_int]]$last.para\n        ] <- Xp_term\n      }\n\n      # Find index for the end of training for this series and keep only those training\n      # observations for the particular series\n      if (class(pred_dat)[1] == 'list') {\n        end_train <- length(which(\n          object2$obs_data[['series']] == (levels(data_train$series)[series])\n        ))\n      } else {\n        end_train <- object2$obs_data %>%\n          dplyr::filter(series == s_name) %>%\n          NROW()\n      }\n\n      Xp2 <- Xp2[object2$ytimes[, series][1:end_train], ]\n\n      # # Zero out all other columns in Xp2\n      Xp2[, !grepl(paste0('(', smooth, ')'), colnames(Xp), fixed = T)] <- 0\n\n      # Calculate residuals from full prediction set\n      all_resids <- object2$resids[[series]][, 1:end_train]\n\n      partial_resids <- matrix(NA, nrow = nrow(betas), ncol = NCOL(all_resids))\n      for (i in 1:NROW(betas)) {\n        partial_resids[i, ] <- (Xp2 %*% betas[i, ]) + all_resids[i, ]\n      }\n    }\n\n    # Plot quantiles of the smooth function, along with observed values\n    # if specified\n    probs = c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n    cred <- sapply(\n      1:NCOL(preds),\n      function(n) quantile(preds[, n], probs = probs, na.rm = TRUE)\n    )\n\n    c_light <- c(\"#DCBCBC\")\n    c_light_highlight <- c(\"#C79999\")\n    c_mid <- c(\"#B97C7C\")\n    c_mid_highlight <- c(\"#A25050\")\n    c_dark <- c(\"#8F2727\")\n    c_dark_highlight <- c(\"#7C0000\")\n\n    if (derivatives) {\n      .pardefault <- par(no.readonly = T)\n      on.exit(par(.pardefault))\n      par(mfrow = c(2, 1))\n\n      if (residuals) {\n        plot(\n          1,\n          type = \"n\",\n          bty = 'L',\n          xlab = smooth,\n          ylab = 'Partial effect',\n          xlim = c(min(pred_vals), max(pred_vals)),\n          ylim = c(\n            min(min(partial_resids, min(cred) - 0.4 * sd(preds), na.rm = T)),\n            max(max(partial_resids, max(cred) + 0.4 * sd(preds), na.rm = T))\n          )\n        )\n\n        if (object2$mgcv_model$smooth[[smooth_int]]$by != \"NA\") {\n          if (trend_effects) {\n            title(\n              sub(\n                'series',\n                'trend',\n                object2$mgcv_model$smooth[[smooth_int]]$label,\n                fixed = TRUE\n              ),\n              adj = 0\n            )\n          } else {\n            title(object2$mgcv_model$smooth[[smooth_int]]$label, adj = 0)\n          }\n        } else {\n          if (trend_effects) {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          } else {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          }\n        }\n      } else {\n        plot(\n          1,\n          type = \"n\",\n          bty = 'L',\n          xlab = smooth,\n          ylab = 'Partial effect',\n          xlim = c(min(pred_vals), max(pred_vals)),\n          ylim = c(min(cred) - 0.9 * sd(preds), max(cred) + 0.9 * sd(preds))\n        )\n        if (object2$mgcv_model$smooth[[smooth_int]]$by != \"NA\") {\n          if (trend_effects) {\n            title(\n              sub(\n                'series',\n                'trend',\n                object2$mgcv_model$smooth[[smooth_int]]$label,\n                fixed = TRUE\n              ),\n              adj = 0\n            )\n          } else {\n            title(object2$mgcv_model$smooth[[smooth_int]]$label, adj = 0)\n          }\n        } else {\n          if (trend_effects) {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          } else {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          }\n        }\n      }\n\n      if (realisations) {\n        for (i in 1:n_realisations) {\n          index <- sample(1:NROW(preds), 1, replace = TRUE)\n          lines(x = pred_vals, y = preds[index, ], col = 'white', lwd = 2.5)\n          lines(\n            x = pred_vals,\n            y = preds[index, ],\n            col = sample(\n              c(\"#DCBCBC\", \"#C79999\", \"#B97C7C\", \"#A25050\", \"#7C0000\"),\n              1\n            ),\n            lwd = 2.25\n          )\n        }\n      } else {\n        if (residuals) {\n          # Get x-axis values and bin if necessary to prevent overplotting\n          sorted_x <- sort(unique(round(object2$obs_data[[smooth]], 6)))\n\n          s_name <- levels(object2$obs_data$series)[series]\n          obs_x <- round(\n            data.frame(\n              series = object2$obs_data$series,\n              smooth_vals = object2$obs_data[[smooth]]\n            ) %>%\n              dplyr::filter(series == s_name) %>%\n              dplyr::pull(smooth_vals),\n            6\n          )\n\n          if (length(sorted_x) > n_resid_bins) {\n            sorted_x <- seq(\n              min(sorted_x),\n              max(sorted_x),\n              length.out = n_resid_bins\n            )\n            resid_probs <- do.call(\n              rbind,\n              lapply(2:n_resid_bins, function(i) {\n                quantile(\n                  as.vector(partial_resids[, which(\n                    obs_x <= sorted_x[i] &\n                      obs_x > sorted_x[i - 1]\n                  )]),\n                  probs = probs,\n                  na.rm = TRUE\n                )\n              })\n            )\n            resid_probs <- rbind(\n              quantile(\n                as.vector(partial_resids[, which(obs_x == sorted_x[1])]),\n                probs = probs,\n                na.rm = TRUE\n              ),\n              resid_probs\n            )\n          } else {\n            resid_probs <- do.call(\n              rbind,\n              lapply(sorted_x, function(i) {\n                quantile(\n                  as.vector(partial_resids[, which(obs_x == i)]),\n                  probs = probs,\n                  na.rm = TRUE\n                )\n              })\n            )\n          }\n\n          # Get polygon coordinates and plot\n          N <- length(sorted_x)\n          idx <- rep(1:N, each = 2)\n          repped_x <- rep(sorted_x, each = 2)\n\n          x <- sapply(\n            1:length(idx),\n            function(k) {\n              if (k %% 2 == 0) {\n                repped_x[k] + min(diff(sorted_x)) / 2\n              } else {\n                repped_x[k] - min(diff(sorted_x)) / 2\n              }\n            }\n          )\n\n          rect(\n            xleft = x[seq(1, N * 2, by = 2)],\n            xright = x[seq(2, N * 2, by = 2)],\n            ytop = resid_probs[, 9],\n            ybottom = resid_probs[, 1],\n            col = c_light,\n            border = 'transparent'\n          )\n          rect(\n            xleft = x[seq(1, N * 2, by = 2)],\n            xright = x[seq(2, N * 2, by = 2)],\n            ytop = resid_probs[, 8],\n            ybottom = resid_probs[, 2],\n            col = c_light_highlight,\n            border = 'transparent'\n          )\n          rect(\n            xleft = x[seq(1, N * 2, by = 2)],\n            xright = x[seq(2, N * 2, by = 2)],\n            ytop = resid_probs[, 7],\n            ybottom = resid_probs[, 3],\n            col = c_mid,\n            border = 'transparent'\n          )\n          rect(\n            xleft = x[seq(1, N * 2, by = 2)],\n            xright = x[seq(2, N * 2, by = 2)],\n            ytop = resid_probs[, 6],\n            ybottom = resid_probs[, 4],\n            col = c_mid_highlight,\n            border = 'transparent'\n          )\n\n          for (k in 1:N) {\n            lines(\n              x = c(x[seq(1, N * 2, by = 2)][k], x[seq(2, N * 2, by = 2)][k]),\n              y = c(resid_probs[k, 5], resid_probs[k, 5]),\n              col = c_dark,\n              lwd = 2\n            )\n          }\n\n          # Overlay a minimalist version of the estimated smooth function\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[1, ], rev(cred[9, ])),\n            col = rgb(\n              red = 0,\n              green = 0,\n              blue = 0,\n              alpha = 30,\n              maxColorValue = 200\n            ),\n            border = NA\n          )\n          lines(\n            pred_vals,\n            cred[5, ],\n            col = rgb(\n              red = 0,\n              green = 0,\n              blue = 0,\n              alpha = 45,\n              maxColorValue = 200\n            ),\n            lwd = 3\n          )\n          box(bty = 'L', lwd = 2)\n        } else {\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[1, ], rev(cred[9, ])),\n            col = c_light,\n            border = NA\n          )\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[2, ], rev(cred[8, ])),\n            col = c_light_highlight,\n            border = NA\n          )\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[3, ], rev(cred[7, ])),\n            col = c_mid,\n            border = NA\n          )\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[4, ], rev(cred[6, ])),\n            col = c_mid_highlight,\n            border = NA\n          )\n          lines(pred_vals, cred[5, ], col = c_dark, lwd = 2.5)\n        }\n      }\n\n      box(bty = 'L', lwd = 2)\n\n      # Show observed values of the smooth as a rug\n      if (class(object2$obs_data)[1] == 'list') {\n        rug(\n          (as.vector(as.matrix(pred_dat[[smooth]])))[which(\n            pred_dat[['series']] == levels(pred_dat[['series']])[series]\n          )],\n          lwd = 1.75,\n          ticksize = 0.025,\n          col = c_mid_highlight\n        )\n      } else {\n        rug(\n          (as.vector(as.matrix(data_train[, smooth])))[which(\n            data_train$series == levels(data_train$series)[series]\n          )],\n          lwd = 1.75,\n          ticksize = 0.025,\n          col = c_mid_highlight\n        )\n      }\n\n      # Compute 1st derivatives\n      first_derivs <- cbind(rep(NA, NROW(preds)), t(apply(preds, 1, diff)))\n      cred <- sapply(\n        1:NCOL(first_derivs),\n        function(n) quantile(first_derivs[, n], probs = probs, na.rm = T)\n      )\n      plot(\n        1,\n        type = \"n\",\n        bty = 'L',\n        xlab = smooth,\n        ylab = '1st derivative',\n        xlim = c(min(pred_vals), max(pred_vals)),\n        ylim = c(\n          min(cred, na.rm = T) - sd(first_derivs, na.rm = T),\n          max(cred, na.rm = T) + sd(first_derivs, na.rm = T)\n        )\n      )\n\n      if (realisations) {\n        for (i in 1:n_realisations) {\n          index <- sample(1:NROW(first_derivs), 1, replace = TRUE)\n          lines(\n            x = pred_vals,\n            y = first_derivs[index, ],\n            col = 'white',\n            lwd = 2.5\n          )\n          lines(\n            x = pred_vals,\n            y = first_derivs[index, ],\n            col = sample(\n              c(\"#DCBCBC\", \"#C79999\", \"#B97C7C\", \"#A25050\", \"#7C0000\"),\n              1\n            ),\n            lwd = 2.25\n          )\n        }\n      } else {\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[1, ], rev(cred[9, ])),\n          col = c_light,\n          border = NA\n        )\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[2, ], rev(cred[8, ])),\n          col = c_light_highlight,\n          border = NA\n        )\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[3, ], rev(cred[7, ])),\n          col = c_mid,\n          border = NA\n        )\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[4, ], rev(cred[6, ])),\n          col = c_mid_highlight,\n          border = NA\n        )\n        lines(pred_vals, cred[5, ], col = c_dark, lwd = 2.5)\n      }\n      box(bty = 'L', lwd = 2)\n\n      abline(h = 0, lty = 'dashed', lwd = 2)\n\n      invisible()\n    } else {\n      if (residuals) {\n        plot(\n          1,\n          type = \"n\",\n          bty = 'L',\n          xlab = smooth,\n          ylab = 'Partial effect',\n          xlim = c(min(pred_vals), max(pred_vals)),\n          ylim = c(\n            min(min(partial_resids, min(cred) - 0.4 * sd(preds), na.rm = T)),\n            max(max(partial_resids, max(cred) + 0.4 * sd(preds), na.rm = T))\n          )\n        )\n        if (object2$mgcv_model$smooth[[smooth_int]]$by != \"NA\") {\n          if (trend_effects) {\n            title(\n              sub(\n                'series',\n                'trend',\n                object2$mgcv_model$smooth[[smooth_int]]$label,\n                fixed = TRUE\n              ),\n              adj = 0\n            )\n          } else {\n            title(object2$mgcv_model$smooth[[smooth_int]]$label, adj = 0)\n          }\n        } else {\n          if (trend_effects) {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          } else {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          }\n        }\n\n        # Get x-axis values and bin if necessary to prevent overplotting\n        sorted_x <- sort(unique(round(object2$obs_data[[smooth]], 6)))\n\n        s_name <- levels(object2$obs_data$series)[series]\n        obs_x <- round(\n          data.frame(\n            series = object2$obs_data$series,\n            smooth_vals = object2$obs_data[[smooth]]\n          ) %>%\n            dplyr::filter(series == s_name) %>%\n            dplyr::pull(smooth_vals),\n          6\n        )\n\n        if (length(sorted_x) > n_resid_bins) {\n          sorted_x <- seq(\n            min(sorted_x),\n            max(sorted_x),\n            length.out = n_resid_bins\n          )\n          resid_probs <- do.call(\n            rbind,\n            lapply(2:n_resid_bins, function(i) {\n              quantile(\n                as.vector(partial_resids[, which(\n                  obs_x <= sorted_x[i] &\n                    obs_x > sorted_x[i - 1]\n                )]),\n                probs = probs,\n                na.rm = TRUE\n              )\n            })\n          )\n          resid_probs <- rbind(\n            quantile(\n              as.vector(partial_resids[, which(obs_x == sorted_x[1])]),\n              probs = probs,\n              na.rm = TRUE\n            ),\n            resid_probs\n          )\n        } else {\n          resid_probs <- do.call(\n            rbind,\n            lapply(sorted_x, function(i) {\n              quantile(\n                as.vector(partial_resids[, which(obs_x == i)]),\n                probs = probs,\n                na.rm = TRUE\n              )\n            })\n          )\n        }\n\n        # Get polygon coordinates and plot\n        N <- length(sorted_x)\n        idx <- rep(1:N, each = 2)\n        repped_x <- rep(sorted_x, each = 2)\n\n        x <- sapply(\n          1:length(idx),\n          function(k) {\n            if (k %% 2 == 0) {\n              repped_x[k] + min(diff(sorted_x)) / 2\n            } else {\n              repped_x[k] - min(diff(sorted_x)) / 2\n            }\n          }\n        )\n\n        rect(\n          xleft = x[seq(1, N * 2, by = 2)],\n          xright = x[seq(2, N * 2, by = 2)],\n          ytop = resid_probs[, 9],\n          ybottom = resid_probs[, 1],\n          col = c_light,\n          border = 'transparent'\n        )\n        rect(\n          xleft = x[seq(1, N * 2, by = 2)],\n          xright = x[seq(2, N * 2, by = 2)],\n          ytop = resid_probs[, 8],\n          ybottom = resid_probs[, 2],\n          col = c_light_highlight,\n          border = 'transparent'\n        )\n        rect(\n          xleft = x[seq(1, N * 2, by = 2)],\n          xright = x[seq(2, N * 2, by = 2)],\n          ytop = resid_probs[, 7],\n          ybottom = resid_probs[, 3],\n          col = c_mid,\n          border = 'transparent'\n        )\n        rect(\n          xleft = x[seq(1, N * 2, by = 2)],\n          xright = x[seq(2, N * 2, by = 2)],\n          ytop = resid_probs[, 6],\n          ybottom = resid_probs[, 4],\n          col = c_mid_highlight,\n          border = 'transparent'\n        )\n\n        for (k in 1:N) {\n          lines(\n            x = c(x[seq(1, N * 2, by = 2)][k], x[seq(2, N * 2, by = 2)][k]),\n            y = c(resid_probs[k, 5], resid_probs[k, 5]),\n            col = c_dark,\n            lwd = 2\n          )\n        }\n\n        # Overlay a minimalist version of the estimated smooth function\n        polygon(\n          c(pred_vals, rev(pred_vals)),\n          c(cred[1, ], rev(cred[9, ])),\n          col = rgb(\n            red = 0,\n            green = 0,\n            blue = 0,\n            alpha = 30,\n            maxColorValue = 200\n          ),\n          border = NA\n        )\n        lines(\n          pred_vals,\n          cred[5, ],\n          col = rgb(\n            red = 0,\n            green = 0,\n            blue = 0,\n            alpha = 45,\n            maxColorValue = 200\n          ),\n          lwd = 3\n        )\n        box(bty = 'L', lwd = 2)\n      } else {\n        plot(\n          1,\n          type = \"n\",\n          bty = 'L',\n          xlab = smooth,\n          ylab = 'Partial effect',\n          xlim = c(min(pred_vals), max(pred_vals)),\n          ylim = c(min(cred) - 0.9 * sd(preds), max(cred) + 0.9 * sd(preds))\n        )\n        if (object2$mgcv_model$smooth[[smooth_int]]$by != \"NA\") {\n          if (trend_effects) {\n            title(\n              sub(\n                'series',\n                'trend',\n                object2$mgcv_model$smooth[[smooth_int]]$label,\n                fixed = TRUE\n              ),\n              adj = 0\n            )\n          } else {\n            title(object2$mgcv_model$smooth[[smooth_int]]$label, adj = 0)\n          }\n        } else {\n          if (trend_effects) {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          } else {\n            title(paste0('s(', smooth, ')'), adj = 0)\n          }\n        }\n\n        if (realisations) {\n          for (i in 1:n_realisations) {\n            index <- sample(1:NROW(preds), 1, replace = TRUE)\n            lines(x = pred_vals, y = preds[index, ], col = 'white', lwd = 2.5)\n            lines(\n              x = pred_vals,\n              y = preds[index, ],\n              col = sample(\n                c(\"#DCBCBC\", \"#C79999\", \"#B97C7C\", \"#A25050\", \"#7C0000\"),\n                1\n              ),\n              lwd = 2.25\n            )\n          }\n        } else {\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[1, ], rev(cred[9, ])),\n            col = c_light,\n            border = NA\n          )\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[2, ], rev(cred[8, ])),\n            col = c_light_highlight,\n            border = NA\n          )\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[3, ], rev(cred[7, ])),\n            col = c_mid,\n            border = NA\n          )\n          polygon(\n            c(pred_vals, rev(pred_vals)),\n            c(cred[4, ], rev(cred[6, ])),\n            col = c_mid_highlight,\n            border = NA\n          )\n          lines(pred_vals, cred[5, ], col = c_dark, lwd = 2.5)\n        }\n        box(bty = 'L', lwd = 2)\n      }\n\n      # Show observed values of the smooth as a rug\n      if (class(object2$obs_data)[1] == 'list') {\n        rug(\n          (as.vector(as.matrix(data_train[[smooth]])))[which(\n            data_train$series == levels(data_train$series)[series]\n          )],\n          lwd = 1.75,\n          ticksize = 0.025,\n          col = c_mid_highlight\n        )\n      } else {\n        rug(\n          (as.vector(as.matrix(data_train[, smooth])))[which(\n            data_train$series == levels(data_train$series)[series]\n          )],\n          lwd = 1.75,\n          ticksize = 0.025,\n          col = c_mid_highlight\n        )\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "R/plot_mvgam_trend.R",
    "content": "#' Plot latent trend predictions from \\pkg{mvgam} models\n#'\n#' @importFrom graphics par lines polygon box abline\n#'\n#' @importFrom stats sd quantile\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @param series \\code{integer} specifying which series in the set is to be\n#'   plotted\n#'\n#' @param newdata Optional \\code{dataframe} or \\code{list} of test data\n#'   containing at least 'series' and 'time' in addition to any other\n#'   variables included in the linear predictor of the original \\code{formula}.\n#'\n#' @param data_test Deprecated. Still works in place of \\code{newdata} but\n#'   users are recommended to use \\code{newdata} instead for more seamless\n#'   integration into `R` workflows\n#'\n#' @param derivatives \\code{logical}. If \\code{TRUE}, an additional plot will\n#'   be returned to show the estimated 1st derivative for the estimated trend\n#'\n#' @param realisations \\code{logical}. If \\code{TRUE}, posterior trend\n#'   realisations are shown as a spaghetti plot, making it easier to visualise\n#'   the diversity of possible trend paths. If \\code{FALSE}, the default,\n#'   empirical quantiles of the posterior distribution are shown\n#'\n#' @param n_realisations \\code{integer} specifying the number of posterior\n#'   realisations to plot, if \\code{realisations = TRUE}. Ignored otherwise\n#'\n#' @param n_cores Deprecated. Parallel processing is no longer supported\n#'\n#' @param xlab Label for x axis\n#'\n#' @param ylab Label for y axis\n#'\n#' @return A `ggplot` object\n#'\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(\n#'   n_series = 3,\n#'   trend_model = AR()\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   chains = 2\n#' )\n#'\n#' # Plot estimated trends for some series\n#' plot_mvgam_trend(mod)\n#' plot_mvgam_trend(mod, series = 2)\n#'\n#' # Extrapolate trends forward in time and plot on response scale\n#' plot_mvgam_trend(\n#'   mod,\n#'   newdata = simdat$data_test\n#' )\n#'\n#' plot_mvgam_trend(\n#'   mod,\n#'   newdata = simdat$data_test,\n#'   series = 2\n#' )\n#'\n#' # But it is recommended to compute extrapolations for all series\n#' # first and then plot\n#' trend_fc <- forecast(\n#'   mod,\n#'   newdata = simdat$data_test\n#' )\n#'\n#' plot(trend_fc, series = 1)\n#' plot(trend_fc, series = 2)\n#' }\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nplot_mvgam_trend = function(\n  object,\n  series = 1,\n  newdata,\n  data_test,\n  realisations = FALSE,\n  n_realisations = 15,\n  n_cores = 1,\n  derivatives = FALSE,\n  xlab,\n  ylab\n) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  validate_pos_integer(series)\n\n  if (series > NCOL(object$ytimes)) {\n    stop(\n      paste0(\n        'object only contains data / predictions for ',\n        NCOL(object$ytimes),\n        ' series'\n      ),\n      call. = FALSE\n    )\n  }\n\n  if (\n    attr(object$model_data, 'trend_model') == 'None' &\n      !object$use_lv\n  ) {\n    stop('no trend was estimated in object', call. = FALSE)\n  }\n\n  if (!missing(\"newdata\")) {\n    data_test <- newdata\n  }\n\n  # Prediction indices for the particular series\n  data_train <- object$obs_data\n  ends <- seq(\n    0,\n    dim(mcmc_chains(object$model_output, 'trend'))[2],\n    length.out = NCOL(object$ytimes) + 1\n  )\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n  ends <- ends[-1]\n\n  if (object$fit_engine == 'stan') {\n    preds <- mcmc_chains(object$model_output, 'trend')[, seq(\n      series,\n      dim(mcmc_chains(object$model_output, 'trend'))[2],\n      by = NCOL(object$ytimes)\n    )]\n  } else {\n    preds <- mcmc_chains(object$model_output, 'trend')[,\n      starts[series]:ends[series]\n    ]\n  }\n\n  # If the posterior predictions do not already cover the data_test period, the forecast needs to be\n  # generated using the latent trend dynamics; note, this assumes that there is no gap between the training and\n  # testing datasets\n\n  # Add variables to data_test if missing\n  s_name <- levels(data_train$series)[series]\n  if (!missing(data_test)) {\n    if (!'y' %in% names(data_test)) {\n      data_test$y <- rep(NA, NROW(data_test))\n    }\n\n    if (!'series' %in% names(data_test)) {\n      data_test$series <- factor('series1')\n    }\n\n    if (!'time' %in% names(data_test)) {\n      stop('data_test does not contain a \"time\" column')\n    }\n\n    if (inherits(data_test, 'list')) {\n      all_obs <- c(\n        data.frame(\n          y = data_train$y,\n          series = data_train$series,\n          time = data_train$time\n        ) %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y),\n        data.frame(\n          y = data_test$y,\n          series = data_test$series,\n          time = data_test$time\n        ) %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y)\n      )\n    } else {\n      all_obs <- c(\n        data_train %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y),\n        data_test %>%\n          dplyr::filter(series == s_name) %>%\n          dplyr::select(time, y) %>%\n          dplyr::distinct() %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(y)\n      )\n    }\n\n    if (dim(preds)[2] != length(all_obs)) {\n      fc_preds <- forecast(\n        object,\n        data_test = data_test,\n        type = 'trend',\n        n_cores = n_cores\n      )$forecasts[[series]]\n      preds <- cbind(preds, fc_preds)\n    }\n  }\n\n  preds_last <- preds[1, ]\n  pred_vals <- seq(1:length(preds_last))\n\n  # Plot quantiles of the smooth function, along with observed values\n  # if specified\n  probs <- c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n  cred <- sapply(1:NCOL(preds), function(n) {\n    quantile(preds[, n], probs = probs, na.rm = TRUE)\n  })\n\n  if (missing(xlab)) {\n    xlab <- 'Time'\n  }\n\n  if (missing(ylab)) {\n    ylab <- paste0('Estimated trend for ', levels(data_train$series)[series])\n  }\n\n  # Create a base plot using posterior credible intervals and observations\n  # for the specified series\n  plot_dat <- data.frame(\n    time = 1:NCOL(cred),\n    med = cred[5, ],\n    lower1 = cred[1, ],\n    lower2 = cred[2, ],\n    lower3 = cred[3, ],\n    lower4 = cred[4, ],\n    upper1 = cred[9, ],\n    upper2 = cred[8, ],\n    upper3 = cred[7, ],\n    upper4 = cred[6, ]\n  )\n\n  base_plot <- ggplot2::ggplot(\n    data = plot_dat,\n    mapping = ggplot2::aes(x = time, y = med)\n  ) +\n    ggplot2::theme_classic() +\n    ggplot2::labs(x = xlab, y = ylab)\n\n  # Add to the base plot accordingly\n  if (realisations) {\n    for (i in 1:n_realisations) {\n      base_plot <- base_plot +\n        ggplot2::geom_line(\n          data = data.frame(\n            y = preds[i, ],\n            time = 1:NCOL(cred)\n          ),\n          mapping = ggplot2::aes(x = time, y = y),\n          col = \"white\",\n          linewidth = 1\n        ) +\n        ggplot2::geom_line(\n          data = data.frame(\n            y = preds[i, ],\n            time = 1:NCOL(cred)\n          ),\n          mapping = ggplot2::aes(x = time, y = y),\n          col = sample(\n            c(\"#DCBCBC\", \"#C79999\", \"#B97C7C\", \"#A25050\", \"#7C0000\"),\n            1\n          ),\n          linewidth = 0.75\n        )\n    }\n  } else {\n    base_plot <- base_plot +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower1, ymax = upper1),\n        fill = \"#DCBCBC\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower2, ymax = upper2),\n        fill = \"#C79999\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower3, ymax = upper3),\n        fill = \"#B97C7C\"\n      ) +\n      ggplot2::geom_ribbon(\n        mapping = ggplot2::aes(ymin = lower4, ymax = upper4),\n        fill = \"#A25050\"\n      ) +\n      ggplot2::geom_line(\n        mapping = ggplot2::aes(x = time, y = med),\n        col = \"#8F2727\",\n        linewidth = 1\n      )\n  }\n\n  if (!missing(data_test)) {\n    if (class(data_train)[1] == 'list') {\n      base_plot <- base_plot +\n        ggplot2::geom_vline(\n          xintercept = length(data_train$y) / NCOL(object$ytimes),\n          linetype = 'dashed'\n        )\n    } else {\n      base_plot <- base_plot +\n        ggplot2::geom_vline(\n          xintercept = NROW(data_train) / NCOL(object$ytimes),\n          linetype = 'dashed'\n        )\n    }\n  }\n\n  # Add the 1st derivative plot if necessary\n  if (derivatives) {\n    first_derivs <- cbind(rep(0, NROW(preds)), t(apply(preds, 1, diff)))\n    cred <- sapply(\n      1:NCOL(first_derivs),\n      function(n) quantile(first_derivs[, n], probs = probs, na.rm = TRUE)\n    )\n    plot_dat <- data.frame(\n      time = 1:NCOL(cred),\n      med = cred[5, ],\n      lower1 = cred[1, ],\n      lower2 = cred[2, ],\n      lower3 = cred[3, ],\n      lower4 = cred[4, ],\n      upper1 = cred[9, ],\n      upper2 = cred[8, ],\n      upper3 = cred[7, ],\n      upper4 = cred[6, ]\n    )\n\n    deriv_plot <- ggplot2::ggplot(\n      data = plot_dat,\n      mapping = ggplot2::aes(x = time, y = med)\n    ) +\n      ggplot2::theme_classic() +\n      ggplot2::labs(x = xlab, y = '1st derivative')\n\n    # Add to the base plot accordingly\n    if (realisations) {\n      for (i in 1:n_realisations) {\n        deriv_plot <- deriv_plot +\n          ggplot2::geom_line(\n            data = data.frame(\n              y = first_derivs[i, ],\n              time = 1:NCOL(cred)\n            ),\n            mapping = ggplot2::aes(x = time, y = y),\n            col = \"white\",\n            linewidth = 1\n          ) +\n          ggplot2::geom_line(\n            data = data.frame(\n              y = first_derivs[i, ],\n              time = 1:NCOL(cred)\n            ),\n            mapping = ggplot2::aes(x = time, y = y),\n            col = sample(\n              c(\"#DCBCBC\", \"#C79999\", \"#B97C7C\", \"#A25050\", \"#7C0000\"),\n              1\n            ),\n            linewidth = 0.75\n          )\n      }\n    } else {\n      deriv_plot <- deriv_plot +\n        ggplot2::geom_ribbon(\n          mapping = ggplot2::aes(ymin = lower1, ymax = upper1),\n          fill = \"#DCBCBC\"\n        ) +\n        ggplot2::geom_ribbon(\n          mapping = ggplot2::aes(ymin = lower2, ymax = upper2),\n          fill = \"#C79999\"\n        ) +\n        ggplot2::geom_ribbon(\n          mapping = ggplot2::aes(ymin = lower3, ymax = upper3),\n          fill = \"#B97C7C\"\n        ) +\n        ggplot2::geom_ribbon(\n          mapping = ggplot2::aes(ymin = lower4, ymax = upper4),\n          fill = \"#A25050\"\n        ) +\n        ggplot2::geom_line(\n          mapping = ggplot2::aes(x = time, y = med),\n          col = \"#8F2727\",\n          linewidth = 1\n        )\n    }\n\n    if (!missing(data_test)) {\n      if (class(data_train)[1] == 'list') {\n        deriv_plot <- deriv_plot +\n          ggplot2::geom_vline(\n            xintercept = length(data_train$y) / NCOL(object$ytimes),\n            linetype = 'dashed'\n          )\n      } else {\n        deriv_plot <- deriv_plot +\n          ggplot2::geom_vline(\n            xintercept = NROW(data_train) / NCOL(object$ytimes),\n            linetype = 'dashed'\n          )\n      }\n    }\n\n    out <- patchwork::wrap_plots(base_plot, deriv_plot, ncol = 1)\n  } else {\n    out <- base_plot\n  }\n\n  return(out)\n}\n"
  },
  {
    "path": "R/plot_mvgam_uncertainty.R",
    "content": "#' Plot forecast uncertainty contributions from \\pkg{mvgam} models\n#'\n#' @importFrom graphics legend\n#' @importFrom stats predict\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @param series \\code{integer} specifying which series in the set is to be\n#'   plotted\n#'\n#' @param newdata A \\code{dataframe} or \\code{list} containing at least 'series'\n#'   and 'time' for the forecast horizon, in addition to any other variables\n#'   included in the linear predictor of \\code{formula}\n#'\n#' @param data_test Deprecated. Still works in place of \\code{newdata} but users\n#'   are recommended to use \\code{newdata} instead for more seamless integration\n#'   into `R` workflows\n#'\n#' @param legend_position The location may also be specified by setting x to a\n#'   single keyword from the list: \"none\", \"bottomright\", \"bottom\", \"bottomleft\",\n#'   \"left\", \"topleft\", \"top\", \"topright\", \"right\" and \"center\". This places the\n#'   legend on the inside of the plot frame at the given location (if it is not\n#'   \"none\").\n#'\n#' @param hide_xlabels \\code{logical}. If \\code{TRUE}, no xlabels are printed to\n#'   allow the user to add custom labels using \\code{axis} from base \\code{R}\n#'\n#' @details The basic idea of this function is to compute forecasts by ignoring\n#'   one of the two primary components in a correlated residual model (i.e. by\n#'   either ignoring the linear predictor effects or by ignoring the residual\n#'   dynamics). Some caution is required however, as this function was designed\n#'   early in the \\pkg{mvgam} development cycle and there are now many types of\n#'   models that it cannot handle very well. For example, models with shared\n#'   latent states, or any type of State-Space models that include terms in the\n#'   `trend_formula`, will either fail or give nonsensical results. Improvements\n#'   are in the works to provide a more general way to decompose forecast\n#'   uncertainties, so please check back at a later date.\n#'\n#' @return A base \\code{R} graphics plot\n#'\n#' @export\nplot_mvgam_uncertainty = function(\n  object,\n  series = 1,\n  newdata,\n  data_test,\n  legend_position = 'topleft',\n  hide_xlabels = FALSE\n) {\n  # Check arguments\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  if (!is.null(object$trend_call)) {\n    stop(\n      'cannot yet plot uncertainty decompositions for models with trend_formulae',\n      call. = FALSE\n    )\n  }\n\n  if (sign(series) != 1) {\n    stop('argument \"series\" must be a positive integer', call. = FALSE)\n  } else {\n    if (series %% 1 != 0) {\n      stop('argument \"series\" must be a positive integer', call. = FALSE)\n    }\n  }\n\n  if (series > NCOL(object$ytimes)) {\n    stop(\n      paste0(\n        'object only contains data / predictions for ',\n        NCOL(object$ytimes),\n        ' series'\n      ),\n      call. = FALSE\n    )\n  }\n\n  if (!missing(newdata)) {\n    data_test <- newdata\n  }\n\n  if (missing(data_test) & missing(newdata)) {\n    if (!is.null(object$test_data)) {\n      data_test <- object$test_data\n    } else {\n      stop(\n        'No newdata supplied; cannot calculate uncertainty contributions',\n        call. = FALSE\n      )\n    }\n  }\n\n  # Prediction indices for the particular series\n  data_train <- object$obs_data\n  ends <- seq(\n    0,\n    dim(mcmc_chains(object$model_output, 'ypred'))[2],\n    length.out = NCOL(object$ytimes) + 1\n  )\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n  ends <- ends[-1]\n\n  # Add series factor variable if missing\n  if (class(data_train)[1] != 'list') {\n    if (!'series' %in% colnames(data_test)) {\n      data_test$series <- factor('series1')\n    }\n  }\n\n  if (class(data_train)[1] == 'list') {\n    if (!'series' %in% names(data_test)) {\n      data_test$series <- factor('series1')\n    }\n  }\n\n  # Generate linear predictor matrix for specified series\n  if (class(data_test)[1] == 'list') {\n    list_names <- names(data_test)\n    indices_keep <- which(data_test$series == levels(data_train$series)[series])\n    series_test <- lapply(data_test, function(x) {\n      if (is.matrix(x)) {\n        matrix(x[indices_keep, ], ncol = NCOL(x))\n      } else {\n        x[indices_keep]\n      }\n    })\n    names(series_test) <- list_names\n  } else {\n    series_test <- data_test[\n      which(data_test$series == levels(data_train$series)[series]),\n    ]\n  }\n\n  Xp <- obs_Xp_matrix(newdata = series_test, object$mgcv_model)\n\n  # Extract beta coefs\n  betas <- mcmc_chains(object$model_output, 'b')\n\n  # Extract current trend estimates\n  if (object$fit_engine == 'stan') {\n    trend <- mcmc_chains(object$model_output, 'trend')[, seq(\n      series,\n      dim(mcmc_chains(object$model_output, 'trend'))[2],\n      by = NCOL(object$ytimes)\n    )]\n  } else {\n    trend <- mcmc_chains(object$model_output, 'trend')[,\n      starts[series]:ends[series]\n    ]\n  }\n\n  if (length(unique(data_train$series)) == 1) {\n    trend <- matrix(trend[, NCOL(trend)])\n  } else {\n    if (class(data_test)[1] == 'list') {\n      trend <- trend[,\n        (length(data_train$series) / NCOL(object$ytimes) + 1):NCOL(trend)\n      ]\n    } else {\n      trend <- trend[, (NROW(data_train) / NCOL(object$ytimes) + 1):NCOL(trend)]\n    }\n  }\n\n  # Function to calculate intersection of two uncertainty distributions\n  intersect_hist = function(fullpreds, gampreds) {\n    from <- min(min(fullpreds, na.rm = T), min(gampreds, na.rm = T))\n    to <- max(max(fullpreds, na.rm = T), max(gampreds, na.rm = T))\n\n    fullhist <- hist(\n      fullpreds,\n      breaks = seq(from, to, length.out = 100),\n      plot = F\n    )\n    gamhist <- hist(\n      gampreds,\n      breaks = seq(from, to, length.out = 100),\n      plot = F\n    )\n\n    sum(gamhist$density / max(gamhist$density)) /\n      sum(fullhist$density / max(fullhist$density))\n  }\n\n  # Full predictions\n  n_samples <- NROW(trend)\n  if (class(data_test)[1] == 'list') {\n    ncols <- length(series_test$series)\n  } else {\n    ncols <- NROW(series_test)\n  }\n  fullpreds <- matrix(NA, nrow = n_samples, ncol = ncols)\n  for (i in 1:n_samples) {\n    fullpreds[i, ] <- Xp %*% betas[i, ] + trend[i, ] + attr(Xp, 'model.offset')\n  }\n\n  # GAM only predictions\n  gampreds <- matrix(NA, nrow = n_samples, ncol = ncols)\n  for (i in 1:n_samples) {\n    gampreds[i, ] <- Xp %*% betas[i, ] + attr(Xp, 'model.offset')\n  }\n\n  # GAM uncertainty contributions at each forecast horizon\n  gam_cont <- vector()\n  for (i in 1:NCOL(fullpreds)) {\n    gam_cont[i] <- intersect_hist(fullpreds[, i], gampreds[, i])\n  }\n  gam_cont[is.na(gam_cont)] <- 0.5\n  gam_cont[gam_cont > 1] <- 1\n\n  # Plot and return\n  if (hide_xlabels) {\n    plot(\n      gam_cont,\n      bty = \"L\",\n      ylim = c(0, 1),\n      type = 'n',\n      ylab = paste0(\n        'Uncertainty contributions for ',\n        levels(data_train$series)[series]\n      ),\n      xlab = \"\",\n      xaxt = 'n'\n    )\n  } else {\n    plot(\n      gam_cont,\n      bty = 'L',\n      ylim = c(0, 1),\n      type = 'n',\n      ylab = paste0(\n        'Uncertainty contributions for ',\n        levels(data_train$series)[series]\n      ),\n      xlab = \"Forecast horizon\"\n    )\n  }\n\n  polygon(\n    c(seq(1:(NCOL(gampreds))), rev(seq(1:NCOL(gampreds)))),\n    c(gam_cont, rep(0, NCOL(gampreds))),\n    col = \"#7C0000\",\n    border = NA\n  )\n  polygon(\n    c(seq(1:(NCOL(gampreds))), rev(seq(1:NCOL(gampreds)))),\n    c(gam_cont, rep(1, NCOL(gampreds))),\n    col = '#DCBCBC',\n    border = NA\n  )\n  box(bty = 'L', lwd = 2)\n  if (legend_position != 'none') {\n    legend(\n      legend_position,\n      legend = c(\"Trend\", \"GAM\"),\n      bg = 'white',\n      col = c('#DCBCBC', \"#7C0000\"),\n      lty = 1,\n      lwd = 6\n    )\n  }\n}\n"
  },
  {
    "path": "R/portal_data.R",
    "content": "#' Portal Project rodent capture survey data\n#'\n#' A dataset containing time series of total captures (across all control plots) for select rodent species from the Portal Project\n#'\n#' @format A `data.frame` containing the following fields:\n#' \\describe{\n#' \\item{time}{time of sampling, in lunar monthly cycles}\n#' \\item{series}{factor indicator of the time series, i.e. the species}\n#' \\item{captures}{total captures across all control plots at each time point}\n#' \\item{ndvi_ma12}{12-month moving average of the mean Normalised Difference Vegetation Index}\n#' \\item{mintemp}{monthly mean of minimum temperature}\n#' }\n#' @source \\url{https://github.com/weecology/PortalData/blob/main/SiteandMethods/Methods.md}\n\"portal_data\"\n"
  },
  {
    "path": "R/posterior_epred.mvgam.R",
    "content": "#' Draws from the expected value of the posterior predictive distribution for \\pkg{mvgam} objects\n#'\n#' Compute posterior draws of the expected value of the posterior predictive\n#' distribution (i.e. the conditional expectation). Can be performed for the\n#' data used to fit the model (posterior predictive checks) or for new data.\n#' By definition, these predictions have smaller variance than the posterior\n#' predictions performed by the \\code{\\link{posterior_predict.mvgam}} method.\n#' This is because only the uncertainty in the expected value of the posterior\n#' predictive distribution is incorporated in the draws computed by\n#' \\code{posterior_epred} while the residual error is ignored there. However,\n#' the estimated means of both methods averaged across draws should be very\n#' similar.\n#'\n#' @inheritParams predict.mvgam\n#'\n#' @param ndraws Positive \\code{integer} indicating how many posterior draws\n#'   should be used. If \\code{NULL} (the default) all draws are used.\n#'\n#' @param process_error \\code{logical}. If \\code{TRUE} and \\code{newdata} is\n#'   supplied, expected uncertainty in the process model is accounted for by\n#'   using draws from any latent trend SD parameters. If \\code{FALSE},\n#'   uncertainty in the latent trend component is ignored when calculating\n#'   predictions. If no \\code{newdata} is supplied, draws from the fitted\n#'   model's posterior predictive distribution will be used (which will always\n#'   include uncertainty in any latent trend components)\n#'\n#' @method posterior_epred mvgam\n#'\n#' @details Note that for all types of predictions for models that did not\n#'   include a `trend_formula`, uncertainty in the dynamic trend component can\n#'   be ignored by setting \\code{process_error = FALSE}. However, if a\n#'   `trend_formula` was supplied in the model, predictions for this component\n#'   cannot be ignored. If \\code{process_error = TRUE}, trend predictions will\n#'   ignore autocorrelation coefficients or GP length scale coefficients,\n#'   ultimately assuming the process is stationary. This method is similar to\n#'   the types of posterior predictions returned from `brms` models when using\n#'   autocorrelated error predictions for newdata. This function is therefore\n#'   more suited to posterior simulation from the GAM components of a\n#'   \\code{mvgam} model, while the forecasting functions\n#'   \\code{\\link{plot_mvgam_fc}} and \\code{\\link{forecast.mvgam}} are better\n#'   suited to generate h-step ahead forecasts that respect the temporal\n#'   dynamics of estimated latent trends.\n#'\n#' @return A \\code{matrix} of dimension \\code{n_samples x n_obs}, where\n#'   \\code{n_samples} is the number of posterior samples from the fitted object\n#'   and \\code{n_obs} is the number of observations in \\code{newdata}\n#'\n#' @seealso \\code{\\link{hindcast.mvgam}},\n#'   \\code{\\link{posterior_linpred.mvgam}},\n#'   \\code{\\link{posterior_predict.mvgam}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data and fit a model\n#' simdat <- sim_mvgam(\n#'   n_series = 1,\n#'   trend_model = AR()\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Compute posterior expectations\n#' expectations <- posterior_epred(mod)\n#' str(expectations)\n#' }\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nposterior_epred.mvgam = function(\n  object,\n  newdata,\n  data_test,\n  ndraws = NULL,\n  process_error = TRUE,\n  ...\n) {\n  if (missing(newdata) & missing(data_test)) {\n    out <- .mvgam_fitted(object, type = 'expected')\n  } else {\n    out <- predict(\n      object,\n      newdata = newdata,\n      data_test = data_test,\n      process_error = process_error,\n      type = 'expected',\n      summary = FALSE\n    )\n  }\n\n  if (!is.null(ndraws)) {\n    validate_pos_integer(ndraws)\n    if (ndraws > NROW(out)) {} else {\n      idx <- sample(1:NROW(out), ndraws, replace = FALSE)\n      out <- out[idx, ]\n    }\n  }\n  return(out)\n}\n\n#' Posterior draws of the linear predictor for \\pkg{mvgam} objects\n#'\n#' Compute posterior draws of the linear predictor, that is draws before\n#' applying any link functions or other transformations. Can be performed for\n#' the data used to fit the model (posterior predictive checks) or for new data.\n#'\n#' @inheritParams posterior_epred.mvgam\n#'\n#' @param transform \\code{logical}; if \\code{FALSE} (the default), draws of\n#'   the linear predictor are returned. If \\code{TRUE}, draws of the\n#'   transformed linear predictor, i.e. the conditional expectation, are\n#'   returned.\n#'\n#' @method posterior_linpred mvgam\n#'\n#' @details Note that for all types of predictions for models that did not\n#'   include a `trend_formula`, uncertainty in the dynamic trend component can\n#'   be ignored by setting \\code{process_error = FALSE}. However, if a\n#'   `trend_formula` was supplied in the model, predictions for this component\n#'   cannot be ignored. If \\code{process_error = TRUE}, trend predictions will\n#'   ignore autocorrelation coefficients or GP length scale coefficients,\n#'   ultimately assuming the process is stationary. This method is similar to\n#'   the types of posterior predictions returned from `brms` models when using\n#'   autocorrelated error predictions for newdata. This function is therefore\n#'   more suited to posterior simulation from the GAM components of a\n#'   \\code{mvgam} model, while the forecasting functions\n#'   \\code{\\link{plot_mvgam_fc}} and \\code{\\link{forecast.mvgam}} are better\n#'   suited to generate h-step ahead forecasts that respect the temporal\n#'   dynamics of estimated latent trends.\n#'\n#' @return A \\code{matrix} of dimension \\code{n_samples x n_obs}, where\n#'   \\code{n_samples} is the number of posterior samples from the fitted object\n#'   and \\code{n_obs} is the number of observations in \\code{newdata}\n#'\n#' @seealso \\code{\\link{hindcast.mvgam}},\n#'   \\code{\\link{posterior_epred.mvgam}},\n#'   \\code{\\link{posterior_predict.mvgam}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data and fit a model\n#' simdat <- sim_mvgam(\n#'   n_series = 1,\n#'   trend_model = AR()\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract linear predictor values\n#' linpreds <- posterior_linpred(mod)\n#' str(linpreds)\n#' }\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nposterior_linpred.mvgam = function(\n  object,\n  transform = FALSE,\n  newdata,\n  ndraws = NULL,\n  data_test,\n  process_error = TRUE,\n  ...\n) {\n  if (transform) {\n    type <- 'expected'\n  } else {\n    type <- 'link'\n  }\n\n  out <- predict(\n    object,\n    newdata = newdata,\n    data_test = data_test,\n    process_error = process_error,\n    type = type,\n    summary = FALSE\n  )\n\n  if (!is.null(ndraws)) {\n    validate_pos_integer(ndraws)\n    if (ndraws > NROW(out)) {} else {\n      idx <- sample(1:NROW(out), ndraws, replace = FALSE)\n      out <- out[idx, ]\n    }\n  }\n  return(out)\n}\n\n#' Draws from the posterior predictive distribution for \\pkg{mvgam} objects\n#'\n#' Compute posterior draws of the posterior predictive distribution. Can be\n#' performed for the data used to fit the model (posterior predictive checks)\n#' or for new data. By definition, these draws have higher variance than draws\n#' of the expected value of the posterior predictive distribution computed by\n#' \\code{\\link{posterior_epred.mvgam}}. This is because the residual error is\n#' incorporated in \\code{posterior_predict}. However, the estimated means of\n#' both methods averaged across draws should be very similar.\n#'\n#' @inheritParams predict.mvgam\n#'\n#' @inheritParams posterior_epred.mvgam\n#'\n#' @param process_error Logical. If \\code{TRUE} and \\code{newdata} is supplied,\n#'   expected uncertainty in the process model is accounted for by using draws\n#'   from any latent trend SD parameters. If \\code{FALSE}, uncertainty in the\n#'   latent trend component is ignored when calculating predictions. If no\n#'   \\code{newdata} is supplied, draws from the fitted model's posterior\n#'   predictive distribution will be used (which will always include uncertainty\n#'   in any latent trend components)\n#'\n#' @method posterior_predict mvgam\n#'\n#' @details Note that for all types of predictions for models that did not\n#'   include a `trend_formula`, uncertainty in the dynamic trend component can\n#'   be ignored by setting \\code{process_error = FALSE}. However, if a\n#'   `trend_formula` was supplied in the model, predictions for this component\n#'   cannot be ignored. If \\code{process_error = TRUE}, trend predictions will\n#'   ignore autocorrelation coefficients or GP length scale coefficients,\n#'   ultimately assuming the process is stationary. This method is similar to\n#'   the types of posterior predictions returned from `brms` models when using\n#'   autocorrelated error predictions for newdata. This function is therefore\n#'   more suited to posterior simulation from the GAM components of a\n#'   \\code{mvgam} model, while the forecasting functions\n#'   \\code{\\link{plot_mvgam_fc}} and \\code{\\link{forecast.mvgam}} are better\n#'   suited to generate h-step ahead forecasts that respect the temporal\n#'   dynamics of estimated latent trends.\n#'\n#' @return A \\code{matrix} of dimension \\code{n_samples x new_obs}, where\n#'   \\code{n_samples} is the number of posterior samples from the fitted object\n#'   and \\code{n_obs} is the number of observations in \\code{newdata}\n#'\n#' @seealso\n#'   \\code{\\link{hindcast.mvgam}},\n#'   \\code{\\link{posterior_linpred.mvgam}},\n#'   \\code{\\link{posterior_epred.mvgam}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data and fit a model\n#' simdat <- sim_mvgam(n_series = 1, trend_model = AR())\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Compute posterior predictions\n#' predictions <- posterior_predict(mod)\n#' str(predictions)\n#' }\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nposterior_predict.mvgam = function(\n  object,\n  newdata,\n  data_test,\n  ndraws = NULL,\n  process_error = TRUE,\n  ...\n) {\n  out <- predict(\n    object,\n    newdata = newdata,\n    data_test = data_test,\n    process_error = process_error,\n    type = 'response',\n    summary = FALSE\n  )\n\n  if (!is.null(ndraws)) {\n    validate_pos_integer(ndraws)\n    if (ndraws > NROW(out)) {} else {\n      idx <- sample(1:NROW(out), ndraws, replace = FALSE)\n      out <- out[idx, ]\n    }\n  }\n  return(out)\n}\n\n#' @export\n#' @importFrom rstantools posterior_predict\nrstantools::posterior_predict\n\n#' @export\n#' @importFrom rstantools posterior_epred\nrstantools::posterior_epred\n\n#' @export\n#' @importFrom rstantools posterior_linpred\nrstantools::posterior_linpred\n\n\n#' Expected values of the posterior predictive distribution for \\pkg{mvgam} objects\n#'\n#' This method extracts posterior estimates of the fitted values (i.e. the\n#' actual predictions, including estimates for any trend states, that were\n#' obtained when fitting the model). It also includes an option for obtaining\n#' summaries of the computed draws.\n#'\n#' @inheritParams brms::fitted.brmsfit\n#'\n#' @inheritParams predict.mvgam\n#'\n#' @param object An object of class `mvgam`\n#'\n#' @details This method gives the actual fitted values from the model (i.e. what\n#'   you will see if you generate hindcasts from the fitted model using\n#'   \\code{\\link{hindcast.mvgam}} with `type = 'expected'`). These predictions\n#'   can be overly precise if a flexible dynamic trend component was included in\n#'   the model. This is in contrast to the set of predict functions (i.e.\n#'   \\code{\\link{posterior_epred.mvgam}} or \\code{\\link{predict.mvgam}}), which\n#'   will assume any dynamic trend component has reached stationarity when\n#'   returning hypothetical predictions.\n#'\n#' @return An \\code{array} of predicted \\emph{mean} response values.\n#'\n#'   If \\code{summary = FALSE} the output resembles those of\n#'   \\code{\\link{posterior_epred.mvgam}} and \\code{\\link{predict.mvgam}}.\n#'\n#'   If \\code{summary = TRUE} the output is an \\code{n_observations} x \\code{E}\n#'   matrix. The number of summary statistics \\code{E} is equal to \\code{2 +\n#'   length(probs)}: The \\code{Estimate} column contains point estimates (either\n#'   mean or median depending on argument \\code{robust}), while the\n#'   \\code{Est.Error} column contains uncertainty estimates (either standard\n#'   deviation or median absolute deviation depending on argument\n#'   \\code{robust}). The remaining columns starting with \\code{Q} contain\n#'   quantile estimates as specified via argument \\code{probs}.\n#'\n#' @seealso\n#'   \\code{\\link{hindcast.mvgam}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data and fit a model\n#' simdat <- sim_mvgam(n_series = 1, trend_model = AR())\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract fitted values (posterior expectations)\n#' expectations <- fitted(mod)\n#' str(expectations)\n#' }\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nfitted.mvgam <- function(\n  object,\n  process_error = TRUE,\n  scale = c(\"response\", \"linear\"),\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n) {\n  if (length(probs) != 2L) {\n    stop(\"argument 'probs' must be a vector of length 2\", call. = FALSE)\n  }\n  scale <- match.arg(scale)\n  type <- switch(scale, \"response\" = \"expected\", \"linear\" = \"link\")\n  preds <- .mvgam_fitted(object = object, type = type)\n\n  # Preserve original data ordering\n  data.frame(\n    time = object$obs_data$index..time..index,\n    order = object$obs_data$index..orig..order,\n    series = object$obs_data$series\n  ) %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::pull(order) -> orig_order\n  preds <- preds[, order(orig_order)]\n\n  if (summary) {\n    Qupper <- apply(preds, 2, quantile, probs = max(probs), na.rm = TRUE)\n    Qlower <- apply(preds, 2, quantile, probs = min(probs), na.rm = TRUE)\n\n    if (robust) {\n      estimates <- apply(preds, 2, median, na.rm = TRUE)\n      errors <- apply(abs(preds - estimates), 2, median, na.rm = TRUE)\n    } else {\n      estimates <- apply(preds, 2, mean, na.rm = TRUE)\n      errors <- apply(preds, 2, sd, na.rm = TRUE)\n    }\n\n    out <- cbind(estimates, errors, Qlower, Qupper)\n    colnames(out) <- c(\n      'Estimate',\n      'Est.Error',\n      paste0('Q', 100 * min(probs)),\n      paste0('Q', 100 * max(probs))\n    )\n  } else {\n    out <- preds\n  }\n\n  return(out)\n}\n\n#' @noRd\n.mvgam_fitted = function(object, type = 'expected') {\n  # Extract the linear predictor draws\n  mus <- mcmc_chains(object$model_output, 'mus')\n\n  # Need to know which series each observation belongs to so we can\n  # pull out appropriate family-level parameters (overdispersions, shapes, etc...)\n  if (is.null(object$test_data)) {\n    all_dat <- data.frame(\n      series = object$obs_data$series,\n      time = object$obs_data$time,\n      y = object$obs_data$y\n    ) %>%\n      dplyr::arrange(series, time)\n  } else {\n    all_dat <- data.frame(\n      series = c(object$obs_data$series, object$test_data$series),\n      time = c(object$obs_data$time, object$test_data$time),\n      y = c(object$obs_data$y, object$test_data$y)\n    ) %>%\n      dplyr::arrange(series, time)\n  }\n\n  obs <- all_dat$y\n  series_obs <- as.numeric(all_dat$series)\n\n  # Family-specific parameters\n  family <- object$family\n  family_pars <- extract_family_pars(object = object)\n  n_series <- NCOL(object$ytimes)\n\n  # Family parameters spread into a vector\n  family_extracts <- lapply(seq_along(family_pars), function(j) {\n    if (is.matrix(family_pars[[j]])) {\n      as.vector(family_pars[[j]][, series_obs])\n    } else {\n      family_pars[[j]][]\n    }\n  })\n  names(family_extracts) <- names(family_pars)\n\n  # Add trial information if this is a Binomial model\n  if (object$family %in% c('binomial', 'beta_binomial')) {\n    trials <- as.vector(matrix(\n      rep(as.vector(attr(object$mgcv_model, 'trials')), NROW(mus)),\n      nrow = NROW(mus),\n      byrow = TRUE\n    ))\n    family_extracts$trials <- trials\n  }\n\n  # Expectations as a vector\n  Xp <- as.matrix(as.vector(mus))\n  attr(Xp, 'model.offset') <- 0\n\n  if (family == 'nmix') {\n    latent_lambdas <- exp(as.vector(mcmc_chains(object$model_output, 'trend')))\n    n_draws <- dim(mcmc_chains(object$model_output, 'ypred'))[1]\n    cap <- as.vector(t(replicate(n_draws, object$obs_data$cap)))\n  } else {\n    latent_lambdas <- NULL\n    cap <- NULL\n  }\n  pred_vec <- mvgam_predict(\n    family = family,\n    family_pars = family_extracts,\n    latent_lambdas = latent_lambdas,\n    cap = cap,\n    type = type,\n    Xp = Xp,\n    betas = 1\n  )\n\n  # Convert back to matrix and return\n  pred_mat <- matrix(pred_vec, nrow = NROW(mus))\n  return(pred_mat)\n}\n"
  },
  {
    "path": "R/ppc.mvgam.R",
    "content": "#' @title Plot conditional posterior predictive checks from \\pkg{mvgam} models\n#'\n#' @importFrom stats quantile density ecdf formula terms\n#' @importFrom graphics hist abline box rect lines polygon par\n#' @importFrom grDevices rgb\n#'\n#' @name ppc.mvgam\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @param newdata Optional \\code{dataframe} or \\code{list} of test data\n#'   containing at least 'series' and 'time' for the forecast horizon, in\n#'   addition to any other variables included in the linear predictor of\n#'   \\code{formula}. If included, the observed values in the test data are\n#'   compared to the model's forecast distribution for exploring biases in\n#'   model predictions. Note this is only useful if the same \\code{newdata}\n#'   was also included when fitting the original model.\n#'\n#' @param data_test Deprecated. Still works in place of \\code{newdata} but\n#'   users are recommended to use \\code{newdata} instead for more seamless\n#'   integration into `R` workflows\n#'\n#' @param series \\code{integer} specifying which series in the set is to be\n#'   plotted\n#'\n#' @param type \\code{character} specifying the type of posterior predictive\n#'   check to calculate and plot. Valid options are: 'rootogram', 'mean',\n#'   'hist', 'density', 'prop_zero', 'pit' and 'cdf'\n#'\n#' @param n_bins \\code{integer} specifying the number of bins to use for\n#'   binning observed values when plotting a rootogram or histogram. Default\n#'   is `50` bins for a rootogram, which means that if there are >50 unique\n#'   observed values, bins will be used to prevent overplotting and facilitate\n#'   interpretation. Default for a histogram is to use the number of bins\n#'   returned by a call to `hist` in base `R`\n#'\n#' @param legend_position The location may also be specified by setting x to a\n#'   single keyword from the list \"bottomright\", \"bottom\", \"bottomleft\",\n#'   \"left\", \"topleft\", \"top\", \"topright\", \"right\" and \"center\". This places\n#'   the legend on the inside of the plot frame at the given location. Or\n#'   alternatively, use \"none\" to hide the legend.\n#'\n#' @param xlab Label for x axis\n#'\n#' @param ylab Label for y axis\n#'\n#' @param ... Further \\code{\\link[graphics]{par}} graphical parameters\n#'\n#' @details Conditional posterior predictions are drawn from the fitted\n#'   \\code{mvgam} and compared against the empirical distribution of the\n#'   observed data for a specified series to help evaluate the model's ability\n#'   to generate unbiased predictions. For all plots apart from\n#'   `type = 'rootogram'`, posterior predictions can also be compared to out\n#'   of sample observations as long as these observations were included as\n#'   'data_test' in the original model fit and supplied here. Rootograms are\n#'   currently only plotted using the 'hanging' style.\n#'\n#'\n#'   Note that the predictions used for these plots are *conditional on\n#'   the observed data*, i.e. they are those predictions that have been\n#'   generated directly within the `mvgam()` model. They can be misleading if\n#'   the model included flexible dynamic trend components. For a broader range\n#'   of posterior checks that are created using *unconditional* \"new data\"\n#'   predictions, see \\code{\\link{pp_check.mvgam}}\n#'\n#' @return A base \\code{R} graphics plot showing either a posterior rootogram\n#'   (for \\code{type == 'rootogram'}), the predicted vs observed mean for the\n#'   series (for \\code{type == 'mean'}), predicted vs observed proportion of\n#'   zeroes for the series (for \\code{type == 'prop_zero'}), predicted vs\n#'   observed histogram for the series (for \\code{type == 'hist'}), kernel\n#'   density or empirical CDF estimates for posterior predictions (for\n#'   \\code{type == 'density'} or \\code{type == 'cdf'}) or a Probability\n#'   Integral Transform histogram (for \\code{type == 'pit'}).\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso \\code{\\link{pp_check.mvgam}}, \\code{\\link{predict.mvgam}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some smooth effects and fit a model\n#' set.seed(0)\n#'\n#' dat <- mgcv::gamSim(\n#'   1,\n#'   n = 200,\n#'   scale = 2\n#' )\n#'\n#' mod <- mvgam(\n#'   y ~ s(x0) + s(x1) + s(x2) + s(x3),\n#'   data = dat,\n#'   family = gaussian(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Posterior checks\n#' ppc(mod, type = \"hist\")\n#' ppc(mod, type = \"density\")\n#' ppc(mod, type = \"cdf\")\n#'\n#' # Many more options are available with pp_check()\n#' pp_check(mod)\n#' pp_check(mod, type = \"ecdf_overlay\")\n#' pp_check(mod, type = \"freqpoly\")\n#' }\n#'\n#' @export\n\nppc <- function(object, ...) {\n  UseMethod(\"ppc\", object)\n}\n\n#' @rdname ppc.mvgam\n#' @method ppc mvgam\n#' @export\nppc.mvgam <- function(\n  object,\n  newdata,\n  data_test,\n  series = 1,\n  type = \"hist\",\n  n_bins,\n  legend_position,\n  xlab,\n  ylab,\n  ...\n) {\n  # Check arguments\n  type <- match.arg(\n    arg = type,\n    choices = c(\n      \"rootogram\",\n      \"mean\",\n      \"histogram\",\n      \"density\",\n      \"pit\",\n      \"cdf\",\n      \"prop_zero\"\n    )\n  )\n  if (type == \"histogram\") {\n    type <- \"hist\"\n  }\n\n  if (type == \"rootogram\") {\n    if (\n      !object$family %in%\n        c(\n          \"poisson\",\n          \"negative binomial\",\n          \"tweedie\",\n          \"nmix\",\n          \"binomial\",\n          \"beta_binomial\"\n        )\n    ) {\n      stop(\n        \"Rootograms not supported for checking non-count data\",\n        call. = FALSE\n      )\n    }\n  }\n\n  optional_args <- list(...)\n\n  if (!(inherits(object, \"mvgam\"))) {\n    stop('argument \"object\" must be of class \"mvgam\"')\n  }\n\n  if (sign(series) != 1) {\n    stop('argument \"series\" must be a positive integer', call. = FALSE)\n  } else {\n    if (series %% 1 != 0) {\n      stop('argument \"series\" must be a positive integer', call. = FALSE)\n    }\n  }\n\n  if (series > NCOL(object$ytimes)) {\n    stop(\n      paste0(\n        \"object only contains data / predictions for \",\n        NCOL(object$ytimes),\n        \" series\"\n      ),\n      call. = FALSE\n    )\n  }\n\n  if (type == \"rootogram\" & missing(n_bins)) {\n    n_bins <- 50\n\n    if (sign(n_bins) != 1) {\n      stop('argument \"n_bins\" must be a positive integer', call. = FALSE)\n    } else {\n      if (n_bins %% 1 != 0) {\n        stop('argument \"n_bins\" must be a positive integer', call. = FALSE)\n      }\n    }\n  }\n\n  if (!missing(\"newdata\")) {\n    data_test <- newdata\n\n    # Ensure outcome is labelled 'y' when feeding data to the model for simplicity\n    if (terms(formula(object$call))[[2]] != \"y\") {\n      data_test$y <- data_test[[terms(formula(object$call))[[2]]]]\n    }\n  }\n\n  # Pull out observations and posterior predictions for the specified series\n  data_train <- object$obs_data\n  ends <- seq(\n    0,\n    dim(mcmc_chains(object$model_output, \"ypred\"))[2],\n    length.out = NCOL(object$ytimes) + 1\n  )\n  starts <- ends + 1\n  starts <- c(1, starts[-c(1, (NCOL(object$ytimes) + 1))])\n  ends <- ends[-1]\n\n  # Colours needed for plotting quantiles\n  c_light <- c(\"#DCBCBC\")\n  c_light_highlight <- c(\"#C79999\")\n  c_mid <- c(\"#B97C7C\")\n  c_mid_highlight <- c(\"#A25050\")\n  c_dark <- c(\"#8F2727\")\n  c_dark_highlight <- c(\"#7C0000\")\n  s_name <- levels(data_train$series)[series]\n\n  if (!missing(data_test)) {\n    if (class(data_test)[1] == \"list\") {\n      if (!\"time\" %in% names(data_test)) {\n        stop('data_test does not contain a \"time\" column')\n      }\n\n      if (!\"series\" %in% names(data_test)) {\n        data_test$series <- factor(\"series1\")\n      }\n    } else {\n      if (!\"time\" %in% colnames(data_test)) {\n        stop('data_test does not contain a \"time\" column')\n      }\n\n      if (!\"series\" %in% colnames(data_test)) {\n        data_test$series <- factor(\"series1\")\n      }\n    }\n\n    if (class(object$obs_data)[1] == \"list\") {\n      truths <- data.frame(\n        y = data_test$y,\n        time = data_test$time,\n        series = data_test$series\n      ) %>%\n        dplyr::arrange(time, series) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::pull(y)\n\n      if (object$fit_engine == \"stan\") {\n        # For stan objects, ypred is stored as a vector in column-major order\n        preds <- mcmc_chains(object$model_output, \"ypred\")[, seq(\n          series,\n          dim(mcmc_chains(object$model_output, \"ypred\"))[2],\n          by = NCOL(object$ytimes)\n        )]\n      } else {\n        preds <- mcmc_chains(object$model_output, \"ypred\")[,\n          starts[series]:ends[series]\n        ]\n      }\n\n      preds <- preds[,\n        ((length(data_train$y) / NCOL(object$ytimes)) + 1):((length(\n          data_train$y\n        ) /\n          NCOL(object$ytimes)) +\n          length(truths))\n      ]\n    } else {\n      truths <- data_test %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n\n      if (object$fit_engine == \"stan\") {\n        # For stan objects, ypred is stored as a vector in column-major order\n        preds <- mcmc_chains(object$model_output, \"ypred\")[, seq(\n          series,\n          dim(mcmc_chains(object$model_output, \"ypred\"))[2],\n          by = NCOL(object$ytimes)\n        )]\n      } else {\n        preds <- mcmc_chains(object$model_output, \"ypred\")[,\n          starts[series]:ends[series]\n        ]\n      }\n\n      preds <- preds[,\n        ((NROW(data_train) / NCOL(object$ytimes)) + 1):((NROW(data_train) /\n          NCOL(object$ytimes)) +\n          length(truths))\n      ]\n    }\n\n    if (NROW(preds) > 4000) {\n      preds <- preds[sample(1:NROW(preds), 4000, F), ]\n    }\n  } else {\n    if (class(object$obs_data)[1] == \"list\") {\n      truths <- data.frame(\n        y = data_train$y,\n        time = data_train$time,\n        series = data_train$series\n      ) %>%\n        dplyr::arrange(series, time) %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::pull(y)\n    } else {\n      truths <- data_train %>%\n        dplyr::filter(series == s_name) %>%\n        dplyr::select(time, y) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(time) %>%\n        dplyr::pull(y)\n    }\n\n    if (object$fit_engine == \"stan\") {\n      # For stan objects, ypred is stored as a vector in column-major order\n      preds <- mcmc_chains(object$model_output, \"ypred\")[, seq(\n        series,\n        dim(mcmc_chains(object$model_output, \"ypred\"))[2],\n        by = NCOL(object$ytimes)\n      )]\n    } else {\n      preds <- mcmc_chains(object$model_output, \"ypred\")[,\n        starts[series]:ends[series]\n      ]\n    }\n\n    preds <- preds[, 1:length(truths), drop = FALSE]\n\n    if (NROW(preds) > 4000) {\n      preds <- preds[sample(1:NROW(preds), 4000, F), ]\n    }\n  }\n\n  # Can't deal with missing values in these diagnostic plots\n  preds[is.nan(preds)] <- NA\n  preds <- preds[, !is.na(truths)]\n  truths <- truths[!is.na(truths)]\n  probs <- c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n\n  if (type == \"prop_zero\") {\n    pred_props <- apply(preds, 1, function(x) length(which(x == 0)) / length(x))\n    lower <- quantile(pred_props, probs = 0.01, na.rm = TRUE)\n    upper <- quantile(pred_props, probs = 0.99, na.rm = TRUE)\n\n    if (lower == 0 & upper == 0) {\n      stop(\"No predictions covered zero\")\n    }\n\n    pred_props <- pred_props[-which(pred_props > upper)]\n    if (lower != 0) {\n      pred_props <- pred_props[-which(pred_props < lower)]\n    }\n    obs_prop <- length(which(truths == 0)) / length(truths)\n\n    if (missing(ylab)) {\n      ylab <- \"Density\"\n    }\n\n    if (missing(xlab)) {\n      xlab <- paste0(\n        \"Predicted proportion of zeroes for \",\n        levels(data_train$series)[series]\n      )\n    }\n\n    hist(\n      pred_props,\n      lwd = 2,\n      xlim = c(\n        min(min(pred_props), min(obs_prop)),\n        max(max(pred_props), max(obs_prop))\n      ),\n      main = \"\",\n      breaks = seq(min(pred_props), max(pred_props), length.out = 15),\n      border = \"#B97C7C\",\n      col = \"#C79999\",\n      ylab = ylab,\n      xlab = xlab,\n      ...\n    )\n    abline(v = obs_prop, lwd = 3, col = \"white\")\n    abline(v = obs_prop, lwd = 2.5, col = \"black\")\n    box(bty = \"L\", lwd = 2)\n\n    if (missing(legend_position)) {\n      legend_position <- \"topright\"\n    }\n\n    if (legend_position != \"none\") {\n      legend(\n        legend_position,\n        legend = c(expression(hat(y)[propzero]), expression(y[propzero])),\n        bg = \"white\",\n        col = c(c_mid, \"black\"),\n        lty = 1,\n        lwd = 2,\n        bty = \"n\"\n      )\n    }\n  }\n\n  if (type == \"rootogram\") {\n    ymax <- floor(max(max(truths), quantile(preds, prob = 0.99, na.rm = TRUE)))\n    ymin <- 0L\n    xpos <- ymin:ymax\n\n    # Bin if necessary to prevent overplotting\n    if (length(xpos) > n_bins) {\n      cutpoints <- seq(ymin, ymax, length.out = n_bins)\n      xpos <- floor(cutpoints)\n\n      # Find the cutpoint interval that each prediction falls in\n      tpreds <- as.list(rep(NA, NROW(preds)))\n      for (i in seq_along(tpreds)) {\n        tpreds[[i]] <- table(xpos[findInterval(preds[i, ], cutpoints)])\n        matches <- match(xpos, rownames(tpreds[[i]]))\n        tpreds[[i]] <- as.numeric(tpreds[[i]][matches])\n      }\n      tpreds <- do.call(rbind, tpreds)\n      tpreds[is.na(tpreds)] <- 0\n      tyquantile <- sqrt(t(apply(\n        tpreds,\n        2,\n        quantile,\n        probs = probs,\n        na.rm = TRUE\n      )))\n      tyexp <- tyquantile[, 5]\n\n      # Repeat for truths\n      ty <- table(xpos[findInterval(truths, cutpoints)])\n      ty <- sqrt(as.numeric(ty[match(xpos, rownames(ty))]))\n    } else {\n      tpreds <- as.list(rep(NA, NROW(preds)))\n      for (i in seq_along(tpreds)) {\n        tpreds[[i]] <- table(as.vector(preds[i, ]))\n        matches <- match(xpos, rownames(tpreds[[i]]))\n        tpreds[[i]] <- as.numeric(tpreds[[i]][matches])\n      }\n      tpreds <- do.call(rbind, tpreds)\n      tpreds[is.na(tpreds)] <- 0\n      tyquantile <- sqrt(t(apply(\n        tpreds,\n        2,\n        quantile,\n        probs = probs,\n        na.rm = TRUE\n      )))\n      tyexp <- tyquantile[, 5]\n      ty <- table(truths)\n      ty <- sqrt(as.numeric(ty[match(xpos, rownames(ty))]))\n    }\n\n    ty[is.na(ty)] <- 0\n    ypos <- ty / 2\n    ypos <- tyexp - ypos\n    data <- data.frame(xpos, ypos, ty, tyexp, tyquantile)\n    N <- length(xpos)\n    idx <- rep(1:N, each = 2)\n    repped_x <- rep(xpos, each = 2)\n    x <- sapply(\n      1:length(idx),\n      function(k) {\n        if (k %% 2 == 0) {\n          repped_x[k] + min(diff(xpos)) / 2\n        } else {\n          repped_x[k] - min(diff(xpos)) / 2\n        }\n      }\n    )\n\n    if (missing(xlab)) {\n      xlab <- expression(y)\n    }\n\n    if (missing(ylab)) {\n      ylab <- expression(sqrt(frequency))\n    }\n\n    # Plot the rootogram\n    plot(\n      1,\n      type = \"n\",\n      bty = \"L\",\n      xlab = xlab,\n      ylab = ylab,\n      xlim = range(xpos),\n      ylim = range(c(data$tyexp, data[, 13], data[, 5], data$tyexp - data$ty)),\n      ...\n    )\n    rect(\n      xleft = x[seq(1, N * 2, by = 2)],\n      xright = x[seq(2, N * 2, by = 2)],\n      ytop = data$tyexp,\n      ybottom = data$tyexp - data$ty,\n      col = \"grey80\",\n      border = \"grey10\",\n      lwd = 2\n    )\n    rect(\n      xleft = x[seq(1, N * 2, by = 2)],\n      xright = x[seq(2, N * 2, by = 2)],\n      ytop = data[, 13],\n      ybottom = data[, 5],\n      col = \"#DCBCBC85\",\n      border = \"transparent\"\n    )\n    rect(\n      xleft = x[seq(1, N * 2, by = 2)],\n      xright = x[seq(2, N * 2, by = 2)],\n      ytop = data[, 12],\n      ybottom = data[, 6],\n      col = \"#C7999985\",\n      border = \"transparent\"\n    )\n    rect(\n      xleft = x[seq(1, N * 2, by = 2)],\n      xright = x[seq(2, N * 2, by = 2)],\n      ytop = data[, 11],\n      ybottom = data[, 7],\n      col = \"#B97C7C85\",\n      border = \"transparent\"\n    )\n    rect(\n      xleft = x[seq(1, N * 2, by = 2)],\n      xright = x[seq(2, N * 2, by = 2)],\n      ytop = data[, 10],\n      ybottom = data[, 8],\n      col = \"#A2505085\",\n      border = \"transparent\"\n    )\n    abline(h = 0, col = \"white\", lwd = 3)\n    abline(h = 0, col = \"black\", lwd = 2.5)\n    for (k in 1:N) {\n      lines(\n        x = c(x[seq(1, N * 2, by = 2)][k], x[seq(2, N * 2, by = 2)][k]),\n        y = c(data[k, 9], data[k, 9]),\n        col = \"#8F2727\",\n        lwd = 3\n      )\n    }\n    box(bty = \"L\", lwd = 2)\n  }\n\n  if (type == \"mean\") {\n    # Plot observed and predicted means\n    pred_means <- apply(preds, 1, mean, na.rm = TRUE)\n    lower <- quantile(pred_means, probs = 0.01, na.rm = TRUE)\n    upper <- quantile(pred_means, probs = 0.99, na.rm = TRUE)\n    pred_means <- pred_means[-which(pred_means > upper)]\n    if (lower != 0) {\n      pred_means <- pred_means[-which(pred_means < lower)]\n    }\n    obs_mean <- mean(truths)\n\n    if (missing(ylab)) {\n      ylab <- \"Density\"\n    }\n\n    if (missing(xlab)) {\n      xlab <- paste0(\"Predicted mean for \", levels(data_train$series)[series])\n    }\n\n    hist(\n      pred_means,\n      xlim = c(\n        min(min(pred_means, na.rm = TRUE), min(obs_mean, na.rm = TRUE)),\n        max(max(pred_means, na.rm = TRUE), max(obs_mean, na.rm = TRUE))\n      ),\n      lwd = 2,\n      main = \"\",\n      breaks = seq(\n        min(pred_means, na.rm = TRUE),\n        max(pred_means, na.rm = TRUE),\n        length.out = 20\n      ),\n      border = \"#B97C7C\",\n      col = \"#C79999\",\n      ylab = ylab,\n      xlab = xlab,\n      ...\n    )\n    abline(v = obs_mean, lwd = 3, col = \"white\")\n    abline(v = obs_mean, lwd = 2.5, col = \"black\")\n    box(bty = \"L\", lwd = 2)\n\n    if (missing(legend_position)) {\n      legend_position <- \"topright\"\n    }\n\n    if (legend_position != \"none\") {\n      legend(\n        legend_position,\n        legend = c(expression(hat(mu)), expression(mu)),\n        bg = \"white\",\n        col = c(c_mid, \"black\"),\n        lty = 1,\n        lwd = 2,\n        bty = \"n\"\n      )\n    }\n  }\n\n  # Generate a sample sequence and plot\n  if (type == \"density\") {\n    max_x <- max(\n      max(density(preds[1, ], na.rm = TRUE)$x),\n      max(density(truths, na.rm = TRUE)$x)\n    )\n    min_x <- min(\n      min(density(preds[1, ], na.rm = TRUE)$x),\n      min(density(truths, na.rm = TRUE)$x)\n    )\n    pred_densities <- do.call(\n      rbind,\n      (lapply(1:NROW(preds), function(x) {\n        if (length(which(is.na(preds[x, ]))) > (length(preds[x, ]) - 3)) {\n          rep(\n            0,\n            length(density(truths, from = min_x, to = max_x, na.rm = TRUE)$y)\n          )\n        } else {\n          dens <- density(preds[x, ], from = min_x, to = max_x, na.rm = TRUE)\n          dens$y\n        }\n      }))\n    )\n\n    cred <- sapply(\n      1:NCOL(pred_densities),\n      function(n) quantile(pred_densities[, n], probs = probs, na.rm = TRUE)\n    )\n    true_dens <- density(truths, from = min_x, to = max_x, na.rm = TRUE)\n    ymax <- max(c(max(cred, na.rm = TRUE), max(true_dens$y, na.rm = TRUE)))\n\n    if (missing(ylab)) {\n      ylab <- paste0(\n        \"Predictive density for \",\n        levels(data_train$series)[series]\n      )\n    }\n\n    if (missing(xlab)) {\n      xlab <- \"\"\n    }\n\n    if (object$family == \"beta\") {\n      xlimits <- c(0, 1)\n    } else if (\n      object$family %in% c(\"poisson\", \"negative binomial\", \"lognormal\", \"Gamma\")\n    ) {\n      xlimits <- c(0, max_x)\n    } else {\n      xlimits <- c(min_x, max_x)\n    }\n\n    plot(\n      1,\n      type = \"n\",\n      bty = \"L\",\n      xlab = xlab,\n      ylab = ylab,\n      xlim = xlimits,\n      ylim = c(0, ymax),\n      ...\n    )\n\n    polygon(\n      c(true_dens$x, rev(true_dens$x)),\n      c(cred[1, ], rev(cred[9, ])),\n      col = c_light,\n      border = NA\n    )\n    polygon(\n      c(true_dens$x, rev(true_dens$x)),\n      c(cred[2, ], rev(cred[8, ])),\n      col = c_light_highlight,\n      border = NA\n    )\n    polygon(\n      c(true_dens$x, rev(true_dens$x)),\n      c(cred[3, ], rev(cred[7, ])),\n      col = c_mid,\n      border = NA\n    )\n    polygon(\n      c(true_dens$x, rev(true_dens$x)),\n      c(cred[4, ], rev(cred[6, ])),\n      col = c_mid_highlight,\n      border = NA\n    )\n    lines(true_dens$x, cred[5, ], col = c_dark, lwd = 2.5)\n\n    lines(x = true_dens$x, y = true_dens$y, lwd = 3, col = \"white\")\n    lines(x = true_dens$x, y = true_dens$y, lwd = 2.5, col = \"black\")\n\n    if (missing(legend_position)) {\n      legend_position <- \"topright\"\n    }\n\n    if (legend_position != \"none\") {\n      legend(\n        legend_position,\n        legend = c(expression(hat(y)), \"y\"),\n        bg = \"white\",\n        col = c(c_mid, \"black\"),\n        lty = 1,\n        lwd = 2,\n        bty = \"n\"\n      )\n    }\n    box(bty = \"L\", lwd = 2)\n  }\n\n  if (type == \"hist\") {\n    if (missing(n_bins)) {\n      n_bins <- max(c(\n        length(hist(c(truths, as.vector(preds)), plot = F)$breaks),\n        20\n      ))\n    }\n\n    if (sign(n_bins) != 1) {\n      stop('argument \"n_bins\" must be a positive integer', call. = FALSE)\n    } else {\n      if (n_bins %% 1 != 0) {\n        stop('argument \"n_bins\" must be a positive integer', call. = FALSE)\n      }\n    }\n\n    xlim <- c(\n      min(\n        min(density(preds[1, ], na.rm = TRUE)$x),\n        min(density(truths, na.rm = TRUE)$x)\n      ),\n      max(\n        max(density(preds[1, ], na.rm = TRUE)$x),\n        max(density(truths, na.rm = TRUE)$x)\n      )\n    )\n\n    if (object$family == \"beta\") {\n      xlim <- c(0, 1)\n    } else if (\n      object$family %in% c(\"poisson\", \"negative binomial\", \"lognormal\", \"Gamma\")\n    ) {\n      xlim <- c(0, xlim[2])\n    } else {\n      xlim <- xlim\n    }\n\n    breaks <- seq(xlim[1], xlim[2], length.out = n_bins)\n    truths <- truths[truths <= xlim[2]]\n    truths <- truths[truths >= xlim[1]]\n    preds <- preds[preds <= xlim[2]]\n    preds <- preds[preds >= xlim[1]]\n\n    ylim <- c(\n      0,\n      max(\n        c(\n          max(hist(truths, breaks = breaks, plot = F)$density, na.rm = TRUE),\n          max(hist(preds, breaks = breaks, plot = F)$density, na.rm = TRUE)\n        ),\n        na.rm = TRUE\n      )\n    )\n\n    if (missing(xlab)) {\n      xlab <- paste0(\"Count\")\n    }\n\n    if (missing(ylab)) {\n      ylab <- \"\"\n    }\n\n    hist(\n      preds,\n      breaks = breaks,\n      lwd = 2,\n      main = \"\",\n      xlab = xlab,\n      ylab = ylab,\n      ylim = ylim,\n      xlim = xlim,\n      border = \"#B97C7C\",\n      col = \"#C79999\",\n      freq = F,\n      ...\n    )\n\n    par(lwd = 2)\n    hist(\n      truths,\n      breaks = breaks,\n      main = \"\",\n      xlab = \"\",\n      ylim = ylim,\n      xlim = xlim,\n      ylab = \"\",\n      yaxt = \"n\",\n      col = rgb(red = 0, green = 0, blue = 0, alpha = 0),\n      border = \"black\",\n      add = T,\n      freq = F\n    )\n    par(lwd = 1)\n    box(bty = \"L\", lwd = 2)\n\n    if (missing(legend_position)) {\n      legend_position <- \"topright\"\n    }\n\n    if (legend_position != \"none\") {\n      legend(\n        legend_position,\n        legend = c(expression(hat(y)), \"y\"),\n        bg = \"white\",\n        col = c(c_mid, \"black\"),\n        lty = 1,\n        lwd = 2,\n        bty = \"n\"\n      )\n    }\n  }\n\n  if (type == \"cdf\") {\n    ecdf_plotdat <- function(vals, x) {\n      if (length(which(is.na(vals))) > (length(vals) - 3)) {} else {\n        func <- ecdf(vals)\n        func(x)\n      }\n    }\n\n    plot_x <- seq(\n      from = min(truths, na.rm = T),\n      to = max(truths, na.rm = T),\n      length.out = 100\n    )\n\n    pred_cdfs <- do.call(\n      rbind,\n      (lapply(1:NROW(preds), function(x) {\n        ecdf_plotdat(preds[x, ], x = plot_x)\n      }))\n    )\n\n    probs <- c(0.05, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.95)\n    cred <- sapply(\n      1:NCOL(pred_cdfs),\n      function(n) quantile(pred_cdfs[, n], probs = probs, na.rm = TRUE)\n    )\n\n    if (missing(ylab)) {\n      ylab <- paste0(\"Predictive CDF for \", levels(data_train$series)[series])\n    }\n\n    if (missing(xlab)) {\n      xlab <- \"\"\n    }\n\n    plot(\n      1,\n      type = \"n\",\n      bty = \"L\",\n      xlab = xlab,\n      ylab = ylab,\n      xlim = c(min(plot_x, na.rm = TRUE), max(plot_x, na.rm = TRUE)),\n      ylim = c(0, 1),\n      ...\n    )\n\n    polygon(\n      c(plot_x, rev(plot_x)),\n      c(cred[1, ], rev(cred[9, ])),\n      col = c_light,\n      border = NA\n    )\n    polygon(\n      c(plot_x, rev(plot_x)),\n      c(cred[2, ], rev(cred[8, ])),\n      col = c_light_highlight,\n      border = NA\n    )\n    polygon(\n      c(plot_x, rev(plot_x)),\n      c(cred[3, ], rev(cred[7, ])),\n      col = c_mid,\n      border = NA\n    )\n    polygon(\n      c(plot_x, rev(plot_x)),\n      c(cred[4, ], rev(cred[6, ])),\n      col = c_mid_highlight,\n      border = NA\n    )\n    lines(plot_x, cred[5, ], col = c_dark, lwd = 2.5)\n\n    lines(x = plot_x, y = ecdf_plotdat(truths, plot_x), col = \"white\", lwd = 3)\n    lines(\n      x = plot_x,\n      y = ecdf_plotdat(truths, plot_x),\n      col = \"black\",\n      lwd = 2.5\n    )\n\n    if (missing(legend_position)) {\n      legend_position <- \"bottomright\"\n    }\n\n    if (legend_position != \"none\") {\n      legend(\n        legend_position,\n        legend = c(expression(hat(y)), \"y\"),\n        bg = \"white\",\n        col = c(c_mid, \"black\"),\n        lty = 1,\n        lwd = 2,\n        bty = \"n\"\n      )\n    }\n    box(bty = \"L\", lwd = 2)\n  }\n\n  if (type == \"pit\") {\n    # Calculate emipirical cumulative distribution function as the\n    # portion of (y_predicted <= y_true)\n    n_pred <- ncol(preds)\n    P_x <- vapply(\n      seq_along(truths),\n      function(i) {\n        sum(preds[i, ] <= truths[i]) / n_pred\n      },\n      .0\n    )\n\n    P_xm1 <- vapply(\n      seq_along(truths),\n      function(i) {\n        sum(preds[i, ] <= truths[i] - 1.e-6) / n_pred\n      },\n      .0\n    )\n    # 1000 replicates for randomised PIT\n    u <- replicate(1000, P_xm1 + stats::runif(length(truths)) * (P_x - P_xm1))\n    pit_hist <- hist(u, breaks = seq(0, 1, by = 0.1), plot = F)$density\n    pit_hist <- (pit_hist / sum(pit_hist)) * 10\n\n    barplot(\n      pit_hist,\n      lwd = 2,\n      col = \"#B97C7C\",\n      xlab = paste0(\"Predictive PIT for \", levels(data_train$series)[series]),\n      border = NA,\n      ...\n    )\n    abline(h = 1, col = \"#FFFFFF60\", lwd = 2.85)\n    abline(h = 1, col = \"black\", lwd = 2.5, lty = \"dashed\")\n    box(bty = \"L\", lwd = 2)\n  }\n}\n\n#' Posterior Predictive Checks for \\code{mvgam} models\n#'\n#' Perform unconditional posterior predictive checks with the help\n#' of the \\pkg{bayesplot} package.\n#'\n#' @aliases pp_check\n#'\n#' @inheritParams brms::pp_check\n#' @inheritParams brms::prepare_predictions.brmsfit\n#'\n#' @importFrom insight get_predictors\n#' @importFrom brms do_call\n#' @importFrom bayesplot pp_check\n#'\n#' @param object An object of class \\code{mvgam}\n#'\n#' @param newdata Optional \\code{dataframe} or \\code{list} of test data containing the\n#' variables included in the linear predictor of \\code{formula}. If not supplied,\n#' predictions are generated for the original observations used for the model fit.\n#' Ignored if using one of the residual plots (i.e. 'resid_hist')\n#'\n#' @param ... Further arguments passed to \\code{\\link{predict.mvgam}}\n#'   as well as to the PPC function specified in \\code{type}\n#'\n#' @return A ggplot object that can be further\n#'  customized using the \\pkg{ggplot2} package.\n#'\n#' @details Unlike the conditional posterior checks provided by \\code{\\link{ppc}},\n#' This function computes *unconditional* posterior predictive checks (i.e. it generates\n#' predictions for fake data without considering the true observations associated with those\n#' fake data). For a detailed explanation of each of the ppc functions,\n#' see the \\code{\\link[bayesplot:PPC-overview]{PPC}}\n#' documentation of the \\pkg{\\link[bayesplot:bayesplot-package]{bayesplot}}\n#' package.\n#'\n#' @seealso \\code{\\link{ppc}}, \\code{\\link{predict.mvgam}}\n#'\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(seasonality = \"hierarchical\")\n#' mod <- mvgam(\n#'   y ~ series +\n#'     s(season, bs = \"cc\", k = 6) +\n#'     s(season, series, bs = \"fs\", k = 4),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Use pp_check(mod, type = \"xyz\") for a list of available plot types\n#'\n#' # Default is a density overlay for all observations\n#' pp_check(mod)\n#'\n#' # Rootograms particularly useful for count data\n#' pp_check(mod, type = \"rootogram\")\n#'\n#' # Grouping plots by series is useful\n#' pp_check(mod,\n#'   type = \"bars_grouped\",\n#'   group = \"series\", ndraws = 50\n#' )\n#' pp_check(mod,\n#'   type = \"ecdf_overlay_grouped\",\n#'   group = \"series\", ndraws = 50\n#' )\n#' pp_check(mod,\n#'   type = \"stat_freqpoly_grouped\",\n#'   group = \"series\", ndraws = 50\n#' )\n#'\n#' # Several types can be used to plot distributions of randomized\n#' # quantile residuals\n#' pp_check(\n#'   object = mod,\n#'   x = \"season\",\n#'   type = \"resid_ribbon\"\n#' )\n#' pp_check(\n#'   object = mod,\n#'   x = \"season\",\n#'   group = \"series\",\n#'   type = \"resid_ribbon_grouped\"\n#' )\n#' pp_check(mod,\n#'   ndraws = 5,\n#'   type = \"resid_hist_grouped\",\n#'   group = \"series\"\n#' )\n#'\n#' # Custom functions accepted\n#' pp_check(mod, type = \"stat\", stat = function(x) mean(x == 0))\n#' pp_check(mod,\n#'   type = \"stat_grouped\",\n#'   stat = function(x) mean(x == 0),\n#'   group = \"series\"\n#' )\n#'\n#' # Some functions accept covariates to set the x-axes\n#' pp_check(mod,\n#'   x = \"season\",\n#'   type = \"ribbon_grouped\",\n#'   prob = 0.5,\n#'   prob_outer = 0.8,\n#'   group = \"series\"\n#' )\n#'\n#' # Many plots can be made without the observed data\n#' pp_check(mod, prefix = \"ppd\")\n#' }\n#'\n#' @export pp_check\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\npp_check.mvgam <- function(\n  object,\n  type,\n  ndraws = NULL,\n  prefix = c(\"ppc\", \"ppd\"),\n  group = NULL,\n  x = NULL,\n  newdata = NULL,\n  ...\n) {\n  # Set red colour scheme\n  col_scheme <- attr(color_scheme_get(), \"scheme_name\")\n  color_scheme_set(\"red\")\n\n  dots <- list(...)\n  if (missing(type)) {\n    type <- \"dens_overlay\"\n  }\n\n  prefix <- match.arg(prefix)\n  ndraws_given <- \"ndraws\" %in% names(match.call())\n\n  if (is.null(newdata)) {\n    newdata <- object$obs_data\n  }\n\n  if (prefix == \"ppc\") {\n    # No type checking for prefix 'ppd' yet\n    valid_types <- sort(\n      c(\n        as.character(bayesplot::available_ppc(\"\")),\n        \"ppc_resid_hist\",\n        \"ppc_resid_hist_grouped\",\n        \"ppc_resid_ribbon\",\n        \"ppc_resid_ribbon_grouped\"\n      )\n    )\n    valid_types <- sub(\"^ppc_\", \"\", valid_types)\n    if (!type %in% valid_types) {\n      stop(\n        \"Type '\",\n        type,\n        \"' is not a valid ppc type. \",\n        \"Valid types are:\\n\",\n        paste0(\"'\", valid_types, \"'\", collapse = \", \"),\n        call. = FALSE\n      )\n    }\n  }\n\n  bptype <- type\n\n  if (bptype %in% c(\"resid_hist\", \"resid_hist_grouped\")) {\n    if (is.null(object$resids)) {\n      object <- add_residuals(object)\n    }\n    bptype <- sub(\"resid\", \"error\", bptype)\n  }\n\n  if (bptype %in% c(\"resid_ribbon\", \"resid_ribbon_grouped\")) {\n    if (is.null(object$resids)) {\n      object <- add_residuals(object)\n    }\n    bptype <- sub(\"resid_\", \"\", bptype)\n  }\n\n  ppc_fun <- get(paste0(prefix, \"_\", bptype), asNamespace(\"bayesplot\"))\n\n  family <- object$family\n  if (family == \"nmix\") {\n    stop(\"'pp_check' is not implemented for this family.\", call. = FALSE)\n  }\n  valid_vars <- names(get_predictors(object))\n  if (\"group\" %in% names(formals(ppc_fun))) {\n    if (is.null(group)) {\n      stop(\n        \"Argument 'group' is required for ppc type '\",\n        type,\n        \"'.\",\n        call. = FALSE\n      )\n    }\n    if (!group %in% valid_vars) {\n      stop(\n        \"Variable '\",\n        group,\n        \"' could not be found in the data.\",\n        call. = FALSE\n      )\n    }\n  }\n  if (\"x\" %in% names(formals(ppc_fun))) {\n    if (!is.null(x) && !x %in% valid_vars) {\n      stop(\"Variable '\", x, \"' could not be found in the data.\", call. = FALSE)\n    }\n  }\n  if (type == \"error_binned\") {\n    method <- \"posterior_epred\"\n  } else {\n    method <- \"posterior_predict\"\n  }\n  if (!ndraws_given) {\n    aps_types <- c(\n      \"error_scatter_avg\",\n      \"error_scatter_avg_vs_x\",\n      \"intervals\",\n      \"intervals_grouped\",\n      \"loo_intervals\",\n      \"loo_pit\",\n      \"loo_pit_overlay\",\n      \"loo_pit_qq\",\n      \"loo_ribbon\",\n      \"pit_ecdf\",\n      \"pit_ecdf_grouped\",\n      \"ribbon\",\n      \"ribbon_grouped\",\n      \"rootogram\",\n      \"scatter_avg\",\n      \"scatter_avg_grouped\",\n      \"stat\",\n      \"stat_2d\",\n      \"stat_freqpoly_grouped\",\n      \"stat_grouped\",\n      \"violin_grouped\"\n    )\n    if (type %in% aps_types) {\n      ndraws <- NULL\n      message(\"Using all posterior draws for ppc type '\", type, \"' by default.\")\n    } else {\n      ndraws <- 10\n      message(\"Using 10 posterior draws for ppc type '\", type, \"' by default.\")\n    }\n  }\n\n  y <- NULL\n  if (prefix == \"ppc\") {\n    # y is ignored in prefix 'ppd' plots; get the response variable,\n    # but take care that binomial models use the cbind() lhs\n    resp_terms <- as.character(terms(formula(object$call))[[2]])\n    if (length(resp_terms) == 1) {\n      out_name <- as.character(terms(object$call)[[2]])\n    } else {\n      if (any(grepl(\"cbind\", resp_terms))) {\n        resp_terms <- resp_terms[-grepl(\"cbind\", resp_terms)]\n        out_name <- resp_terms[1]\n      }\n    }\n    y <- newdata[[out_name]]\n  }\n\n  # For plotting DS residuals, set y to zero and take\n  # -1 * residual so that errors are in the correct direction\n  if (grepl(\"resid\", type)) {\n    y[!is.na(y)] <- 0\n    yrep <- t(-1 * residuals(object, summary = FALSE))\n\n    if (!is.null(ndraws)) {\n      yrep <- yrep[1:ndraws, ]\n    }\n  } else {\n    pred_args <- list(\n      object,\n      newdata = newdata,\n      ndraws = ndraws,\n      ...\n    )\n    yrep <- do_call(method, pred_args)\n  }\n\n  if (anyNA(y)) {\n    warning(\"NA responses are not shown in 'pp_check'.\")\n    take <- !is.na(y)\n    y <- y[take]\n    yrep <- yrep[, take, drop = FALSE]\n  } else {\n    take <- NULL\n  }\n\n  # Prepare plotting arguments\n  ppc_args <- list()\n  if (prefix == \"ppc\") {\n    ppc_args$y <- y\n    ppc_args$yrep <- yrep\n  } else if (prefix == \"ppd\") {\n    ppc_args$ypred <- yrep\n  }\n  if (!is.null(group)) {\n    if (!exists(group, newdata)) {\n      stop(paste0(\"Variable \", group, \" not in newdata\"), call. = FALSE)\n    }\n    ppc_args$group <- newdata[[group]]\n\n    if (!is.null(take)) {\n      ppc_args$group <- ppc_args$group[take]\n    }\n  }\n\n  is_like_factor <- function(x) {\n    is.factor(x) || is.character(x) || is.logical(x)\n  }\n\n  if (!is.null(x)) {\n    ppc_args$x <- newdata[[x]]\n    if (!is_like_factor(ppc_args$x)) {\n      ppc_args$x <- as.numeric(ppc_args$x)\n    }\n\n    if (!is.null(take)) {\n      ppc_args$x <- ppc_args$x[take]\n    }\n  }\n\n  if (\"psis_object\" %in% setdiff(names(formals(ppc_fun)), names(ppc_args))) {\n    # ppc_args$psis_object <- do_call(\n    #   compute_loo, c(pred_args, criterion = \"psis\")\n    # )\n    # compute_loo() not available yet for mvgam\n    ppc_args$psis_object <- NULL\n  }\n  if (\"lw\" %in% setdiff(names(formals(ppc_fun)), names(ppc_args))) {\n    # ppc_args$lw <- weights(\n    #   do_call(compute_loo, c(pred_args, criterion = \"psis\"))\n    # )\n    # compute_loo() not available yet for mvgam\n    ppc_args$lw <- NULL\n  }\n\n  # Most ... arguments are meant for the prediction function\n  for_pred <- names(dots) %in% names(formals(posterior_predict.mvgam))\n  ppc_args <- c(ppc_args, dots[!for_pred])\n\n  # Generate plot\n  out_plot <- do_call(ppc_fun, ppc_args)\n\n  if (\"x\" %in% names(formals(ppc_fun)) && !is.null(x)) {\n    out_plot <- out_plot +\n      ggplot2::labs(x = x)\n  }\n\n  # Improve labels for residual plots\n  if (type %in% c(\"resid_hist\", \"resid_hist_grouped\")) {\n    out_plot <- out_plot +\n      ggplot2::labs(x = \"DS residuals\")\n  }\n\n  if (type %in% c(\"resid_ribbon\", \"resid_ribbon_grouped\")) {\n    out_plot <- out_plot +\n      ggplot2::theme(legend.position = \"none\") +\n      ggplot2::labs(y = \"DS residuals\")\n  }\n\n  # Reset color scheme and return the plot\n  color_scheme_set(col_scheme)\n  return(out_plot)\n}\n"
  },
  {
    "path": "R/predict.mvgam.R",
    "content": "#' Predict from a fitted \\pkg{mvgam} model\n#'\n#' @importFrom stats predict\n#'\n#' @inheritParams brms::fitted.brmsfit\n#'\n#' @param object \\code{list} object of class \\code{mvgam} or \\code{jsdgam}.\n#'   See [mvgam()]\n#'\n#' @param newdata Optional \\code{dataframe} or \\code{list} of test data\n#'   containing the same variables that were included in the original `data`\n#'   used to fit the model. If not supplied, predictions are generated for the\n#'   original observations used for the model fit.\n#'\n#' @param data_test Deprecated. Still works in place of \\code{newdata} but\n#'   users are recommended to use \\code{newdata} instead for more seamless\n#'   integration into `R` workflows\n#'\n#' @param type When this has the value \\code{link} (default) the linear\n#'   predictor is calculated on the link scale. If \\code{expected} is used,\n#'   predictions reflect the expectation of the response (the mean) but ignore\n#'   uncertainty in the observation process. When \\code{response} is used, the\n#'   predictions take uncertainty in the observation process into account to\n#'   return predictions on the outcome scale. When \\code{variance} is used, the\n#'   variance of the response with respect to the mean (mean-variance\n#'   relationship) is returned. When `type = \"terms\"`, each component of the\n#'   linear predictor is returned separately in the form of a `list` (possibly\n#'   with standard errors, if `summary = TRUE`): this includes parametric model\n#'   components, followed by each smooth component, but excludes any offset and\n#'   any intercept. Two special cases are also allowed: type `latent_N` will\n#'   return the estimated latent abundances from an N-mixture distribution,\n#'   while type `detection` will return the estimated detection probability from\n#'   an N-mixture distribution\n#'\n#' @param process_error Logical. If \\code{TRUE} and a dynamic trend model was\n#'   fit, expected uncertainty in the process model is accounted for by using\n#'   draws from a stationary, zero-centred multivariate Normal distribution\n#'   using any estimated process variance-covariance parameters. If\n#'   \\code{FALSE}, uncertainty in the latent trend component is ignored when\n#'   calculating predictions\n#'\n#' @param ... Ignored\n#'\n#' @details Note that if your model included a latent temporal trend (i.e. if\n#'   you used something other than `\"None\"` for the `trend_model` argument), the\n#'   predictions returned by this function will ignore autocorrelation\n#'   coefficients or GP length scale coefficients by *assuming the process is\n#'   stationary*. This approach is similar to how predictions are computed from\n#'   other types of regression models that can include correlated residuals,\n#'   *ultimately treating the temporal dynamics as random effect nuisance\n#'   parameters*. The `predict` function is therefore more suited to\n#'   scenario-based posterior simulation from the GAM components of a\n#'   \\code{mvgam} model, while the hindcast / forecast functions\n#'   [hindcast.mvgam()] and [forecast.mvgam()] are better suited to generate\n#'   predictions that respect the temporal dynamics of estimated latent trends\n#'   at the actual time points supplied in `data` and `newdata`.\n#'\n#' @return Predicted values on the appropriate scale.\n#'\n#'   If \\code{summary = FALSE} and `type != \"terms\"`, the output is a matrix of\n#'   dimension `n_draw x n_observations` containing predicted values for each\n#'   posterior draw in `object`.\n#'\n#'   If \\code{summary = TRUE} and `type != \"terms\"`, the output is an\n#'   \\code{n_observations} x \\code{E} matrix. The number of summary statistics\n#'   \\code{E} is equal to \\code{2 + length(probs)}: The \\code{Estimate} column\n#'   contains point estimates (either mean or median depending on argument\n#'   \\code{robust}), while the \\code{Est.Error} column contains uncertainty\n#'   estimates (either standard deviation or median absolute deviation depending\n#'   on argument \\code{robust}). The remaining columns starting with \\code{Q}\n#'   contain quantile estimates as specified via argument \\code{probs}.\n#'\n#'   If `type = \"terms\"` and `summary = FALSE`, the output is a named `list`\n#'   containing a separate slot for each effect, with the effects returned as\n#'   matrices of dimension `n_draw x 1`. If `summary = TRUE`, the output\n#'   resembles that from \\code{\\link[mgcv]{predict.gam}} when using the call\n#'   `predict.gam(object, type = \"terms\", se.fit = TRUE)`, where mean\n#'   contributions from each effect are returned in `matrix` form while standard\n#'   errors (representing the interval: `(max(probs) - min(probs)) / 2`) are\n#'   returned in a separate `matrix`\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso\n#'   [hindcast.mvgam()],\n#'   [forecast.mvgam()],\n#'   [fitted.mvgam()],\n#'   [augment.mvgam()]\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate 4 time series with hierarchical seasonality\n#' # and independent AR1 dynamic processes\n#' set.seed(123)\n#' simdat <- sim_mvgam(\n#'   seasonality = 'hierarchical',\n#'   prop_trend = 0.75,\n#'   trend_model = AR(),\n#'   family = gaussian()\n#' )\n#'\n#' # Fit a model with shared seasonality\n#' # and AR(1) dynamics\n#' mod1 <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   data = simdat$data_train,\n#'   family = gaussian(),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Generate predictions against observed data\n#' preds <- predict(\n#'   mod1,\n#'   summary = TRUE\n#' )\n#' head(preds)\n#'\n#' # Generate predictions against test data\n#' preds <- predict(\n#'   mod1,\n#'   newdata = simdat$data_test,\n#'   summary = TRUE\n#' )\n#' head(preds)\n#'\n#' # Use plot_predictions(), which relies on predict()\n#' # to more easily see how the latent AR(1) dynamics are\n#' # being ignored when using predict()\n#' plot_predictions(\n#'   mod1,\n#'   by = c('time', 'series', 'series'),\n#'   points = 0.5\n#' )\n#'\n#' # Using the hindcast() function will give a more accurate\n#' # representation of how the AR(1) processes were estimated to give\n#' # accurate predictions to the in-sample training data\n#' hc <- hindcast(mod1)\n#' plot(hc) +\n#'   plot(hc, series = 2) +\n#'   plot(hc, series = 3)\n#' }\n#'\n#' @export\npredict.mvgam = function(\n  object,\n  newdata,\n  data_test,\n  type = 'link',\n  process_error = FALSE,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n) {\n  # Argument checks\n  if (!missing(\"data_test\")) {\n    newdata <- data_test\n  }\n  if (missing(newdata)) {\n    newdata <- object$obs_data\n  }\n  if (length(probs) != 2L) {\n    stop(\"argument 'probs' must be a vector of length 2\", call. = FALSE)\n  }\n  validate_proportional(min(probs))\n  validate_proportional(max(probs))\n\n  # Check names of supplied variables against those required\n  # for prediction\n  validate_predictors(object, newdata)\n\n  # newdata needs to have a 'series' indicator in it for integrating\n  # over the trend uncertainties\n  if (inherits(object, 'jsdgam')) {\n    newdata <- validate_series_time(\n      data = newdata,\n      trend_model = attr(object$model_data, 'prepped_trend_model'),\n      check_levels = FALSE,\n      check_times = FALSE\n    )\n  } else {\n    newdata <- validate_series_time(\n      data = newdata,\n      trend_model = object$trend_model,\n      check_levels = FALSE,\n      check_times = FALSE\n    )\n  }\n\n  type <- match.arg(\n    arg = type,\n    choices = c(\n      \"link\",\n      \"expected\",\n      \"response\",\n      \"variance\",\n      \"latent_N\",\n      \"detection\",\n      \"terms\"\n    )\n  )\n\n  if (type == 'latent_N' & object$family != 'nmix') {\n    stop('\"latent_N\" type only available for N-mixture models', call. = FALSE)\n  }\n\n  if (type == 'detection' & object$family != 'nmix') {\n    stop('\"detection\" type only available for N-mixture models', call. = FALSE)\n  }\n\n  # terms is the easiest return type, so evaluate it first\n  if (type == 'terms') {\n    out <- list()\n    out$obs_effects <- terms_preds(\n      object = object,\n      newdata = newdata,\n      summary = summary,\n      robust = robust,\n      probs = probs,\n      trend_effects = FALSE\n    )\n    if (!is.null(object$trend_call)) {\n      out$process_effects <- terms_preds(\n        object = object,\n        newdata = newdata,\n        summary = summary,\n        robust = robust,\n        probs = probs,\n        trend_effects = TRUE\n      )\n    }\n  } else {\n    # If a linear predictor was supplied for the latent process models, calculate\n    # predictions by assuming the trend is stationary (this is basically what brms\n    # does when predicting for autocor() models)\n    if (!is.null(object$trend_call)) {\n      # Linear predictor matrix for the latent process models\n      Xp <- trend_Xp_matrix(\n        newdata = newdata,\n        trend_map = object$trend_map,\n        series = 'all',\n        mgcv_model = object$trend_mgcv_model\n      )\n\n      # Extract process error estimates\n      if (\n        attr(object$model_data, 'trend_model') %in%\n          c('None', 'RW', 'AR1', 'AR2', 'AR3', 'CAR1', 'ZMVN')\n      ) {\n        if (object$family == 'nmix') {\n          family_pars <- list(sigma_obs = .Machine$double.eps)\n        } else {\n          family_pars <- list(\n            sigma_obs = mcmc_chains(object$model_output, 'sigma')\n          )\n        }\n      }\n\n      if (attr(object$model_data, 'trend_model') %in% c('VAR1')) {\n        if (object$use_lv) {\n          family_pars <- list(\n            sigma_obs = mcmc_chains(object$model_output, 'Sigma')[,\n              seq(1, object$n_lv^2, by = object$n_lv + 1)\n            ]\n          )\n        } else {\n          family_pars <- list(\n            sigma_obs = mcmc_chains(object$model_output, 'Sigma')[,\n              seq(1, NCOL(object$ytimes)^2, by = NCOL(object$ytimes) + 1)\n            ]\n          )\n        }\n      }\n\n      # Indicators of which trend to use for each observation\n      if (inherits(newdata, 'list')) {\n        data.frame(series = newdata$series) %>%\n          dplyr::left_join(object$trend_map, by = 'series') %>%\n          dplyr::pull(trend) -> trend_inds\n        newdata_trend <- newdata\n        newdata_trend$trend <- trend_inds\n      } else {\n        newdata %>%\n          dplyr::left_join(object$trend_map, by = 'series') -> newdata_trend\n      }\n      trend_ind <- as.numeric(newdata_trend$trend)\n\n      # Beta coefficients for GAM process model component\n      betas <- mcmc_chains(object$model_output, 'b_trend')\n\n      # Family parameters spread into a vector\n      family_extracts <- lapply(seq_along(family_pars), function(j) {\n        if (is.matrix(family_pars[[j]])) {\n          as.vector(family_pars[[j]][, trend_ind])\n        } else {\n          family_pars[[j]]\n        }\n      })\n      names(family_extracts) <- names(family_pars)\n\n      # Trend stationary predictions\n      if (!process_error) {\n        family_extracts <- list(sigma_obs = .Machine$double.eps)\n      }\n      if (inherits(object, 'jsdgam')) {\n        # JSDMs should generate one set of predictions per latent variable and then\n        # create a weighted set of predictions based on the loading estimates\n        lv_coefs <- mcmc_chains(object$model_output, 'lv_coefs')\n        n_draws <- dim(mcmc_chains(object$model_output, 'b'))[1]\n        series_ind <- as.numeric(newdata$series)\n\n        trend_predictions_raw <- lapply(1:object$n_lv, function(x) {\n          # Linear predictor matrix for the latent process models\n          Xp <- trend_Xp_matrix(\n            newdata = newdata,\n            trend_map = data.frame(\n              trend = x,\n              series = unique(object$trend_map$series)\n            ),\n            series = 'all',\n            mgcv_model = object$trend_mgcv_model\n          )\n          all_linpreds <- as.matrix(as.vector(t(apply(\n            as.matrix(betas),\n            1,\n            function(row) Xp %*% row + attr(Xp, 'model.offset')\n          ))))\n          attr(all_linpreds, 'model.offset') <- 0\n          pred_vec <- mvgam_predict(\n            family = 'gaussian',\n            Xp = all_linpreds,\n            type = 'response',\n            betas = 1,\n            family_pars = family_extracts\n          )\n          matrix(pred_vec, nrow = NROW(betas))\n        })\n\n        # Create weighted set of predictions using the loadings\n        weighted_mat = function(pred_matrices, weights, draw = 1, obs = 1) {\n          lv_draws <- unlist(\n            lapply(pred_matrices, function(x) x[draw, obs]),\n            use.names = FALSE\n          )\n          as.vector(lv_draws %*% weights)\n        }\n\n        trend_predictions <- matrix(\n          NA,\n          nrow = n_draws,\n          ncol = length(newdata[[1]])\n        )\n        n_lv <- object$n_lv\n        for (i in 1:n_draws) {\n          for (x in 1:length(newdata[[1]])) {\n            trend_predictions[i, x] <- weighted_mat(\n              trend_predictions_raw,\n              matrix(lv_coefs[i, ], nrow = n_lv)[, series_ind[x]],\n              draw = i,\n              obs = x\n            )\n          }\n        }\n        trend_predictions <- as.vector(trend_predictions)\n      } else {\n        # Pre-multiply the linear predictors\n        all_linpreds <- as.matrix(as.vector(t(apply(\n          as.matrix(betas),\n          1,\n          function(row) Xp %*% row + attr(Xp, 'model.offset')\n        ))))\n        attr(all_linpreds, 'model.offset') <- 0\n        trend_predictions <- mvgam_predict(\n          family = 'gaussian',\n          Xp = all_linpreds,\n          type = 'response',\n          betas = 1,\n          family_pars = family_extracts\n        )\n      }\n    } else if (\n      attr(object$model_data, 'trend_model') != 'None' & process_error\n    ) {\n      # If no linear predictor for the trends but a dynamic trend model was used,\n      # and the process_error flag is set to TRUE,\n      # simulate from stationary time series to capture uncertainty\n      # in the dynamic trend component\n\n      n_draws <- dim(mcmc_chains(object$model_output, 'b'))[1]\n      series_ind <- as.numeric(newdata$series)\n\n      # Draw from fixed sigma for latent variable models\n      if (object$use_lv & is.null(object$trend_map)) {\n        if (attr(object$model_data, 'trend_model') != 'GP') {\n          trends <- array(\n            rnorm(\n              n_draws * object$n_lv * length(newdata[[1]]),\n              mean = 0,\n              sd = 0.1\n            ),\n            dim = c(n_draws, object$n_lv, length(newdata[[1]]))\n          )\n        } else {\n          trends <- array(\n            rnorm(\n              n_draws * object$n_lv * length(newdata[[1]]),\n              mean = 0,\n              sd = 0.25\n            ),\n            dim = c(n_draws, object$n_lv, length(newdata[[1]]))\n          )\n        }\n\n        lv_coefs <- mcmc_chains(object$model_output, 'lv_coefs')\n\n        trend_predictions <- matrix(\n          NA,\n          nrow = n_draws,\n          ncol = length(newdata[[1]])\n        )\n        for (i in 1:n_draws) {\n          for (x in 1:length(newdata[[1]])) {\n            trend_predictions[i, x] <- t(trends[i, , series_ind[x]]) %*%\n              matrix(lv_coefs[i, ], nrow = object$n_lv)[, series_ind[x]]\n          }\n        }\n        trend_predictions <- as.vector(trend_predictions)\n      }\n\n      if (!object$use_lv | !is.null(object$trend_map)) {\n        if (\n          attr(object$model_data, 'trend_model') %in%\n            c('RW', 'AR1', 'AR2', 'AR3', 'VAR1', 'CAR1', 'ZMVN')\n        ) {\n          family_pars <- list(\n            sigma_obs = mcmc_chains(object$model_output, 'sigma')\n          )\n        }\n        if (attr(object$model_data, 'trend_model') %in% c('GP')) {\n          family_pars <- list(\n            sigma_obs = mcmc_chains(object$model_output, 'alpha_gp')\n          )\n        }\n        if (\n          attr(object$model_data, 'trend_model') %in%\n            c('PWlogistic', 'PWlinear')\n        ) {\n          trend_hcs <- hindcast(object, type = 'trend')\n          sigma_obs <- unlist(\n            lapply(seq_along(trend_hcs$hindcasts), function(x) {\n              mean(apply(trend_hcs$hindcasts[[x]], 2, sd))\n            }),\n            use.names = FALSE\n          )\n          family_pars <- list(\n            sigma_obs = sigma_obs\n          )\n        }\n\n        # Indicators of which trend to use for each observation\n        if (!is.null(object$trend_map)) {\n          newdata %>%\n            dplyr::left_join(object$trend_map, by = 'series') -> newdata_trend\n          trend_ind <- as.numeric(newdata_trend$trend)\n        } else {\n          trend_ind <- as.numeric(newdata$series)\n        }\n\n        # Create a fake design matrix of 1s\n        betas <- matrix(\n          0,\n          ncol = 1,\n          nrow = dim(mcmc_chains(object$model_output, 'b'))[1]\n        )\n        Xp <- matrix(1, ncol = 1, nrow = length(newdata$time))\n        attr(Xp, 'model.offset') <- 0\n\n        # Family parameters spread into a vector\n        family_extracts <- lapply(seq_along(family_pars), function(j) {\n          if (is.matrix(family_pars[[j]])) {\n            as.vector(family_pars[[j]][, trend_ind])\n          } else {\n            family_pars[[j]]\n          }\n        })\n        names(family_extracts) <- names(family_pars)\n\n        # Pre-multiply the linear predictors\n        all_linpreds <- as.matrix(as.vector(t(apply(\n          as.matrix(betas),\n          1,\n          function(row) Xp %*% row + attr(Xp, 'model.offset')\n        ))))\n        attr(all_linpreds, 'model.offset') <- 0\n\n        # Trend stationary predictions\n        trend_predictions <- mvgam_predict(\n          family = 'gaussian',\n          Xp = all_linpreds,\n          type = 'response',\n          betas = 1,\n          family_pars = family_extracts\n        )\n      }\n    } else {\n      # If no trend_model was used, or if process_error == FALSE,\n      # ignore uncertainty in any latent trend component\n      trend_predictions <- 0\n    }\n\n    #### Once trend predictions are made, calculate observation predictions ####\n    # Generate linear predictor matrix from the mgcv observation model\n    Xp <- obs_Xp_matrix(newdata = newdata, mgcv_model = object$mgcv_model)\n\n    # Beta coefficients for GAM component\n    betas <- mcmc_chains(object$model_output, 'b')\n\n    # Family of model\n    family <- object$family\n\n    # Family-specific parameters\n    family_pars <- extract_family_pars(object = object)\n\n    # Determine which series each observation belongs to\n    series_ind <- as.numeric(newdata$series)\n\n    # Family parameters spread into long vectors\n    family_extracts <- lapply(seq_along(family_pars), function(j) {\n      if (is.matrix(family_pars[[j]])) {\n        as.vector(family_pars[[j]][, series_ind])\n      } else {\n        as.vector(matrix(\n          rep(family_pars[[j]], NROW(Xp)),\n          nrow = NROW(betas),\n          byrow = FALSE\n        ))\n      }\n    })\n    names(family_extracts) <- names(family_pars)\n\n    # Add trial information if this is a Binomial model\n    if (object$family %in% c('binomial', 'beta_binomial')) {\n      resp_terms <- as.character(terms(formula(object))[[2]])\n      resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n      trial_name <- resp_terms[2]\n      if (!trial_name %in% names(newdata)) {\n        stop(\n          paste0('variable ', trial_name, ' not found in newdata'),\n          call. = FALSE\n        )\n      }\n\n      trials <- newdata[[trial_name]]\n      trials <- as.vector(matrix(\n        rep(as.vector(trials), NROW(betas)),\n        nrow = NROW(betas),\n        byrow = TRUE\n      ))\n      family_extracts$trials <- trials\n    }\n\n    # Pre-multiply the linear predictors, including any offset and trend\n    # predictions if applicable\n    if (family == 'nmix') {\n      all_linpreds <- as.matrix(as.vector(t(apply(\n        as.matrix(betas),\n        1,\n        function(row) Xp %*% row + attr(Xp, 'model.offset')\n      ))))\n      latent_lambdas <- exp(trend_predictions)\n\n      if (!(exists('cap', where = newdata))) {\n        stop(\n          'Max abundances must be supplied as a variable named \"cap\" for N-mixture models',\n          call. = FALSE\n        )\n      }\n\n      validate_pos_integers(newdata$cap)\n\n      if (any(is.na(newdata$cap)) | any(is.infinite(newdata$cap))) {\n        stop(\n          paste0('Missing or infinite values found for some \"cap\" terms'),\n          call. = FALSE\n        )\n      }\n      cap <- as.vector(t(replicate(NROW(betas), newdata$cap)))\n    } else {\n      all_linpreds <- as.matrix(\n        as.vector(t(apply(\n          as.matrix(betas),\n          1,\n          function(row) Xp %*% row + attr(Xp, 'model.offset')\n        ))) +\n          trend_predictions\n      )\n      latent_lambdas <- NULL\n      cap <- NULL\n    }\n\n    attr(all_linpreds, 'model.offset') <- 0\n\n    # Calculate vectorized predictions\n    predictions_vec <- mvgam_predict(\n      family = family,\n      Xp = all_linpreds,\n      latent_lambdas = latent_lambdas,\n      cap = cap,\n      type = type,\n      betas = 1,\n      family_pars = family_extracts\n    )\n\n    # Convert back to matrix\n    preds <- matrix(predictions_vec, nrow = NROW(betas))\n\n    if (summary) {\n      Qupper <- apply(preds, 2, quantile, probs = max(probs), na.rm = TRUE)\n      Qlower <- apply(preds, 2, quantile, probs = min(probs), na.rm = TRUE)\n\n      if (robust) {\n        estimates <- apply(preds, 2, median, na.rm = TRUE)\n        errors <- apply(abs(preds - estimates), 2, median, na.rm = TRUE)\n      } else {\n        estimates <- apply(preds, 2, mean, na.rm = TRUE)\n        errors <- apply(preds, 2, sd, na.rm = TRUE)\n      }\n\n      out <- cbind(estimates, errors, Qlower, Qupper)\n      colnames(out) <- c(\n        'Estimate',\n        'Est.Error',\n        paste0('Q', 100 * min(probs)),\n        paste0('Q', 100 * max(probs))\n      )\n    } else {\n      out <- preds\n    }\n  }\n  return(out)\n}\n\n#' Term-specific predictions and uncertainties\n#' @noRd\nterms_preds = function(\n  object,\n  newdata,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  trend_effects = FALSE\n) {\n  if (trend_effects) {\n    Xp <- trend_Xp_matrix(\n      newdata = newdata,\n      trend_map = object$trend_map,\n      series = 'all',\n      mgcv_model = object$trend_mgcv_model\n    )\n    betas <- mcmc_chains(object$model_output, 'b_trend')\n    effect_names <- colnames(predict(\n      relabel_gps(object$trend_mgcv_model),\n      type = 'terms',\n      se.fit = FALSE\n    ))\n    effect_names <- gsub('series', 'trend', effect_names, fixed = TRUE)\n    coef_names <- names(coef(object$trend_mgcv_model))\n    coef_names <- gsub('series', 'trend', coef_names, fixed = TRUE)\n  } else {\n    Xp <- obs_Xp_matrix(newdata = newdata, mgcv_model = object$mgcv_model)\n    betas <- mcmc_chains(object$model_output, 'b')\n    effect_names <- colnames(predict(\n      relabel_gps(object$mgcv_model),\n      type = 'terms',\n      se.fit = FALSE\n    ))\n    coef_names <- names(coef(object$mgcv_model))\n  }\n\n  # Contributions considering full uncertainties\n  contributions <- serrors <- vector(\n    mode = 'list',\n    length = length(effect_names)\n  )\n  for (i in seq_along(effect_names)) {\n    effect_idxs <- grep(effect_names[i], coef_names, fixed = TRUE)\n    linpred <- as.matrix(as.vector(t(apply(\n      as.matrix(betas[, effect_idxs, drop = FALSE]),\n      1,\n      function(row) Xp[, effect_idxs, drop = FALSE] %*% row\n    ))))\n    contributions[[i]] <- matrix(linpred, nrow = NROW(betas))\n\n    if (summary) {\n      serrors[[i]] <- (apply(\n        contributions[[i]],\n        2,\n        function(x) quantile(x, probs = max(probs), na.rm = TRUE)\n      ) -\n        apply(\n          contributions[[i]],\n          2,\n          function(x) quantile(x, probs = min(probs), na.rm = TRUE)\n        )) /\n        2\n      if (robust) {\n        contributions[[i]] <- apply(contributions[[i]], 2, median)\n      } else {\n        contributions[[i]] <- apply(contributions[[i]], 2, mean)\n      }\n    }\n  }\n  if (summary) {\n    out <- list()\n    contributions <- do.call(cbind, contributions)\n    serrors <- do.call(cbind, serrors)\n    colnames(contributions) <- colnames(serrors) <- effect_names\n    out$fit <- contributions\n    out$se.fit <- serrors\n  } else {\n    names(contributions) <- effect_names\n    out <- contributions\n  }\n  return(out)\n}\n"
  },
  {
    "path": "R/print.mvgam.R",
    "content": "#' Print a fitted \\pkg{mvgam} object\n#'\n#' This function takes a fitted \\code{mvgam} or \\code{jsdgam} object and prints\n#' a quick summary.\n#'\n#' @param x \\code{list} object returned from \\code{mvgam}\n#'\n#' @param ... Ignored\n#'\n#' @details A brief summary of the model's call is printed\n#'\n#' @return A \\code{list} is printed on-screen\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nprint.mvgam = function(x, ...) {\n  object <- x\n\n  # Use shared extractor functions to eliminate code duplication\n  model_spec <- extract_model_spec(object)\n  sampling_info <- extract_sampling_info(object)\n\n  # Print model specification with simplified logic for print.mvgam\n  print_model_specification_simple(model_spec)\n\n  # Print sampling information using shared helper\n  print_sampling_information(sampling_info)\n}\n\n#' Print model specification section for print.mvgam (simplified version)\n#' @param model_spec Model specification from extract_model_spec\n#' @noRd\nprint_model_specification_simple <- function(model_spec) {\n  # Print formulas\n  if (!is.null(model_spec$formulas$process)) {\n    cat(\"GAM observation formula:\\n\")\n    print(model_spec$formulas$observation)\n    cat(\"\\nGAM process formula:\\n\")\n    print(model_spec$formulas$process)\n  } else {\n    cat(\"GAM formula:\\n\")\n    print(model_spec$formulas$observation)\n  }\n\n  # Print family and link\n  cat(\"\\nFamily:\\n\")\n  cat(paste0(model_spec$family, '\\n'))\n\n  cat(\"\\nLink function:\\n\")\n  cat(paste0(model_spec$link, '\\n'))\n\n  # Print trend model\n  if (!model_spec$is_jsdgam) {\n    cat(\"\\nTrend model:\\n\")\n    if (is.call(model_spec$trend_model)) {\n      print(model_spec$trend_model)\n      cat('\\n')\n    } else {\n      cat(paste0(model_spec$trend_model, '\\n'))\n    }\n  }\n\n  # Print latent variable info (simplified - always \"latent factors\" for print.mvgam)\n  if (!is.null(model_spec$latent_variables)) {\n    cat(\"\\nN latent factors:\\n\")\n    cat(model_spec$latent_variables$count, '\\n')\n  }\n\n  # Print dimensions\n  if (model_spec$is_jsdgam) {\n    cat('\\nN species:\\n')\n    cat(model_spec$dimensions$n_species, '\\n')\n    cat('\\nN sites:\\n')\n    cat(model_spec$dimensions$n_sites, '\\n')\n  } else {\n    cat('\\nN series:\\n')\n    cat(model_spec$dimensions$n_series, '\\n')\n    cat('\\nN timepoints:\\n')\n    cat(model_spec$dimensions$n_timepoints, '\\n')\n  }\n\n  # Print upper bounds if present\n  if (!is.null(model_spec$upper_bounds)) {\n    cat('\\nUpper bounds:\\n')\n    cat(model_spec$upper_bounds, '\\n')\n  }\n}\n\n\n#'@export\nprint.mvgam_prefit = function(x, ...) {\n  object <- x\n\n  # Use shared extractor function for model specification\n  model_spec <- extract_model_spec(object)\n\n  # Print model specification using shared helper\n  print_model_specification(model_spec)\n\n  # Add prefit-specific status message\n  cat('\\nStatus:\\n')\n  cat('Not fitted', '\\n')\n}\n"
  },
  {
    "path": "R/residual_cor.R",
    "content": "#' Extract residual correlations based on latent factors\n#'\n#' Compute residual correlation estimates from Joint Species Distribution\n#' (\\code{jsdgam}) or \\code{mvgam} models that either used latent factors\n#' or included correlated process errors directly\n#'\n#' @name residual_cor.jsdgam\n#'\n#' @inheritParams brms::residuals.brmsfit\n#'\n#' @param object \\code{list} object of class \\code{mvgam} resulting from a\n#'   call to [jsdgam()] or a call to [mvgam()] in which either\n#'   `use_lv = TRUE` or a multivariate process was used with `cor = TRUE`\n#'   (see [RW()] and [VAR()] for examples)\n#'\n#' @param robust If `FALSE` (the default) the mean is used as a measure of\n#'   central tendency. If `TRUE`, the median is used instead. Only used if\n#'   `summary` is `TRUE`\n#'\n#' @param ... ignored\n#'\n#' @return If `summary = TRUE`, a `list` of\n#'   \\code{\\link{mvgam_residcor-class}} with the following components:\n#'   \\item{cor, cor_lower, cor_upper}{A set of \\eqn{p \\times p} correlation\n#'   matrices, containing either the posterior median or mean estimate, plus\n#'   lower and upper limits of the corresponding credible intervals supplied\n#'   to `probs`}\n#'   \\item{sig_cor}{A \\eqn{p \\times p} correlation matrix containing only\n#'   correlations whose credible interval does not contain zero. All other\n#'   correlations are set to zero}\n#'   \\item{prec, prec_lower, prec_upper}{A set of \\eqn{p \\times p} precision\n#'   matrices, containing either the posterior median or mean estimate, plus\n#'   lower and upper limits of the corresponding credible intervals supplied\n#'   to `probs`}\n#'   \\item{sig_prec}{A \\eqn{p \\times p} precision matrix containing only\n#'   precisions whose credible interval does not contain zero. All other\n#'   precisions are set to zero}\n#'   \\item{cov}{A \\eqn{p \\times p} posterior median or mean covariance\n#'   matrix}\n#'   \\item{trace}{The median/mean point estimator of the trace (sum of the\n#'   diagonal elements) of the residual covariance matrix `cov`}\n#'\n#'   If `summary = FALSE`, this function returns a `list` containing the\n#'   following components:\n#'   \\item{all_cormat}{A \\eqn{n_{draws} \\times p \\times p} `array` of\n#'   posterior residual correlation matrix draws}\n#'   \\item{all_covmat}{A \\eqn{n_{draws} \\times p \\times p} `array` of\n#'   posterior residual covariance matrix draws}\n#'   \\item{all_presmat}{A \\eqn{n_{draws} \\times p \\times p} `array` of\n#'   posterior residual precision matrix draws}\n#'   \\item{all_trace}{A \\eqn{n_{draws}} `vector` of posterior covariance\n#'   trace draws}\n#'\n#' @details\n#' See \\code{\\link{mvgam_residcor-class}} for a description of the quantities\n#' that are computed and returned by this function, along with key references.\n#'\n#' @references Hui, F. K. C. (2016). boral – Bayesian Ordination and\n#'   Regression Analysis of Multivariate Abundance Data in r. \\emph{Methods\n#'   in Ecology and Evolution}, 7(6), 744-750.\n#'   \\doi{10.1111/2041-210X.12514}\n#'\n#' @seealso [jsdgam()], [lv_correlations()], \\code{\\link{mvgam_residcor-class}}\n#'\n#' @export\nresidual_cor <- function(object, ...) {\n  UseMethod(\"residual_cor\", object)\n}\n\n#' @rdname residual_cor.jsdgam\n#' @method residual_cor mvgam\n#' @export\nresidual_cor.mvgam <- function(\n  object,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n) {\n  # Only applicable if this is a dynamic factor model or a model\n  # that included a process error variance-covariance matrix\n  if (\n    any(\n      grepl(\n        'Sigma',\n        variables(object)$trend_pars$orig_name\n      )\n    ) |\n      object$use_lv\n  ) {\n    class(object) <- c('jsdgam', 'mvgam')\n    return(\n      residual_cor(\n        object,\n        object = object,\n        summary = summary,\n        robust = robust,\n        probs = probs,\n        ...\n      )\n    )\n  } else {\n    stop(\n      paste0(\n        'Cannot compute residual correlations if no latent factors ',\n        'or correlated process errors were modelled'\n      ),\n      call. = FALSE\n    )\n  }\n}\n\n#' @rdname residual_cor.jsdgam\n#' @method residual_cor jsdgam\n#' @examples\n#'\\dontrun{\n#' # Fit a JSDGAM to the portal_data captures\n#' mod <- jsdgam(\n#'   formula = captures ~\n#'     # Fixed effects of NDVI and mintemp, row effect as a GP of time\n#'     ndvi_ma12:series + mintemp:series + gp(time, k = 15),\n#'   factor_formula = ~ -1,\n#'   data = portal_data,\n#'   unit = time,\n#'   species = series,\n#'   family = poisson(),\n#'   n_lv = 2,\n#'   silent = 2,\n#'   chains = 2\n#' )\n#'\n#' # Plot residual correlations\n#' plot(\n#'   residual_cor(mod)\n#' )\n#'\n#' # Compare to a residual ordination biplot\n#' if(requireNamespace('ggrepel', quietly = TRUE)){\n#'   ordinate(mod)\n#' }\n#'\n#' # Not needed for general use; cleans up connections for automated testing\n#' closeAllConnections()\n#' }\n#' @export\nresidual_cor.jsdgam <- function(\n  object,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n) {\n  insight::check_if_installed(\"corpcor\")\n\n  if (length(probs) != 2L) {\n    stop(\"argument 'probs' must be a vector of length 2\", call. = FALSE)\n  }\n  validate_proportional(min(probs))\n  validate_proportional(max(probs))\n\n  # Initiate objects to store all posterior correlation and covariance matrices\n  p <- NCOL(object$ytimes)\n  sp_names <- levels(object$obs_data$series)\n  ndraws <- brms::ndraws(as_draws_array(object, variable = 'betas'))\n  all_cormat <- all_covmat <- all_precmat <- array(\n    0,\n    dim = c(ndraws, p, p)\n  )\n  all_trace_rescor <- numeric(ndraws)\n\n  # Check whether this model included a full variance-covariance matrix\n  use_lv <- TRUE\n  if (\n    any(\n      grepl(\n        'Sigma',\n        variables(object)$trend_pars$orig_name\n      )\n    )\n  ) {\n    # Use the factors if they were supplied; otherwise\n    # use the full variance-covariance matrix\n    if (object$use_lv) {\n      use_lv <- TRUE\n    } else {\n      use_lv <- FALSE\n    }\n  }\n\n  if (use_lv) {\n    # Take draws of factor loadings to compute residual correlations,\n    # covariances, and precisions\n    n_lv <- object$n_lv\n    loadings <- as.matrix(object$model_output, 'lv_coefs')\n\n    # Calculate posterior covariance, correlation, precision and trace estimates\n    for (i in 1:ndraws) {\n      lv_coefs <- matrix(loadings[i, ], nrow = p, ncol = n_lv)\n\n      lambdalambdaT <- tcrossprod(lv_coefs)\n      all_covmat[i, , ] <- lambdalambdaT\n      all_trace_rescor[i] <- sum(diag(lambdalambdaT))\n      all_cormat[i, , ] <- cov2cor(lambdalambdaT)\n      all_precmat[i, , ] <- corpcor::cor2pcor(lambdalambdaT)\n    }\n  } else {\n    # If the model already included a variance-covariance matrix,\n    # compute directly\n    Sigma_post <- as.matrix(\n      object,\n      variable = \"Sigma\",\n      regex = TRUE\n    )\n\n    for (i in 1:ndraws) {\n      cov <- matrix(\n        Sigma_post[i, ],\n        nrow = p,\n        ncol = p\n      )\n      all_covmat[i, , ] <- cov\n      all_trace_rescor[i] <- sum(diag(cov))\n      all_cormat[i, , ] <- cov2cor(cov)\n      all_precmat[i, , ] <- corpcor::cor2pcor(cov)\n    }\n  }\n\n  if (!summary) {\n    out <- list(\n      all_cormat = all_cormat,\n      all_covmat = all_covmat,\n      all_precmat = all_precmat,\n      all_trace = all_trace_rescor\n    )\n  } else {\n    #### If summary, calculate summary statistics ####\n    # Initiate summary correlation and covariance matrices\n    sig_cormat <- cormat <- cormat_lower <- cormat_upper <-\n      sig_precmat <- precmat <- precmat_lower <- precmat_upper <-\n        covmat <- matrix(0, nrow = p, ncol = p)\n\n    rownames(cormat) <- rownames(cormat_lower) <- rownames(cormat_upper) <-\n      rownames(sig_cormat) <- rownames(precmat) <- rownames(precmat_lower) <-\n        rownames(precmat_upper) <- rownames(sig_precmat) <- rownames(covmat) <-\n          colnames(cormat) <- colnames(cormat_lower) <- colnames(\n            cormat_upper\n          ) <-\n            colnames(sig_cormat) <- colnames(precmat) <- colnames(\n              precmat_lower\n            ) <-\n              colnames(precmat_upper) <- colnames(sig_precmat) <- colnames(\n                covmat\n              ) <-\n                sp_names\n\n    # Calculate posterior summaries\n    for (j in 1:p) {\n      for (j2 in 1:p) {\n        if (robust) {\n          covmat[j, j2] <- median(all_covmat[, j, j2])\n          cormat[j, j2] <- median(all_cormat[, j, j2])\n          precmat[j, j2] <- median(all_precmat[, j, j2])\n        } else {\n          covmat[j, j2] <- mean(all_covmat[, j, j2])\n          cormat[j, j2] <- mean(all_cormat[, j, j2])\n          precmat[j, j2] <- mean(all_precmat[, j, j2])\n        }\n\n        sig_cormat[j, j2] <- cormat[j, j2]\n        cormat_lower[j, j2] <- quantile(\n          all_cormat[, j, j2],\n          probs = min(probs),\n          na.rm = TRUE\n        )\n        cormat_upper[j, j2] <- quantile(\n          all_cormat[, j, j2],\n          probs = max(probs),\n          na.rm = TRUE\n        )\n        if (0 > cormat_lower[j, j2] & 0 < cormat_upper[j, j2]) {\n          sig_cormat[j, j2] <- 0\n        }\n\n        sig_precmat[j, j2] <- precmat[j, j2]\n        precmat_lower[j, j2] <- quantile(\n          all_precmat[, j, j2],\n          probs = min(probs),\n          na.rm = TRUE\n        )\n        precmat_upper[j, j2] <- quantile(\n          all_precmat[, j, j2],\n          probs = max(probs),\n          na.rm = TRUE\n        )\n        if (0 > precmat_lower[j, j2] & 0 < precmat_upper[j, j2]) {\n          sig_precmat[j, j2] <- 0\n        }\n      }\n    }\n\n    if (robust) {\n      final_trace <- median(all_trace_rescor)\n    } else {\n      final_trace <- mean(all_trace_rescor)\n    }\n\n    out <- structure(\n      list(\n        cor = cormat,\n        cor_lower = cormat_lower,\n        cor_upper = cormat_upper,\n        sig_cor = sig_cormat,\n        cov = covmat,\n        prec = precmat,\n        prec_lower = precmat_lower,\n        prec_upper = precmat_upper,\n        sig_prec = sig_precmat,\n        trace = final_trace\n      ),\n      class = 'mvgam_residcor'\n    )\n  }\n  return(out)\n}\n"
  },
  {
    "path": "R/residuals.mvgam.R",
    "content": "#' Posterior draws of residuals from \\pkg{mvgam} models\n#'\n#' This method extracts posterior draws of Dunn-Smyth (randomized quantile)\n#' residuals in the order in which the data were supplied to the model. It\n#' includes additional arguments for obtaining summaries of the computed\n#' residuals.\n#'\n#' @inheritParams brms::residuals.brmsfit\n#'\n#' @param object An object of class `mvgam`\n#'\n#' @param ... Ignored\n#'\n#' @details This method gives residuals as Dunn-Smyth (randomized quantile)\n#'   residuals. Any observations that were missing (i.e. `NA`) in the original\n#'   data will have missing values in the residuals.\n#'\n#' @return An \\code{array} of randomized quantile residual values.\n#'\n#'   If \\code{summary = FALSE} the output resembles those of\n#'   \\code{\\link{posterior_epred.mvgam}} and \\code{\\link{predict.mvgam}}.\n#'\n#'   If \\code{summary = TRUE} the output is an \\code{n_observations} x \\code{E}\n#'   matrix. The number of summary statistics \\code{E} is equal to \\code{2 +\n#'   length(probs)}. The \\code{Estimate} column contains point estimates (either\n#'   mean or median depending on argument \\code{robust}), while the\n#'   \\code{Est.Error} column contains uncertainty estimates (either standard\n#'   deviation or median absolute deviation depending on argument\n#'   \\code{robust}). The remaining columns starting with \\code{Q} contain\n#'   quantile estimates as specified via argument \\code{probs}.\n#'\n#' @seealso\n#'   \\code{\\link{augment.mvgam}}\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data and fit a model\n#' simdat <- sim_mvgam(n_series = 1, trend_model = AR())\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract posterior residuals\n#' resids <- residuals(mod)\n#' str(resids)\n#'\n#' # Or add them directly to the observed data, along with fitted values\n#' augment(mod, robust = FALSE, probs = c(0.25, 0.75))\n#' }\n#'\n#' @export\nresiduals.mvgam <- function(\n  object,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n) {\n  if (length(probs) != 2L) {\n    stop(\"argument 'probs' must be a vector of length 2\", call. = FALSE)\n  }\n  validate_proportional(min(probs))\n  validate_proportional(max(probs))\n\n  # What was the original time / series order?\n  orig_order <- data.frame(\n    series = object$obs_data$series,\n    time = object$obs_data$index..time..index\n  )\n\n  series_numeric <- as.numeric(orig_order$series)\n  time_numeric <- match(orig_order$time, unique(orig_order$time))\n\n  # Build a matrix to return residuals in this order\n  resid_matrix <- matrix(\n    NA,\n    nrow = NROW(orig_order),\n    ncol = NROW(object$resids[[1]])\n  )\n  for (i in 1:NROW(resid_matrix)) {\n    resid_matrix[i, ] <- object$resids[[series_numeric[i]]][, time_numeric[i]]\n  }\n\n  if (summary) {\n    Qupper <- apply(resid_matrix, 1, quantile, probs = max(probs), na.rm = TRUE)\n    Qlower <- apply(resid_matrix, 1, quantile, probs = min(probs), na.rm = TRUE)\n\n    if (robust) {\n      estimates <- apply(resid_matrix, 1, median, na.rm = TRUE)\n      errors <- apply(abs(resid_matrix - estimates), 1, median, na.rm = TRUE)\n    } else {\n      estimates <- apply(resid_matrix, 1, mean, na.rm = TRUE)\n      errors <- apply(resid_matrix, 1, sd, na.rm = TRUE)\n    }\n\n    out <- cbind(estimates, errors, Qlower, Qupper)\n    colnames(out) <- c(\n      'Estimate',\n      'Est.Error',\n      paste0('Q', 100 * min(probs)),\n      paste0('Q', 100 * max(probs))\n    )\n  } else {\n    out <- resid_matrix\n  }\n\n  return(out)\n}\n"
  },
  {
    "path": "R/sanitise_modelfile.R",
    "content": "#' Clean up a stan file\n#' @noRd\nsanitise_modelfile = function(model_file) {\n  # Remove empty lines\n  clean_up <- vector()\n  for (x in 1:length(model_file)) {\n    clean_up[x] <- trimws(model_file[x]) == \"\" |\n      trimws(model_file[x]) == \"NA\"\n  }\n  clean_up[is.na(clean_up)] <- FALSE\n  model_file <- model_file[!clean_up]\n\n  # Expand on backslashes to make model more readable\n  hashes <- vector()\n  hashes[1] <- FALSE\n  for (x in 2:length(model_file)) {\n    hashes[x] <- grepl('//', model_file[x], fixed = TRUE) &\n      trimws(model_file[x - 1]) != \"\" &\n      (!grepl('{', model_file[x - 1], fixed = TRUE) |\n        grepl('}', model_file[x - 1], fixed = TRUE)) &\n      !grepl(';', model_file[x], fixed = TRUE)\n  }\n\n  if (any(hashes)) {\n    model_file[hashes] <- paste0('\\n', model_file[hashes])\n  }\n  model_file <- readLines(textConnection(model_file), n = -1)\n  return(model_file)\n}\n"
  },
  {
    "path": "R/score.mvgam_forecast.R",
    "content": "#' @title Compute probabilistic forecast scores for \\pkg{mvgam} models\n#'\n#' @param object `mvgam_forecast` object. See [forecast.mvgam()]. If the test\n#'   data supplied to \\code{forecast.mvgam} contained out of sample test\n#'   observations, the calibration of probabilistic forecasts can be scored\n#'   using proper scoring rules\n#'\n#' @param ... Ignored\n#'\n#' @param score \\code{character} specifying the type of proper scoring rule\n#'   to use for evaluation. Options are: `sis` (i.e. the Scaled Interval\n#'   Score), `energy`, `variogram`, `elpd` (i.e. the Expected log pointwise\n#'   Predictive Density), `drps` (i.e. the Discrete Rank Probability Score),\n#'   `crps` (the Continuous Rank Probability Score) or `brier` (the latter\n#'   of which is only applicable for `bernoulli` models. Note that when\n#'   choosing `elpd`, the supplied object must have forecasts on the `link`\n#'   scale so that expectations can be calculated prior to scoring. If\n#'   choosing `brier`, the object must have forecasts on the `expected` scale\n#'   (i.e. probability predictions). For all other scores, forecasts should\n#'   be supplied on the `response` scale (i.e. posterior predictions)\n#'\n#' @param log \\code{logical}. Should the forecasts and truths be logged\n#'   prior to scoring? This is often appropriate for comparing performance\n#'   of models when series vary in their observation ranges. Ignored if\n#'   `score = 'brier'`\n#'\n#' @param weights optional \\code{vector} of weights (where\n#'   \\code{length(weights) == n_series}) for weighting pairwise correlations\n#'   when evaluating the variogram score for multivariate forecasts. Useful\n#'   for down-weighting series that have larger magnitude observations or\n#'   that are of less interest when forecasting. Ignored if\n#'   \\code{score != 'variogram'}\n#'\n#' @param interval_width proportional value on `[0.05,0.95]` defining the\n#'   forecast interval for calculating coverage and, if `score = 'sis'`, for\n#'   calculating the interval score. Ignored if `score = 'brier'`\n#'\n#' @param n_cores \\code{integer} specifying number of cores for calculating\n#'   scores in parallel\n#'\n#' @return A \\code{list} containing scores and interval coverages per\n#'   forecast horizon. If \\code{score %in% c('drps', 'crps', 'elpd', 'brier')},\n#'   the list will also contain return the sum of all series-level scores\n#'   per horizon. If \\code{score %in% c('energy','variogram')}, no\n#'   series-level scores are computed and the only score returned will be\n#'   for all series. For all scores apart from `elpd` and `brier`, the\n#'   `in_interval` column in each series-level slot is a binary indicator of\n#'   whether or not the true value was within the forecast's corresponding\n#'   posterior empirical quantiles. Intervals are not calculated when using\n#'   `elpd` because forecasts will only contain the linear predictors\n#'\n#' @author Nicholas J Clark\n#'\n#' @method score mvgam_forecast\n#'\n#' @references Gneiting, T. and Raftery, A. E. (2007). Strictly Proper\n#'   Scoring Rules, Prediction, and Estimation. \\emph{Journal of the American\n#'   Statistical Association}, 102(477), 359-378.\n#'   \\doi{10.1198/016214506000001437}\n#'\n#' @seealso \\code{\\link{forecast.mvgam}}, \\code{\\link{ensemble}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate observations for three count-valued time series\n#' data <- sim_mvgam()\n#'\n#' # Fit a dynamic model using 'newdata' to automatically produce forecasts\n#' mod <- mvgam(\n#'   y ~ 1,\n#'   trend_model = RW(),\n#'   data = data$data_train,\n#'   newdata = data$data_test,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract forecasts into a 'mvgam_forecast' object\n#' fc <- forecast(mod)\n#' plot(fc)\n#'\n#' # Compute Discrete Rank Probability Scores and 0.90 interval coverages\n#' fc_scores <- score(fc, score = 'drps')\n#' str(fc_scores)\n#'\n#' # An example using binary data\n#' data <- sim_mvgam(family = bernoulli())\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc', k = 6),\n#'   trend_model = AR(),\n#'   data = data$data_train,\n#'   newdata = data$data_test,\n#'   family = bernoulli(),\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Extract forecasts on the expectation (probability) scale\n#' fc <- forecast(mod, type = 'expected')\n#' plot(fc)\n#'\n#' # Compute Brier scores\n#' fc_scores <- score(fc, score = 'brier')\n#' str(fc_scores)\n#' }\n#'\n#' @export\nscore.mvgam_forecast = function(\n  object,\n  score = 'crps',\n  log = FALSE,\n  weights,\n  interval_width = 0.9,\n  n_cores = 1,\n  ...\n) {\n  score <- match.arg(\n    arg = score,\n    choices = c('crps', 'drps', 'brier', 'elpd', 'sis', 'energy', 'variogram')\n  )\n\n  if (object$type == 'trend') {\n    stop(\n      'cannot evaluate accuracy of latent trend forecasts. Use \"type == response\" when forecasting instead',\n      call. = FALSE\n    )\n  }\n\n  if (object$type != 'link' & score == 'elpd') {\n    stop(\n      'cannot evaluate elpd scores unless linear predictors are supplied. Use \"type == link\" when forecasting instead',\n      call. = FALSE\n    )\n  }\n\n  if (object$type != 'expected' & score == 'brier') {\n    stop(\n      'cannot evaluate brier scores unless probability predictions are supplied. Use \"type == expected\" when forecasting instead',\n      call. = FALSE\n    )\n  }\n\n  validate_pos_integer(n_cores)\n  validate_proportional(interval_width)\n  if (interval_width < 0.05 || interval_width > 0.95) {\n    stop('interval width must be between 0.05 and 0.95, inclusive')\n  }\n\n  # Get truths (out of sample) into correct format\n  n_series <- length(object$series_names)\n  truths <- do.call(\n    rbind,\n    lapply(seq_len(n_series), function(series) {\n      object$test_observations[[series]]\n    })\n  )\n\n  if (score == 'elpd') {\n    # Get linear predictor forecasts into the correct format\n    linpreds <- do.call(cbind, object$forecasts)\n\n    # Build a dataframe for indexing which series each observation belongs to\n    newdata <- data.frame(\n      series = factor(\n        sort(rep(object$series_names, NCOL(object$forecasts[[1]]))),\n        levels = levels(object$series_names)\n      ),\n      y = unname(unlist(object$test_observations))\n    )\n\n    class(object) <- c('mvgam', class(object))\n\n    # Calculate log-likelihoods\n    elpd_score <- logLik(\n      object = object,\n      linpreds = linpreds,\n      newdata = newdata,\n      family_pars = object$family_pars,\n      n_cores = n_cores\n    )\n    elpd_score <- apply(elpd_score, 2, log_mean_exp)\n\n    # Construct series-level score dataframes\n    series_score <- lapply(seq_len(n_series), function(series) {\n      DRPS <- data.frame(drps_mcmc_object(\n        truths[series, ],\n        object$forecasts[[series]],\n        log = log,\n        interval_width = interval_width\n      ))\n      data.frame(\n        score = elpd_score[which(\n          newdata$series == levels(object$series_names)[series]\n        )],\n        eval_horizon = seq(1, NCOL(object$forecasts[[1]])),\n        score_type = 'elpd'\n      )\n    })\n    names(series_score) <- object$series_names\n    all_scores <- data.frame(\n      score = rowSums(do.call(\n        cbind,\n        lapply(seq_len(n_series), function(series) {\n          series_score[[series]]$score\n        })\n      )),\n      eval_horizon = seq(1, NCOL(object$forecasts[[1]])),\n      score_type = 'sum_elpd'\n    )\n    series_score$all_series <- all_scores\n  }\n\n  if (score %in% c('energy', 'variogram')) {\n    if (missing(weights)) {\n      weights <- rep(1, length(object$series_names))\n    }\n\n    # Calculate coverage using one of the univariate scores\n    series_score <- lapply(seq_len(n_series), function(series) {\n      DRPS <- data.frame(drps_mcmc_object(\n        truths[series, ],\n        object$forecasts[[series]],\n        log = log,\n        interval_width = interval_width\n      ))\n      colnames(DRPS) <- c('score', 'in_interval')\n      DRPS$interval_width <- interval_width\n      DRPS$eval_horizon <- seq(1, NCOL(object$forecasts[[1]]))\n      DRPS[, 2:4]\n    })\n    names(series_score) <- object$series_names\n\n    if (score == 'variogram') {\n      var_score <- variogram_mcmc_object(\n        truths = truths,\n        fcs = object$forecasts,\n        log = log,\n        weights = weights\n      )\n      series_score$all_series <- data.frame(\n        score = var_score,\n        eval_horizon = 1:NCOL(object$forecasts[[1]]),\n        score_type = 'variogram'\n      )\n    }\n\n    if (score == 'energy') {\n      en_score <- energy_mcmc_object(\n        truths = truths,\n        fcs = object$forecasts,\n        log = log\n      )\n      series_score$all_series <- data.frame(\n        score = en_score,\n        eval_horizon = 1:NCOL(object$forecasts[[1]]),\n        score_type = 'energy'\n      )\n    }\n  }\n\n  if (score == 'sis') {\n    series_score <- lapply(seq_len(n_series), function(series) {\n      SIS <- data.frame(sis_mcmc_object(\n        truths[series, ],\n        object$forecasts[[series]],\n        log = log,\n        interval_width = interval_width\n      ))\n      colnames(SIS) <- c('score', 'in_interval')\n      SIS$interval_width <- interval_width\n      SIS$eval_horizon <- seq(1, NCOL(object$forecasts[[1]]))\n      SIS$score_type <- 'sis'\n      SIS\n    })\n    names(series_score) <- object$series_names\n    all_scores <- data.frame(\n      score = rowSums(do.call(\n        cbind,\n        lapply(seq_len(n_series), function(series) {\n          series_score[[series]]$score\n        })\n      )),\n      eval_horizon = seq(1, NCOL(object$forecasts[[1]])),\n      score_type = 'sum_sis'\n    )\n    series_score$all_series <- all_scores\n  }\n\n  if (score == 'drps') {\n    series_score <- lapply(seq_len(n_series), function(series) {\n      DRPS <- data.frame(drps_mcmc_object(\n        truths[series, ],\n        object$forecasts[[series]],\n        log = log,\n        interval_width = interval_width\n      ))\n      colnames(DRPS) <- c('score', 'in_interval')\n      DRPS$interval_width <- interval_width\n      DRPS$eval_horizon <- seq(1, NCOL(object$forecasts[[1]]))\n      DRPS$score_type <- 'drps'\n      DRPS\n    })\n    names(series_score) <- object$series_names\n    all_scores <- data.frame(\n      score = rowSums(do.call(\n        cbind,\n        lapply(seq_len(n_series), function(series) {\n          series_score[[series]]$score\n        })\n      )),\n      eval_horizon = seq(1, NCOL(object$forecasts[[1]])),\n      score_type = 'sum_drps'\n    )\n    series_score$all_series <- all_scores\n  }\n\n  if (score == 'crps') {\n    series_score <- lapply(seq_len(n_series), function(series) {\n      CRPS <- data.frame(crps_mcmc_object(\n        truths[series, ],\n        object$forecasts[[series]],\n        log = log,\n        interval_width = interval_width\n      ))\n      colnames(CRPS) <- c('score', 'in_interval')\n      CRPS$interval_width <- interval_width\n      CRPS$eval_horizon <- seq(1, NCOL(object$forecasts[[1]]))\n      CRPS$score_type <- 'crps'\n      CRPS\n    })\n    names(series_score) <- object$series_names\n    all_scores <- data.frame(\n      score = rowSums(do.call(\n        cbind,\n        lapply(seq_len(n_series), function(series) {\n          series_score[[series]]$score\n        })\n      )),\n      eval_horizon = seq(1, NCOL(object$forecasts[[1]])),\n      score_type = 'sum_crps'\n    )\n    series_score$all_series <- all_scores\n  }\n\n  if (score == 'brier') {\n    if (object$family != 'bernoulli') {\n      stop('brier score only applicable for Bernoulli forecasts', call. = FALSE)\n    }\n    series_score <- lapply(seq_len(n_series), function(series) {\n      BRIER <- data.frame(brier_mcmc_object(\n        truths[series, ],\n        object$forecasts[[series]],\n        log = log\n      ))\n      colnames(BRIER) <- c('score', 'in_interval')\n      BRIER$interval_width <- interval_width\n      BRIER$eval_horizon <- seq(1, NCOL(object$forecasts[[1]]))\n      BRIER$score_type <- 'brier'\n      BRIER\n    })\n    names(series_score) <- object$series_names\n    all_scores <- data.frame(\n      score = rowSums(do.call(\n        cbind,\n        lapply(seq_len(n_series), function(series) {\n          series_score[[series]]$score\n        })\n      )),\n      eval_horizon = seq(1, NCOL(object$forecasts[[1]])),\n      score_type = 'sum_brier'\n    )\n    series_score$all_series <- all_scores\n  }\n\n  series_score\n}\n\n#'@name score.mvgam_forecast\n#'@param object `mvgam_forecast` object. See [forecast.mvgam()].\n#'@param ... Ignored\n#'@export\nscore = function(object, ...) {\n  UseMethod(\"score\", object)\n}\n"
  },
  {
    "path": "R/series_to_mvgam.R",
    "content": "#' Convert timeseries object to format necessary for \\pkg{mvgam} models\n#'\n#' This function converts univariate or multivariate time series (\\code{xts} or\n#' \\code{ts} objects) to the format necessary for \\code{\\link{mvgam}}.\n#'\n#' @importFrom stats is.ts ts start time frequency\n#'\n#' @importFrom utils head\n#'\n#' @param series \\code{\\link[xts]{xts}} or \\code{\\link[stats]{ts}} object to be\n#'   converted to \\code{\\link{mvgam}} format\n#'\n#' @param freq \\code{integer}. The seasonal frequency of the series\n#'\n#' @param train_prop \\code{numeric} stating the proportion of data to use for\n#'   training. Should be between \\code{0.25} and \\code{0.95}\n#'\n#' @return A \\code{list} object containing outputs needed for\n#'   \\code{\\link{mvgam}}, including 'data_train' and 'data_test'\n#'\n#' @examples\n#' # A ts object example\n#' data(\"sunspots\")\n#' series <- cbind(sunspots, sunspots)\n#' colnames(series) <- c('blood', 'bone')\n#' head(series)\n#' series_to_mvgam(series, frequency(series), 0.85)\n#'\n#' # An xts object example\n#' library(xts)\n#' dates <- seq(as.Date(\"2001-05-01\"), length = 30, by = \"quarter\")\n#'\n#' data <- cbind(\n#'   c(gas = rpois(30, cumprod(1 + rnorm(30, mean = 0.01, sd = 0.001)))),\n#'   c(oil = rpois(30, cumprod(1 + rnorm(30, mean = 0.01, sd = 0.001))))\n#' )\n#'\n#' series <- xts(x = data, order.by = dates)\n#' colnames(series) <- c('gas', 'oil')\n#' head(series)\n#' series_to_mvgam(series, freq = 4, train_prop = 0.85)\n#'\n#' @export\nseries_to_mvgam <- function(series, freq, train_prop = 0.85) {\n  # Check for xts and lubridate packages\n  insight::check_if_installed(\"xts\")\n  insight::check_if_installed(\"lubridate\")\n\n  # Check series format\n  type <- 'wrong'\n  if (is.ts(series)) {\n    type <- 'ts'\n  }\n\n  if (xts::is.xts(series)) {\n    type <- 'xts'\n  }\n\n  if (type == 'wrong') {\n    stop(\"series must be either a ts or xts object\")\n  }\n\n  # Extract information on years and seasons from the series object\n  if (type == 'ts') {\n    dates <- lubridate::date_decimal(as.numeric(time(series)))\n    years <- lubridate::year(dates)\n    seasons <- as.vector(1 + ((time(series) %% 1) * frequency(series)))\n  }\n\n  # Function to convert xts to ts object\n  xts.to.ts <- function(x, freq = 52) {\n    start_time <- head(\n      1 +\n        (round(\n          (lubridate::yday(lubridate::date(time(series))) / 365) *\n            freq,\n          0\n        )),\n      1\n    )\n    ts(\n      as.numeric(x),\n      start = c(lubridate::year(start(x)), start_time),\n      frequency = freq\n    )\n  }\n\n  if (type == 'xts') {\n    dates <- lubridate::date(time(series))\n    years <- lubridate::year(time(series))\n    seasons <- as.vector(\n      1 +\n        ((time(xts.to.ts(series[, 1], freq = freq)) %% 1) *\n          freq)\n    )\n  }\n\n  # Extract remaining information and put into correct format\n  n_series <- NCOL(series)\n  T <- NROW(series)\n  series_names <- factor(colnames(series), levels = colnames(series))\n  if (length(levels(series_names)) == 0) {\n    series_names <- factor(\n      paste0('series_', seq(1, n_series)),\n      levels = paste0('series_', seq(1, n_series))\n    )\n  }\n\n  mvgam_data = data.frame(\n    y = as.vector(series),\n    season = rep(seasons, n_series),\n    year = rep(years, n_series),\n    date = rep(dates, n_series),\n    series = as.factor(sort(rep(series_names, T)))\n  ) %>%\n    dplyr::arrange(year, season, series)\n\n  mvgam_data %>%\n    dplyr::left_join(\n      mvgam_data %>%\n        dplyr::select(year, season) %>%\n        dplyr::distinct() %>%\n        dplyr::arrange(year, season) %>%\n        dplyr::mutate(time = dplyr::row_number()),\n      by = c('season', 'year')\n    ) -> mvgam_data\n\n  # Split into training and testing and return\n  last_time <- floor(max(mvgam_data$time) * train_prop)\n\n  return(list(\n    data_train = mvgam_data %>%\n      dplyr::filter(time <= last_time),\n    data_test = mvgam_data %>%\n      dplyr::filter(time > last_time)\n  ))\n}\n"
  },
  {
    "path": "R/shared_obs_params.R",
    "content": "#' Updates for allowing shared observation params across series\n#' @noRd\nshared_obs_params = function(model_file, family) {\n  if (family == 'poisson') {\n    message(\n      'Context share_obs_params: Poisson family has no additional observation params'\n    )\n    model_file <- model_file\n  }\n\n  if (family == 'nmix') {\n    message(\n      'Context share_obs_params: nmix family has no additional observation params'\n    )\n    model_file <- model_file\n  }\n\n  if (family %in% c('student', 'gaussian', 'lognormal')) {\n    model_file[grep(\n      \"vector<lower=0>[n_series] sigma_obs;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"real<lower=0> sigma_obs;\"\n\n    model_file <- model_file[\n      -grep(\n        \"flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];\",\n        model_file,\n        fixed = TRUE\n      )\n    ]\n    model_file <- model_file[\n      -grep(\"vector[n_nonmissing] flat_sigma_obs;\", model_file, fixed = TRUE)\n    ]\n    model_file[grep(\"flat_sigma_obs);\", model_file, fixed = TRUE)] <-\n      'sigma_obs);'\n\n    if (any(grepl(\"flat_sigma_obs,\", model_file, fixed = TRUE))) {\n      model_file[grep(\"flat_sigma_obs,\", model_file, fixed = TRUE)] <-\n        \"sigma_obs,\"\n      model_file[grep(\n        \"data vector Y, matrix X, vector b, vector sigma_obs, real alpha) {\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"data vector Y, matrix X, vector b, real sigma_obs, real alpha) {\"\n      model_file[grep(\n        \"ptarget += normal_id_glm_lpdf(Y[start:end] | X[start:end], alpha, b, sigma_obs[start:end]);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"ptarget += normal_id_glm_lpdf(Y[start:end] | X[start:end], alpha, b, sigma_obs);\"\n    }\n\n    model_file[grep(\n      \"sigma_obs_vec[1:n,s] = rep_vector(sigma_obs[s], n);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"sigma_obs_vec[1:n,s] = rep_vector(sigma_obs, n);\"\n  }\n\n  if (family == 'student') {\n    model_file[grep(\n      \"vector<lower=0>[n_series] nu;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"real<lower=0> nu;\"\n\n    model_file <- model_file[\n      -grep(\"flat_nu = rep_each(nu, n)[obs_ind];\", model_file, fixed = TRUE)\n    ]\n    model_file <- model_file[\n      -grep(\"vector[n_nonmissing] flat_nu;\", model_file, fixed = TRUE)\n    ]\n    model_file[grep(\n      \"flat_ys ~ student_t(flat_nu,\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"flat_ys ~ student_t(nu,\"\n\n    model_file[grep(\n      \"nu_vec[1:n,s] = rep_vector(nu[s], n);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"nu_vec[1:n,s] = rep_vector(nu, n);\"\n  }\n\n  if (family == 'negative binomial') {\n    model_file[grep(\n      'vector<lower=0>[n_series] phi_inv;',\n      model_file,\n      fixed = TRUE\n    )] <-\n      'real<lower=0> phi_inv;'\n\n    model_file <- model_file[\n      -grep(\n        'flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]);',\n        model_file,\n        fixed = TRUE\n      )\n    ]\n    model_file <- model_file[\n      -grep(\"real flat_phis[n_nonmissing];\", model_file, fixed = TRUE)\n    ]\n\n    model_file[grep(\"inv(flat_phis));\", model_file, fixed = TRUE)] <-\n      'inv(phi_inv));'\n\n    model_file[grep(\"phi = inv(phi_inv);\", model_file, fixed = TRUE)] <-\n      \"phi = rep_vector(inv(phi_inv), n_series);\"\n  }\n\n  if (family == 'beta') {\n    model_file[grep(\n      'vector<lower=0>[n_series] phi;',\n      model_file,\n      fixed = TRUE\n    )] <-\n      'real<lower=0> phi;'\n\n    model_file <- model_file[\n      -grep('flat_phis = rep_each(phi, n)[obs_ind];', model_file, fixed = TRUE)\n    ]\n    model_file <- model_file[\n      -grep(\"vector[n_nonmissing] flat_phis;\", model_file, fixed = TRUE)\n    ]\n\n    model_file[grep(\n      \"inv_logit(flat_xs * b) .* flat_phis,\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"inv_logit(flat_xs * b) .* phi,\"\n    model_file[grep(\n      \"(1 - inv_logit(flat_xs * b)) .* flat_phis);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"(1 - inv_logit(flat_xs * b)) .* phi);\"\n\n    model_file[grep(\n      \"inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0)) .* flat_phis,\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0)) .* phi,\"\n    model_file[grep(\n      \"(1 - inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0))) .* flat_phis);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"(1 - inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0))) .* phi);\"\n\n    model_file[grep(\n      \"phi_vec[1:n,s] = rep_vector(phi[s], n);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"phi_vec[1:n,s] = rep_vector(phi, n);\"\n  }\n\n  if (family == 'Gamma') {\n    model_file[grep(\n      \"vector<lower=0>[n_series] shape;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"real<lower=0> shape;\"\n\n    model_file <- model_file[\n      -grep(\n        \"flat_shapes = rep_each(shape, n)[obs_ind];\",\n        model_file,\n        fixed = TRUE\n      )\n    ]\n    model_file <- model_file[\n      -grep(\"vector[n_nonmissing] flat_shapes;\", model_file, fixed = TRUE)\n    ]\n\n    model_file[grep(\n      \"flat_shapes, flat_shapes ./ exp(flat_xs * b));\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"shape, shape ./ exp(flat_xs * b));\"\n\n    model_file[grep(\n      \"flat_shapes, flat_shapes ./ exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0)));\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"shape, shape ./ exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0)));\"\n\n    model_file[grep(\n      \"shape_vec[1:n,s] = rep_vector(shape[s], n);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"shape_vec[1:n,s] = rep_vector(shape, n);\"\n  }\n\n  return(model_file)\n}\n"
  },
  {
    "path": "R/sim_mvgam.R",
    "content": "#' Simulate a set of time series for modelling in \\pkg{mvgam}\n#'\n#' This function simulates sets of time series data for fitting a\n#' multivariate GAM that includes shared seasonality and dependence on\n#' State-Space latent dynamic factors. Random dependencies among series,\n#' i.e. correlations in their long-term trends, are included in the form of\n#' correlated loadings on the latent dynamic factors\n#'\n#' @importFrom stats rnorm rbeta rpois rlnorm rgamma cor cov2cor cov ts\n#' @importFrom brms lognormal\n#'\n#' @param T \\code{integer}. Number of observations (timepoints)\n#'\n#' @param n_series \\code{integer}. Number of discrete time series\n#'\n#' @param seasonality \\code{character}. Either \\code{shared}, meaning that\n#'   all series share the exact same seasonal pattern, or\n#'   \\code{hierarchical}, meaning that there is a global seasonality but\n#'   each series' pattern can deviate slightly\n#'\n#' @param use_lv \\code{logical}. If \\code{TRUE}, use dynamic factors to\n#'   estimate series' latent trends in a reduced dimension format. If\n#'   \\code{FALSE}, estimate independent latent trends for each series\n#'\n#' @param n_lv \\code{integer}. Number of latent dynamic factors for\n#'   generating the series' trends. Defaults to `0`, meaning that dynamics\n#'   are estimated independently for each series\n#'\n#' @param trend_model \\code{character} specifying the time series dynamics\n#'   for the latent trend. Options are:\n#'   \\itemize{\n#'     \\item `None` (no latent trend component; i.e. the GAM component is\n#'     all that contributes to the linear predictor, and the observation\n#'     process is the only source of error; similarly to what is estimated\n#'     by \\code{\\link[mgcv]{gam}})\n#'     \\item `RW` (random walk with possible drift)\n#'     \\item `AR1` (with possible drift)\n#'     \\item `AR2` (with possible drift)\n#'     \\item `AR3` (with possible drift)\n#'     \\item `VAR1` (contemporaneously uncorrelated VAR1)\n#'     \\item `VAR1cor` (contemporaneously correlated VAR1)\n#'     \\item `GP` (Gaussian Process with squared exponential kernel)\n#'   }\n#'   See [mvgam_trends] for more details\n#'\n#' @param drift \\code{logical}, simulate a drift term for each trend\n#'\n#' @param prop_trend \\code{numeric}. Relative importance of the trend for\n#'   each series. Should be between \\code{0} and \\code{1}\n#'\n#' @param trend_rel Deprecated. Use `prop_trend` instead\n#'\n#' @param freq \\code{integer}. The seasonal frequency of the series\n#'\n#' @param family \\code{family} specifying the exponential observation\n#'   family for the series. Currently supported families are: `nb()`,\n#'   `poisson()`, `bernoulli()`, `tweedie()`, `gaussian()`, `betar()`,\n#'   `lognormal()`, `student()` and `Gamma()`\n#'\n#' @param phi \\code{vector} of dispersion parameters for the series\n#'   (i.e. `size` for `nb()` or `phi` for `betar()`). If\n#'   \\code{length(phi) < n_series}, the first element of `phi` will be\n#'   replicated `n_series` times. Defaults to \\code{5} for `nb()` and\n#'   `tweedie()`; \\code{10} for `betar()`\n#'\n#' @param shape \\code{vector} of shape parameters for the series\n#'   (i.e. `shape` for `gamma()`). If \\code{length(shape) < n_series},\n#'   the first element of `shape` will be replicated `n_series` times.\n#'   Defaults to \\code{10}\n#'\n#' @param sigma \\code{vector} of scale parameters for the series\n#'   (i.e. `sd` for `gaussian()` or `student()`, `log(sd)` for\n#'   `lognormal()`). If \\code{length(sigma) < n_series}, the first element\n#'   of `sigma` will be replicated `n_series` times. Defaults to\n#'   \\code{0.5} for `gaussian()` and `student()`; \\code{0.2} for\n#'   `lognormal()`\n#'\n#' @param nu \\code{vector} of degrees of freedom parameters for the series\n#'   (i.e. `nu` for `student()`). If \\code{length(nu) < n_series}, the\n#'   first element of `nu` will be replicated `n_series` times. Defaults\n#'   to \\code{3}\n#'\n#' @param mu \\code{vector} of location parameters for the series. If\n#'   \\code{length(mu) < n_series}, the first element of `mu` will be\n#'   replicated `n_series` times. Defaults to small random values between\n#'   `-0.5` and `0.5` on the link scale\n#'\n#' @param prop_missing \\code{numeric} stating proportion of observations\n#'   that are missing. Should be between \\code{0} and \\code{0.8}, inclusive\n#'\n#' @param prop_train \\code{numeric} stating the proportion of data to use\n#'   for training. Should be between \\code{0.2} and \\code{1}\n#'\n#' @return A \\code{list} object containing outputs needed for\n#'   \\code{\\link{mvgam}}, including 'data_train' and 'data_test', as well\n#'   as some additional information about the simulated seasonality and\n#'   trend dependencies\n#'\n#' @references Clark, N. J. and Wells, K. (2022). Dynamic generalised\n#'   additive models (DGAMs) for forecasting discrete ecological time\n#'   series. \\emph{Methods in Ecology and Evolution}, 13(11), 2388-2404.\n#'   \\doi{10.1111/2041-210X.13974}\n#'\n#' @examples\n#' # Simulate series with observations bounded at 0 and 1 (Beta responses)\n#' sim_data <- sim_mvgam(\n#'   family = betar(),\n#'   trend_model = RW(),\n#'   prop_trend = 0.6\n#' )\n#' plot_mvgam_series(data = sim_data$data_train, series = 'all')\n#'\n#' # Now simulate series with overdispersed discrete observations\n#' sim_data <- sim_mvgam(\n#'   family = nb(),\n#'   trend_model = RW(),\n#'   prop_trend = 0.6,\n#'   phi = 10\n#' )\n#' plot_mvgam_series(data = sim_data$data_train, series = 'all')\n#'\n#' @export\nsim_mvgam = function(\n  T = 100,\n  n_series = 3,\n  seasonality = 'shared',\n  use_lv = FALSE,\n  n_lv = 0,\n  trend_model = RW(),\n  drift = FALSE,\n  prop_trend = 0.2,\n  trend_rel,\n  freq = 12,\n  family = poisson(),\n  phi,\n  shape,\n  sigma,\n  nu,\n  mu,\n  prop_missing = 0,\n  prop_train = 0.85\n) {\n  # Validate the family argument\n  family <- validate_family(family)\n  family_char <- match.arg(\n    arg = family$family,\n    choices = c(\n      'negative binomial',\n      \"poisson\",\n      \"bernoulli\",\n      \"tweedie\",\n      \"beta\",\n      \"gaussian\",\n      \"lognormal\",\n      \"student\",\n      \"Gamma\"\n    )\n  )\n\n  # Validate the trend arguments\n  trend_model <- validate_trend_model(trend_model, drift = drift, warn = FALSE)\n  if (trend_model %in% c('VAR1', 'VAR1cor')) {\n    use_lv <- FALSE\n  }\n\n  if (trend_model %in% c('RWcor', 'AR1cor', 'AR2cor', 'AR3cor')) {\n    warning(paste0(\n      'Simulation of correlated AR or RW trends not yet supported.\\n',\n      'Reverting to uncorrelated trends'\n    ))\n  }\n\n  if (missing(trend_rel)) {\n    trend_rel <- prop_trend\n  }\n  validate_proportional(trend_rel)\n\n  # Check n_series\n  validate_pos_integer(n_series)\n\n  # Check prop_missing\n  validate_proportional(prop_missing)\n\n  # Check n_lv\n  if (n_lv == 0) {\n    use_lv <- FALSE\n    n_lv <- n_series\n  } else {\n    validate_pos_integer(n_lv)\n    use_lv <- TRUE\n  }\n\n  if (use_lv) {\n    if (n_lv > n_series) {\n      warning(\n        'Argument \"n_lv\" cannot be greater than n_series; changing n_lv to match n_series'\n      )\n      n_lv <- n_series\n    }\n  }\n\n  # Check seasonality\n  if (!seasonality %in% c('shared', 'hierarchical')) {\n    stop('seasonality must be either shared or hierarchical')\n  }\n\n  # Check family-specific parameters\n  if (missing(phi)) {\n    if (family_char == 'beta') {\n      phi <- rep(10, n_series)\n    } else {\n      phi <- rep(5, n_series)\n    }\n  }\n\n  if (any(phi <= 0)) {\n    stop('Argument \"phi\" must be a non-negative real number', call. = FALSE)\n  }\n\n  if (missing(shape)) {\n    shape <- rep(1, n_series)\n  }\n\n  if (any(shape <= 0)) {\n    stop('Argument \"shape\" must be a non-negative real number', call. = FALSE)\n  }\n\n  if (missing(sigma)) {\n    if (family_char == 'lognormal') {\n      sigma <- rep(0.2, n_series)\n    } else {\n      sigma <- rep(0.5, n_series)\n    }\n  }\n\n  if (any(sigma <= 0)) {\n    stop('Argument \"sigma\" must be a non-negative real number', call. = FALSE)\n  }\n\n  if (missing(nu)) {\n    nu <- rep(3, n_series)\n  }\n\n  if (any(nu <= 0)) {\n    stop('Argument \"nu\" must be a non-negative real number', call. = FALSE)\n  }\n\n  if (missing(mu)) {\n    mu <- sample(seq(-0.5, 0.5), n_series, TRUE)\n  }\n\n  if (length(phi) < n_series) {\n    phi <- rep(phi[1], n_series)\n  }\n\n  if (length(shape) < n_series) {\n    shape <- rep(shape[1], n_series)\n  }\n\n  if (length(sigma) < n_series) {\n    sigma <- rep(sigma[1], n_series)\n  }\n\n  if (length(nu) < n_series) {\n    nu <- rep(nu[1], n_series)\n  }\n\n  if (length(mu) < n_series) {\n    mu <- rep(mu[1], n_series)\n  }\n\n  # Check data splitting\n  if (missing(prop_train)) {\n    prop_train <- 0.75\n  }\n  if (prop_train < 0.2 || prop_train > 1) {\n    stop(\n      'Argument \"prop_train\" must be a proportion ranging from 0.2 to 1, inclusive',\n      call. = FALSE\n    )\n  }\n\n  # Set trend parameters\n  if (trend_model %in% c('RW', 'RWcor')) {\n    ar1s <- rep(1, n_lv)\n    ar2s <- rep(0, n_lv)\n    ar3s <- rep(0, n_lv)\n  }\n\n  if (trend_model %in% c('AR1', 'AR1cor')) {\n    ar1s <- rnorm(n_lv, sd = 0.5)\n    ar2s <- rep(0, n_lv)\n    ar3s <- rep(0, n_lv)\n  }\n\n  if (trend_model %in% c('AR2', 'AR2cor')) {\n    ar1s <- rnorm(n_lv, sd = 0.5)\n    ar2s <- rnorm(n_lv, sd = 0.5)\n    ar3s <- rep(0, n_lv)\n  }\n\n  if (trend_model %in% c('AR3', 'AR3cor')) {\n    ar1s <- rnorm(n_lv, sd = 0.5)\n    ar2s <- rnorm(n_lv, sd = 0.5)\n    ar3s <- rnorm(n_lv, sd = 0.5)\n  }\n\n  if (trend_model %in% c('RW', 'AR1', 'AR2', 'AR3', 'VAR1', 'VAR1cor')) {\n    # Sample trend drift terms so they are (hopefully) not too correlated\n    if (drift) {\n      trend_alphas <- rnorm(n_lv, sd = 0.5)\n    } else {\n      trend_alphas <- rep(0, n_lv)\n    }\n\n    # Simulate latent trends\n    if (!trend_model %in% c('VAR1', 'VAR1cor')) {\n      trends <- do.call(\n        cbind,\n        lapply(seq_len(n_lv), function(x) {\n          sim_ar3(\n            drift = 0,\n            ar1 = ar1s[x],\n            ar2 = ar2s[x],\n            ar3 = ar3s[x],\n            tau = 1,\n            last_trends = rnorm(3),\n            h = T\n          ) +\n            trend_alphas[x] * 1:T\n        })\n      )\n    }\n\n    if (trend_model %in% c('VAR1', 'VAR1cor')) {\n      if (trend_model == 'VAR1') {\n        # Simulate the Sigma matrix (contemporaneously uncorrelated)\n        Sigma <- matrix(0, n_lv, n_lv)\n        sigma <- runif(n_lv, 0.4, 1.2)\n        diag(Sigma) <- sigma\n      }\n\n      if (trend_model == 'VAR1cor') {\n        # Use the LKJ distribution to sample correlation matrices\n        # with nice properties\n        # Sample trend SD parameters and construct Sigma\n        sigma <- runif(n_lv, 0.4, 1.2)\n        Sigma <- outer(sigma, sigma) * lkj_corr(n_series = n_lv)\n      }\n\n      # Create a stationary VAR coefficient matrix\n      A <- stationary_VAR_phi(p = 1, n_series = n_lv)[[1]]\n\n      # Simulate the VAR trends\n      trends <- sim_var1(\n        drift = trend_alphas,\n        A = A,\n        Sigma = Sigma,\n        last_trends = mvnfast::rmvn(n = 1, mu = rep(0, n_lv), sigma = Sigma),\n        h = T\n      )\n    }\n  }\n\n  if (trend_model == 'GP') {\n    # Sample alpha and rho parameters\n    trend_alphas <- runif(n_lv, 0.75, 1.25)\n    trend_rhos <- runif(n_lv, 3, 8)\n\n    # Generate latent GP trends\n    trends <- do.call(\n      cbind,\n      lapply(seq_len(n_lv), function(lv) {\n        Sigma <- trend_alphas[lv]^2 *\n          exp(-0.5 * ((outer(1:T, 1:T, \"-\") / trend_rhos[lv])^2)) +\n          diag(1e-9, T)\n        mvnfast::rmvn(1, mu = rep(0, T), sigma = Sigma)[1, ]\n      })\n    )\n  }\n\n  if (use_lv) {\n    Sigma <- random_Sigma(n_series)\n    loadings <- as.matrix(matrix(\n      mvnfast::rmvn(n = n_lv, mu = rep(0, n_series), sigma = Sigma),\n      ncol = n_series\n    ))\n  } else {\n    # Else use independent trend loadings\n    loadings <- diag(n_lv)\n  }\n\n  # Simulate the global seasonal pattern\n  glob_season <- periodic_gp(T, period = freq, rho = runif(1, 0.5, 1.2))\n\n  # Simulate observed series as dependent on seasonality and trend\n  obs_trends <- matrix(NA, nrow = T, ncol = n_series)\n  for (s in 1:n_series) {\n    obs_trends[, s] <- as.vector(scale(as.vector(loadings[, s] %*% t(trends))))\n  }\n\n  obs_ys <- c(unlist(lapply(seq_len(n_series), function(x) {\n    if (seasonality == 'shared') {\n      dynamics <- (glob_season * (1 - trend_rel)) +\n        (obs_trends[, x] * trend_rel)\n    } else {\n      yseason <- as.vector(scale(stats::stl(\n        ts(rnorm(T, glob_season, sd = 2), frequency = freq),\n        'periodic'\n      )$time.series[, 1]))\n      dynamics <- (yseason * (1 - trend_rel)) +\n        (obs_trends[, x] * trend_rel)\n    }\n\n    if (family_char == 'negative binomial') {\n      out <- rnbinom(\n        length(dynamics),\n        size = phi[x],\n        mu = exp(mu[x] + dynamics)\n      )\n    }\n\n    if (family_char == 'poisson') {\n      out <- rpois(length(dynamics), lambda = exp(mu[x] + dynamics))\n    }\n\n    if (family_char == 'bernoulli') {\n      out <- rbinom(length(dynamics), size = 1, prob = plogis(mu[x] + dynamics))\n    }\n\n    if (family_char == 'tweedie') {\n      out <- rpois(\n        n = length(dynamics),\n        lambda = tweedie::rtweedie(\n          length(dynamics),\n          mu = exp(mu[x] + dynamics),\n          power = 1.5,\n          phi = phi[x]\n        )\n      )\n    }\n\n    if (family_char == 'gaussian') {\n      out <- rnorm(length(dynamics), mean = mu[x] + dynamics, sd = sigma[x])\n    }\n\n    if (family_char == 'student') {\n      out <- rstudent_t(\n        n = length(dynamics),\n        df = nu[x],\n        mu = mu[x] + dynamics,\n        sigma = sigma[x]\n      )\n    }\n\n    if (family_char == 'lognormal') {\n      out <- rlnorm(\n        length(dynamics),\n        meanlog = mu[x] + (dynamics * 0.3),\n        sdlog = sigma[x]\n      )\n    }\n\n    if (family_char == 'Gamma') {\n      out <- rgamma(\n        length(dynamics),\n        rate = shape[x] / exp(mu[x] + dynamics),\n        shape = shape[x]\n      )\n    }\n\n    if (family_char == 'beta') {\n      shape_pars <- beta_shapes(mu = plogis(mu[x] + dynamics), phi = phi[x])\n      out <- rbeta(\n        length(dynamics),\n        shape1 = shape_pars$shape1,\n        shape2 = shape_pars$shape2\n      )\n    }\n\n    out[is.infinite(out)] <- NA\n    if (prop_missing > 0) {\n      out[sample(seq(1, length(out)), floor(length(out) * prop_missing))] <- NA\n    }\n    out\n  })))\n\n  # Return simulated data in the format that is ready for mvgam analysis\n  sim_data = data.frame(\n    y = obs_ys,\n    season = rep(rep(seq(1, freq), ceiling(T / freq))[1:T], n_series),\n    year = rep(sort(rep(seq(1, ceiling(T / freq)), freq))[1:T], n_series),\n    series = as.factor(paste0('series_', sort(rep(seq(1, n_series), T))))\n  ) %>%\n    dplyr::group_by(series) %>%\n    dplyr::arrange(year, season) %>%\n    dplyr::mutate(time = 1:dplyr::n()) %>%\n    dplyr::ungroup()\n\n  data_train <- sim_data %>%\n    dplyr::filter(time <= floor(max(sim_data$time) * prop_train)) %>%\n    dplyr::ungroup() %>%\n    dplyr::group_by(series) %>%\n    dplyr::arrange(time)\n\n  data_test <- sim_data %>%\n    dplyr::filter(time > max(data_train$time)) %>%\n    dplyr::ungroup() %>%\n    dplyr::group_by(series) %>%\n    dplyr::arrange(time)\n\n  if (!use_lv) {\n    if (trend_model %in% c('RW', 'AR1', 'AR2', 'AR3')) {\n      trend_params = list(ar1 = ar1s, ar2 = ar2s, ar3 = ar3s)\n    }\n\n    if (trend_model %in% c('VAR1', 'VAR1cor')) {\n      trend_params = list(var1 = A, Sigma = Sigma)\n    }\n\n    if (trend_model == 'GP') {\n      trend_params = list(alpha = trend_alphas, rho = trend_rhos)\n    }\n\n    out <- list(\n      data_train = data.frame(data_train),\n      data_test = data.frame(data_test),\n      true_corrs = cov2cor(cov(obs_trends)),\n      true_trends = obs_trends,\n      global_seasonality = glob_season,\n      trend_params = trend_params\n    )\n  } else {\n    out <- list(\n      data_train = data.frame(data_train),\n      data_test = data.frame(data_test),\n      true_corrs = cov2cor(cov(obs_trends)),\n      true_trends = obs_trends,\n      global_seasonality = glob_season\n    )\n  }\n\n  return(out)\n}\n\n#' Simulate a fixed seasonal pattern\n#' @noRd\nsim_seasonal = function(T, freq = 12) {\n  beta1 <- runif(1, 0.2, 0.6)\n  beta2 <- runif(1, -0.5, 0.5)\n  cov1 <- sin(2 * pi * (1:T) / freq)\n  cov2 <- cos(2 * pi * (1:T) / freq)\n  rnorm(T, mean = beta1 * cov1 + beta2 * cov2, sd = 0.1)\n}\n\n#' Simulate from a periodic GP\n#' @noRd\nperiodic_gp <- function(T, period = 12, rho = 1) {\n  time <- 1:T\n  cov_matrix = array(0, c(length(time), length(time)))\n  for (i in 1:length(time)) {\n    cov_matrix[i, i] = 1 + 0.00000001\n    if (i < length(time)) {\n      for (j in (i + 1):length(time)) {\n        covariance = exp(\n          -2 * (sin(pi * abs(time[i] - time[j]) / period)^2) / (rho^2)\n        )\n        cov_matrix[i, j] = covariance\n        cov_matrix[j, i] = covariance\n      }\n    }\n  }\n  chol_cov <- t(chol(cov_matrix))\n  values <- as.vector(scale(chol_cov %*% rnorm(length(time))))\n  return(values)\n}\n\n#' Simulate from the LKJ distribution\n#' @noRd\nlkj_corr <- function(n_series, eta = 0.8) {\n  alpha <- eta + (n_series - 2) / 2\n  r12 <- 2 * rbeta(1, alpha, alpha) - 1\n  R <- matrix(0, n_series, n_series)\n  R[1, 1] <- 1\n  R[1, 2] <- r12\n  R[2, 2] <- sqrt(1 - r12^2)\n  if (n_series > 2) {\n    for (m in 2:(n_series - 1)) {\n      alpha <- alpha - 0.5\n      y <- rbeta(1, m / 2, alpha)\n      z <- rnorm(m, 0, 1)\n      z <- z / sqrt(crossprod(z)[1])\n      R[1:m, m + 1] <- sqrt(y) * z\n      R[m + 1, m + 1] <- sqrt(1 - y)\n    }\n  }\n  return(crossprod(R))\n}\n\n#' Generate a random covariance matrix\n#' @noRd\nrandom_Sigma = function(N) {\n  L_Omega <- matrix(0, N, N)\n  L_Omega[1, 1] <- 1\n  for (i in 2:N) {\n    bound <- 1\n    for (j in 1:(i - 1)) {\n      is_sparse <- rbinom(1, 1, 0.6)\n      if (is_sparse) {\n        L_Omega[i, j] <- runif(1, -0.05, 0.05)\n      } else {\n        L_Omega[i, j] <- runif(1, -sqrt(bound), sqrt(bound))\n      }\n      bound <- bound - L_Omega[i, j]^2\n    }\n    L_Omega[i, i] <- sqrt(bound)\n  }\n  Sigma <- L_Omega %*% t(L_Omega)\n  return(Sigma)\n}\n"
  },
  {
    "path": "R/stability.R",
    "content": "#' Calculate measures of latent VAR community stability\n#'\n#' Compute reactivity, return rates and contributions of interactions to\n#' stationary forecast variance from \\pkg{mvgam} models with Vector\n#' Autoregressive dynamics.\n#'\n#' @name stability.mvgam\n#'\n#' @param object \\code{list} object of class \\code{mvgam} resulting from a call\n#'   to [mvgam()] that used a Vector Autoregressive latent process model (either\n#'   as `VAR(cor = FALSE)` or `VAR(cor = TRUE)`)\n#'\n#' @param ... Ignored\n#'\n#' @details These measures of stability can be used to assess how important\n#'   inter-series dependencies are to the variability of a multivariate system\n#'   and to ask how systems are expected to respond to environmental\n#'   perturbations. Using the formula for a latent VAR(1) as:\n#'\n#'   \\deqn{\n#'   \\mu_t \\sim \\text{MVNormal}(A(\\mu_{t - 1}), \\Sigma)\n#'   }\n#'\n#'   this function will calculate the long-term stationary forecast distribution\n#'   of the system, which has mean \\eqn{\\mu_{\\infty}} and variance\n#'   \\eqn{\\Sigma_{\\infty}}, to then calculate the following quantities:\n#'\n#'   \\itemize{\n#'     \\item `prop_int`: Proportion of the volume of the stationary forecast\n#'     distribution that is attributable to lagged interactions:\n#'     \\deqn{ det(A)^2 }\n#'\n#'     \\item `prop_int_adj`: Same as `prop_int` but scaled by the number of\n#'     series \\eqn{p}:\n#'     \\deqn{ det(A)^{2/p} }\n#'\n#'     \\item `prop_int_offdiag`: Sensitivity of `prop_int` to inter-series\n#'     interactions (off-diagonals of \\eqn{A}):\n#'     \\deqn{ [2~det(A) (A^{-1})^T] }\n#'\n#'     \\item `prop_int_diag`: Sensitivity of `prop_int` to intra-series\n#'     interactions (diagonals of \\eqn{A}):\n#'     \\deqn{ [2~det(A) (A^{-1})^T] }\n#'\n#'     \\item `prop_cov_offdiag`: Sensitivity of \\eqn{\\Sigma_{\\infty}} to\n#'     inter-series error correlations:\n#'     \\deqn{ [2~det(\\Sigma_{\\infty}) (\\Sigma_{\\infty}^{-1})^T] }\n#'\n#'     \\item `prop_cov_diag`: Sensitivity of \\eqn{\\Sigma_{\\infty}} to error\n#'     variances:\n#'     \\deqn{ [2~det(\\Sigma_{\\infty}) (\\Sigma_{\\infty}^{-1})^T] }\n#'\n#'     \\item `reactivity`: Degree to which the system moves away from a stable\n#'     equilibrium following a perturbation. If \\eqn{\\sigma_{max}(A)} is the\n#'     largest singular value of \\eqn{A}:\n#'     \\deqn{ \\log\\sigma_{max}(A) }\n#'\n#'     \\item `mean_return_rate`: Asymptotic return rate of the mean of the\n#'     transition distribution to the stationary mean:\n#'     \\deqn{ \\max(\\lambda_{A}) }\n#'\n#'     \\item `var_return_rate`: Asymptotic return rate of the variance of the\n#'     transition distribution to the stationary variance:\n#'     \\deqn{ \\max(\\lambda_{A \\otimes A}) }\n#'   }\n#'\n#'   Major advantages of using \\pkg{mvgam} to compute these metrics are that\n#'   well-calibrated uncertainties are available and that VAR processes are\n#'   forced to be stationary. These properties make it simple and insightful to\n#'   calculate and inspect aspects of both long-term and short-term stability.\n#'\n#'   You can also inspect interactions among the time series in a latent VAR\n#'   process using \\code{\\link{irf}} for impulse response functions or\n#'   \\code{\\link{fevd}} for forecast error variance decompositions.\n#'\n#' @return A \\code{data.frame} containing posterior draws for each stability\n#'   metric.\n#'\n#' @references\n#'   AR Ives, B Dennis, KL Cottingham & SR Carpenter (2003). Estimating\n#'   community stability and ecological interactions from time-series data.\n#'   *Ecological Monographs*, 73, 301–330.\n#'\n#' @author Nicholas J Clark\n#'\n#' @seealso\n#'   \\code{\\link{VAR}},\n#'   \\code{\\link{irf}},\n#'   \\code{\\link{fevd}}\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some time series that follow a latent VAR(1) process\n#' simdat <- sim_mvgam(\n#'   family = gaussian(),\n#'   n_series = 4,\n#'   trend_model = VAR(cor = TRUE),\n#'   prop_trend = 1\n#' )\n#'\n#' plot_mvgam_series(data = simdat$data_train, series = 'all')\n#'\n#' # Fit a model that uses a latent VAR(1)\n#' mod <- mvgam(\n#'   y ~ -1,\n#'   trend_formula = ~ 1,\n#'   trend_model = VAR(cor = TRUE),\n#'   family = gaussian(),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' # Calculate stability metrics for this system\n#' metrics <- stability(mod)\n#'\n#' # Proportion of stationary forecast distribution attributable to interactions\n#' hist(\n#'   metrics$prop_int,\n#'   xlim = c(0, 1),\n#'   xlab = 'Prop_int',\n#'   main = '',\n#'   col = '#B97C7C',\n#'   border = 'white'\n#' )\n#'\n#' # Inter- vs intra-series interaction contributions\n#' layout(matrix(1:2, nrow = 2))\n#' hist(\n#'   metrics$prop_int_offdiag,\n#'   xlim = c(0, 1),\n#'   xlab = '',\n#'   main = 'Inter-series interactions',\n#'   col = '#B97C7C',\n#'   border = 'white'\n#' )\n#'\n#' hist(\n#'   metrics$prop_int_diag,\n#'   xlim = c(0, 1),\n#'   xlab = 'Contribution to interaction effect',\n#'   main = 'Intra-series interactions (density dependence)',\n#'   col = 'darkblue',\n#'   border = 'white'\n#' )\n#' layout(1)\n#'\n#' # Inter- vs intra-series contributions to forecast variance\n#' layout(matrix(1:2, nrow = 2))\n#' hist(\n#'   metrics$prop_cov_offdiag,\n#'   xlim = c(0, 1),\n#'   xlab = '',\n#'   main = 'Inter-series covariances',\n#'   col = '#B97C7C',\n#'   border = 'white'\n#' )\n#'\n#' hist(\n#'   metrics$prop_cov_diag,\n#'   xlim = c(0, 1),\n#'   xlab = 'Contribution to forecast variance',\n#'   main = 'Intra-series variances',\n#'   col = 'darkblue',\n#'   border = 'white'\n#' )\n#' layout(1)\n#'\n#' # Reactivity: system response to perturbation\n#' hist(\n#'   metrics$reactivity,\n#'   main = '',\n#'   xlab = 'Reactivity',\n#'   col = '#B97C7C',\n#'   border = 'white',\n#'   xlim = c(\n#'     -1 * max(abs(metrics$reactivity)),\n#'     max(abs(metrics$reactivity))\n#'   )\n#' )\n#' abline(v = 0, lwd = 2.5)\n#' }\n#'\n#' @export\nstability <- function(object, ...) {\n  UseMethod(\"stability\", object)\n}\n\n#'@rdname stability.mvgam\n#'@method stability mvgam\n#'@export\nstability.mvgam = function(object, ...) {\n  # Check trend_model\n  trend_model <- attr(object$model_data, 'trend_model')\n  if (!trend_model %in% c('VAR', 'VARcor', 'VAR1', 'VAR1cor')) {\n    stop(\n      'Only VAR(1) models currently supported for calculating stability metrics',\n      call. = FALSE\n    )\n  }\n\n  # Take posterior draws of the interaction matrix\n  B_post <- mcmc_chains(object$model_output, 'A')\n\n  # Take posterior draws of Sigma\n  Sigma_post <- mcmc_chains(object$model_output, 'Sigma')\n\n  # Number of series in the VAR process\n  n_series <- object$n_lv\n\n  if (is.null(n_series)) {\n    n_series <- nlevels(object$obs_data$series)\n  }\n\n  metrics <- do.call(\n    rbind,\n    lapply(seq_len(NROW(B_post)), function(i) {\n      B <- matrix(B_post[i, ], nrow = n_series, ncol = n_series, byrow = TRUE)\n      p <- dim(B)[1]\n\n      # If we want to get the variance of the stationary distribution (Sigma_inf)\n      Sigma <- matrix(\n        Sigma_post[i, ],\n        nrow = n_series,\n        ncol = n_series,\n        byrow = TRUE\n      )\n      vecS_inf <- solve(diag(p * p) - kronecker(B, B)) %*% as.vector(Sigma)\n      Sigma_inf <- matrix(vecS_inf, nrow = p)\n\n      # The difference in volume between Sigma_inf and Sigma is:\n      # det(Sigma_inf - Sigma) = det(Sigma_inf) * det(B) ^ 2\n      # according to Ives et al 2003 (eqn 24)\n\n      # We can take partial derivatives to determine which elements of\n      # Sigma_inf contribute most to rates of change in the\n      # proportion of Sigma_inf that is due to process error\n      # Thanks to Mark Scheuerell for providing inspirational code\n      # https://github.com/mdscheuerell/safs-quant-sem-2022/blob/main/lwa_analysis.R\n      int_env <- det(Sigma_inf) * t(solve(Sigma_inf))\n\n      # Proportion of inter-series covariance to\n      # to overall environmental variation contribution (i.e. how important are\n      # correlated errors for controlling the shape of the stationary forecast\n      # distribution?)\n      dat <- data.frame(\n        prop_cov_offdiag = mean(abs(int_env[lower.tri(int_env)])) /\n          (mean(abs(diag(int_env))) + mean(abs(int_env[lower.tri(int_env)])))\n      )\n\n      # Proportion of error variances to stationary forecast distribution\n      dat$prop_cov_diag <- 1 - dat$prop_cov_offdiag\n\n      # Proportion of volume of Sigma_inf attributable to series interactions,\n      # measuring the degree to which interactions increase\n      # the variance of the stationary distribution (Sigma_inf) relative\n      # to the variance of the process error (Sigma)\n      # lower values = more stability\n      dat$prop_int = abs(det(B))^2\n\n      # Ives et al 2003 suggest to scale this by the number of series for more direct\n      # comparisons among different studies\n      dat$prop_int_adj <- abs(det(B))^(2 / p)\n\n      # Sensitivity of the species interaction proportion to particular\n      # interactions is also calculated using partial derivatives\n      # (note the use of 2 here because we squared det(B) in the above eqn)\n      int_sens <- 2 * det(B) * t(solve(B))\n\n      # Proportion of interspecific contributions to\n      # to overall interaction contribution\n      dat$prop_int_offdiag <- mean(abs(int_sens[lower.tri(int_sens)])) /\n        (mean(abs(diag(int_sens))) + mean(abs(int_sens[lower.tri(int_sens)])))\n\n      # Proportion of density dependent contributions to\n      # to overall interaction contribution\n      dat$prop_int_diag <- 1 - dat$prop_int_offdiag\n\n      # Reactivity, measuring the degree to which the system moves\n      # away from a stable equilibrium following a perturbation\n      # values > 0 suggest the system is reactive, whereby a\n      # perturbation of the system in one period can be amplified in the next period\n      # Following Neubert et al 2009 Ecology (Detecting reactivity)\n      dat$reactivity <- log(max(svd(B)$d))\n\n      # Return rate of transition distribution to the stationary distribution\n      # Asymptotic return rate of the mean\n      # lower values = more stability\n      dat$mean_return_rate <- max(abs(eigen(B)$values))\n\n      # Asymptotic return rate of the variance\n      # lower values = more stability\n      dat$var_return_rate <- max(abs(eigen(B %x% B)$values))\n      dat\n    })\n  )\n  return(metrics)\n}\n"
  },
  {
    "path": "R/stan_utils.R",
    "content": "#' Stan code and data objects for \\pkg{mvgam} models\n#'\n#' Generate Stan code and data objects for \\pkg{mvgam} models\n#'\n#' @param object An object of class `mvgam` or `mvgam_prefit`,\n#' returned from a call to \\code{mvgam}\n#' @return Either a character string containing the fully commented \\pkg{Stan} code\n#'   to fit a \\pkg{mvgam} model or a named list containing the data objects needed\n#'   to fit the model in Stan.\n#' @export\n#' @examples\n#'\\dontrun{\n#' simdat <- sim_mvgam()\n#' mod <- mvgam(y ~ s(season) +\n#'                s(time, by = series),\n#'              family = poisson(),\n#'              data = simdat$data_train,\n#'              run_model = FALSE)\n#'\n#' # View Stan model code\n#' stancode(mod)\n#'\n#' # View Stan model data\n#' sdata <- standata(mod)\n#' str(sdata)\n#' }\n#'\ncode = function(object) {\n  if (!inherits(object, c('mvgam', 'mvgam_prefit'))) {\n    stop('argument \"object\" must be of class \"mvgam\" or \"mvgam_prefit\"')\n  }\n\n  scode <- readLines(textConnection(object$model_file), n = -1)\n  class(scode) <- c(\"character\", \"mvgammodel\")\n  scode\n}\n\n#' @export\nprint.mvgammodel = function(x, ...) {\n  cat(x, sep = '\\n')\n  invisible(x)\n}\n\n#' @export\n#' @importFrom brms stancode\nbrms::stancode\n\n#' @export\n#' @param ... ignored\n#' @rdname code\nstancode.mvgam_prefit = function(object, ...) {\n  code(object)\n}\n\n#' @export\n#' @rdname code\nstancode.mvgam = function(object, ...) {\n  code(object)\n}\n\n#' @export\n#' @importFrom brms standata\nbrms::standata\n\n#' @export\n#' @param ... ignored\n#' @rdname code\nstandata.mvgam_prefit = function(object, ...) {\n  object$model_data\n}\n\n#' @noRd\nremove_likelihood = function(model_file) {\n  like_line <- grep('// likelihood functions', model_file)\n  all_open_braces <- grep('{', model_file, fixed = TRUE)\n  all_close_braces <- grep('}', model_file, fixed = TRUE)\n  open_distances <- like_line - all_open_braces\n  open_distances[open_distances < 0] <- NA\n  start_remove <- all_open_braces[\n    which.min(open_distances)\n  ]\n\n  close_distances <- like_line - all_close_braces\n  close_distances[close_distances > 0] <- NA\n  end_remove <- all_close_braces[\n    which.max(close_distances)\n  ]\n\n  model_file[-(start_remove:end_remove)]\n}\n\n\n#### Replacement for MCMCvis functions to remove dependence on rstan for working\n# with stanfit objects ####\n#' @noRd\nmcmc_summary = function(\n  object,\n  params = 'all',\n  excl = NULL,\n  ISB = TRUE,\n  exact = TRUE,\n  probs = c(0.025, 0.5, 0.975),\n  hpd_prob = 0.95,\n  HPD = FALSE,\n  pg0 = FALSE,\n  digits = NULL,\n  round = NULL,\n  Rhat = TRUE,\n  n.eff = TRUE,\n  func = NULL,\n  func_name = NULL,\n  variational = FALSE\n) {\n  if (variational) {\n    Rhat <- FALSE\n    n.eff <- FALSE\n  }\n  # SORTING BLOCK\n\n  if (methods::is(object, 'matrix')) {\n    object2 <- mcmc_chains(\n      object,\n      params,\n      excl,\n      ISB,\n      exact = exact,\n      mcmc.list = FALSE\n    )\n  } else {\n    if (methods::is(object, 'stanfit')) {\n      object2 <- object\n    } else {\n      # rstanarm\n      if (methods::is(object, 'stanreg')) {\n        object2 <- object$stanfit\n      } else {\n        # brms\n        if (methods::is(object, 'brmsfit')) {\n          object2 <- object$fit\n        } else {\n          #jagsUI\n          if (methods::is(object, 'jagsUI')) {\n            object2 <- mcmc_chains(object)\n          } else {\n            object2 <- mcmc_chains(\n              object,\n              params,\n              excl,\n              ISB,\n              exact = exact,\n              mcmc.list = TRUE\n            )\n          }\n        }\n      }\n    }\n  }\n\n  #--------------------------------------------------------------------------------------------------------------\n\n  # PROCESSING BLOCK - JAGS AND MATRIX MCMC OUTPUT\n\n  if (coda::is.mcmc.list(object2) == TRUE | methods::is(object, 'matrix')) {\n    if (methods::is(object, 'matrix')) {\n      np <- NCOL(object2)\n      ch_bind <- object2\n    } else {\n      np <- NCOL(object2[[1]])\n      if (np > 1) {\n        ch_bind <- do.call(\"rbind\", object2)\n      } else {\n        ch_bind <- as.matrix(object2)\n      }\n    }\n\n    x <- list()\n\n    # mean, sd, and quantiles\n\n    if (!is.null(digits)) {\n      if (!is.null(round)) {\n        warning(\n          \"'digits' and 'round' arguments cannot be used together. Using 'digits'.\"\n        )\n      }\n\n      bind_mn <- data.frame(signif(apply(ch_bind, 2, mean), digits = digits))\n      bind_sd <- data.frame(signif(\n        apply(ch_bind, 2, stats::sd),\n        digits = digits\n      ))\n      colnames(bind_mn) <- \"mean\"\n      colnames(bind_sd) <- \"sd\"\n\n      if (HPD == FALSE) {\n        if (length(probs) == 1) {\n          bind_q <- data.frame(signif(\n            apply(ch_bind, 2, stats::quantile, probs = probs),\n            digits = digits\n          ))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        } else {\n          bind_q <- data.frame(t(signif(\n            apply(ch_bind, 2, stats::quantile, probs = probs),\n            digits = digits\n          )))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        }\n      }\n      if (HPD == TRUE) {\n        if (length(hpd_prob) > 1) {\n          stop(\n            'specify only a single probability for HPD interval computation.'\n          )\n        }\n        bind_q <- data.frame(signif(\n          coda::HPDinterval(coda::as.mcmc(ch_bind), prob = hpd_prob),\n          digits = digits\n        ))\n        colnames(bind_q) <- c(\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDL\"),\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDU\")\n        )\n      }\n    }\n\n    if (is.null(digits) & !is.null(round)) {\n      bind_mn <- data.frame(round(apply(ch_bind, 2, mean), digits = round))\n      bind_sd <- data.frame(round(apply(ch_bind, 2, stats::sd), digits = round))\n      colnames(bind_mn) <- \"mean\"\n      colnames(bind_sd) <- \"sd\"\n\n      if (HPD == FALSE) {\n        if (length(probs) == 1) {\n          bind_q <- data.frame(round(\n            apply(ch_bind, 2, stats::quantile, probs = probs),\n            digits = round\n          ))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        } else {\n          bind_q <- data.frame(t(round(\n            apply(ch_bind, 2, stats::quantile, probs = probs),\n            digits = round\n          )))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        }\n      }\n      if (HPD == TRUE) {\n        if (length(hpd_prob) > 1) {\n          stop(\n            'specify only a single probability for HPD interval computation.'\n          )\n        }\n        bind_q <- data.frame(round(\n          coda::HPDinterval(coda::as.mcmc(ch_bind), prob = hpd_prob),\n          digits = round\n        ))\n        colnames(bind_q) <- c(\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDL\"),\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDU\")\n        )\n      }\n    }\n\n    if (is.null(digits) & is.null(round)) {\n      bind_mn <- data.frame(apply(ch_bind, 2, mean))\n      bind_sd <- data.frame(apply(ch_bind, 2, stats::sd))\n      colnames(bind_mn) <- \"mean\"\n      colnames(bind_sd) <- \"sd\"\n\n      if (HPD == FALSE) {\n        if (length(probs) == 1) {\n          bind_q <- data.frame(apply(\n            ch_bind,\n            2,\n            stats::quantile,\n            probs = probs\n          ))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        } else {\n          bind_q <- data.frame(t(apply(\n            ch_bind,\n            2,\n            stats::quantile,\n            probs = probs\n          )))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        }\n      }\n      if (HPD == TRUE) {\n        if (length(hpd_prob) > 1) {\n          stop(\n            'specify only a single probability for HPD interval computation.'\n          )\n        }\n        bind_q <- data.frame(coda::HPDinterval(\n          coda::as.mcmc(ch_bind),\n          prob = hpd_prob\n        ))\n        colnames(bind_q) <- c(\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDL\"),\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDU\")\n        )\n      }\n    }\n\n    x[[1]] <- cbind(bind_mn, bind_sd, bind_q)\n\n    # rhat\n\n    if (Rhat == TRUE) {\n      if (!methods::is(object, 'matrix')) {\n        if (length(object2) > 1) {\n          # If > 750 params use loop to calculate Rhat\n          if (NCOL(object2[[1]]) > 750) {\n            r_hat <- c(rep(NA, NCOL(object2[[1]])))\n            for (v in 1:length(r_hat)) {\n              r_hat[v] <- round(\n                coda::gelman.diag(object2[, v])$psrf[, 1],\n                digits = 2\n              )\n            }\n            r_hat <- data.frame(r_hat)\n            colnames(r_hat) <- \"Rhat\"\n          } else {\n            r_hat <- data.frame(round(\n              coda::gelman.diag(object2, multivariate = FALSE)$psrf[, 1],\n              digits = 2\n            ))\n            colnames(r_hat) <- \"Rhat\"\n          }\n        } else {\n          warning(\n            \"Rhat statistic cannot be calculated with one chain. NAs inserted.\"\n          )\n          r_hat <- data.frame(rep(NA, np))\n          colnames(r_hat) <- \"Rhat\"\n        }\n      } else {\n        warning(\n          \"Rhat statistic cannot be calculated with one chain (matrix input). NAs inserted.\"\n        )\n        r_hat <- data.frame(rep(NA, np))\n        colnames(r_hat) <- \"Rhat\"\n      }\n      x[[(length(x) + 1)]] <- r_hat\n    }\n\n    # neff\n\n    if (n.eff == TRUE) {\n      if (!methods::is(object, 'matrix')) {\n        neff <- data.frame(round(coda::effectiveSize(object2), digits = 0))\n        colnames(neff) <- \"n_eff\"\n      } else {\n        warning(\n          'Number of effective samples cannot be calculated without individual chains (matrix input). NAs inserted.'\n        )\n        neff <- data.frame(rep(NA, np))\n        colnames(neff) <- \"n_eff\"\n      }\n      x[[(length(x) + 1)]] <- neff\n    }\n\n    # p>0\n\n    if (pg0 == TRUE) {\n      tpg <- data.frame(apply(\n        ch_bind,\n        2,\n        function(x) round(sum(x > 0) / length(x), 2)\n      ))\n      colnames(tpg) <- 'p>0'\n      x[[(length(x) + 1)]] <- tpg\n    }\n\n    # custom function\n\n    if (!is.null(func)) {\n      if (!is.null(digits)) {\n        tmp <- signif(apply(ch_bind, 2, func), digits = digits)\n      }\n      if (is.null(digits) & !is.null(round)) {\n        tmp <- round(apply(ch_bind, 2, func), digits = round)\n      }\n      if (is.null(digits) & is.null(round)) {\n        tmp <- apply(ch_bind, 2, func)\n      }\n      if (!is.null(dim(tmp))) {\n        tmp <- data.frame(t(tmp))\n      } else {\n        tmp <- data.frame(tmp)\n      }\n      if (!is.null(func_name)) {\n        if (length(func_name) != NCOL(tmp)) {\n          stop(\"length(func_name) must equal number of func outputs\")\n        }\n        colnames(tmp) <- func_name\n      } else {\n        colnames(tmp) <- 'func'\n      }\n\n      x[[(length(x) + 1)]] <- tmp\n    }\n\n    # bind them\n    mcmc_summary <- do.call(\"cbind\", x)\n  }\n\n  #--------------------------------------------------------------------------------------------------------------\n  # PROCESSING BLOCK - STAN OR JAGSUI MCMC OUTPUT\n\n  if (methods::is(object2, 'stanfit') | methods::is(object, 'jagsUI')) {\n    if (methods::is(object2, 'stanfit')) {\n      # rhat and n_eff directly from rstan output\n      all_params <- row.names(rstan::summary(object2)$summary)\n      rs_df <- data.frame(rstan::summary(object2)$summary)\n\n      #if brms, reassign names without b_ and r_ (as in MCMCchains)\n      if (methods::is(object, 'brmsfit')) {\n        sp_names_p <- names(object2@sim$samples[[1]])\n        #remove b_ and r_\n        st_nm <- substr(sp_names_p, start = 1, stop = 2)\n        sp_names <- rep(NA, length(sp_names_p))\n        b_idx <- which(st_nm == 'b_')\n        r_idx <- which(st_nm == 'r_')\n        ot_idx <- which(st_nm != 'b_' & st_nm != 'r_')\n        #fill names vec with b_ and r_ removed\n        sp_names[b_idx] <- gsub('b_', '', sp_names_p[b_idx])\n        sp_names[r_idx] <- gsub('r_', '', sp_names_p[r_idx])\n        sp_names[ot_idx] <- sp_names_p[ot_idx]\n\n        #assign names to df\n        all_params <- sp_names\n        row.names(rs_df) <- all_params\n      }\n    }\n\n    if (methods::is(object, 'jagsUI')) {\n      all_params <- row.names(object$summary)\n      rs_df <- data.frame(object$summary)\n    }\n\n    # filtering of parameters from rstan/jagsUI object - from MCMCchains\n    if (ISB == TRUE) {\n      names <- vapply(\n        strsplit(all_params, split = \"[\", fixed = TRUE),\n        `[`,\n        1,\n        FUN.VALUE = character(1)\n      )\n    } else {\n      names <- all_params\n    }\n\n    x <- list()\n\n    # INDEX BLOCK exclusions\n\n    if (!is.null(excl)) {\n      rm_ind <- c()\n      for (i in 1:length(excl)) {\n        if (ISB == TRUE) {\n          n_excl <- vapply(\n            strsplit(excl, split = \"[\", fixed = TRUE),\n            `[`,\n            1,\n            FUN.VALUE = character(1)\n          )\n        } else {\n          n_excl <- excl\n        }\n\n        if (exact == TRUE) {\n          ind_excl <- which(names %in% n_excl[i])\n        } else {\n          ind_excl <- grep(n_excl[i], names, fixed = FALSE)\n        }\n\n        if (length(ind_excl) < 1) {\n          warning(paste0(\n            \"\\\"\",\n            excl[i],\n            \"\\\"\",\n            \" not found in MCMC output. Check 'ISB'' and 'exact' arguments to make sure the desired parsing methods are being used.\"\n          ))\n        }\n        rm_ind <- c(rm_ind, ind_excl)\n      }\n\n      if (length(rm_ind) > 0) {\n        dups <- which(duplicated(rm_ind))\n        if (length(dups) > 0) {\n          rm_ind2 <- rm_ind[-dups]\n        } else {\n          rm_ind2 <- rm_ind\n        }\n      } else {\n        excl <- NULL\n      }\n    }\n\n    # selections\n\n    if (length(params) == 1) {\n      if (params == \"all\") {\n        if (is.null(excl)) {\n          f_ind <- 1:length(names)\n        } else {\n          f_ind <- (1:length(names))[-rm_ind2]\n        }\n      } else {\n        if (exact == TRUE) {\n          get_ind <- which(names %in% params)\n        } else {\n          get_ind <- grep(paste(params), names, fixed = FALSE)\n        }\n\n        if (length(get_ind) < 1) {\n          stop(paste0(\n            \"\\\"\",\n            params,\n            \"\\\"\",\n            \" not found in MCMC output. Check 'ISB' and 'exact' arguments to make sure the desired parsing methods are being used.\"\n          ))\n        }\n        if (!is.null(excl)) {\n          if (identical(get_ind, rm_ind2)) {\n            stop(\"No parameters selected.\")\n          }\n          matched <- stats::na.omit(match(rm_ind2, get_ind))\n          if (length(matched) > 0) {\n            f_ind <- get_ind[-matched]\n          } else {\n            f_ind <- get_ind\n          }\n        } else {\n          f_ind <- get_ind\n        }\n      }\n    } else {\n      grouped <- c()\n      for (i in 1:length(params)) {\n        if (exact == TRUE) {\n          get_ind <- which(names %in% params[i])\n        } else {\n          get_ind <- grep(paste(params[i]), names, fixed = FALSE)\n        }\n\n        if (length(get_ind) < 1) {\n          warning(paste0(\n            \"\\\"\",\n            params[i],\n            \"\\\"\",\n            \" not found in MCMC output. Check 'ISB' and 'exact' arguments to make sure the desired parsing methods are being used.\"\n          ))\n          (next)()\n        }\n        grouped <- c(grouped, get_ind)\n      }\n      if (!is.null(excl)) {\n        if (identical(grouped, rm_ind2)) {\n          stop(\"No parameters selected.\")\n        }\n        matched <- stats::na.omit(match(rm_ind2, grouped))\n        if (length(matched) > 0) {\n          t_ind <- grouped[-matched]\n        } else {\n          t_ind <- grouped\n        }\n        to.rm <- which(duplicated(t_ind))\n        if (length(to.rm) > 0) {\n          f_ind <- t_ind[-to.rm]\n        } else {\n          f_ind <- t_ind\n        }\n      } else {\n        to.rm <- which(duplicated(grouped))\n        if (length(to.rm) > 0) {\n          f_ind <- grouped[-to.rm]\n        } else {\n          f_ind <- grouped\n        }\n      }\n    }\n\n    # end sort\n\n    # convert object to matrix if computing non default intervals or using custom func\n    if (\n      !is.null(func) |\n        HPD == TRUE |\n        identical(probs, c(0.025, 0.5, 0.975)) == FALSE |\n        pg0 == TRUE\n    ) {\n      if (methods::is(object2, 'stanfit')) {\n        #ensure is matrix, not vector\n        ch_bind <- as.matrix(as.matrix(object2)[, f_ind])\n      }\n      if (methods::is(object, 'jagsUI')) {\n        ch_bind <- mcmc_chains(object, params, excl, ISB)\n      }\n    }\n\n    # mean, sd, and quantiles\n\n    if (!is.null(digits)) {\n      if (!is.null(round)) {\n        warning(\n          \"'digits' and 'round' arguments cannot be used together. Using 'digits'.\"\n        )\n      }\n\n      bind_mn <- data.frame(signif(rs_df[\"mean\"][f_ind, 1], digits = digits))\n      bind_sd <- data.frame(signif(rs_df[\"sd\"][f_ind, 1], digits = digits))\n      colnames(bind_mn) <- \"mean\"\n      colnames(bind_sd) <- \"sd\"\n\n      if (HPD == FALSE) {\n        if (length(probs) == 1) {\n          bind_q <- data.frame(signif(\n            apply(ch_bind, 2, stats::quantile, probs = probs),\n            digits = digits\n          ))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        } else {\n          if (identical(probs, c(0.025, 0.5, 0.975)) == TRUE) {\n            bind_LCI <- signif(rs_df[\"X2.5.\"][f_ind, 1], digits = digits)\n            bind_med <- signif(rs_df[\"X50.\"][f_ind, 1], digits = digits)\n            bind_UCI <- signif(rs_df[\"X97.5.\"][f_ind, 1], digits = digits)\n            bind_q <- data.frame(cbind(bind_LCI, bind_med, bind_UCI))\n            colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n          } else {\n            bind_q <- data.frame(t(signif(\n              apply(ch_bind, 2, stats::quantile, probs = probs),\n              digits = digits\n            )))\n            colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n          }\n        }\n      }\n      if (HPD == TRUE) {\n        if (length(hpd_prob) > 1) {\n          stop(\n            'Specify only a single probability for HPD interval computation.'\n          )\n        }\n        bind_q <- data.frame(signif(\n          coda::HPDinterval(coda::as.mcmc(ch_bind), prob = hpd_prob),\n          digits = digits\n        ))\n        colnames(bind_q) <- c(\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDL\"),\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDU\")\n        )\n      }\n    }\n\n    if (is.null(digits) & !is.null(round)) {\n      bind_mn <- data.frame(round(rs_df[\"mean\"][f_ind, 1], digits = round))\n      bind_sd <- data.frame(round(rs_df[\"sd\"][f_ind, 1], digits = round))\n      colnames(bind_mn) <- \"mean\"\n      colnames(bind_sd) <- \"sd\"\n\n      if (HPD == FALSE) {\n        if (length(probs) == 1) {\n          bind_q <- data.frame(round(\n            apply(ch_bind, 2, stats::quantile, probs = probs),\n            digits = round\n          ))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        } else {\n          if (identical(probs, c(0.025, 0.5, 0.975)) == TRUE) {\n            bind_LCI <- round(rs_df[\"X2.5.\"][f_ind, 1], digits = round)\n            bind_med <- round(rs_df[\"X50.\"][f_ind, 1], digits = round)\n            bind_UCI <- round(rs_df[\"X97.5.\"][f_ind, 1], digits = round)\n            bind_q <- data.frame(cbind(bind_LCI, bind_med, bind_UCI))\n            colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n          } else {\n            bind_q <- data.frame(t(round(\n              apply(ch_bind, 2, stats::quantile, probs = probs),\n              digits = round\n            )))\n            colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n          }\n        }\n      }\n      if (HPD == TRUE) {\n        if (length(hpd_prob) > 1) {\n          stop(\n            'Specify only a single probability for HPD interval computation.'\n          )\n        }\n        bind_q <- data.frame(round(\n          coda::HPDinterval(coda::as.mcmc(ch_bind), prob = hpd_prob),\n          digits = round\n        ))\n        colnames(bind_q) <- c(\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDL\"),\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDU\")\n        )\n      }\n    }\n\n    if (is.null(digits) & is.null(round)) {\n      bind_mn <- data.frame(rs_df[\"mean\"][f_ind, 1])\n      bind_sd <- data.frame(rs_df[\"sd\"][f_ind, 1])\n      colnames(bind_mn) <- \"mean\"\n      colnames(bind_sd) <- \"sd\"\n\n      if (HPD == FALSE) {\n        if (length(probs) == 1) {\n          bind_q <- data.frame(apply(\n            ch_bind,\n            2,\n            stats::quantile,\n            probs = probs\n          ))\n          colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n        } else {\n          if (identical(probs, c(0.025, 0.5, 0.975)) == TRUE) {\n            bind_LCI <- rs_df[\"X2.5.\"][f_ind, 1]\n            bind_med <- rs_df[\"X50.\"][f_ind, 1]\n            bind_UCI <- rs_df[\"X97.5.\"][f_ind, 1]\n            bind_q <- data.frame(cbind(bind_LCI, bind_med, bind_UCI))\n            colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n          } else {\n            bind_q <- data.frame(t(apply(\n              ch_bind,\n              2,\n              stats::quantile,\n              probs = probs\n            )))\n            colnames(bind_q) <- paste0(signif(probs * 100, digits = 3), \"%\")\n          }\n        }\n      }\n      if (HPD == TRUE) {\n        if (length(hpd_prob) > 1) {\n          stop(\n            'Specify only a single probability for HPD interval computation.'\n          )\n        }\n        bind_q <- data.frame(coda::HPDinterval(\n          coda::as.mcmc(ch_bind),\n          prob = hpd_prob\n        ))\n        colnames(bind_q) <- c(\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDL\"),\n          paste0(signif(hpd_prob * 100, digits = 3), \"%_HPDU\")\n        )\n      }\n    }\n    x[[1]] <- cbind(bind_mn, bind_sd, bind_q)\n\n    # rhat - rhat in Stan calculated within chain (different than with coda package)\n\n    if (Rhat == TRUE) {\n      r_hat <- data.frame(round(rs_df[\"Rhat\"][f_ind, 1], digits = 2))\n      colnames(r_hat) <- \"Rhat\"\n      x[[(length(x) + 1)]] <- r_hat\n    }\n\n    # neff - neff in Stan is calculated within chain (different than with coda package)\n\n    if (n.eff == TRUE) {\n      if (methods::is(object2, 'stanfit')) {\n        neff <- data.frame(round(rs_df[\"n_eff\"][f_ind, 1], digits = 0))\n      }\n      if (methods::is(object, 'jagsUI')) {\n        neff <- data.frame(round(rs_df[\"n.eff\"][f_ind, 1], digits = 0))\n      }\n      colnames(neff) <- \"n_eff\"\n      x[[(length(x) + 1)]] <- neff\n    }\n\n    # p>0\n\n    if (pg0 == TRUE) {\n      tpg <- data.frame(apply(\n        ch_bind,\n        2,\n        function(x) round(sum(x > 0) / length(x), 2)\n      ))\n      colnames(tpg) <- 'p>0'\n      x[[(length(x) + 1)]] <- tpg\n    }\n\n    # custom function\n\n    if (!is.null(func)) {\n      if (!is.null(digits)) {\n        tmp <- signif(apply(ch_bind, 2, func), digits = digits)\n      }\n      if (is.null(digits) & !is.null(round)) {\n        tmp <- round(apply(ch_bind, 2, func), digits = round)\n      }\n      if (is.null(digits) & is.null(round)) {\n        tmp <- apply(ch_bind, 2, func)\n      }\n      if (!is.null(dim(tmp))) {\n        tmp <- data.frame(t(tmp))\n      } else {\n        tmp <- data.frame(tmp)\n      }\n      if (!is.null(func_name)) {\n        if (length(func_name) != NCOL(tmp)) {\n          stop(\"length(func_name) must equal number of func outputs\")\n        }\n        colnames(tmp) <- func_name\n      } else {\n        colnames(tmp) <- 'func'\n      }\n\n      x[[(length(x) + 1)]] <- tmp\n    }\n\n    # bind them\n\n    mcmc_summary <- do.call(\"cbind\", x)\n    row.names(mcmc_summary) <- all_params[f_ind]\n\n    if (variational) {\n      mcmc_summary$Rhat <- NaN\n      mcmc_summary$n.eff <- NaN\n    }\n  }\n  return(mcmc_summary)\n}\n\n#' @noRd\nmcmc_chains = function(\n  object,\n  params = 'all',\n  excl = NULL,\n  ISB = TRUE,\n  exact = TRUE,\n  mcmc.list = FALSE,\n  chain_num = NULL\n) {\n  #for rstanarm/brms objects - set to NULL by default\n  sp_names <- NULL\n\n  #if mcmc object (from nimble) - convert to mcmc.list\n  if (methods::is(object, 'mcmc')) {\n    object <- coda::mcmc.list(object)\n  }\n\n  #if list object of matrices (from nimble) - convert to mcmc.list\n  if (methods::is(object, 'list')) {\n    object <- coda::mcmc.list(lapply(object, function(x) coda::mcmc(x)))\n  }\n\n  if (\n    coda::is.mcmc.list(object) != TRUE &\n      !methods::is(object, 'matrix') &\n      !methods::is(object, 'mcmc') &\n      !methods::is(object, 'list') &\n      !methods::is(object, 'rjags') &\n      !methods::is(object, 'stanfit') &\n      !methods::is(object, 'brmsfit') &\n      !methods::is(object, 'jagsUI') &\n      !methods::is(object, 'CmdStanMCMC')\n  ) {\n    stop(\n      'Invalid object type. Input must be stanfit object (rstan), CmdStanMCMC object (cmdstanr), stanreg object (rstanarm), brmsfit object (brms), mcmc.list object (coda/rjags), mcmc object (coda/nimble), list object (nimble), rjags object (R2jags), jagsUI object (jagsUI), or matrix with MCMC chains.'\n    )\n  }\n\n  #NAME SORTING BLOCK\n  if (methods::is(object, 'stanfit')) {\n    #convert to mcmc.list\n    temp_in <- rstan::As.mcmc.list(object)\n\n    #assign new colnames for mcmc.list object if object exists (for stanreg and brms objs so parameter names are interpretable) - do not rename params for model fit directly with Stan\n    if (!is.null(sp_names)) {\n      coda::varnames(temp_in) <- sp_names\n    }\n\n    if (ISB == TRUE) {\n      names <- vapply(\n        strsplit(colnames(temp_in[[1]]), split = '[', fixed = TRUE),\n        `[`,\n        1,\n        FUN.VALUE = character(1)\n      )\n    } else {\n      names <- colnames(temp_in[[1]])\n    }\n  }\n\n  if (methods::is(object, 'jagsUI')) {\n    object <- object$samples\n  }\n\n  if (methods::is(object, 'CmdStanMCMC')) {\n    object <- cmdstanr::as_mcmc.list(object)\n  }\n\n  if (coda::is.mcmc.list(object) == TRUE) {\n    temp_in <- object\n    if (is.null(colnames(temp_in[[1]]))) {\n      warning('No parameter names provided. Assigning arbitrary names.')\n      sub_cn <- paste0('Param_', 1:NCOL(temp_in[[1]]))\n      colnames(temp_in[[1]]) <- sub_cn\n    }\n\n    if (ISB == TRUE) {\n      names <- vapply(\n        strsplit(colnames(temp_in[[1]]), split = \"[\", fixed = TRUE),\n        `[`,\n        1,\n        FUN.VALUE = character(1)\n      )\n    } else {\n      names <- colnames(temp_in[[1]])\n    }\n  }\n\n  if (methods::is(object, 'matrix')) {\n    temp_in <- object\n    if (is.null(colnames(temp_in))) {\n      warning(\n        'No parameter names (column names) provided. Assigning arbitrary names.'\n      )\n      sub_cn <- paste0('Param_', 1:NCOL(temp_in))\n      colnames(temp_in) <- sub_cn\n    }\n\n    if (ISB == TRUE) {\n      names <- vapply(\n        strsplit(colnames(temp_in), split = \"[\", fixed = TRUE),\n        `[`,\n        1,\n        FUN.VALUE = character(1)\n      )\n    } else {\n      names <- colnames(temp_in)\n    }\n  }\n\n  if (methods::is(object, 'rjags')) {\n    temp_in <- object$BUGSoutput$sims.matrix\n    if (ISB == TRUE) {\n      names <- vapply(\n        strsplit(\n          rownames(object$BUGSoutput$summary),\n          split = \"[\",\n          fixed = TRUE\n        ),\n        `[`,\n        1,\n        FUN.VALUE = character(1)\n      )\n    } else {\n      names <- rownames(object$BUGSoutput$summary)\n    }\n  }\n\n  #INDEX BLOCK\n  #exclusions\n  if (!is.null(excl)) {\n    rm_ind <- c()\n    for (i in 1:length(excl)) {\n      if (ISB == TRUE) {\n        n_excl <- vapply(\n          strsplit(excl, split = \"[\", fixed = TRUE),\n          `[`,\n          1,\n          FUN.VALUE = character(1)\n        )\n      } else {\n        n_excl <- excl\n      }\n\n      if (exact == TRUE) {\n        ind_excl <- which(names %in% n_excl[i])\n      } else {\n        ind_excl <- grep(n_excl[i], names, fixed = FALSE)\n      }\n\n      if (length(ind_excl) < 1) {\n        warning(paste0(\n          \"\\\"\",\n          excl[i],\n          \"\\\"\",\n          \" not found in MCMC output. Check 'ISB' and 'exact' arguments to make sure the desired parsing methods are being used.\"\n        ))\n      }\n      rm_ind <- c(rm_ind, ind_excl)\n    }\n    if (length(rm_ind) > 0) {\n      dups <- which(duplicated(rm_ind))\n      if (length(dups) > 0) {\n        rm_ind2 <- rm_ind[-dups]\n      } else {\n        rm_ind2 <- rm_ind\n      }\n    } else {\n      excl <- NULL\n    }\n  }\n\n  #selections\n  if (length(params) == 1) {\n    if (params == 'all') {\n      if (is.null(excl)) {\n        f_ind <- 1:length(names)\n      } else {\n        f_ind <- (1:length(names))[-rm_ind2]\n      }\n    } else {\n      if (exact == TRUE) {\n        get_ind <- which(names %in% params)\n      } else {\n        get_ind <- grep(paste(params), names, fixed = FALSE)\n      }\n\n      if (length(get_ind) < 1) {\n        stop(paste0(\n          \"\\\"\",\n          params,\n          \"\\\"\",\n          \" not found in MCMC output. Check `ISB` and `exact` arguments to make sure the desired parsing methods are being used.\"\n        ))\n      }\n      if (!is.null(excl)) {\n        if (identical(get_ind, rm_ind2)) {\n          stop('No parameters selected.')\n        }\n        matched <- stats::na.omit(match(rm_ind2, get_ind))\n        if (length(matched) > 0) {\n          f_ind <- get_ind[-matched]\n        } else {\n          f_ind <- get_ind\n        }\n      } else {\n        f_ind <- get_ind\n      }\n    }\n  } else {\n    grouped <- c()\n    for (i in 1:length(params)) {\n      if (exact == TRUE) {\n        get_ind <- which(names %in% params[i])\n      } else {\n        get_ind <- grep(paste(params[i]), names, fixed = FALSE)\n      }\n\n      if (length(get_ind) < 1) {\n        warning(paste0(\n          \"\\\"\",\n          params[i],\n          \"\\\"\",\n          \" not found in MCMC output. Check 'ISB' and 'exact' arguments to make sure the desired parsing methods are being used.\"\n        ))\n        next()\n      }\n      grouped <- c(grouped, get_ind)\n    }\n    if (!is.null(excl)) {\n      if (identical(grouped, rm_ind2)) {\n        stop('No parameters selected.')\n      }\n      matched <- stats::na.omit(match(rm_ind2, grouped))\n      if (length(matched) > 0) {\n        t_ind <- grouped[-matched]\n      } else {\n        t_ind <- grouped\n      }\n      to.rm <- which(duplicated(t_ind))\n      if (length(to.rm) > 0) {\n        f_ind <- t_ind[-to.rm]\n      } else {\n        f_ind <- t_ind\n      }\n    } else {\n      to.rm <- which(duplicated(grouped))\n      if (length(to.rm) > 0) {\n        f_ind <- grouped[-to.rm]\n      } else {\n        f_ind <- grouped\n      }\n    }\n  }\n\n  #PROCESSING BLOCK\n  if (is.null(chain_num)) {\n    if (coda::is.mcmc.list(object) == TRUE | typeof(object) == 'S4') {\n      if (length(f_ind) > 1) {\n        dsort_mcmc <- do.call(coda::mcmc.list, temp_in[, f_ind])\n        OUT <- do.call('rbind', dsort_mcmc)\n      } else {\n        dsort_mcmc <- do.call(coda::mcmc.list, temp_in[, f_ind, drop = FALSE])\n        OUT <- as.matrix(\n          do.call(coda::mcmc.list, temp_in[, f_ind, drop = FALSE]),\n          ncol = 1\n        )\n      }\n    }\n    if (methods::is(object, 'matrix')) {\n      OUT <- temp_in[, f_ind, drop = FALSE]\n      if (mcmc.list == TRUE) {\n        stop('Cannot produce mcmc.list output with matrix input')\n      }\n    }\n\n    if (methods::is(object, 'rjags')) {\n      OUT <- temp_in[, f_ind, drop = FALSE]\n      if (mcmc.list == TRUE) {\n        #modified coda::as.mcmc (removing ordering of param names)\n        x <- object$BUGSoutput\n        mclist <- vector(\"list\", x$n.chains)\n        mclis <- vector(\"list\", x$n.chains)\n        ord <- dimnames(x$sims.array)[[3]]\n        for (i in 1:x$n.chains) {\n          tmp1 <- x$sims.array[, i, ord]\n          mclis[[i]] <- coda::mcmc(tmp1, thin = x$n.thin)\n        }\n        temp2 <- coda::as.mcmc.list(mclis)\n        #end mod as.mcmc\n        dsort_mcmc <- do.call(coda::mcmc.list, temp2[, f_ind, drop = FALSE])\n      }\n    }\n  }\n\n  if (!is.null(chain_num)) {\n    if (coda::is.mcmc.list(object) == TRUE | typeof(object) == 'S4') {\n      if (length(f_ind) > 1) {\n        dsort <- do.call(coda::mcmc.list, temp_in[, f_ind])\n\n        if (chain_num > length(dsort)) {\n          stop('Invalid value for chain_num specified.')\n        }\n        dsort_mcmc <- dsort[[chain_num]]\n        OUT <- as.matrix(dsort_mcmc)\n      } else {\n        dsort <- do.call(coda::mcmc.list, temp_in[, f_ind, drop = FALSE])\n\n        if (chain_num > length(dsort)) {\n          stop('Invalid value for chain_num specified.')\n        }\n        dsort_mcmc <- dsort[[chain_num]]\n        OUT <- as.matrix(dsort_mcmc)\n      }\n    }\n\n    if (methods::is(object, 'matrix')) {\n      stop(\n        'Cannot extract posterior information for individual chains from matrix input.'\n      )\n    }\n\n    if (methods::is(object, 'rjags')) {\n      #modified coda::as.mcmc (removing ordering of param names)\n      x <- object$BUGSoutput\n      mclist <- vector(\"list\", x$n.chains)\n      mclis <- vector(\"list\", x$n.chains)\n      ord <- dimnames(x$sims.array)[[3]]\n      for (i in 1:x$n.chains) {\n        tmp1 <- x$sims.array[, i, ord]\n        mclis[[i]] <- coda::mcmc(tmp1, thin = x$n.thin)\n      }\n      temp2 <- coda::as.mcmc.list(mclis)\n      #end mod as.mcmc\n      dsort <- do.call(coda::mcmc.list, temp2[, f_ind, drop = FALSE])\n      if (chain_num > length(dsort)) {\n        stop('Invalid value for chain_num specified.')\n      }\n      dsort_mcmc <- dsort[[chain_num]]\n      OUT <- as.matrix(dsort_mcmc)\n    }\n  }\n\n  if (mcmc.list == FALSE) {\n    return(OUT)\n  }\n  if (mcmc.list == TRUE) {\n    return(dsort_mcmc)\n  }\n}\n\n\n#### Vectorise a stan model's likelihood for quicker computation ####\n#' @noRd\n#' @param model_file Stan model file to be edited\n#' @param model_data Prepared mvgam data for Stan modelling\n#' @param family \\code{character}\n#' @param trend_model \\code{character} specifying the time series dynamics for the latent trend.\n#' @param offset \\code{logical}\n#' @param drift \\code{logical}\n#' @param threads \\code{integer} Experimental option to use multithreading for within-chain\n#'parallelisation in \\code{Stan}. We recommend its use only if you are experienced with\n#'\\code{Stan}'s `reduce_sum` function and have a slow running model that cannot be sped\n#'up by any other means\n#' @return A `list` containing the updated Stan model and model data\nvectorise_stan_lik = function(\n  model_file,\n  model_data,\n  family = 'poisson',\n  trend_model = 'None',\n  use_lv = FALSE,\n  offset = FALSE,\n  drift = FALSE,\n  threads = 1\n) {\n  if (family %in% c('binomial', 'beta_binomial', 'bernoulli')) {\n    family <- 'poisson'\n  }\n\n  if (use_lv & trend_model %in% c('None', 'ZMVN')) {\n    trend_model <- 'RW'\n  }\n\n  # Hack for adding VAR1 models\n  if (trend_model %in% c('VAR1', 'VAR1cor')) {\n    VAR1 <- TRUE\n    trend_model <- 'RW'\n  } else {\n    VAR1 <- FALSE\n  }\n\n  # Similar hack for adding piecewise trends\n  if (trend_model %in% c('PWlinear', 'PWlogistic')) {\n    trend_model <- 'RW'\n  }\n\n  #### Family specifications ####\n  if (threads > 1) {\n    if (family == 'gaussian') {\n      if (any(grepl('functions {', model_file, fixed = TRUE))) {\n        model_file[grep('functions {', model_file, fixed = TRUE)] <-\n          paste0(\n            'functions {\\n',\n            'real partial_log_lik(int[] seq, int start, int end,\\n',\n            ifelse(\n              offset,\n              'data vector Y, matrix X, vector b, vector sigma_obs, vector alpha) {\\n',\n              'data vector Y, matrix X, vector b, vector sigma_obs, real alpha) {\\n'\n            ),\n            'real ptarget = 0;\\n',\n            ifelse(\n              offset,\n              'ptarget += normal_id_glm_lpdf(Y[start:end] | X[start:end], alpha[start:end], b, sigma_obs[start:end]);\\n',\n              'ptarget += normal_id_glm_lpdf(Y[start:end] | X[start:end], alpha, b, sigma_obs[start:end]);\\n'\n            ),\n            'return ptarget;\\n',\n            '}\\n'\n          )\n      } else {\n        model_file[grep('Stan model code', model_file)] <-\n          paste0(\n            '// Stan model code generated by package mvgam\\n',\n            'functions {\\n',\n            'real partial_log_lik(int[] seq, int start, int end,\\n',\n            ifelse(\n              offset,\n              'data vector Y, matrix X, vector b, vector sigma_obs, vector alpha) {\\n',\n              'data vector Y, matrix X, vector b, vector sigma_obs, real alpha) {\\n'\n            ),\n            'real ptarget = 0;\\n',\n            ifelse(\n              offset,\n              'ptarget += normal_id_glm_lpdf(Y[start:end] | X[start:end], alpha[start:end], b, sigma_obs[start:end]);\\n',\n              'ptarget += normal_id_glm_lpdf(Y[start:end] | X[start:end], alpha, b, sigma_obs[start:end]);\\n'\n            ),\n            'return ptarget;\\n',\n            '}\\n}\\n'\n          )\n      }\n    }\n\n    if (family == 'poisson') {\n      if (any(grepl('functions {', model_file, fixed = TRUE))) {\n        model_file[grep('functions {', model_file, fixed = TRUE)] <-\n          paste0(\n            'functions {\\n',\n            'real partial_log_lik(int[] seq, int start, int end,\\n',\n            ifelse(\n              offset,\n              'data array[] int Y, matrix X, vector b, vector alpha) {\\n',\n              'data array[] int Y, matrix X, vector b, real alpha) {\\n'\n            ),\n            'real ptarget = 0;\\n',\n            ifelse(\n              offset,\n              'ptarget += poisson_log_glm_lpmf(Y[start:end] | X[start:end], alpha[start:end], b);\\n',\n              'ptarget += poisson_log_glm_lpmf(Y[start:end] | X[start:end], alpha, b);\\n'\n            ),\n            'return ptarget;\\n',\n            '}\\n'\n          )\n      } else {\n        model_file[grep('Stan model code', model_file)] <-\n          paste0(\n            '// Stan model code generated by package mvgam\\n',\n            'functions {\\n',\n            'real partial_log_lik(int[] seq, int start, int end,\\n',\n            ifelse(\n              offset,\n              'data array[] int Y, matrix X, vector b, vector alpha) {\\n',\n              'data array[] int Y, matrix X, vector b, real alpha) {\\n'\n            ),\n            'real ptarget = 0;\\n',\n            ifelse(\n              offset,\n              'ptarget += poisson_log_glm_lpmf(Y[start:end] | X[start:end], alpha[start:end], b);\\n',\n              'ptarget += poisson_log_glm_lpmf(Y[start:end] | X[start:end], alpha, b);\\n'\n            ),\n            'return ptarget;\\n',\n            '}\\n}\\n'\n          )\n      }\n    }\n\n    if (family == 'lognormal') {\n      if (any(grepl('functions {', model_file, fixed = TRUE))) {\n        model_file[grep('functions {', model_file, fixed = TRUE)] <-\n          paste0(\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector sigma_obs) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += lognormal_lpdf(Y[start:end] | mu[start:end],\\n',\n            'sigma_obs[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n'\n          )\n      } else {\n        model_file[grep('Stan model code', model_file)] <-\n          paste0(\n            '// Stan model code generated by package mvgam\\n',\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector sigma_obs) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += lognormal_lpdf(Y[start:end] | mu[start:end],\\n',\n            'sigma_obs[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n}'\n          )\n      }\n    }\n\n    if (family == 'beta') {\n      if (any(grepl('functions {', model_file, fixed = TRUE))) {\n        model_file[grep('functions {', model_file, fixed = TRUE)] <-\n          paste0(\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector phi) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += beta_lpdf(Y[start:end] | inv_logit(mu[start:end]) .* phi[start:end],\\n',\n            '(1 - inv_logit(mu[start:end])) .* phi[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n'\n          )\n      } else {\n        model_file[grep('Stan model code', model_file)] <-\n          paste0(\n            '// Stan model code generated by package mvgam\\n',\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector phi) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += beta_lpdf(Y[start:end] | inv_logit(mu[start:end]) .* phi[start:end],\\n',\n            '(1 - inv_logit(mu[start:end])) .* phi[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n}'\n          )\n      }\n    }\n\n    if (family == 'student') {\n      if (any(grepl('functions {', model_file, fixed = TRUE))) {\n        model_file[grep('functions {', model_file, fixed = TRUE)] <-\n          paste0(\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector sigma_obs, vector nu) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += student_t_lpdf(Y[start:end] | nu[start:end], mu[start:end],\\n',\n            'sigma_obs[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n'\n          )\n      } else {\n        model_file[grep('Stan model code', model_file)] <-\n          paste0(\n            '// Stan model code generated by package mvgam\\n',\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector sigma_obs, vector nu) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += student_t_lpdf(Y[start:end] | nu[start:end], mu[start:end],\\n',\n            'sigma_obs[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n}'\n          )\n      }\n    }\n\n    if (family == 'negative binomial') {\n      if (any(grepl('functions {', model_file, fixed = TRUE))) {\n        model_file[grep('functions {', model_file, fixed = TRUE)] <-\n          paste0(\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data array[] int Y, vector mu, array[] real phi) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += neg_binomial_2_lpmf(Y[start:end] | mu[start:end],\\n',\n            'inv(phi[start:end]));\\n',\n            'return ptarget;\\n',\n            '}\\n'\n          )\n      } else {\n        model_file[grep('Stan model code', model_file)] <-\n          paste0(\n            '// Stan model code generated by package mvgam\\n',\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data array[] int Y, vector mu, array[] real phi) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += neg_binomial_2_lpmf(Y[start:end] | mu[start:end],\\n',\n            'inv(phi[start:end]));\\n',\n            'return ptarget;\\n',\n            '}\\n}'\n          )\n      }\n    }\n\n    if (family == 'Gamma') {\n      if (any(grepl('functions {', model_file, fixed = TRUE))) {\n        model_file[grep('functions {', model_file, fixed = TRUE)] <-\n          paste0(\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector shape) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += gamma_lpdf(Y[start:end] | shape[start:end], shape[start:end] ./ mu[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n'\n          )\n      } else {\n        model_file[grep('Stan model code', model_file)] <-\n          paste0(\n            '// Stan model code generated by package mvgam\\n',\n            'functions {\\n',\n            'real partial_log_lik(array[] int seq, int start, int end,\\n',\n            'data vector Y, vector mu, vector shape) {\\n',\n            'real ptarget = 0;\\n',\n            'ptarget += gamma_lpdf(Y[start:end] | shape[start:end], shape[start:end] ./ mu[start:end]);\\n',\n            'return ptarget;\\n',\n            '}\\n}'\n          )\n      }\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  lik_line <- grep('// likelihood functions', model_file, fixed = TRUE)\n  model_file <- model_file[-c(lik_line:(lik_line + 6))]\n\n  if (family == 'gaussian') {\n    if (threads > 1) {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_sigma_obs;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];\\n',\n        'target += reduce_sum(partial_log_lik, seq,\\n',\n        'grainsize,\\n',\n        'flat_ys,\\n',\n        'append_col(flat_xs, flat_trends),\\n',\n        'append_row(b, 1.0),\\n',\n        'flat_sigma_obs,\\n',\n        ifelse(offset, 'offset[obs_ind],\\n);\\n}\\n', '0.0);\\n}\\n}\\n')\n      )\n    } else {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_sigma_obs;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];\\n',\n        'flat_ys ~ normal_id_glm(append_col(flat_xs, flat_trends),\\n',\n        ifelse(offset, 'offset[obs_ind],', '0.0,'),\n        'append_row(b, 1.0),\\n',\n        'flat_sigma_obs);\\n}\\n}\\n'\n      )\n    }\n  }\n\n  if (family == 'poisson') {\n    if (threads > 1) {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'target += reduce_sum(partial_log_lik, seq,\\n',\n        'grainsize,\\n',\n        'flat_ys,\\n',\n        'append_col(flat_xs, flat_trends),\\n',\n        'append_row(b, 1.0),\\n',\n        ifelse(offset, 'offset[obs_ind]);\\n}\\n', '0.0);\\n}\\n}\\n')\n      )\n    } else {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends),\\n',\n        ifelse(offset, 'offset[obs_ind],', '0.0,'),\n        'append_row(b, 1.0));\\n}\\n}\\n'\n      )\n    }\n  }\n\n  if (family == 'lognormal') {\n    if (threads > 1) {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_sigma_obs;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];\\n',\n        'target += reduce_sum(partial_log_lik, seq,\\n',\n        'grainsize,\\n',\n        'flat_ys,\\n',\n        ifelse(\n          offset,\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind],\\n',\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0),\\n'\n        ),\n        'flat_sigma_obs);\\n}\\n}\\n'\n      )\n    } else {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_sigma_obs;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];\\n',\n        'flat_ys ~ lognormal(\\n',\n        ifelse(\n          offset,\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind],\\n',\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0),\\n'\n        ),\n        'flat_sigma_obs);\\n}\\n}\\n'\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (family == 'beta') {\n    if (threads > 1) {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_phis;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_phis = rep_each(phi, n)[obs_ind];\\n',\n        'target += reduce_sum(partial_log_lik, seq,\\n',\n        'grainsize,\\n',\n        'flat_ys,\\n',\n        ifelse(\n          offset,\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind],\\n',\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0),\\n'\n        ),\n        'flat_phis);\\n}\\n}\\n'\n      )\n    } else {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_phis;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_phis = rep_each(phi, n)[obs_ind];\\n',\n        'flat_ys ~ beta(\\n',\n        ifelse(\n          offset,\n          'inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind]) .* flat_phis,\\n',\n          'inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0)) .* flat_phis,\\n'\n        ),\n        ifelse(\n          offset,\n          '(1 - inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind])) .* flat_phis);\\n}\\n}\\n',\n          '(1 - inv_logit(append_col(flat_xs, flat_trends) * append_row(b, 1.0))) .* flat_phis);\\n}\\n}\\n'\n        )\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (family == 'Gamma') {\n    if (threads > 1) {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_shapes;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_shapes = rep_each(shape, n)[obs_ind];\\n',\n        'target += reduce_sum(partial_log_lik, seq,\\n',\n        'grainsize,\\n',\n        'flat_ys,\\n',\n        ifelse(\n          offset,\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind]),\\n',\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0)),\\n'\n        ),\n        'flat_shapes);\\n}\\n}\\n'\n      )\n    } else {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_shapes;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_shapes = rep_each(shape, n)[obs_ind];\\n',\n        'flat_ys ~ gamma(\\n',\n        'flat_shapes, flat_shapes ./ ',\n        ifelse(\n          offset,\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind])',\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0))'\n        ),\n        ');\\n}\\n}\\n'\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (family == 'student') {\n    if (threads > 1) {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_sigma_obs;\\n',\n        'vector[n_nonmissing] flat_nu;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];\\n',\n        'flat_nu = rep_each(nu, n)[obs_ind];\\n',\n        'target += reduce_sum(partial_log_lik, seq,\\n',\n        'grainsize,\\n',\n        'flat_ys,\\n',\n        ifelse(\n          offset,\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind],\\n',\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0),\\n'\n        ),\n        'flat_sigma_obs, flat_nu);\\n}\\n}\\n'\n      )\n    } else {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'vector[n_nonmissing] flat_sigma_obs;\\n',\n        'vector[n_nonmissing] flat_nu;\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];\\n',\n        'flat_nu = rep_each(nu, n)[obs_ind];\\n',\n        'flat_ys ~ student_t(flat_nu,\\n',\n        ifelse(\n          offset,\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind],\\n',\n          'append_col(flat_xs, flat_trends) * append_row(b, 1.0),\\n'\n        ),\n        'flat_sigma_obs);\\n}\\n}\\n'\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (family == 'negative binomial') {\n    if (threads > 1) {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'real flat_phis[n_nonmissing];\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]);\\n',\n        'target += reduce_sum(partial_log_lik, seq,\\n',\n        'grainsize,\\n',\n        'flat_ys,\\n',\n        ifelse(\n          offset,\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind]),\\n',\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0)),\\n'\n        ),\n        'flat_phis);\\n}\\n}\\n'\n      )\n    } else {\n      model_file[lik_line] <- paste0(\n        '{\\n// likelihood functions\\n',\n        'vector[n_nonmissing] flat_trends;\\n',\n        'real flat_phis[n_nonmissing];\\n',\n        'flat_trends = (to_vector(trend))[obs_ind];\\n',\n        'flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]);\\n',\n        'flat_ys ~ neg_binomial_2(\\n',\n        ifelse(\n          offset,\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0) + offset[obs_ind]),\\n',\n          'exp(append_col(flat_xs, flat_trends) * append_row(b, 1.0)),\\n'\n        ),\n        'inv(flat_phis));\\n}\\n}\\n'\n      )\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Add the rep_each function to replicate series-varying parameters for particular families\n  if (\n    family %in%\n      c(\n        'negative binomial',\n        'gaussian',\n        'lognormal',\n        'student',\n        'Gamma',\n        'beta'\n      )\n  ) {\n    model_file <- readLines(textConnection(model_file), n = -1)\n    if (any(grepl('functions {', model_file, fixed = TRUE))) {\n      model_file[grep('functions {', model_file, fixed = TRUE)] <-\n        paste0(\n          'functions {\\n',\n          'vector rep_each(vector x, int K) {\\n',\n          'int N = rows(x);\\n',\n          'vector[N * K] y;\\n',\n          'int pos = 1;\\n',\n          'for (n in 1:N) {\\n',\n          'for (k in 1:K) {\\n',\n          'y[pos] = x[n];\\n',\n          'pos += 1;\\n',\n          '}\\n',\n          '}\\n',\n          'return y;\\n',\n          '}\\n'\n        )\n    } else {\n      model_file[grep('Stan model code', model_file)] <-\n        paste0(\n          '// Stan model code generated by package mvgam\\n',\n          'functions {\\n',\n          'vector rep_each(vector x, int K) {\\n',\n          'int N = rows(x);\\n',\n          'vector[N * K] y;\\n',\n          'int pos = 1;\\n',\n          'for (n in 1:N) {\\n',\n          'for (k in 1:K) {\\n',\n          'y[pos] = x[n];\\n',\n          'pos += 1;\\n',\n          '}\\n',\n          '}\\n',\n          'return y;\\n',\n          '}\\n}'\n        )\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  #### Data modifications ####\n  # Gather the number of nonmissing observations\n  model_data$n_nonmissing <- length(which(model_data$y_observed == 1))\n\n  # Grab indices of nonmissing ys and include reduced sets of ys and Xs\n  model_data$obs_ind <- which(as.vector(model_data$y_observed) == 1)\n  model_data$flat_ys <- as.vector(model_data$y)[which(\n    as.vector(model_data$y_observed) == 1\n  )]\n  model_data$X <- t(model_data$X)\n  model_data$flat_xs <- as.matrix(model_data$X[\n    as.vector(model_data$ytimes)[model_data$obs_ind],\n  ])\n\n  # Add a grainsize integer\n  if (threads > 1) {\n    model_data$seq <- 1:model_data$n_nonmissing\n    model_data$grainsize <- max(\n      100,\n      floor(length(as.vector(model_data$y)) / threads)\n    )\n  }\n\n  # Update the data statement\n  obs_line <- grep(\n    'int<lower=0, upper=1> y_observed[n, n_series]; // indices of missing vs observed',\n    model_file,\n    fixed = TRUE\n  )\n  model_file <- model_file[-c(obs_line:(obs_line + 2))]\n\n  obs_format <- 'int<lower=0> flat_ys[n_nonmissing];'\n  if (family %in% c('gaussian', 'student')) {\n    obs_format <- 'vector[n_nonmissing] flat_ys;'\n  }\n  if (family %in% c('Gamma', 'lognormal')) {\n    obs_format <- 'vector<lower=0>[n_nonmissing] flat_ys;'\n  }\n  if (family == 'beta') {\n    obs_format <- 'vector<lower=0,upper=1>[n_nonmissing] flat_ys;'\n  }\n\n  if (threads > 1) {\n    model_file[obs_line] <- paste0(\n      'int<lower=0> n_nonmissing;',\n      ' // number of nonmissing observations\\n',\n      obs_format,\n      ' // flattened nonmissing observations\\n',\n      'matrix[n_nonmissing, num_basis] flat_xs;',\n      ' // X values for nonmissing observations\\n',\n      'int<lower=0> obs_ind[n_nonmissing];',\n      ' // indices of nonmissing observations\\n',\n      'int<lower=1> grainsize;',\n      ' // grainsize for reduce_sum threading\\n',\n      'int<lower=1> seq[n_nonmissing];',\n      ' // an integer sequence for reduce_sum slicing\\n',\n      '}'\n    )\n  } else {\n    model_file[obs_line] <- paste0(\n      'int<lower=0> n_nonmissing;',\n      ' // number of nonmissing observations\\n',\n      obs_format,\n      ' // flattened nonmissing observations\\n',\n      'matrix[n_nonmissing, num_basis] flat_xs;',\n      ' // X values for nonmissing observations\\n',\n      'int<lower=0> obs_ind[n_nonmissing];',\n      ' // indices of nonmissing observations\\n',\n      '}'\n    )\n  }\n\n  # Some final edits to improve efficiency of the Stan models\n  model_file <- gsub(\n    'row_vector[num_basis] b_raw;',\n    'vector[num_basis] b_raw;',\n    model_file,\n    fixed = TRUE\n  )\n  model_file <- gsub(\n    'row_vector[num_basis] b;',\n    'vector[num_basis] b;',\n    model_file,\n    fixed = TRUE\n  )\n  model_file <- gsub(\n    'matrix[num_basis, total_obs] X; // transposed mgcv GAM design matrix',\n    'matrix[total_obs, num_basis] X; // mgcv GAM design matrix',\n    model_file,\n    fixed = TRUE\n  )\n  model_file <- model_file[\n    -(grep(\n      '// GAM contribution to expectations (log scale)',\n      model_file,\n      fixed = TRUE\n    ):(grep(\n      '// GAM contribution to expectations (log scale)',\n      model_file,\n      fixed = TRUE\n    ) +\n      5))\n  ]\n\n  if (trend_model == 'GP') {\n    model_file <- model_file[\n      -(grep('eta = to_vector(b * X);', model_file, fixed = TRUE))\n    ]\n    model_file <- model_file[\n      -((grep(\n        'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];',\n        model_file,\n        fixed = TRUE\n      ) -\n        1):(grep(\n        'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];',\n        model_file,\n        fixed = TRUE\n      ) +\n        1))\n    ]\n  } else {\n    model_file <- model_file[\n      -(grep('eta = to_vector(b * X);', model_file, fixed = TRUE):(grep(\n        'eta = to_vector(b * X);',\n        model_file,\n        fixed = TRUE\n      ) +\n        4))\n    ]\n  }\n\n  model_file <- model_file[\n    -((grep('// posterior predictions', model_file, fixed = TRUE) + 1):(grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    ) +\n      3))\n  ]\n  model_file[grep(\n    'generated quantities {',\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    'generated quantities {\\n',\n    'vector[total_obs] eta;\\n',\n    'matrix[n, n_series] mus;'\n  )\n  if (family == 'poisson') {\n    model_file[grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      '// posterior predictions\\n',\n      ifelse(offset, 'eta = X * b + offset;\\n', 'eta = X * b;\\n'),\n      'for(s in 1:n_series){ \\n',\n      'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n      'ypred[1:n, s] = poisson_log_rng(mus[1:n, s]);\\n',\n      '}'\n    )\n  }\n\n  if (family == 'negative binomial') {\n    model_file[grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      '// posterior predictions\\n',\n      ifelse(offset, 'eta = X * b + offset;\\n', 'eta = X * b;\\n'),\n      'for(s in 1:n_series){ \\n',\n      'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n      'ypred[1:n, s] = neg_binomial_2_rng(exp(mus[1:n, s]), phi_vec[1:n, s]);\\n',\n      '}'\n    )\n  }\n\n  if (family == 'gaussian') {\n    model_file[grep(\n      'array[n, n_series] int ypred;',\n      model_file,\n      fixed = TRUE\n    )] <- 'array[n, n_series] real ypred;'\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file[grep(\n      'vector[num_basis] b_raw;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'vector[num_basis] b_raw;\\n',\n      '// gaussian observation error\\n',\n      'vector<lower=0>[n_series] sigma_obs;'\n    )\n    model_file[\n      grep('// likelihood functions', model_file, fixed = TRUE) - 1\n    ] <- paste0(\n      '// priors for observation error parameters\\n',\n      'sigma_obs ~ student_t(3, 0, 2);\\n',\n      '{'\n    )\n    model_file[grep(\n      'matrix[n, n_series] mus;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'matrix[n, n_series] sigma_obs_vec;\\n',\n      'matrix[n, n_series] mus;'\n    )\n    model_file[grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      '// posterior predictions\\n',\n      ifelse(offset, 'eta = X * b + offset;\\n', 'eta = X * b;\\n'),\n      'for (s in 1:n_series) {\\n',\n      'sigma_obs_vec[1:n,s] = rep_vector(sigma_obs[s], n);\\n',\n      '}\\n',\n      'for(s in 1:n_series){ \\n',\n      'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n      'ypred[1:n, s] = normal_rng(mus[1:n, s], sigma_obs_vec[1:n, s]);\\n',\n      '}'\n    )\n  }\n\n  if (family == 'student') {\n    model_file[grep(\n      'array[n, n_series] int ypred;',\n      model_file,\n      fixed = TRUE\n    )] <- 'array[n, n_series] real ypred;'\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file[grep(\n      'vector[num_basis] b_raw;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'vector[num_basis] b_raw;\\n',\n      '// student-t observation error\\n',\n      'vector<lower=0>[n_series] sigma_obs;\\n',\n      '// student-t df parameters\\n',\n      'vector<lower=0>[n_series] nu;'\n    )\n    model_file[\n      grep('// likelihood functions', model_file, fixed = TRUE) - 1\n    ] <- paste0(\n      '// priors for observation error parameters\\n',\n      'sigma_obs ~ student_t(3, 0, 2);\\n',\n      '// priors for df parameters\\n',\n      'nu ~ gamma(2, 0.1);\\n',\n      '{'\n    )\n    model_file[grep(\n      'matrix[n, n_series] mus;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'matrix[n, n_series] sigma_obs_vec;\\n',\n      'matrix[n, n_series] nu_vec;\\n',\n      'matrix[n, n_series] mus;'\n    )\n    model_file[grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      '// posterior predictions\\n',\n      ifelse(offset, 'eta = X * b + offset;\\n', 'eta = X * b;\\n'),\n      'for (s in 1:n_series) {\\n',\n      'sigma_obs_vec[1:n,s] = rep_vector(sigma_obs[s], n);\\n',\n      'nu_vec[1:n,s] = rep_vector(nu[s], n);\\n',\n      '}\\n',\n      'for(s in 1:n_series){ \\n',\n      'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n      'ypred[1:n, s] = student_t_rng(nu_vec[1:n, s], mus[1:n, s], sigma_obs_vec[1:n, s]);\\n',\n      '}'\n    )\n  }\n\n  if (family == 'lognormal') {\n    model_file[grep(\n      'array[n, n_series] int ypred;',\n      model_file,\n      fixed = TRUE\n    )] <- 'real<lower=0> ypred[n, n_series];'\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file[grep(\n      'vector[num_basis] b_raw;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'vector[num_basis] b_raw;\\n',\n      '// lognormal observation error\\n',\n      'vector<lower=0>[n_series] sigma_obs;'\n    )\n    model_file[\n      grep('// likelihood functions', model_file, fixed = TRUE) - 1\n    ] <- paste0(\n      '// priors for log(observation error) parameters\\n',\n      'sigma_obs ~ student_t(3, 0, 1);\\n',\n      '{'\n    )\n    model_file[grep(\n      'matrix[n, n_series] mus;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'matrix[n, n_series] sigma_obs_vec;\\n',\n      'matrix[n, n_series] mus;'\n    )\n    model_file[grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      '// posterior predictions\\n',\n      ifelse(offset, 'eta = X * b + offset;\\n', 'eta = X * b;\\n'),\n      'for (s in 1:n_series) {\\n',\n      'sigma_obs_vec[1:n,s] = rep_vector(sigma_obs[s], n);\\n',\n      '}\\n',\n      'for(s in 1:n_series){ \\n',\n      'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n      'ypred[1:n, s] = lognormal_rng(mus[1:n, s], sigma_obs_vec[1:n, s]);\\n',\n      '}'\n    )\n  }\n\n  if (family == 'beta') {\n    model_file[grep(\n      'array[n, n_series] int ypred;',\n      model_file,\n      fixed = TRUE\n    )] <- 'real<lower=0,upper=1> ypred[n, n_series];'\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file[grep(\n      'vector[num_basis] b_raw;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'vector[num_basis] b_raw;\\n',\n      '// Beta precision parameters\\n',\n      'vector<lower=0>[n_series] phi;'\n    )\n    model_file[\n      grep('// likelihood functions', model_file, fixed = TRUE) - 1\n    ] <- paste0(\n      '// priors for precision parameters\\n',\n      'phi ~ gamma(0.01, 0.01);\\n',\n      '{'\n    )\n    model_file[grep(\n      'matrix[n, n_series] mus;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0('matrix[n, n_series] phi_vec;\\n', 'matrix[n, n_series] mus;')\n    model_file[grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      '// posterior predictions\\n',\n      ifelse(offset, 'eta = X * b + offset;\\n', 'eta = X * b;\\n'),\n      'for (s in 1:n_series) {\\n',\n      'phi_vec[1:n,s] = rep_vector(phi[s], n);\\n',\n      '}\\n',\n      'for(s in 1:n_series){ \\n',\n      'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n      'ypred[1:n, s] = beta_rng(inv_logit(mus[1:n, s]) .* phi_vec[1:n, s], (1 - inv_logit(mus[1:n, s])) .* phi_vec[1:n, s]);\\n',\n      '}'\n    )\n  }\n\n  if (family == 'Gamma') {\n    model_file[grep(\n      'array[n, n_series] int ypred;',\n      model_file,\n      fixed = TRUE\n    )] <- 'real<lower=0> ypred[n, n_series];'\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file[grep(\n      'vector[num_basis] b_raw;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      'vector[num_basis] b_raw;\\n',\n      '// Gamma shape parameters\\n',\n      'vector<lower=0>[n_series] shape;'\n    )\n    model_file[\n      grep('// likelihood functions', model_file, fixed = TRUE) - 1\n    ] <- paste0(\n      '// priors for shape parameters\\n',\n      'shape ~ gamma(0.01, 0.01);\\n',\n      '{'\n    )\n    model_file[grep(\n      'matrix[n, n_series] mus;',\n      model_file,\n      fixed = TRUE\n    )] <- paste0('matrix[n, n_series] shape_vec;\\n', 'matrix[n, n_series] mus;')\n    model_file[grep(\n      '// posterior predictions',\n      model_file,\n      fixed = TRUE\n    )] <- paste0(\n      '// posterior predictions\\n',\n      ifelse(offset, 'eta = X * b + offset;\\n', 'eta = X * b;\\n'),\n      'for (s in 1:n_series) {\\n',\n      'shape_vec[1:n,s] = rep_vector(shape[s], n);\\n',\n      '}\\n',\n      'for(s in 1:n_series){ \\n',\n      'mus[1:n, s] = eta[ytimes[1:n, s]] + trend[1:n, s];\\n',\n      'ypred[1:n, s] = gamma_rng(shape_vec[1:n, s], shape_vec[1:n, s] ./ exp(mus[1:n, s]));\\n',\n      '}'\n    )\n  }\n\n  #### Trend modifications ####\n  # Vectorise trend models\n  if (trend_model == 'RW') {\n    if (any(grepl('// dynamic factor estimates', model_file, fixed = TRUE))) {\n      init_trend_line <- grep(\n        'LV_raw[1, j] ~ normal(0, 0.1)',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'LV_raw[1, 1:n_lv] ~ normal(0, 0.1);'\n\n      if (drift) {} else {\n        remainder_line <- grep(\n          'LV_raw[2:n, j] ~ normal(LV_raw[1:(n - 1), j], 0.1)',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(remainder_line:(remainder_line + 2))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(j in 1:n_lv){\\n',\n            'LV_raw[2:n, j] ~ normal(LV_raw[1:(n - 1), j], 0.1);\\n',\n            '}'\n          )\n      }\n\n      model_file = readLines(textConnection(model_file), n = -1)\n    } else {\n      init_trend_line <- grep(\n        'trend[1, s] ~ normal(0, sigma[s])',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'trend[1, 1:n_series] ~ normal(0, sigma);'\n\n      if (drift) {} else {\n        remainder_line <- grep(\n          'trend[2:n, s] ~ normal(trend[1:(n - 1), s], sigma[s])',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(remainder_line:(remainder_line + 2))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(s in 1:n_series){\\n',\n            'trend[2:n, s] ~ normal(trend[1:(n - 1), s], sigma[s]);\\n',\n            '}'\n          )\n        model_file = readLines(textConnection(model_file), n = -1)\n      }\n    }\n  }\n\n  if (trend_model == 'CAR1') {\n    if (any(grepl('// dynamic factor estimates', model_file, fixed = TRUE))) {\n      init_trend_line <- grep(\n        'LV_raw[1, j] ~ normal(0, 0.1)',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'LV_raw[1, 1:n_lv] ~ normal(0, 0.1);'\n\n      remainder_line <- grep(\n        'LV_raw[2:n, j] ~ normal(ar1[j] * LV_raw[1:(n - 1), j], 0.1)',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(remainder_line:(remainder_line + 2))]\n      model_file[remainder_line] <-\n        paste0(\n          'for(j in 1:n_lv){\\n',\n          'LV_raw[2:n, j] ~ normal(pow(ar1[j], to_vector(time_dis[2:n, j])) .* LV_raw[1:(n - 1), j], 0.1);\\n',\n          '}'\n        )\n      model_file = readLines(textConnection(model_file), n = -1)\n    } else {\n      init_trend_line <- grep(\n        'trend[1, s] ~ normal(0, sigma[s])',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'trend[1, 1:n_series] ~ normal(0, sigma);'\n\n      remainder_line <- grep(\n        'trend[2:n, s] ~ normal(ar1[s] * trend[1:(n - 1), s], sigma[s])',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(remainder_line:(remainder_line + 2))]\n      model_file[remainder_line] <-\n        paste0(\n          'for(s in 1:n_series){\\n',\n          'trend[2:n, s] ~ normal(pow(ar1[s], to_vector(time_dis[2:n, s])) ',\n          '.* trend[1:(n - 1), s], ',\n          'sigma[s] * (1 - ar1[s]^(2*to_vector(time_dis[2:n, s]))) / (1 - ar1[s]^2));\\n',\n          '}'\n        )\n      model_file = readLines(textConnection(model_file), n = -1)\n    }\n  }\n\n  if (trend_model == 'AR1') {\n    if (any(grepl('// dynamic factor estimates', model_file, fixed = TRUE))) {\n      init_trend_line <- grepws(\n        'LV_raw[1, j] ~ normal(0, 0.1)',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'LV_raw[1, 1:n_lv] ~ normal(0, 0.1);'\n\n      if (drift) {} else {\n        remainder_line <- grepws(\n          'LV_raw[2:n, j] ~ normal(ar1[j] * LV_raw[1:(n - 1), j], 0.1)',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(remainder_line:(remainder_line + 2))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(j in 1:n_lv){\\n',\n            'LV_raw[2:n, j] ~ normal(ar1[j] * LV_raw[1:(n - 1), j], 0.1);\\n',\n            '}'\n          )\n      }\n\n      model_file = readLines(textConnection(model_file), n = -1)\n    } else {\n      init_trend_line <- grepws(\n        'trend[1, s] ~ normal(0, sigma[s])',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'trend[1, 1:n_series] ~ normal(0, sigma);'\n\n      if (drift) {} else {\n        remainder_line <- grepws(\n          'trend[2:n, s] ~ normal(ar1[s] * trend[1:(n - 1), s], sigma[s])',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(remainder_line:(remainder_line + 2))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(s in 1:n_series){\\n',\n            'trend[2:n, s] ~ normal(ar1[s] * trend[1:(n - 1), s], sigma[s]);\\n',\n            '}'\n          )\n        model_file = readLines(textConnection(model_file), n = -1)\n      }\n    }\n  }\n\n  if (trend_model == 'AR2') {\n    if (any(grepl('// dynamic factor estimates', model_file, fixed = TRUE))) {\n      init_trend_line <- grepws(\n        'LV_raw[1, j] ~ normal(0, 0.1)',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'LV_raw[1, 1:n_lv] ~ normal(0, 0.1);'\n\n      if (drift) {} else {\n        second_line <- grepws(\n          'LV_raw[2, j] ~ normal(LV_raw[1, j] * ar1[j], 0.1)',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(second_line:(second_line + 2))]\n        model_file[second_line] <-\n          'LV_raw[2, 1:n_lv] ~ normal(LV_raw[1, 1:n_lv] * ar1, 0.1);'\n\n        remainder_line <- grepws(\n          'LV_raw[i, j] ~ normal(ar1[j] * LV_raw[i - 1, j] + ar2[j] * LV_raw[i - 2, j]',\n          model_file,\n          fixed = TRUE\n        ) -\n          2\n        model_file <- model_file[-c(remainder_line:(remainder_line + 3))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(j in 1:n_lv){\\n',\n            'LV_raw[3:n, j] ~ normal(ar1[j] * LV_raw[2:(n - 1), j] + ar2[j] * LV_raw[1:(n - 2), j], 0.1);\\n',\n            '}'\n          )\n      }\n      model_file = readLines(textConnection(model_file), n = -1)\n    } else {\n      init_trend_line <- grepws(\n        'trend[1, s] ~ normal(0, sigma[s])',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'trend[1, 1:n_series] ~ normal(0, sigma);'\n\n      if (drift) {} else {\n        second_line <- grep(\n          'trend[2, s] ~ normal(trend[1, s] * ar1[s], sigma[s])',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(second_line:(second_line + 2))]\n        model_file[second_line] <-\n          'trend[2, 1:n_series] ~ normal(trend[1, 1:n_series] * ar1, sigma);'\n\n        remainder_line <- grep(\n          'trend[i, s] ~ normal(ar1[s] * trend[i - 1, s] + ar2[s] * trend[i - 2, s]',\n          model_file,\n          fixed = TRUE\n        ) -\n          2\n        model_file <- model_file[-c(remainder_line:(remainder_line + 3))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(s in 1:n_series){\\n',\n            'trend[3:n, s] ~ normal(ar1[s] * trend[2:(n - 1), s] + ar2[s] * trend[1:(n - 2), s], sigma[s]);\\n',\n            '}'\n          )\n        model_file = readLines(textConnection(model_file), n = -1)\n      }\n    }\n  }\n\n  if (trend_model == 'AR3') {\n    if (any(grepl('// dynamic factor estimates', model_file, fixed = TRUE))) {\n      init_trend_line <- grepws(\n        'LV_raw[1, j] ~ normal(0, 0.1)',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'LV_raw[1, 1:n_lv] ~ normal(0, 0.1);'\n\n      if (drift) {} else {\n        second_line <- grep(\n          'LV_raw[2, j] ~ normal(LV_raw[1, j] * ar1[j], 0.1)',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(second_line:(second_line + 2))]\n        model_file[second_line] <-\n          'LV_raw[2, 1:n_lv] ~ normal(LV_raw[1, 1:n_lv] * ar1, 0.1);'\n\n        third_line <- grep(\n          'LV_raw[3, j] ~ normal(LV_raw[2, j] * ar1[j] + LV_raw[1, j] * ar2[j]',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(third_line:(third_line + 2))]\n        model_file[third_line] <-\n          'LV_raw[3, 1:n_lv] ~ normal(LV_raw[2, 1:n_lv] * ar1 + LV_raw[1, 1:n_lv] * ar2, 0.1);'\n\n        remainder_line <- grep(\n          'LV_raw[i, j] ~ normal(ar1[j] * LV_raw[i - 1, j] + ar2[j] * LV_raw[i - 2, j] + ar3[j] * LV_raw[i - 3, j]',\n          model_file,\n          fixed = TRUE\n        ) -\n          2\n        model_file <- model_file[-c(remainder_line:(remainder_line + 3))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(j in 1:n_lv){\\n',\n            'LV_raw[4:n, j] ~ normal(ar1[j] * LV_raw[3:(n - 1), j] + ar2[j] * LV_raw[2:(n - 2), j] + ar3[j] * LV_raw[1:(n - 3), j], 0.1);\\n',\n            '}'\n          )\n      }\n\n      model_file = readLines(textConnection(model_file), n = -1)\n    } else {\n      init_trend_line <- grepws(\n        'trend[1, s] ~ normal(0, sigma[s])',\n        model_file,\n        fixed = TRUE\n      ) -\n        1\n      model_file <- model_file[-c(init_trend_line:(init_trend_line + 2))]\n      model_file[init_trend_line] <-\n        'trend[1, 1:n_series] ~ normal(0, sigma);'\n\n      if (drift) {} else {\n        second_line <- grepws(\n          'trend[2, s] ~ normal(trend[1, s] * ar1[s], sigma[s])',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(second_line:(second_line + 2))]\n        model_file[second_line] <-\n          'trend[2, 1:n_series] ~ normal(trend[1, 1:n_series] * ar1, sigma);'\n\n        third_line <- grepws(\n          'trend[3, s] ~ normal(trend[2, s] * ar1[s] + trend[1, s] * ar2[s]',\n          model_file,\n          fixed = TRUE\n        ) -\n          1\n        model_file <- model_file[-c(third_line:(third_line + 2))]\n        model_file[third_line] <-\n          'trend[3, 1:n_series] ~ normal(trend[2, 1:n_series] * ar1 + trend[1, 1:n_series] * ar2, sigma);'\n\n        remainder_line <- grepws(\n          'trend[i, s] ~ normal(ar1[s] * trend[i - 1, s] + ar2[s] * trend[i - 2, s] + ar3[s] * trend[i - 3, s]',\n          model_file,\n          fixed = TRUE\n        ) -\n          2\n        model_file <- model_file[-c(remainder_line:(remainder_line + 3))]\n        model_file[remainder_line] <-\n          paste0(\n            'for(s in 1:n_series){\\n',\n            'trend[4:n, s] ~ normal(ar1[s] * trend[3:(n - 1), s] + ar2[s] * trend[2:(n - 2), s] + ar3[s] * trend[1:(n - 3), s], sigma[s]);\\n',\n            '}'\n          )\n        model_file = readLines(textConnection(model_file), n = -1)\n      }\n    }\n  }\n\n  # Clean to remove trend components if this is a 'None' trend model\n  if (trend_model == 'None') {\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file <- gsub(' + trend[1:n, s]', '', model_file, fixed = TRUE)\n    model_file <- gsub(\n      'exp(append_col(flat_xs, flat_trends)',\n      'exp(flat_xs',\n      model_file,\n      fixed = TRUE\n    )\n    model_file <- gsub(\n      'append_col(flat_xs, flat_trends)',\n      'flat_xs',\n      model_file,\n      fixed = TRUE\n    )\n    model_file <- gsub('append_row(b, 1.0)', 'b', model_file, fixed = TRUE)\n    model_file <- model_file[\n      -grep('vector[n_nonmissing] flat_trends;', model_file, fixed = TRUE)\n    ]\n    model_file <- model_file[\n      -grep(\n        'flat_trends = (to_vector(trend))[obs_ind];',\n        model_file,\n        fixed = TRUE\n      )\n    ]\n  }\n\n  # New additions for VAR1 models\n  if (VAR1) {\n    model_file <- model_file[\n      -grep('vector[n_series] tau;', model_file, fixed = TRUE)\n    ]\n    model_file[grep('// latent trends', model_file, fixed = TRUE)] <-\n      '// raw latent trends'\n    model_file[grep('matrix[n, n_series] trend;', model_file, fixed = TRUE)] <-\n      'vector[n_series] trend_raw[n];'\n    model_file[\n      grep('// latent trend variance parameters', model_file, fixed = TRUE) - 1\n    ] <-\n      paste0(\n        '\\n// latent trend VAR1 terms\\n',\n        'matrix<lower=-1,upper=1>[n_series, n_series] A;\\n'\n      )\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file[grep('vector[num_basis] b;', model_file, fixed = TRUE)] <-\n      paste0(\n        'vector[num_basis] b;',\n        '\\n// trend estimates in matrix-form\\n',\n        'matrix[n, n_series] trend;\\n',\n        '\\nfor(i in 1:n){\\n',\n        'trend[i, 1:n_series] = to_row_vector(trend_raw[i]);\\n',\n        '}\\n'\n      )\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file[grep('model {', model_file, fixed = TRUE)] <-\n      paste0(\n        'model {\\n',\n        '// latent trend mean parameters\\n',\n        'vector[n_series] mu[n - 1];\\n'\n      )\n    model_file[grep('sigma ~ exponential(2);', model_file, fixed = TRUE)] <-\n      paste0(\n        'sigma ~ inv_gamma(2.3693353, 0.7311319);\\n\\n',\n        '// VAR coefficients\\n',\n        'to_vector(A) ~ normal(0, 0.5);\\n\\n',\n        '// trend means\\n',\n        'for(i in 2:n){\\n',\n        'mu[i - 1] = A * trend_raw[i - 1];\\n',\n        '}\\n\\n',\n        '// stochastic latent trends (contemporaneously uncorrelated)\\n',\n        'trend_raw[1] ~ normal(0, sigma);\\n',\n        'for(i in 2:n){\\n',\n        'trend_raw[i] ~ normal(mu[i - 1], sigma);\\n',\n        '}\\n'\n      )\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file <- model_file[\n      -c(\n        (grep(\n          \"trend[1, 1:n_series] ~ normal(0, sigma);\",\n          model_file,\n          fixed = TRUE\n        ) -\n          2):(grep(\n          \"trend[1, 1:n_series] ~ normal(0, sigma);\",\n          model_file,\n          fixed = TRUE\n        ) +\n          3)\n      )\n    ]\n    model_file[grep(\"generated quantities {\", model_file, fixed = TRUE)] <-\n      paste0('generated quantities {\\n', 'matrix[n_series, n_series] Sigma;')\n    model_file = readLines(textConnection(model_file), n = -1)\n    model_file <- model_file[\n      -c(\n        (grep(\"tau[s] = pow(sigma[s], -2.0);\", model_file, fixed = TRUE) -\n          1):(grep(\"tau[s] = pow(sigma[s], -2.0);\", model_file, fixed = TRUE) +\n          1)\n      )\n    ]\n    model_file[\n      grep(\"// posterior predictions\", model_file, fixed = TRUE) - 1\n    ] <-\n      paste0('Sigma = diag_matrix(square(sigma));\\n')\n    model_file = readLines(textConnection(model_file), n = -1)\n  }\n\n  # Add time_dis array for tracking length between observations for\n  # continuous time AR models\n  if (trend_model == 'CAR1') {\n    model_file[grep(\n      'int<lower=0> ytimes[n, n_series]; //',\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        'int<lower=0> ytimes[n, n_series]; // time-ordered matrix (which col in X belongs to each [time, series] observation?)\\n',\n        'array[n, n_series] real<lower=0> time_dis; // temporal distances between observations'\n      )\n    model_file = readLines(textConnection(model_file), n = -1)\n  }\n\n  # Change variable 'offset' to 'off_set' to avoid any issues with later\n  # versions of cmdstan\n  if (any(grepl('offset', model_file, fixed = TRUE))) {\n    model_file <- gsub('offset', 'off_set', model_file)\n    model_file <- gsub('off_set vector', 'offset vector', model_file)\n    model_data$off_set <- model_data$offset\n    model_data$offset <- NULL\n  }\n\n  # Tidying the representation\n  if (any(grepl('functions {', model_file, fixed = TRUE))) {\n    model_file <- model_file[\n      -(grep(\n        '// Stan model code generated by package mvgam',\n        model_file,\n        fixed = TRUE\n      ))\n    ]\n    model_file[grep('functions {', model_file, fixed = TRUE)] <-\n      paste0('// Stan model code generated by package mvgam\\n', 'functions {')\n  }\n\n  return(list(\n    model_file = readLines(textConnection(model_file), n = -1),\n    model_data = model_data\n  ))\n}\n\n#### Modifications to Stan code for setting up trend mapping ####\n#' @noRd\ntrend_map_mods = function(\n  model_file,\n  model_data,\n  trend_map,\n  trend_model,\n  n_lv,\n  data_train,\n  ytimes\n) {\n  if (trend_model == 'ZMVN') {\n    trend_model <- 'RW'\n  }\n  if (trend_model != 'VAR1') {\n    # Model code should be modified to remove any priors and modelling for the\n    # latent variable coefficients and sign corrections\n    model_file <- model_file[\n      -c(\n        grep(\n          '// dynamic factor lower triangle loading coefficients',\n          model_file,\n          fixed = TRUE\n        ):(grep(\n          '// dynamic factor lower triangle loading coefficients',\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n    model_file <- model_file[\n      -c(\n        grep(\n          '// Number of non-zero lower triangular factor loadings',\n          model_file,\n          fixed = TRUE\n        ):(grep(\n          '// Number of non-zero lower triangular factor loadings',\n          model_file,\n          fixed = TRUE\n        ) +\n          3)\n      )\n    ]\n    model_file <- model_file[\n      -c(\n        grep(\n          '// constraints allow identifiability of loadings',\n          model_file,\n          fixed = TRUE\n        ):(grep(\n          '// constraints allow identifiability of loadings',\n          model_file,\n          fixed = TRUE\n        ) +\n          15)\n      )\n    ]\n    model_file <- model_file[\n      -grep('matrix[n_series, n_lv] lv_coefs_raw;', model_file, fixed = TRUE)\n    ]\n    model_file <- model_file[\n      -grep('matrix[n_series, n_lv] lv_coefs;', model_file, fixed = TRUE)\n    ]\n    model_file <- model_file[\n      -c(\n        grep(\n          '// priors for dynamic factor loading coefficients',\n          model_file,\n          fixed = TRUE\n        ):(grep(\n          '// priors for dynamic factor loading coefficients',\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n    model_file <- model_file[\n      -c(\n        grep(\n          '// Sign correct factor loadings and factors',\n          model_file,\n          fixed = TRUE\n        ):(grep(\n          '// Sign correct factor loadings and factors',\n          model_file,\n          fixed = TRUE\n        ) +\n          9)\n      )\n    ]\n    model_file <- model_file[\n      -grep('matrix[n, n_lv] LV;', model_file, fixed = TRUE)\n    ]\n    model_file <- gsub('LV_raw', 'LV', model_file)\n    model_file <- gsub('lv_coefs_raw', 'lv_coefs', model_file)\n    model_file[grep(\"matrix[n, n_series] trend;\", model_file, fixed = TRUE)] <-\n      paste0('matrix[n, n_series] trend;\\n', 'matrix[n_series, n_lv] lv_coefs;')\n    model_file[grep(\"// derived latent trends\", model_file, fixed = TRUE)] <-\n      paste0('// derived latent trends\\n', 'lv_coefs = Z;')\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    # We can estimate the variance parameters if a trend map is supplied\n    if (trend_model %in% c('None', 'RW', 'AR1', 'AR2', 'AR3', 'CAR1')) {\n      model_file <- model_file[\n        -grep('vector[num_basis] b_raw;', model_file, fixed = TRUE)\n      ]\n      model_file[grep(\"// raw basis coefficients\", model_file, fixed = TRUE)] <-\n        paste0(\n          '// raw basis coefficients\\n',\n          'vector[num_basis] b_raw;\\n\\n',\n          '// latent factor SD terms\\n',\n          'vector<lower=0>[n_lv] sigma;'\n        )\n\n      model_file[grep(\n        \"// dynamic factor estimates\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          '// priors for factor SD parameters\\n',\n          'sigma ~ exponential(2);\\n',\n          '// dynamic factor estimates'\n        )\n\n      model_file[grep(\n        \"penalty = rep_vector(100.0, n_lv);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"penalty = 1.0 / (sigma .* sigma);\"\n\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, 0.1);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        'LV[1, 1:n_lv] ~ normal(0, sigma);'\n\n      model_file <- readLines(textConnection(model_file), n = -1)\n      model_file <- gsub('j], 0.1', 'j], sigma[j]', model_file)\n    }\n  }\n  if (trend_model == 'VAR1') {\n    model_file[grep(\"// raw latent trends\", model_file, fixed = TRUE)] <-\n      \"// dynamic factors\"\n    model_file[grep(\n      \"vector[n_series] trend_raw[n];\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"vector[n_lv] LV[n];\"\n\n    model_file[grep(\n      \"// trend estimates in matrix-form\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"// trends and dynamic factor loading matrix\"\n    model_file[grep(\"matrix[n, n_series] trend;\", model_file, fixed = TRUE)] <-\n      paste0(\"matrix[n, n_series] trend;\\n\", \"matrix[n_series, n_lv] lv_coefs;\")\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    model_file <- model_file[\n      -c(\n        (grep(\n          \"trend[i, 1:n_series] = to_row_vector(trend_raw[i]);\",\n          model_file,\n          fixed = TRUE\n        ) -\n          1):(grep(\n          \"trend[i, 1:n_series] = to_row_vector(trend_raw[i]);\",\n          model_file,\n          fixed = TRUE\n        ) +\n          1)\n      )\n    ]\n\n    model_file[grep(\n      \"matrix[n_series, n_lv] lv_coefs;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"matrix[n_series, n_lv] lv_coefs;\\n\",\n        \"// derived latent trends\\n\",\n        \"lv_coefs = Z;\\n\",\n        \"for (i in 1:n){\\n\",\n        \"for (s in 1:n_series){\\n\",\n        \"trend[i, s] = dot_product(lv_coefs[s,], LV[i]);\\n\",\n        \"}\\n\",\n        \"}\\n\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    model_file <- gsub('trend_raw', 'LV', model_file)\n\n    model_file[grep(\n      \"vector<lower=0>[n_series] sigma;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"vector<lower=0>[n_lv] sigma;\"\n\n    model_file[grep(\n      \"matrix[n_series, n_series] P_real;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"matrix[n_lv, n_lv] P_real;\"\n\n    model_file[grep(\n      \"matrix[n_series, n_series] A;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"matrix[n_lv, n_lv] A;\"\n\n    model_file[grep(\"vector[n_series] mu[n - 1];\", model_file, fixed = TRUE)] <-\n      \"vector[n_lv] mu[n];\"\n\n    model_file[grep(\n      \"array[n] vector[n_series] mu;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"array[n] vector[n_lv] mu;\"\n\n    model_file[grep(\n      \"matrix[n_series, n_series] Sigma;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"matrix[n_lv, n_lv] Sigma;\"\n\n    model_file[grep(\n      \"matrix[n_series, n_series] P[1];\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"matrix[n_lv, n_lv] P[1];\"\n\n    model_file[grep(\n      \"matrix[n_series, n_series] phiGamma[2, 1];\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"matrix[n_lv, n_lv] phiGamma[2, 1];\"\n\n    model_file[\n      grep(\n        \"diagonal(P_real) ~ normal(Pmu[1], 1 / sqrt(Pomega[1]));\",\n        model_file,\n        fixed = TRUE\n      ) +\n        1\n    ] <-\n      \"for(i in 1:n_lv) {\"\n\n    model_file[\n      grep(\n        \"diagonal(P_real) ~ normal(Pmu[1], 1 / sqrt(Pomega[1]));\",\n        model_file,\n        fixed = TRUE\n      ) +\n        2\n    ] <-\n      \"for(j in 1:n_lv) {\"\n\n    model_file[grep(\n      \"int<lower=0> n; // number of timepoints per series\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"int<lower=0> n; // number of timepoints per series\\n\",\n        \"int<lower=0> n_lv; // number of dynamic factors\"\n      )\n    model_file <- readLines(textConnection(model_file), n = -1)\n\n    if (\n      any(grepl(\n        \"matrix[n_series, n_series] L_Sigma;\",\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      model_file[grep(\n        \"matrix[n_series, n_series] L_Sigma;\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"matrix[n_lv, n_lv] L_Sigma;\"\n\n      model_file[grep(\n        \"cov_matrix[n_series] Sigma;\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"cov_matrix[n_lv] Sigma;\"\n\n      model_file[grep(\n        \"cov_matrix[n_series] Gamma;\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"cov_matrix[n_lv] Gamma;\"\n\n      model_file[grep(\n        \"cholesky_factor_corr[n_series] L_Omega;\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"cholesky_factor_corr[n_lv] L_Omega;\"\n\n      model_file[grep(\n        \"vector[n_series] trend_zeros = rep_vector(0.0, n_series);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"vector[n_lv] trend_zeros = rep_vector(0.0, n_lv);\"\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n  }\n\n  # Need to formulate the lv_coefs matrix and\n  # supply it as data\n  model_file[grep(\n    \"int<lower=0> n_series; // number of series\",\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      \"int<lower=0> n_series; // number of series\\n\",\n      \"matrix[n_series, n_lv] Z; // matrix mapping series to latent trends\"\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Z <- matrix(0, NCOL(ytimes), n_lv)\n  # for(i in 1:NROW(trend_map)){\n  #   Z[as.numeric(data_train$series)[trend_map$series[i]],\n  #            trend_map$trend[i]] <- 1\n  # }\n\n  Z <- matrix(0, NCOL(ytimes), n_lv)\n  for (i in 1:NROW(trend_map)) {\n    rowid <- which(levels(data_train$series) == trend_map$series[i])\n    Z[rowid, trend_map$trend[i]] <- 1\n  }\n\n  model_data$Z <- Z\n  return(list(model_file = model_file, model_data = model_data))\n}\n\n#### Modifications to Stan code for adding predictors to trend models ####\n#' @noRd\nadd_trend_predictors = function(\n  trend_formula,\n  trend_knots,\n  trend_map,\n  trend_model,\n  data_train,\n  data_test,\n  model_file,\n  model_data,\n  drop_trend_int = TRUE,\n  drift = FALSE\n) {\n  #### Creating the trend mvgam model file and data structures ####\n  if (trend_model == 'ZMVN') {\n    trend_model <- 'RW'\n  }\n  # Replace any terms labelled 'trend' with 'series' for creating the necessary\n  # structures\n  trend_formula <- formula(paste(\n    gsub('trend', 'series', as.character(trend_formula), fixed = TRUE),\n    collapse = \" \"\n  ))\n\n  if (missing(trend_knots)) {\n    trend_knots <- rlang::missing_arg()\n  }\n\n  # Drop any intercept from the formula if this is not an N-mixture model\n  # or a trend_map was supplied, as the intercept will almost surely be unidentifiable\n  if (drop_trend_int) {\n    if (attr(terms(trend_formula), 'intercept') == 1) {\n      trend_formula <- update(trend_formula, trend_y ~ . - 1)\n    } else {\n      trend_formula <- update(trend_formula, trend_y ~ .)\n    }\n  } else {\n    trend_formula <- update(trend_formula, trend_y ~ .)\n  }\n\n  trend_train <- data_train\n  trend_train$time <- trend_train$index..time..index\n  trend_train$trend_y <- rnorm(length(trend_train$time))\n\n  # Add indicators of trend names as factor levels using the trend_map\n  trend_indicators <- vector(length = length(trend_train$time))\n  for (i in 1:length(trend_train$time)) {\n    trend_indicators[i] <- trend_map$trend[which(\n      trend_map$series == trend_train$series[i]\n    )]\n  }\n  trend_indicators <- factor(\n    paste0('trend', trend_indicators),\n    levels = paste0('trend', 1:max(trend_map$trend))\n  )\n  trend_train$series <- trend_indicators\n  trend_train$y <- NULL\n\n  # Only keep one time observation per trend\n  data.frame(\n    series = trend_train$series,\n    time = trend_train$time,\n    row_num = 1:length(trend_train$time)\n  ) %>%\n    dplyr::group_by(series, time) %>%\n    dplyr::slice_head(n = 1) %>%\n    dplyr::pull(row_num) -> inds_keep\n\n  if (inherits(trend_train, 'list')) {\n    trend_train <- lapply(trend_train, function(x) {\n      if (is.matrix(x)) {\n        matrix(x[inds_keep, ], ncol = NCOL(x))\n      } else {\n        x[inds_keep]\n      }\n    })\n  } else {\n    trend_train <- trend_train[inds_keep, ]\n  }\n\n  if (!is.null(data_test)) {\n    # If newdata supplied, also create a fake design matrix\n    # for the test data\n    trend_test <- data_test\n    trend_test$time <- trend_test$index..time..index\n    trend_test$trend_y <- rnorm(length(trend_test$time))\n    trend_indicators <- vector(length = length(trend_test$time))\n    for (i in 1:length(trend_test$time)) {\n      trend_indicators[i] <- trend_map$trend[which(\n        trend_map$series == trend_test$series[i]\n      )]\n    }\n    trend_indicators <- as.factor(paste0('trend', trend_indicators))\n    trend_test$series <- trend_indicators\n    trend_test$y <- NULL\n\n    data.frame(\n      series = trend_test$series,\n      time = trend_test$time,\n      row_num = 1:length(trend_test$time)\n    ) %>%\n      dplyr::group_by(series, time) %>%\n      dplyr::slice_head(n = 1) %>%\n      dplyr::pull(row_num) -> inds_keep\n\n    if (inherits(trend_test, 'list')) {\n      trend_test <- lapply(trend_test, function(x) {\n        if (is.matrix(x)) {\n          matrix(x[inds_keep, ], ncol = NCOL(x))\n        } else {\n          x[inds_keep]\n        }\n      })\n    } else {\n      trend_test <- trend_test[inds_keep, ]\n    }\n\n    # Construct the model file and data structures for testing and training\n    trend_mvgam <- mvgam(\n      trend_formula,\n      knots = trend_knots,\n      data = trend_train,\n      newdata = trend_test,\n      family = gaussian(),\n      trend_model = 'None',\n      return_model_data = TRUE,\n      run_model = FALSE,\n      autoformat = FALSE,\n      noncentred = FALSE\n    )\n  } else {\n    # Construct the model file and data structures for training only\n    trend_mvgam <- mvgam(\n      trend_formula,\n      knots = trend_knots,\n      data = trend_train,\n      family = gaussian(),\n      trend_model = 'None',\n      return_model_data = TRUE,\n      run_model = FALSE,\n      autoformat = FALSE,\n      noncentred = FALSE\n    )\n  }\n\n  trend_model_file <- trend_mvgam$model_file\n\n  #### Modifying the model_file and model_data ####\n  # Add lines for the raw trend basis coefficients\n  model_file[grep(\"vector[num_basis] b_raw;\", model_file, fixed = TRUE)] <-\n    paste0(\"vector[num_basis] b_raw;\\n\", \"vector[num_basis_trend] b_raw_trend;\")\n\n  # Add lines to data declarations for trend design matrix\n  model_file[grep(\n    \"matrix[total_obs, num_basis] X; // mgcv GAM design matrix\",\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      \"matrix[total_obs, num_basis] X; // mgcv GAM design matrix\\n\",\n      \"matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix\"\n    )\n\n  model_file[grep(\n    \"int<lower=0> num_basis; // total number of basis coefficients\",\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      \"int<lower=0> num_basis; // total number of basis coefficients\\n\",\n      \"int<lower=0> num_basis_trend; // number of trend basis coefficients\"\n    )\n\n  model_file[grep(\n    \"int<lower=0> ytimes[n, n_series]; // time-ordered matrix (which col in X belongs to each [time, series] observation?)\",\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      \"int<lower=0> ytimes[n, n_series]; // time-ordered matrix (which col in X belongs to each [time, series] observation?)\\n\",\n      \"int<lower=0> ytimes_trend[n, n_lv]; // time-ordered matrix for latent trends\"\n    )\n\n  model_data$ytimes_trend <- trend_mvgam$model_data$ytimes\n  model_data$num_basis_trend <- trend_mvgam$model_data$num_basis\n  model_data$X_trend <- trend_mvgam$model_data$X\n\n  # Update names to reflect process models rather than latent factors\n  model_file[grep(\n    \"// trends and dynamic factor loading matrix\",\n    model_file,\n    fixed = TRUE\n  )] <-\n    \"// latent states and loading matrix\"\n\n  if (trend_model %in% c('None', 'RW', 'AR1', 'AR2', 'AR3', 'CAR1')) {\n    model_file[grep(\"// latent factor SD terms\", model_file, fixed = TRUE)] <-\n      \"// latent state SD terms\"\n    model_file[grep(\n      \"// priors for factor SD parameters\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      \"// priors for latent state SD parameters\"\n  }\n\n  model_file[grep(\n    \"// derived latent trends\",\n    model_file,\n    fixed = TRUE\n  )] <- \"// derived latent states\"\n\n  # Add beta_trend lines\n  b_trend_lines <- trend_model_file[grep('b[', trend_model_file, fixed = TRUE)]\n  b_trend_lines <- gsub('\\\\bb\\\\b', 'b_trend', b_trend_lines)\n  b_trend_lines <- gsub('raw', 'raw_trend', b_trend_lines)\n  b_trend_lines <- gsub('num_basis', 'num_basis_trend', b_trend_lines)\n  b_trend_lines <- gsub('idx', 'trend_idx', b_trend_lines)\n  b_trend_lines <- gsub('l_gp', 'l_gp_trend', b_trend_lines)\n  b_trend_lines <- gsub('k_gp', 'k_gp_trend', b_trend_lines)\n  b_trend_lines <- gsub('alpha_gp', 'alpha_gp_trend', b_trend_lines)\n  b_trend_lines <- gsub('rho_gp', 'rho_gp_trend', b_trend_lines)\n  b_trend_lines <- gsub('z_gp', 'z_gp_trend', b_trend_lines)\n  model_file[grep(\"// derived latent states\", model_file, fixed = TRUE)] <-\n    paste0(\n      '// process model basis coefficients\\n',\n      paste(b_trend_lines, collapse = '\\n'),\n      '\\n\\n// derived latent states'\n    )\n  model_file[grep(\"vector[num_basis] b;\", model_file, fixed = TRUE)] <-\n    paste0(\"vector[num_basis] b;\\n\", \"vector[num_basis_trend] b_trend;\")\n\n  b1_lines <- model_file[min(grep('b[1', model_file, fixed = TRUE))]\n  model_file[min(grep('b[1', model_file, fixed = TRUE))] <-\n    paste0('// observation model basis coefficients\\n', b1_lines)\n\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  trend_smooths_included <- FALSE\n\n  # Add any multinormal smooth lines\n  if (\n    any(grepl('multi_normal_prec', trend_model_file)) |\n      any(grepl('// priors for smoothing parameters', trend_model_file)) |\n      any(grepl('// prior for gp', trend_model_file))\n  ) {\n    trend_smooths_included <- TRUE\n\n    # Replace any indices from trend model so names aren't\n    # conflicting with any possible indices in the observation model\n    if (any(grepl('idx', trend_model_file))) {\n      trend_model_file <- gsub('idx', 'trend_idx', trend_model_file)\n      idx_data <- trend_mvgam$model_data[grep(\n        'idx',\n        names(trend_mvgam$model_data)\n      )]\n      names(idx_data) <- gsub('idx', 'trend_idx', names(idx_data))\n      model_data <- append(model_data, idx_data)\n\n      idx_lines <- c(\n        grep('int trend_idx', trend_model_file),\n        grep('// gp basis coefficient indices', trend_model_file),\n        grep('// monotonic basis coefficient indices', trend_model_file)\n      )\n      model_file[min(grep('data {', model_file, fixed = TRUE))] <-\n        paste0('data {\\n', paste(trend_model_file[idx_lines], collapse = '\\n'))\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    # Check for gp() terms\n    if (\n      any(grepl('l_gp', trend_model_file)) &\n        any(grepl('k_gp', trend_model_file)) &\n        any(grepl('z_gp', trend_model_file))\n    ) {\n      # Add spd_cov functions\n      if (any(grepl('spd_gp_exp_quad', trend_model_file, fixed = TRUE))) {\n        model_file <- add_gp_spd_funs(model_file, kernel = 'exp_quad')\n      }\n      if (any(grepl('spd_gp_exponential', trend_model_file, fixed = TRUE))) {\n        model_file <- add_gp_spd_funs(model_file, kernel = 'exponential')\n      }\n      if (any(grepl('spd_gp_matern32', trend_model_file, fixed = TRUE))) {\n        model_file <- add_gp_spd_funs(model_file, kernel = 'matern32')\n      }\n      if (any(grepl('spd_gp_matern52', trend_model_file, fixed = TRUE))) {\n        model_file <- add_gp_spd_funs(model_file, kernel = 'matern52')\n      }\n\n      # Update gp param names to include 'trend'\n      trend_model_file <- gsub('l_gp', 'l_gp_trend', trend_model_file)\n      trend_model_file <- gsub('k_gp', 'k_gp_trend', trend_model_file)\n      trend_model_file <- gsub('alpha_gp', 'alpha_gp_trend', trend_model_file)\n      trend_model_file <- gsub('rho_gp', 'rho_gp_trend', trend_model_file)\n      trend_model_file <- gsub('z_gp', 'z_gp_trend', trend_model_file)\n      idx_data <- trend_mvgam$model_data[grep(\n        'l_gp',\n        names(trend_mvgam$model_data)\n      )]\n      names(idx_data) <- gsub('l_gp', 'l_gp_trend', names(idx_data))\n      model_data <- append(model_data, idx_data)\n\n      l_lines <- grep(\n        '// approximate gp eigenvalues',\n        trend_model_file,\n        fixed = TRUE\n      )\n      model_file[min(grep('data {', model_file, fixed = TRUE))] <-\n        paste0('data {\\n', paste(trend_model_file[l_lines], collapse = '\\n'))\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (any(grepl('k_gp', trend_model_file))) {\n      idx_data <- trend_mvgam$model_data[grep(\n        'k_gp',\n        names(trend_mvgam$model_data)\n      )]\n      names(idx_data) <- gsub('k_gp', 'k_gp_trend', names(idx_data))\n      model_data <- append(model_data, idx_data)\n\n      k_lines <- grep(\n        '// basis functions for approximate gp',\n        trend_model_file,\n        fixed = TRUE\n      )\n      model_file[min(grep('data {', model_file, fixed = TRUE))] <-\n        paste0('data {\\n', paste(trend_model_file[k_lines], collapse = '\\n'))\n      model_file <- readLines(textConnection(model_file), n = -1)\n\n      # Update the parameters block with gp params\n      start <- grep(\"// gp term sd parameters\", trend_model_file, fixed = TRUE)\n      end <- grep(\n        \"// gp term latent variables\",\n        trend_model_file,\n        fixed = TRUE\n      ) +\n        1\n      last <- end\n      for (i in end:(end + 50)) {\n        if (grepl('vector[k_gp_trend', trend_model_file[i], fixed = TRUE)) {\n          last <- i\n        } else {\n          break\n        }\n      }\n      gp_params <- paste(trend_model_file[start:last], collapse = '\\n')\n\n      model_file[min(grep('parameters {', model_file, fixed = TRUE))] <-\n        paste0('parameters {\\n', gp_params)\n      model_file <- readLines(textConnection(model_file), n = -1)\n    }\n\n    if (\n      any(grepl(\n        \"int<lower=0> n_sp; // number of smoothing parameters\",\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      model_file[grep(\n        \"int<lower=0> n_sp; // number of smoothing parameters\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"int<lower=0> n_sp; // number of smoothing parameters\\n\",\n          \"int<lower=0> n_sp_trend; // number of trend smoothing parameters\"\n        )\n    } else {\n      model_file[grep(\n        \"int<lower=0> n; // number of timepoints per series\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"int<lower=0> n; // number of timepoints per series\\n\",\n          \"int<lower=0> n_sp_trend; // number of trend smoothing parameters\"\n        )\n    }\n    model_data$n_sp_trend <- trend_mvgam$model_data$n_sp\n\n    spline_coef_headers <- trend_model_file[\n      grep('multi_normal_prec', trend_model_file) - 1\n    ]\n    if (any(grepl('normal(0, lambda', trend_model_file, fixed = TRUE))) {\n      idx_headers <- trend_model_file[\n        grep('normal(0, lambda', trend_model_file, fixed = TRUE) - 1\n      ]\n      spline_coef_headers <- c(\n        spline_coef_headers,\n        grep('//', idx_headers, value = TRUE)\n      )\n    }\n\n    if (any(grepl('// prior for gp', trend_model_file))) {\n      spline_coef_headers <- c(\n        spline_coef_headers,\n        trend_model_file[grep(\n          '// prior for gp',\n          trend_model_file,\n          fixed = TRUE\n        )]\n      )\n    }\n    spline_coef_headers <- gsub(\n      '...',\n      '_trend...',\n      spline_coef_headers,\n      fixed = TRUE\n    )\n\n    spline_coef_lines <- trend_model_file[grepl(\n      'multi_normal_prec',\n      trend_model_file\n    )]\n    if (any(grepl('normal(0, lambda', trend_model_file, fixed = TRUE))) {\n      lambda_normals <- (grep(\n        'normal(0, lambda',\n        trend_model_file,\n        fixed = TRUE\n      ))\n      for (i in 1:length(lambda_normals)) {\n        spline_coef_lines <- c(\n          spline_coef_lines,\n          paste(trend_model_file[lambda_normals[i]], collapse = '\\n')\n        )\n      }\n    }\n\n    all_gp_prior_lines = function(model_file, prior_line, max_break = 10) {\n      last <- prior_line + max_break\n      for (i in prior_line:(prior_line + max_break)) {\n        if (!grepl('b_raw[', model_file[i], fixed = TRUE)) {} else {\n          last <- i\n          break\n        }\n      }\n      (prior_line + 1):last\n    }\n\n    if (any(grepl('// prior for gp', trend_model_file))) {\n      starts <- grep('// prior for gp', trend_model_file, fixed = TRUE)\n      ends <- grep('// prior for gp', trend_model_file, fixed = TRUE) + 4\n      for (i in seq_along(starts)) {\n        spline_coef_lines <- c(\n          spline_coef_lines,\n          paste(\n            trend_model_file[all_gp_prior_lines(\n              trend_model_file,\n              starts[i],\n              max_break = 10\n            )],\n            collapse = '\\n'\n          )\n        )\n      }\n    }\n\n    spline_coef_lines <- gsub('_raw', '_raw_trend', spline_coef_lines)\n    spline_coef_lines <- gsub('lambda', 'lambda_trend', spline_coef_lines)\n    spline_coef_lines <- gsub('zero', 'zero_trend', spline_coef_lines)\n    spline_coef_lines <- gsub('S', 'S_trend', spline_coef_lines, fixed = TRUE)\n\n    for (i in seq_along(spline_coef_lines)) {\n      spline_coef_lines[i] <- paste0(\n        spline_coef_headers[i],\n        '\\n',\n        spline_coef_lines[i]\n      )\n    }\n\n    lambda_prior_line <- sub(\n      'lambda',\n      'lambda_trend',\n      trend_model_file[grep('lambda ~', trend_model_file, fixed = TRUE)]\n    )\n    lambda_param_line <- sub(\n      'lambda',\n      'lambda_trend',\n      trend_model_file[grep(\n        'vector<lower=0>[n_sp] lambda;',\n        trend_model_file,\n        fixed = TRUE\n      )]\n    )\n    lambda_param_line <- sub('n_sp', 'n_sp_trend', lambda_param_line)\n\n    if (any(grepl('// dynamic process models', model_file, fixed = TRUE))) {\n      model_file[\n        grep('// dynamic process models', model_file, fixed = TRUE) + 1\n      ] <-\n        paste0(\n          model_file[\n            grep('// dynamic process models', model_file, fixed = TRUE) + 1\n          ],\n          '\\n',\n          paste(spline_coef_lines, collapse = '\\n'),\n          '\\n',\n          lambda_prior_line,\n          '\\n'\n        )\n    } else {\n      if (trend_model != 'VAR1') {\n        model_file[grep(\n          \"// dynamic factor estimates\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// dynamic process models\\n',\n            paste(spline_coef_lines, collapse = '\\n'),\n            '\\n',\n            lambda_prior_line\n          )\n      } else {\n        model_file[grep(\n          '// stochastic latent trends',\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// dynamic process models\\n',\n            paste(spline_coef_lines, collapse = '\\n'),\n            '\\n',\n            lambda_prior_line\n          )\n      }\n    }\n    if (any(grepl(\"vector<lower=0>[n_sp] lambda;\", model_file, fixed = TRUE))) {\n      model_file[grep(\"// dynamic factors\", model_file, fixed = TRUE)] <-\n        \"// latent states\"\n      model_file[grep(\n        \"vector<lower=0>[n_sp] lambda;\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"vector<lower=0>[n_sp] lambda;\\n\",\n          \"vector<lower=0>[n_sp_trend] lambda_trend;\"\n        )\n    } else {\n      if (trend_model != 'VAR1') {\n        model_file <- model_file[\n          -grep(\"matrix[n, n_lv] LV;\", model_file, fixed = TRUE)\n        ]\n        model_file[grep(\"// dynamic factors\", model_file, fixed = TRUE)] <-\n          paste0(\n            \"// latent states\\n\",\n            \"matrix[n, n_lv] LV;\\n\\n\",\n            \"// smoothing parameters\\n\",\n            \"vector<lower=0>[n_sp_trend] lambda_trend;\"\n          )\n      } else {\n        model_file <- model_file[\n          -grep(\"vector[n_lv] LV[n];\", model_file, fixed = TRUE)\n        ]\n        model_file[grep(\"// dynamic factors\", model_file, fixed = TRUE)] <-\n          paste0(\n            \"// latent states\\n\",\n            \"vector[n_lv] LV[n];\\n\\n\",\n            \"// smoothing parameters\\n\",\n            \"vector<lower=0>[n_sp_trend] lambda_trend;\"\n          )\n      }\n    }\n\n    if (\n      any(grepl('mgcv smooth penalty matrix', trend_model_file, fixed = TRUE))\n    ) {\n      S_lines <- trend_model_file[grep(\n        'mgcv smooth penalty matrix',\n        trend_model_file,\n        fixed = TRUE\n      )]\n      S_lines <- gsub('S', 'S_trend', S_lines, fixed = TRUE)\n      model_file[grep(\n        \"int<lower=0> n_nonmissing; // number of nonmissing observations\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"int<lower=0> n_nonmissing; // number of nonmissing observations\\n\",\n          paste(S_lines, collapse = '\\n')\n        )\n\n      # Pull out S matrices (don't always start at 1!)\n      S_mats <- trend_mvgam$model_data[grepl(\n        \"S[0-9]\",\n        names(trend_mvgam$model_data)\n      )]\n      names(S_mats) <- gsub('S', 'S_trend', names(S_mats))\n      model_data <- append(model_data, S_mats)\n    }\n\n    if (!is.null(trend_mvgam$model_data$zero)) {\n      model_file[grep(\n        \"int<lower=0> num_basis_trend; // number of trend basis coefficients\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"int<lower=0> num_basis_trend; // number of trend basis coefficients\\n\",\n          \"vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients\"\n        )\n      model_data$zero_trend <- trend_mvgam$model_data$zero\n    }\n\n    if (any(grepl(\"vector[n_sp] rho;\", model_file, fixed = TRUE))) {\n      model_file[grep(\"vector[n_sp] rho;\", model_file, fixed = TRUE)] <-\n        paste0(\"vector[n_sp] rho;\\n\", \"vector[n_sp_trend] rho_trend;\")\n\n      model_file[grep(\"rho = log(lambda);\", model_file, fixed = TRUE)] <-\n        paste0(\"rho = log(lambda);\\n\", \"rho_trend = log(lambda_trend);\")\n    } else {\n      model_file[grep(\"matrix[n, n_series] mus;\", model_file, fixed = TRUE)] <-\n        paste0(\"matrix[n, n_series] mus;\\n\", \"vector[n_sp_trend] rho_trend;\")\n\n      model_file[grep(\"// posterior predictions\", model_file, fixed = TRUE)] <-\n        paste0(\"rho_trend = log(lambda_trend);\\n\\n\", \"// posterior predictions\")\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Add any parametric effect beta lines\n  if (\n    length(attr(trend_mvgam$mgcv_model$pterms, 'term.labels')) != 0L ||\n      attr(terms(trend_formula), 'intercept') == 1\n  ) {\n    trend_parametrics <- TRUE\n\n    smooth_labs <- do.call(\n      rbind,\n      lapply(seq_along(trend_mvgam$mgcv_model$smooth), function(x) {\n        data.frame(\n          label = trend_mvgam$mgcv_model$smooth[[x]]$label,\n          term = paste(trend_mvgam$mgcv_model$smooth[[x]]$term, collapse = ','),\n          class = class(trend_mvgam$mgcv_model$smooth[[x]])[1]\n        )\n      })\n    )\n    lpmat <- predict(\n      trend_mvgam$mgcv_model,\n      type = 'lpmatrix',\n      exclude = smooth_labs$label\n    )\n    pindices <- which(apply(lpmat, 2, function(x) !all(x == 0)) == TRUE)\n    pnames <- names(pindices)\n    pnames <- gsub('series', 'trend', pnames)\n\n    # pnames <- attr(trend_mvgam$mgcv_model$pterms, 'term.labels')\n    # pindices <- colnames(attr(trend_mvgam$mgcv_model$terms, 'factors'))\n    plines <- vector()\n    for (i in seq_along(pnames)) {\n      plines[i] <- paste0(\n        '// prior for ',\n        pnames[i],\n        '_trend...',\n        '\\n',\n        'b_raw_trend[',\n        pindices[i],\n        '] ~ student_t(3, 0, 2);\\n'\n      )\n    }\n\n    if (any(grepl('// dynamic process models', model_file, fixed = TRUE))) {\n      model_file[grep(\"// dynamic process models\", model_file, fixed = TRUE)] <-\n        paste0(\n          '// dynamic process models\\n',\n          paste0(paste(plines, collapse = '\\n'))\n        )\n    } else {\n      if (any(grepl(\"// dynamic factor estimates\", model_file, fixed = TRUE))) {\n        model_file[grep(\n          \"// dynamic factor estimates\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            '// dynamic process models\\n',\n            paste0(paste(plines, collapse = '\\n'))\n          )\n      }\n\n      if (any(grepl(\"// trend means\", model_file, fixed = TRUE))) {\n        model_file[grep(\"// trend means\", model_file, fixed = TRUE)] <-\n          paste0(\n            '// dynamic process models\\n',\n            paste0(paste(plines, collapse = '\\n'), '// trend means')\n          )\n      }\n    }\n  }\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add any random effect beta lines\n  trend_random_included <- FALSE\n  if (any(grepl('mu_raw[', trend_model_file, fixed = TRUE))) {\n    trend_random_included <- TRUE\n    smooth_labs <- do.call(\n      rbind,\n      lapply(seq_along(trend_mvgam$mgcv_model$smooth), function(x) {\n        data.frame(\n          label = trend_mvgam$mgcv_model$smooth[[x]]$label,\n          first.para = trend_mvgam$mgcv_model$smooth[[x]]$first.para,\n          last.para = trend_mvgam$mgcv_model$smooth[[x]]$last.para,\n          class = class(trend_mvgam$mgcv_model$smooth[[x]])[1]\n        )\n      })\n    )\n    random_inds <- vector()\n    for (i in 1:NROW(smooth_labs)) {\n      if (smooth_labs$class[i] == 'random.effect') {\n        random_inds[i] <- paste0(\n          smooth_labs$first.para[i],\n          ':',\n          smooth_labs$last.para[i]\n        )\n      }\n    }\n    random_inds <- random_inds[!is.na(random_inds)]\n    trend_rand_idxs <- unlist(lapply(seq_along(random_inds), function(x) {\n      seq(\n        as.numeric(sub(\"\\\\:.*\", \"\", random_inds[x])),\n        sub(\".*\\\\:\", \"\", random_inds[x])\n      )\n    }))\n    model_data$trend_rand_idxs <- trend_rand_idxs\n\n    model_file[grep(\n      \"int<lower=0> obs_ind[n_nonmissing]; // indices of nonmissing observations\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"int<lower=0> obs_ind[n_nonmissing]; // indices of nonmissing observations\\n\",\n        paste0(\n          \"int trend_rand_idxs[\",\n          length(trend_rand_idxs),\n          ']; // trend random effect indices'\n        )\n      )\n\n    random_param_lines <- trend_model_file[c(\n      grep(\"// random effect variances\", trend_model_file, fixed = TRUE) + 1,\n      grep(\"// random effect means\", trend_model_file, fixed = TRUE) + 1\n    )]\n    random_param_lines <- gsub('raw', 'raw_trend', random_param_lines)\n    model_file[grepws(\n      \"vector[num_basis_trend] b_raw_trend;\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"vector[num_basis_trend] b_raw_trend;\\n\\n\",\n        \"// trend random effects\\n\",\n        paste(random_param_lines, collapse = '\\n')\n      )\n\n    if (trend_model %in% c('None', 'RW', 'AR1', 'AR2', 'AR3', 'CAR1')) {\n      model_file[grepws(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <- paste0(\n        \"sigma_raw_trend ~ exponential(0.5);\\n\",\n        \"mu_raw_trend ~ std_normal();\\n\",\n        paste0(\"b_raw_trend[\", 'trend_rand_idxs', \"] ~ std_normal();\\n\"),\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\"\n      )\n    }\n\n    if (trend_model == 'VAR1') {\n      if (\n        any(grepl(\n          \"cholesky_factor_corr[n_lv] L_Omega;\",\n          model_file,\n          fixed = TRUE\n        ))\n      ) {\n        model_file[grep(\n          \"LV[1] ~ multi_normal(trend_zeros, Gamma);\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            \"sigma_raw_trend ~ exponential(0.5);\\n\",\n            \"mu_raw_trend ~ std_normal();\\n\",\n            paste0(\"b_raw_trend[\", 'trend_rand_idxs', \"] ~ std_normal();\\n\"),\n            \"LV[1] ~ multi_normal(trend_zeros, Gamma);\"\n          )\n      } else {\n        model_file[grep(\n          \"LV[1] ~ normal(0, sigma);\",\n          model_file,\n          fixed = TRUE\n        )] <-\n          paste0(\n            \"sigma_raw_trend ~ exponential(0.5);\\n\",\n            \"mu_raw_trend ~ std_normal();\\n\",\n            paste0(\"b_raw_trend[\", 'trend_rand_idxs', \"] ~ std_normal();\\n\"),\n            \"LV[1] ~ normal(0, sigma);\"\n          )\n      }\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Update the trend model statements\n  model_file[grep(\n    \"// latent states and loading matrix\",\n    model_file,\n    fixed = TRUE\n  )] <-\n    paste0(\n      \"// latent states and loading matrix\\n\",\n      \"vector[n * n_lv] trend_mus;\"\n    )\n  model_file[grep(\"// derived latent states\", model_file, fixed = TRUE)] <-\n    paste0(\n      \"// latent process linear predictors\\n\",\n      \"trend_mus = X_trend * b_trend;\\n\\n\",\n      \"// derived latent states\"\n    )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  #### Trend model specific updates ####\n  if (trend_model == 'None') {\n    model_file <- model_file[\n      -c(\n        grep(\"for(j in 1:n_lv){\", model_file, fixed = TRUE):(grep(\n          \"for(j in 1:n_lv){\",\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n\n    model_file[grep(\n      \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"for(j in 1:n_lv){\\n\",\n        \"for(i in 1:n){\\n\",\n        \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]], sigma[j]);\\n\",\n        \"}\\n}\"\n      )\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'RW') {\n    model_file <- model_file[\n      -c(\n        grep(\"for(j in 1:n_lv){\", model_file, fixed = TRUE):(grep(\n          \"for(j in 1:n_lv){\",\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n\n    if (drift) {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"for(i in 2:n){\\n\",\n          \"LV[i, j] ~ normal(drift[j] * (i - 1) + trend_mus[ytimes_trend[i, j]] + LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]], sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n    } else {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"for(i in 2:n){\\n\",\n          \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] + LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]], sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'CAR1') {\n    model_file[grepws(\n      '// latent factor AR1 terms',\n      model_file,\n      fixed = TRUE\n    )] <-\n      '// latent state AR1 terms'\n    model_file <- model_file[\n      -c(\n        grepws(\"for(j in 1:n_lv){\", model_file, fixed = TRUE):(grepws(\n          \"for(j in 1:n_lv){\",\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n\n    model_file[grepws(\n      \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0(\n        \"for(j in 1:n_lv){\\n\",\n        \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\\n\",\n        \"for(i in 2:n){\\n\",\n        \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] + pow(ar1[j], time_dis[i, j]) * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]), sigma[j]);\\n\",\n        \"}\\n}\"\n      )\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR1') {\n    model_file[grep('// latent factor AR1 terms', model_file, fixed = TRUE)] <-\n      '// latent state AR1 terms'\n    model_file <- model_file[\n      -c(\n        grep(\"for(j in 1:n_lv){\", model_file, fixed = TRUE):(grep(\n          \"for(j in 1:n_lv){\",\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n\n    if (drift) {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"for(i in 2:n){\\n\",\n          \"LV[i, j] ~ normal(drift[j] * (i - 1) + trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]), sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n    } else {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"for(i in 2:n){\\n\",\n          \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]), sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR2') {\n    model_file[grep('// latent factor AR1 terms', model_file, fixed = TRUE)] <-\n      '// latent state AR1 terms'\n    model_file[grep('// latent factor AR2 terms', model_file, fixed = TRUE)] <-\n      '// latent state AR2 terms'\n    model_file <- model_file[\n      -c(\n        grep(\"for(j in 1:n_lv){\", model_file, fixed = TRUE):(grep(\n          \"for(j in 1:n_lv){\",\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n\n    if (drift) {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal([ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"LV[2, j] ~ normal(drift[j] + trend_mus[ytimes_trend[2, j]] + ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]), sigma[j]);\\n\",\n          \"for(i in 3:n){\\n\",\n          \"LV[i, j] ~ normal(drift[j] * (i - 1) + trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]), sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n      model_file <- model_file[\n        -grep(\n          \"LV[2, 1:n_lv] ~ normal(drift + LV[1, 1:n_lv] * ar1, 0.1);\",\n          model_file,\n          fixed = TRUE\n        )\n      ]\n    } else {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"LV[2, j] ~ normal(trend_mus[ytimes_trend[2, j]] + ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]), sigma[j]);\\n\",\n          \"for(i in 3:n){\\n\",\n          \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]), sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n      model_file <- model_file[\n        -grep(\n          \"LV[2, 1:n_lv] ~ normal(LV[1, 1:n_lv] * ar1, 0.1);\",\n          model_file,\n          fixed = TRUE\n        )\n      ]\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'AR3') {\n    model_file[grep('// latent factor AR1 terms', model_file, fixed = TRUE)] <-\n      '// latent state AR1 terms'\n    model_file[grep('// latent factor AR2 terms', model_file, fixed = TRUE)] <-\n      '// latent state AR2 terms'\n    model_file[grep('// latent factor AR3 terms', model_file, fixed = TRUE)] <-\n      '// latent state AR3 terms'\n    model_file <- model_file[\n      -c(\n        grep(\"for(j in 1:n_lv){\", model_file, fixed = TRUE):(grep(\n          \"for(j in 1:n_lv){\",\n          model_file,\n          fixed = TRUE\n        ) +\n          2)\n      )\n    ]\n\n    if (drift) {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal([ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"LV[2, j] ~ normal(drift[j] + trend_mus[ytimes_trend[2, j]] + ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]), sigma[j]);\\n\",\n          \"LV[3, j] ~ normal(drift[j] * 2 + trend_mus[ytimes_trend[3, j]] + ar1[j] * (LV[2, j] - trend_mus[ytimes_trend[2, j]]) + ar2[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]), sigma[j]);\\n\",\n          \"for(i in 4:n){\\n\",\n          \"LV[i, j] ~ normal(drift[j] * (i - 1) + trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]) + ar3[j] * (LV[i - 3, j] - trend_mus[ytimes_trend[i - 3, j]]), sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n      model_file <- model_file[\n        -grep(\n          \"LV[2, 1:n_lv] ~ normal(drift + LV[1, 1:n_lv] * ar1, 0.1);\",\n          model_file,\n          fixed = TRUE\n        )\n      ]\n      model_file <- model_file[\n        -grep(\n          'LV[3, 1:n_lv] ~ normal(drift * 2  + LV[2, 1:n_lv] * ar1 + LV[1, 1:n_lv] * ar2, 0.1);',\n          model_file,\n          fixed = TRUE\n        )\n      ]\n    } else {\n      model_file[grep(\n        \"LV[1, 1:n_lv] ~ normal(0, sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        paste0(\n          \"for(j in 1:n_lv){\\n\",\n          \"LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]);\\n\",\n          \"LV[2, j] ~ normal(trend_mus[ytimes_trend[2, j]] + ar1[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]), sigma[j]);\\n\",\n          \"LV[3, j] ~ normal(trend_mus[ytimes_trend[3, j]] + ar1[j] * (LV[2, j] - trend_mus[ytimes_trend[2, j]]) + ar2[j] * (LV[1, j] - trend_mus[ytimes_trend[1, j]]), sigma[j]);\\n\",\n          \"for(i in 4:n){\\n\",\n          \"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]) + ar2[j] * (LV[i - 2, j] - trend_mus[ytimes_trend[i - 2, j]]) + ar3[j] * (LV[i - 3, j] - trend_mus[ytimes_trend[i - 3, j]]), sigma[j]);\\n\",\n          \"}\\n}\"\n        )\n      model_file <- model_file[\n        -grep(\n          \"LV[2, 1:n_lv] ~ normal(LV[1, 1:n_lv] * ar1, 0.1);\",\n          model_file,\n          fixed = TRUE\n        )\n      ]\n      model_file <- model_file[\n        -grep(\n          'LV[3, 1:n_lv] ~ normal(LV[2, 1:n_lv] * ar1 + LV[1, 1:n_lv] * ar2, 0.1);',\n          model_file,\n          fixed = TRUE\n        )\n      ]\n    }\n\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  if (trend_model == 'VAR1') {\n    model_file <- gsub('trend means', 'latent state means', model_file)\n\n    model_file[grep('mu[i - 1] = A * LV[i - 1];', model_file, fixed = TRUE)] <-\n      'mu[i] = A * (LV[i - 1] - trend_mus[ytimes_trend[i - 1, 1:n_lv]]);'\n\n    model_file[grep('vector[n_series] mu[n - 1];', model_file, fixed = TRUE)] <-\n      \"vector[n_series] mu[n];\"\n\n    if (\n      any(grepl(\n        \"cholesky_factor_corr[n_lv] L_Omega;\",\n        model_file,\n        fixed = TRUE\n      ))\n    ) {\n      model_file <- model_file[\n        -grep(\n          \"vector[n_lv] trend_zeros = rep_vector(0.0, n_lv);\",\n          model_file,\n          fixed = TRUE\n        )\n      ]\n\n      model_file[grep(\n        \"LV[1] ~ multi_normal(trend_zeros, Gamma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"LV[1] ~ multi_normal(trend_mus[ytimes_trend[1, 1:n_lv]], Gamma);\"\n\n      model_file[grep(\n        \"LV[i] ~ multi_normal_cholesky(mu[i - 1], L_Sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"LV[i] ~ multi_normal_cholesky(trend_mus[ytimes_trend[i, 1:n_lv]] + mu[i], L_Sigma);\"\n    } else {\n      model_file[grep(\"LV[1] ~ normal(0, sigma);\", model_file, fixed = TRUE)] <-\n        \"LV[1] ~ normal(trend_mus[ytimes_trend[1, 1:n_lv]], sigma);\"\n\n      model_file[grep(\n        \"LV[i] ~ normal(mu[i - 1], sigma);\",\n        model_file,\n        fixed = TRUE\n      )] <-\n        \"LV[i] ~ normal(trend_mus[ytimes_trend[i, 1:n_lv]] + mu[i], sigma);\"\n    }\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  model_file <- gsub('latent trend', 'latent state', model_file)\n\n  # Any final tidying for trend_level terms\n  model_file <- gsub('byseriestrend', 'bytrendtrend', model_file)\n  model_file <- gsub(':seriestrend', ':trendtrend', model_file)\n\n  names(model_data) <- gsub('byseriestrend', 'bytrendtrend', names(model_data))\n  names(model_data) <- gsub(':seriestrend', ':trendtrend', names(model_data))\n\n  names(trend_mvgam$mgcv_model$coefficients) <-\n    gsub(\n      'byseriestrend',\n      'bytrendtrend',\n      names(trend_mvgam$mgcv_model$coefficients)\n    )\n  names(trend_mvgam$mgcv_model$coefficients) <-\n    gsub(\n      ':seriestrend',\n      ':trendtrend',\n      names(trend_mvgam$mgcv_model$coefficients)\n    )\n\n  return(list(\n    model_file = model_file,\n    model_data = model_data,\n    trend_mgcv_model = trend_mvgam$mgcv_model,\n    trend_sp_names = trend_mvgam$sp_names,\n    trend_smooths_included = trend_smooths_included,\n    trend_random_included = trend_random_included\n  ))\n}\n\n#### Stan diagnostic checks ####\n#' Check transitions that ended with a divergence\n#' @param fit A stanfit object\n#' @param quiet Logical (verbose or not?)\n#' @details Utility function written by Michael Betancourt (https://betanalpha.github.io/)\n#' @noRd\ncheck_div <- function(fit, quiet = FALSE, sampler_params) {\n  if (missing(sampler_params)) {\n    sampler_params <- rstan::get_sampler_params(fit, inc_warmup = FALSE)\n  }\n  divergent <- do.call(rbind, sampler_params)[, 'divergent__']\n  n = sum(divergent)\n  N = length(divergent)\n\n  if (round(100 * n / N, 4) > 2) {\n    if (!quiet) {\n      insight::print_color(\n        sprintf(\n          '\\u2716 %s of %s iterations ended with a divergence (%s%%)\\n',\n          n,\n          N,\n          round(100 * n / N, 4)\n        ),\n        \"bred\"\n      )\n    }\n    insight::print_color(\n      '    Try a larger adapt_delta to remove divergences\\n',\n      \"bred\"\n    )\n    if (quiet) return(FALSE)\n  } else {\n    if (!quiet) {\n      insight::print_color('\\u2714', \"green\")\n      cat(' No issues with divergences\\n')\n    }\n    if (quiet) return(TRUE)\n  }\n}\n\n#' Check transitions that ended prematurely due to maximum tree depth limit\n#' @param fit A stanfit object\n#' @param quiet Logical (verbose or not?)\n#' @details Utility function written by Michael Betancourt (https://betanalpha.github.io/)\n#' @noRd\ncheck_treedepth <- function(\n  fit,\n  max_depth = 10,\n  quiet = FALSE,\n  sampler_params\n) {\n  if (missing(sampler_params)) {\n    sampler_params <- rstan::get_sampler_params(fit, inc_warmup = FALSE)\n  }\n  treedepths <- do.call(rbind, sampler_params)[, 'treedepth__']\n  n = length(treedepths[sapply(treedepths, function(x) x >= max_depth)])\n  N = length(treedepths)\n\n  if (round(100 * n / N, 4) > 2) {\n    if (!quiet) {\n      insight::print_color(\n        sprintf(\n          '\\u2716 %s of %s iterations saturated the maximum tree depth of %s (%s%%)\\n',\n          n,\n          N,\n          max_depth,\n          round(100 * n / N, 4)\n        ),\n        \"bred\"\n      )\n    }\n    insight::print_color(\n      '    Try a larger max_treedepth to avoid saturation\\n',\n      \"bred\"\n    )\n    if (quiet) return(FALSE)\n  } else {\n    if (!quiet) {\n      insight::print_color('\\u2714', \"green\")\n      cat(' No issues with maximum tree depth\\n')\n    }\n    if (quiet) return(TRUE)\n  }\n}\n\n#' Check the effective sample size per iteration\n#' @param fit A stanfit object\n#' @param quiet Logical (verbose or not?)\n#' @details Utility function written by Michael Betancourt (https://betanalpha.github.io/)\n#' @noRd\ncheck_n_eff <- function(\n  fit,\n  quiet = FALSE,\n  fit_summary,\n  ignore_b_trend = FALSE\n) {\n  if (missing(fit_summary)) {\n    fit_summary <- rstan::summary(fit, probs = c(0.5))$summary\n  }\n\n  fit_summary <- fit_summary[-grep('ypred', rownames(fit_summary)), ]\n\n  if (any(grep('LV', rownames(fit_summary)))) {\n    fit_summary <- fit_summary[-grep('LV', rownames(fit_summary)), ]\n    fit_summary <- fit_summary[-grep('lv_coefs', rownames(fit_summary)), ]\n\n    if (any(grepl('L[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('L[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n    if (any(grepl('L_diag[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('L_diag[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n    if (any(grepl('L_lower[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('L_lower[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n    if (any(grepl('LV_raw[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('LV_raw[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n  }\n\n  if (ignore_b_trend) {\n    if (any(grepl('_trend', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('_trend', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n\n    if (any(grepl('trend_mus[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('trend_mus[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n  }\n\n  iter <- dim(rstan::extract(fit)[[1]])[[1]]\n\n  neffs <- fit_summary[, 'n_eff']\n  ratios <- neffs / iter\n  no_warning <- TRUE\n  if (min(ratios, na.rm = TRUE) < 0.001) {\n    no_warning <- FALSE\n  }\n  if (no_warning) {\n    if (!quiet) {\n      insight::print_color('\\u2714', \"green\")\n      cat(' No issues with effective samples per iteration\\n')\n    }\n    if (quiet) return(TRUE)\n  } else {\n    if (!quiet) {\n      insight::print_color(\n        paste0(\n          '\\u2716 n_eff / iter below 0.001 found for ',\n          length(which(ratios < 0.001)),\n          ' parameters\\n    Effective sample size is inaccurate for these parameters\\n'\n        ),\n        \"bred\"\n      )\n    }\n    if (quiet) return(FALSE)\n  }\n}\n\n#' Check the potential scale reduction factors\n#' @param fit A stanfit object\n#' @param quiet Logical (verbose or not?)\n#' @details Utility function written by Michael Betancourt (https://betanalpha.github.io/)\n#' @noRd\ncheck_rhat <- function(\n  fit,\n  quiet = FALSE,\n  fit_summary,\n  ignore_b_trend = FALSE\n) {\n  if (missing(fit_summary)) {\n    fit_summary <- rstan::summary(fit, probs = c(0.5))$summary\n  }\n\n  fit_summary <- fit_summary[-grep('ypred', rownames(fit_summary)), ]\n\n  if (any(grep('LV', rownames(fit_summary)))) {\n    fit_summary <- fit_summary[-grep('LV', rownames(fit_summary)), ]\n    fit_summary <- fit_summary[-grep('lv_coefs', rownames(fit_summary)), ]\n\n    if (any(grepl('L[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('L[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n    if (any(grepl('L_diag[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('L_diag[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n    if (any(grepl('L_lower[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('L_lower[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n    if (any(grepl('LV_raw[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('LV_raw[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n  }\n\n  if (ignore_b_trend) {\n    if (any(grepl('_trend', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('_trend', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n\n    if (any(grepl('trend_mus[', rownames(fit_summary), fixed = TRUE))) {\n      fit_summary <- fit_summary[\n        -grep('trend_mus[', rownames(fit_summary), fixed = TRUE),\n      ]\n    }\n  }\n\n  no_warning <- TRUE\n  rhats <- fit_summary[, 'Rhat']\n  N = length(rhats[!is.na(rhats)])\n  n = length(which(rhats > 1.05))\n\n  if (round(100 * n / N, 4) > 2) {\n    no_warning <- FALSE\n  }\n  if (no_warning) {\n    if (!quiet) {\n      insight::print_color('\\u2714', \"green\")\n      cat(' Rhat looks good for all parameters\\n')\n    }\n    if (quiet) return(TRUE)\n  } else {\n    if (!quiet) {\n      insight::print_color(\n        paste0(\n          '\\u2716 Rhats above 1.05 found for some',\n          ' parameters\\n',\n          '    Use pairs() and mcmc_plot() to investigate\\n'\n        ),\n        \"bred\"\n      )\n    }\n    if (quiet) return(FALSE)\n  }\n}\n\n#' Run all diagnostic checks\n#' @param fit A stanfit object\n#' @param quiet Logical (verbose or not?)\n#' @details Utility function written by Michael Betancourt (https://betanalpha.github.io/)\n#' @noRd\ncheck_all_diagnostics <- function(\n  fit,\n  max_treedepth = 10,\n  ignore_b_trend = FALSE\n) {\n  sampler_params <- rstan::get_sampler_params(fit, inc_warmup = FALSE)\n  fit_summary <- rstan::summary(fit, probs = c(0.5))$summary\n  check_n_eff(fit, fit_summary = fit_summary, ignore_b_trend = ignore_b_trend)\n  check_rhat(fit, fit_summary = fit_summary, ignore_b_trend = ignore_b_trend)\n  check_div(fit, sampler_params = sampler_params)\n  check_treedepth(\n    fit,\n    max_depth = max_treedepth,\n    sampler_params = sampler_params\n  )\n}\n\n#' @noRd\nis_try_error = function(x) {\n  inherits(x, \"try-error\")\n}\n\n#' evaluate an expression without printing output or messages\n#' @param expr expression to be evaluated\n#' @param type type of output to be suppressed (see ?sink)\n#' @param try wrap evaluation of expr in 'try' and\n#'   not suppress outputs if evaluation fails?\n#' @param silent actually evaluate silently?\n#' @noRd\neval_silent <- function(\n  expr,\n  type = \"output\",\n  try = FALSE,\n  silent = TRUE,\n  ...\n) {\n  try <- as_one_logical(try)\n  silent <- as_one_logical(silent)\n  type <- match.arg(type, c(\"output\", \"message\"))\n  expr <- substitute(expr)\n  envir <- parent.frame()\n  if (silent) {\n    if (try && type == \"message\") {\n      try_out <- try(utils::capture.output(\n        out <- eval(expr, envir),\n        type = type,\n        ...\n      ))\n      if (is_try_error(try_out)) {\n        # try again without suppressing error messages\n        out <- eval(expr, envir)\n      }\n    } else {\n      utils::capture.output(out <- eval(expr, envir), type = type, ...)\n    }\n  } else {\n    out <- eval(expr, envir)\n  }\n  out\n}\n\n\n#' @noRd\nnlist = function(...) {\n  m <- match.call()\n  dots <- list(...)\n  no_names <- is.null(names(dots))\n  has_name <- if (no_names) FALSE else nzchar(names(dots))\n  if (all(has_name)) {\n    return(dots)\n  }\n  nms <- as.character(m)[-1]\n  if (no_names) {\n    names(dots) <- nms\n  } else {\n    names(dots)[!has_name] <- nms[!has_name]\n  }\n  dots\n}\n\n#' @noRd\n`c<-` = function(x, value) {\n  c(x, value)\n}\n\n#' @noRd\ngrepws = function(pattern, x, fixed = TRUE, ...) {\n  grep(trimws(tolower(pattern)), trimws(tolower(x)), fixed = fixed, ...)\n}\n"
  },
  {
    "path": "R/stationarise_VAR.R",
    "content": "#### Modifications to Stan code for stationary VAR1 processes ####\n# All functions and reparameterisations use code supplied generously by Sarah Heaps:\n# Heaps, Sarah E. \"Enforcing stationarity through the prior in vector autoregressions.\"\n# Journal of Computational and Graphical Statistics (2022): 1-10.\n#' @noRd\nstationarise_VAR = function(model_file) {\n  # Remove previous prior for VAR coefficients\n  model_file <- model_file[\n    -c(\n      (grep('// VAR coefficients', model_file, fixed = TRUE)):(grep(\n        '// VAR coefficients',\n        model_file,\n        fixed = TRUE\n      ) +\n        1)\n    )\n  ]\n  model_file <- model_file[\n    -c(\n      (grep(\"// latent trend VAR1 terms\", model_file, fixed = TRUE)):(grep(\n        \"// latent trend VAR1 terms\",\n        model_file,\n        fixed = TRUE\n      ) +\n        1)\n    )\n  ]\n  model_file <- model_file[\n    -grep(\"matrix[n_series, n_series] Sigma;\", model_file, fixed = TRUE)\n  ]\n  model_file <- model_file[\n    -grep(\"Sigma = diag_matrix(square(sigma));\", model_file, fixed = TRUE)\n  ]\n\n  # Add Heaps' functions for constrained VAR1 process priors\n  if (any(grepl('functions {', model_file, fixed = TRUE))) {\n    model_file[grep('functions {', model_file, fixed = TRUE)] <-\n      paste0(\n        'functions {\\n',\n        '/* Function to compute the matrix square root */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix sqrtm(matrix A) {\\n',\n        'int m = rows(A);\\n',\n        'vector[m] root_root_evals = sqrt(sqrt(eigenvalues_sym(A)));\\n',\n        'matrix[m, m] evecs = eigenvectors_sym(A);\\n',\n        'matrix[m, m] eprod = diag_post_multiply(evecs, root_root_evals);\\n',\n        'return tcrossprod(eprod);\\n',\n        '}\\n',\n        '/* Function to transform P_real to P */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix P_realtoP(matrix P_real) {\\n',\n        'int m = rows(P_real);\\n',\n        'matrix[m, m] B = tcrossprod(P_real);\\n',\n        'for(i in 1:m) B[i, i] += 1.0;\\n',\n        'return mdivide_left_spd(sqrtm(B), P_real);\\n',\n        '}\\n',\n        '/* Function to perform the reverse mapping*/\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix[,] rev_mapping(matrix[] P, matrix Sigma) {\\n',\n        'int p = size(P);\\n',\n        'int m = rows(Sigma);\\n',\n        'matrix[m, m] phi_for[p, p];   matrix[m, m] phi_rev[p, p];\\n',\n        'matrix[m, m] Sigma_for[p+1];  matrix[m, m] Sigma_rev[p+1];\\n',\n        'matrix[m, m] S_for;           matrix[m, m] S_rev;\\n',\n        'matrix[m, m] S_for_list[p+1];\\n',\n        'matrix[m, m] Gamma_trans[p+1];\\n',\n        'matrix[m, m] phiGamma[2, p];\\n',\n        '// Step 1:\\n',\n        'Sigma_for[p+1] = Sigma;\\n',\n        'S_for_list[p+1] = sqrtm(Sigma);\\n',\n        'for(s in 1:p) {\\n',\n        '// In this block of code S_rev is B^{-1} and S_for is a working matrix\\n',\n        'S_for = - tcrossprod(P[p-s+1]);\\n',\n        'for(i in 1:m) S_for[i, i] += 1.0;\\n',\n        'S_rev = sqrtm(S_for);\\n',\n        'S_for_list[p-s+1] = mdivide_right_spd(mdivide_left_spd(S_rev,\\n',\n        'sqrtm(quad_form_sym(Sigma_for[p-s+2], S_rev))), S_rev);\\n',\n        'Sigma_for[p-s+1] = tcrossprod(S_for_list[p-s+1]);\\n',\n        '}\\n',\n        '// Step 2:\\n',\n        'Sigma_rev[1] = Sigma_for[1];\\n',\n        'Gamma_trans[1] = Sigma_for[1];\\n',\n        'for(s in 0:(p-1)) {\\n',\n        'S_for = S_for_list[s+1];\\n',\n        'S_rev = sqrtm(Sigma_rev[s+1]);\\n',\n        'phi_for[s+1, s+1] = mdivide_right_spd(S_for * P[s+1], S_rev);\\n',\n        \"phi_rev[s+1, s+1] = mdivide_right_spd(S_rev * P[s+1]', S_for);\\n\",\n        'Gamma_trans[s+2] = phi_for[s+1, s+1] * Sigma_rev[s+1];\\n',\n        'if(s>=1) {\\n',\n        'for(k in 1:s) {\\n',\n        'phi_for[s+1, k] = phi_for[s, k] - phi_for[s+1, s+1] * phi_rev[s, s-k+1];\\n',\n        'phi_rev[s+1, k] = phi_rev[s, k] - phi_rev[s+1, s+1] * phi_for[s, s-k+1];\\n',\n        '}\\n',\n        'for(k in 1:s) Gamma_trans[s+2] = Gamma_trans[s+2] + phi_for[s, k] * Gamma_trans[s+2-k];\\n',\n        '}\\n',\n        \"Sigma_rev[s+2] = Sigma_rev[s+1] - quad_form_sym(Sigma_for[s+1],phi_rev[s+1, s+1]');\\n\",\n        '}\\n',\n        'for(i in 1:p) phiGamma[1, i] = phi_for[p, i];\\n',\n        \"for(i in 1:p) phiGamma[2, i] = Gamma_trans[i]';\\n\",\n        'return phiGamma;\\n',\n        '}\\n'\n      )\n  } else {\n    model_file[grep('Stan model code', model_file)] <-\n      paste0(\n        '// Stan model code generated by package mvgam\\n',\n        'functions {\\n',\n        '/* Function to compute the matrix square root */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix sqrtm(matrix A) {\\n',\n        'int m = rows(A);\\n',\n        'vector[m] root_root_evals = sqrt(sqrt(eigenvalues_sym(A)));\\n',\n        'matrix[m, m] evecs = eigenvectors_sym(A);\\n',\n        'matrix[m, m] eprod = diag_post_multiply(evecs, root_root_evals);\\n',\n        'return tcrossprod(eprod);\\n',\n        '}\\n',\n        '/* Function to transform P_real to P */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix P_realtoP(matrix P_real) {\\n',\n        'int m = rows(P_real);\\n',\n        'matrix[m, m] B = tcrossprod(P_real);\\n',\n        'for(i in 1:m) B[i, i] += 1.0;\\n',\n        'return mdivide_left_spd(sqrtm(B), P_real);\\n',\n        '}\\n',\n        '/* Function to perform the reverse mapping*/\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix[,] rev_mapping(matrix[] P, matrix Sigma) {\\n',\n        'int p = size(P);\\n',\n        'int m = rows(Sigma);\\n',\n        'matrix[m, m] phi_for[p, p];   matrix[m, m] phi_rev[p, p];\\n',\n        'matrix[m, m] Sigma_for[p+1];  matrix[m, m] Sigma_rev[p+1];\\n',\n        'matrix[m, m] S_for;           matrix[m, m] S_rev;\\n',\n        'matrix[m, m] S_for_list[p+1];\\n',\n        'matrix[m, m] Gamma_trans[p+1];\\n',\n        'matrix[m, m] phiGamma[2, p];\\n',\n        '// Step 1:\\n',\n        'Sigma_for[p+1] = Sigma;\\n',\n        'S_for_list[p+1] = sqrtm(Sigma);\\n',\n        'for(s in 1:p) {\\n',\n        '// In this block of code S_rev is B^{-1} and S_for is a working matrix\\n',\n        'S_for = - tcrossprod(P[p-s+1]);\\n',\n        'for(i in 1:m) S_for[i, i] += 1.0;\\n',\n        'S_rev = sqrtm(S_for);\\n',\n        'S_for_list[p-s+1] = mdivide_right_spd(mdivide_left_spd(S_rev,\\n',\n        'sqrtm(quad_form_sym(Sigma_for[p-s+2], S_rev))), S_rev);\\n',\n        'Sigma_for[p-s+1] = tcrossprod(S_for_list[p-s+1]);\\n',\n        '}\\n',\n        '// Step 2:\\n',\n        'Sigma_rev[1] = Sigma_for[1];\\n',\n        'Gamma_trans[1] = Sigma_for[1];\\n',\n        'for(s in 0:(p-1)) {\\n',\n        'S_for = S_for_list[s+1];\\n',\n        'S_rev = sqrtm(Sigma_rev[s+1]);\\n',\n        'phi_for[s+1, s+1] = mdivide_right_spd(S_for * P[s+1], S_rev);\\n',\n        \"phi_rev[s+1, s+1] = mdivide_right_spd(S_rev * P[s+1]', S_for);\\n\",\n        'Gamma_trans[s+2] = phi_for[s+1, s+1] * Sigma_rev[s+1];\\n',\n        'if(s>=1) {\\n',\n        'for(k in 1:s) {\\n',\n        'phi_for[s+1, k] = phi_for[s, k] - phi_for[s+1, s+1] * phi_rev[s, s-k+1];\\n',\n        'phi_rev[s+1, k] = phi_rev[s, k] - phi_rev[s+1, s+1] * phi_for[s, s-k+1];\\n',\n        '}\\n',\n        'for(k in 1:s) Gamma_trans[s+2] = Gamma_trans[s+2] + phi_for[s, k] * Gamma_trans[s+2-k];\\n',\n        '}\\n',\n        \"Sigma_rev[s+2] = Sigma_rev[s+1] - quad_form_sym(Sigma_for[s+1],phi_rev[s+1, s+1]');\\n\",\n        '}\\n',\n        'for(i in 1:p) phiGamma[1, i] = phi_for[p, i];\\n',\n        \"for(i in 1:p) phiGamma[2, i] = Gamma_trans[i]';\\n\",\n        'return phiGamma;\\n',\n        '}\\n',\n        '}'\n      )\n  }\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add transformed data lines for Heaps stationarity constraints\n  if (any(grepl('transformed data {', model_file, fixed = TRUE))) {\n    model_file[grep('transformed data {', model_file, fixed = TRUE)] <- paste0(\n      'transformed data {\\n',\n      'vector[n_series] trend_zeros = rep_vector(0.0, n_series);\\n',\n      '// exchangeable partial autocorrelation hyperparameters\\n',\n      '// see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)\\n',\n      'vector[2] es;\\n',\n      'vector<lower=0>[2] fs;\\n',\n      'vector<lower=0>[2] gs;\\n',\n      'vector<lower=0>[2] hs;\\n',\n      'es[1] = 0;\\nes[2] = 0;\\n',\n      'fs[1] = sqrt(0.455);\\nfs[2] = sqrt(0.455);\\n',\n      'gs[1] = 1.365;\\ngs[2] = 1.365;\\n',\n      'hs[1] = 0.071175;\\nhs[2] = 0.071175;\\n'\n    )\n  } else {\n    params_line <- min(which(grepl('parameters {', model_file, fixed = TRUE)))\n    model_file[params_line] <- paste0(\n      'transformed data {\\n',\n      'vector[n_series] trend_zeros = rep_vector(0.0, n_series);\\n',\n      '// exchangeable partial autocorrelation hyperparameters\\n',\n      '// see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)\\n',\n      'vector[2] es;\\n',\n      'vector<lower=0>[2] fs;\\n',\n      'vector<lower=0>[2] gs;\\n',\n      'vector<lower=0>[2] hs;\\n',\n      'es[1] = 0;\\nes[2] = 0;\\n',\n      'fs[1] = sqrt(0.455);\\nfs[2] = sqrt(0.455);\\n',\n      'gs[1] = 1.365;\\ngs[2] = 1.365;\\n',\n      'hs[1] = 0.071175;\\nhs[2] = 0.071175;\\n',\n      '}\\n\\nparameters {'\n    )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Add parameters for real-valued partial autocorrelations\n  model_file[grep(\n    \"vector<lower=0>[n_series] sigma;\",\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    \"vector<lower=0>[n_series] sigma;\\n\\n\",\n    '// unconstrained VAR1 partial autocorrelations\\n',\n    'matrix[n_series, n_series] P_real;\\n',\n    '// partial autocorrelation hyperparameters\\n',\n    'vector[2] Pmu;\\n',\n    'vector<lower=0>[2] Pomega;\\n'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add transformed parameters for partial autocorrelation reverse mapping\n  model_file[grep(\n    'transformed parameters {',\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    'transformed parameters {\\n',\n    \"// latent trend VAR1 autoregressive terms\\n\",\n    \"matrix[n_series, n_series] A;\\n\",\n    '// stationary trend covariance\\n',\n    \"matrix[n_series, n_series] Sigma;\"\n  )\n  model_file[\n    grep(\n      'trend[i, 1:n_series] = to_row_vector(trend_raw[i]);',\n      model_file,\n      fixed = TRUE\n    ) +\n      1\n  ] <- paste0(\n    '}\\n\\n',\n    \"Sigma = diag_matrix(square(sigma));\\n\",\n    '// stationary VAR reparameterisation\\n',\n    '{\\n',\n    'matrix[n_series, n_series] P[1];\\n',\n    'matrix[n_series, n_series] phiGamma[2, 1];\\n',\n    'P[1] = P_realtoP(P_real);\\n',\n    'phiGamma = rev_mapping(P, Sigma);\\n',\n    'A = phiGamma[1, 1];\\n',\n    '}'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add priors for partial autocorrelations\n  model_file[grep(\"// trend means\", model_file, fixed = TRUE)] <- paste0(\n    '// partial autocorrelation hyperpriors\\n',\n    'Pmu ~ normal(es, fs);\\n',\n    'Pomega ~ gamma(gs, hs);\\n',\n    '// unconstrained partial autocorrelations\\n',\n    'diagonal(P_real) ~ normal(Pmu[1], 1 / sqrt(Pomega[1]));\\n',\n    'for(i in 1:n_series) {\\n',\n    'for(j in 1:n_series) {\\n',\n    'if(i != j) P_real[i, j] ~ normal(Pmu[2], 1 / sqrt(Pomega[2]));\\n',\n    '}\\n',\n    '}\\n',\n    \"// trend means\"\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Return the updated model file\n  return(model_file)\n}\n\n#' Modifications for a VAR1 with possible contemporaneously correlated trend\n#' errors\n#' @noRd\nstationarise_VARcor = function(model_file) {\n  # Remove previous prior for VAR coefficients\n  model_file <- model_file[\n    -c(\n      (grep('// VAR coefficients', model_file, fixed = TRUE)):(grep(\n        '// VAR coefficients',\n        model_file,\n        fixed = TRUE\n      ) +\n        1)\n    )\n  ]\n  model_file <- model_file[\n    -c(\n      (grep(\"// latent trend VAR1 terms\", model_file, fixed = TRUE)):(grep(\n        \"// latent trend VAR1 terms\",\n        model_file,\n        fixed = TRUE\n      ) +\n        1)\n    )\n  ]\n  model_file <- model_file[\n    -grep(\"matrix[n_series, n_series] Sigma;\", model_file, fixed = TRUE)\n  ]\n  model_file <- model_file[\n    -grep(\"Sigma = diag_matrix(square(sigma));\", model_file, fixed = TRUE)\n  ]\n\n  # Add Heaps' functions for constrained VAR1 process priors\n  if (any(grepl('functions {', model_file, fixed = TRUE))) {\n    model_file[grep('functions {', model_file, fixed = TRUE)] <-\n      paste0(\n        'functions {\\n',\n        '/* Function to compute the matrix square root */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix sqrtm(matrix A) {\\n',\n        'int m = rows(A);\\n',\n        'vector[m] root_root_evals = sqrt(sqrt(eigenvalues_sym(A)));\\n',\n        'matrix[m, m] evecs = eigenvectors_sym(A);\\n',\n        'matrix[m, m] eprod = diag_post_multiply(evecs, root_root_evals);\\n',\n        'return tcrossprod(eprod);\\n',\n        '}\\n',\n        '/* Function to transform P_real to P */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix P_realtoP(matrix P_real) {\\n',\n        'int m = rows(P_real);\\n',\n        'matrix[m, m] B = tcrossprod(P_real);\\n',\n        'for(i in 1:m) B[i, i] += 1.0;\\n',\n        'return mdivide_left_spd(sqrtm(B), P_real);\\n',\n        '}\\n',\n        '/* Function to perform the reverse mapping*/\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix[,] rev_mapping(matrix[] P, matrix Sigma) {\\n',\n        'int p = size(P);\\n',\n        'int m = rows(Sigma);\\n',\n        'matrix[m, m] phi_for[p, p];   matrix[m, m] phi_rev[p, p];\\n',\n        'matrix[m, m] Sigma_for[p+1];  matrix[m, m] Sigma_rev[p+1];\\n',\n        'matrix[m, m] S_for;           matrix[m, m] S_rev;\\n',\n        'matrix[m, m] S_for_list[p+1];\\n',\n        'matrix[m, m] Gamma_trans[p+1];\\n',\n        'matrix[m, m] phiGamma[2, p];\\n',\n        '// Step 1:\\n',\n        'Sigma_for[p+1] = Sigma;\\n',\n        'S_for_list[p+1] = sqrtm(Sigma);\\n',\n        'for(s in 1:p) {\\n',\n        '// In this block of code S_rev is B^{-1} and S_for is a working matrix\\n',\n        'S_for = - tcrossprod(P[p-s+1]);\\n',\n        'for(i in 1:m) S_for[i, i] += 1.0;\\n',\n        'S_rev = sqrtm(S_for);\\n',\n        'S_for_list[p-s+1] = mdivide_right_spd(mdivide_left_spd(S_rev,\\n',\n        'sqrtm(quad_form_sym(Sigma_for[p-s+2], S_rev))), S_rev);\\n',\n        'Sigma_for[p-s+1] = tcrossprod(S_for_list[p-s+1]);\\n',\n        '}\\n',\n        '// Step 2:\\n',\n        'Sigma_rev[1] = Sigma_for[1];\\n',\n        'Gamma_trans[1] = Sigma_for[1];\\n',\n        'for(s in 0:(p-1)) {\\n',\n        'S_for = S_for_list[s+1];\\n',\n        'S_rev = sqrtm(Sigma_rev[s+1]);\\n',\n        'phi_for[s+1, s+1] = mdivide_right_spd(S_for * P[s+1], S_rev);\\n',\n        \"phi_rev[s+1, s+1] = mdivide_right_spd(S_rev * P[s+1]', S_for);\\n\",\n        'Gamma_trans[s+2] = phi_for[s+1, s+1] * Sigma_rev[s+1];\\n',\n        'if(s>=1) {\\n',\n        'for(k in 1:s) {\\n',\n        'phi_for[s+1, k] = phi_for[s, k] - phi_for[s+1, s+1] * phi_rev[s, s-k+1];\\n',\n        'phi_rev[s+1, k] = phi_rev[s, k] - phi_rev[s+1, s+1] * phi_for[s, s-k+1];\\n',\n        '}\\n',\n        'for(k in 1:s) Gamma_trans[s+2] = Gamma_trans[s+2] + phi_for[s, k] * Gamma_trans[s+2-k];\\n',\n        '}\\n',\n        \"Sigma_rev[s+2] = Sigma_rev[s+1] - quad_form_sym(Sigma_for[s+1],phi_rev[s+1, s+1]');\\n\",\n        '}\\n',\n        'for(i in 1:p) phiGamma[1, i] = phi_for[p, i];\\n',\n        \"for(i in 1:p) phiGamma[2, i] = Gamma_trans[i]';\\n\",\n        'return phiGamma;\\n',\n        '}\\n'\n      )\n  } else {\n    model_file[grep('Stan model code', model_file)] <-\n      paste0(\n        '// Stan model code generated by package mvgam\\n',\n        'functions {\\n',\n        '/* Function to compute the matrix square root */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix sqrtm(matrix A) {\\n',\n        'int m = rows(A);\\n',\n        'vector[m] root_root_evals = sqrt(sqrt(eigenvalues_sym(A)));\\n',\n        'matrix[m, m] evecs = eigenvectors_sym(A);\\n',\n        'matrix[m, m] eprod = diag_post_multiply(evecs, root_root_evals);\\n',\n        'return tcrossprod(eprod);\\n',\n        '}\\n',\n        '/* Function to transform P_real to P */\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix P_realtoP(matrix P_real) {\\n',\n        'int m = rows(P_real);\\n',\n        'matrix[m, m] B = tcrossprod(P_real);\\n',\n        'for(i in 1:m) B[i, i] += 1.0;\\n',\n        'return mdivide_left_spd(sqrtm(B), P_real);\\n',\n        '}\\n',\n        '/* Function to perform the reverse mapping*/\\n',\n        '/* see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)*/\\n',\n        'matrix[,] rev_mapping(matrix[] P, matrix Sigma) {\\n',\n        'int p = size(P);\\n',\n        'int m = rows(Sigma);\\n',\n        'matrix[m, m] phi_for[p, p];   matrix[m, m] phi_rev[p, p];\\n',\n        'matrix[m, m] Sigma_for[p+1];  matrix[m, m] Sigma_rev[p+1];\\n',\n        'matrix[m, m] S_for;           matrix[m, m] S_rev;\\n',\n        'matrix[m, m] S_for_list[p+1];\\n',\n        'matrix[m, m] Gamma_trans[p+1];\\n',\n        'matrix[m, m] phiGamma[2, p];\\n',\n        '// Step 1:\\n',\n        'Sigma_for[p+1] = Sigma;\\n',\n        'S_for_list[p+1] = sqrtm(Sigma);\\n',\n        'for(s in 1:p) {\\n',\n        '// In this block of code S_rev is B^{-1} and S_for is a working matrix\\n',\n        'S_for = - tcrossprod(P[p-s+1]);\\n',\n        'for(i in 1:m) S_for[i, i] += 1.0;\\n',\n        'S_rev = sqrtm(S_for);\\n',\n        'S_for_list[p-s+1] = mdivide_right_spd(mdivide_left_spd(S_rev,\\n',\n        'sqrtm(quad_form_sym(Sigma_for[p-s+2], S_rev))), S_rev);\\n',\n        'Sigma_for[p-s+1] = tcrossprod(S_for_list[p-s+1]);\\n',\n        '}\\n',\n        '// Step 2:\\n',\n        'Sigma_rev[1] = Sigma_for[1];\\n',\n        'Gamma_trans[1] = Sigma_for[1];\\n',\n        'for(s in 0:(p-1)) {\\n',\n        'S_for = S_for_list[s+1];\\n',\n        'S_rev = sqrtm(Sigma_rev[s+1]);\\n',\n        'phi_for[s+1, s+1] = mdivide_right_spd(S_for * P[s+1], S_rev);\\n',\n        \"phi_rev[s+1, s+1] = mdivide_right_spd(S_rev * P[s+1]', S_for);\\n\",\n        'Gamma_trans[s+2] = phi_for[s+1, s+1] * Sigma_rev[s+1];\\n',\n        'if(s>=1) {\\n',\n        'for(k in 1:s) {\\n',\n        'phi_for[s+1, k] = phi_for[s, k] - phi_for[s+1, s+1] * phi_rev[s, s-k+1];\\n',\n        'phi_rev[s+1, k] = phi_rev[s, k] - phi_rev[s+1, s+1] * phi_for[s, s-k+1];\\n',\n        '}\\n',\n        'for(k in 1:s) Gamma_trans[s+2] = Gamma_trans[s+2] + phi_for[s, k] * Gamma_trans[s+2-k];\\n',\n        '}\\n',\n        \"Sigma_rev[s+2] = Sigma_rev[s+1] - quad_form_sym(Sigma_for[s+1],phi_rev[s+1, s+1]');\\n\",\n        '}\\n',\n        'for(i in 1:p) phiGamma[1, i] = phi_for[p, i];\\n',\n        \"for(i in 1:p) phiGamma[2, i] = Gamma_trans[i]';\\n\",\n        'return phiGamma;\\n',\n        '}\\n',\n        '}'\n      )\n  }\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add transformed data lines for Heaps stationarity constraints\n  if (any(grepl('transformed data {', model_file, fixed = TRUE))) {\n    model_file[grep('transformed data {', model_file, fixed = TRUE)] <- paste0(\n      'transformed data {\\n',\n      'vector[n_series] trend_zeros = rep_vector(0.0, n_series);\\n',\n      '// exchangeable partial autocorrelation hyperparameters\\n',\n      '// see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)\\n',\n      'vector[2] es;\\n',\n      'vector<lower=0>[2] fs;\\n',\n      'vector<lower=0>[2] gs;\\n',\n      'vector<lower=0>[2] hs;\\n',\n      'es[1] = 0;\\nes[2] = 0;\\n',\n      'fs[1] = sqrt(0.455);\\nfs[2] = sqrt(0.455);\\n',\n      'gs[1] = 1.365;\\ngs[2] = 1.365;\\n',\n      'hs[1] = 0.071175;\\nhs[2] = 0.071175;\\n'\n    )\n  } else {\n    params_line <- min(which(grepl('parameters {', model_file, fixed = TRUE)))\n    model_file[params_line] <- paste0(\n      'transformed data {\\n',\n      'vector[n_series] trend_zeros = rep_vector(0.0, n_series);\\n',\n      '// exchangeable partial autocorrelation hyperparameters\\n',\n      '// see Heaps 2022 for details (https://doi.org/10.1080/10618600.2022.2079648)\\n',\n      'vector[2] es;\\n',\n      'vector<lower=0>[2] fs;\\n',\n      'vector<lower=0>[2] gs;\\n',\n      'vector<lower=0>[2] hs;\\n',\n      'es[1] = 0;\\nes[2] = 0;\\n',\n      'fs[1] = sqrt(0.455);\\nfs[2] = sqrt(0.455);\\n',\n      'gs[1] = 1.365;\\ngs[2] = 1.365;\\n',\n      'hs[1] = 0.071175;\\nhs[2] = 0.071175;\\n',\n      '}\\n\\nparameters {'\n    )\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  # Add parameters for real-valued partial autocorrelations\n  model_file[grep(\n    \"vector<lower=0>[n_series] sigma;\",\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    \"cholesky_factor_corr[n_series] L_Omega;\\n\",\n    \"vector<lower=0>[n_series] sigma;\\n\\n\",\n    '// unconstrained VAR1 partial autocorrelations\\n',\n    'matrix[n_series, n_series] P_real;\\n',\n    '// partial autocorrelation hyperparameters\\n',\n    'vector[2] Pmu;\\n',\n    'vector<lower=0>[2] Pomega;\\n'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add transformed parameters for partial autocorrelation reverse mapping\n  model_file[grep(\n    'transformed parameters {',\n    model_file,\n    fixed = TRUE\n  )] <- paste0(\n    'transformed parameters {\\n',\n    \"// latent trend VAR1 autoregressive terms\\n\",\n    \"matrix[n_series, n_series] A;\\n\",\n    '// LKJ form of covariance matrix\\n',\n    \"matrix[n_series, n_series] L_Sigma;\\n\",\n    '// computed error covariance matrix\\n',\n    'cov_matrix[n_series] Sigma;\\n',\n    '// initial trend covariance\\n',\n    'cov_matrix[n_series] Gamma;'\n  )\n  model_file[\n    grep(\n      'trend[i, 1:n_series] = to_row_vector(trend_raw[i]);',\n      model_file,\n      fixed = TRUE\n    ) +\n      1\n  ] <- paste0(\n    '}\\n\\n',\n    'L_Sigma = diag_pre_multiply(sigma, L_Omega);\\n',\n    'Sigma = multiply_lower_tri_self_transpose(L_Sigma);\\n',\n    '// stationary VAR reparameterisation\\n',\n    '{\\n',\n    'matrix[n_series, n_series] P[1];\\n',\n    'matrix[n_series, n_series] phiGamma[2, 1];\\n',\n    'P[1] = P_realtoP(P_real);\\n',\n    'phiGamma = rev_mapping(P, Sigma);\\n',\n    'A = phiGamma[1, 1];\\n',\n    'Gamma = phiGamma[2, 1];\\n',\n    '}'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Add priors for partial autocorrelations\n  model_file[grep(\"// trend means\", model_file, fixed = TRUE)] <- paste0(\n    '// LKJ error correlation prior\\n',\n    'L_Omega ~ lkj_corr_cholesky(2);\\n',\n    '// partial autocorrelation hyperpriors\\n',\n    'Pmu ~ normal(es, fs);\\n',\n    'Pomega ~ gamma(gs, hs);\\n',\n    '// unconstrained partial autocorrelations\\n',\n    'diagonal(P_real) ~ normal(Pmu[1], 1 / sqrt(Pomega[1]));\\n',\n    'for(i in 1:n_series) {\\n',\n    'for(j in 1:n_series) {\\n',\n    'if(i != j) P_real[i, j] ~ normal(Pmu[2], 1 / sqrt(Pomega[2]));\\n',\n    '}\\n',\n    '}\\n',\n    \"// trend means\"\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update prior for error SD parameters sigma\n  model_file[\n    grep(\n      \"// priors for latent trend variance parameters\",\n      model_file,\n      fixed = TRUE\n    ) +\n      1\n  ] <- paste0(\n    'sigma ~ inv_gamma(2.3693353, 0.7311319);'\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Update trend model to use multinormal\n  model_file[grep(\n    \"trend_raw[1] ~ normal(0, sigma);\",\n    model_file,\n    fixed = TRUE\n  )] <- \"trend_raw[1] ~ multi_normal(trend_zeros, Gamma);\"\n  model_file[grep(\n    \"trend_raw[i] ~ normal(mu[i - 1], sigma);\",\n    model_file,\n    fixed = TRUE\n  )] <- \"trend_raw[i] ~ multi_normal_cholesky(mu[i - 1], L_Sigma);\"\n\n  model_file <- gsub(\n    'contemporaneously uncorrelated',\n    'contemporaneously correlated',\n    model_file\n  )\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  # Return the updated model file\n  return(model_file)\n}\n"
  },
  {
    "path": "R/summary.mvgam.R",
    "content": "#' Summary for a fitted \\pkg{mvgam} models\n#'\n#' These functions take a fitted \\code{mvgam} or \\code{jsdgam} object and\n#' return various useful summaries\n#'\n#' @importFrom stats printCoefmat\n#'\n#' @param object \\code{list} object of class `mvgam`\n#'\n#' @param include_betas Logical. Print a summary that includes posterior\n#'   summaries of all linear predictor beta coefficients (including spline\n#'   coefficients)? Defaults to \\code{TRUE} but use \\code{FALSE} for a more\n#'   concise summary\n#'\n#' @param smooth_test Logical. Compute estimated degrees of freedom and\n#'   approximate p-values for smooth terms? Defaults to \\code{TRUE}, but users\n#'   may wish to set to \\code{FALSE} for complex models with many smooth or\n#'   random effect terms\n#'\n#' @param digits The number of significant digits for printing out the summary;\n#'   defaults to \\code{2}.\n#'\n#' @param ... Ignored\n#'\n#' @author Nicholas J Clark\n#'\n#' @details `summary.mvgam` and `summary.mvgam_prefit` return brief summaries of\n#'   the model's call, along with posterior intervals for some of the key\n#'   parameters in the model. Note that some smooths have extra penalties on the\n#'   null space, so summaries for the \\code{rho} parameters may include more\n#'   penalty terms than the number of smooths in the original model formula.\n#'   Approximate p-values for smooth terms are also returned, with methods used\n#'   for their calculation following those used for `mgcv` equivalents (see\n#'   \\code{\\link[mgcv]{summary.gam}} for details). The Estimated Degrees of\n#'   Freedom (edf) for smooth terms is computed using either `edf.type = 1` for\n#'   models with no trend component, or `edf.type = 0` for models with trend\n#'   components. These are described in the documentation for\n#'   \\code{\\link[mgcv]{jagam}}. Experiments suggest these p-values tend to be\n#'   more conservative than those that might be returned from an equivalent model\n#'   fit with \\code{\\link[mgcv]{summary.gam}} using `method = 'REML'`\n#'\n#'   `coef.mvgam` returns either summaries or full posterior estimates for `GAM`\n#'   component coefficients\n#'\n#' @return For `summary.mvgam`, an object of class \\code{mvgam_summary} containing:\n#'   \\itemize{\n#'     \\item \\code{model_spec}: Model specification details (formulas, family, dimensions)\n#'     \\item \\code{parameters}: Parameter estimates and significance tests\n#'     \\item \\code{diagnostics}: MCMC convergence diagnostics\n#'     \\item \\code{sampling_info}: Sampling algorithm details\n#'   }\n#'\n#'   For `summary.mvgam_prefit`, a \\code{list} is printed on-screen showing\n#'   the model specifications\n#'\n#'   For `coef.mvgam`, either a \\code{matrix} of posterior coefficient\n#'   distributions (if \\code{summarise == FALSE} or \\code{data.frame} of\n#'   coefficient summaries)\n#' @examples\n#' \\dontrun{\n#' simdat <- sim_mvgam(seasonality = \"hierarchical\")\n#'\n#' mod <- mvgam(\n#'   y ~ series +\n#'     s(season, bs = \"cc\", k = 6) +\n#'     s(season, series, bs = \"fs\", k = 4),\n#'   data = simdat$data_train,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' mod_summary <- summary(mod)\n#' mod_summary\n#' }\n#' @export\nsummary.mvgam = function(\n  object,\n  include_betas = TRUE,\n  smooth_test = TRUE,\n  digits = 2,\n  ...\n) {\n  #### Some adjustments for cleaner summaries ####\n  if (\n    attr(object$model_data, 'trend_model') == 'None' &\n      object$use_lv &\n      object$family != 'nmix'\n  ) {\n    attr(object$model_data, 'trend_model') <- 'RW'\n  }\n  variational <- object$algorithm %in%\n    c('fullrank', 'meanfield', 'laplace', 'pathfinder')\n\n  #### Smooth tests ####\n  if (smooth_test) {\n    if (inherits(object$trend_model, 'mvgam_trend')) {\n      trend_model <- object$trend_model$label\n    } else {\n      trend_model <- object$trend_model\n    }\n    object$mgcv_model <- compute_edf(\n      object$mgcv_model,\n      object,\n      'rho',\n      'sigma_raw',\n      conservative = trend_model == 'None'\n    )\n\n    if (!is.null(object$trend_call) & !inherits(object, 'jsdgam')) {\n      object$trend_mgcv_model <- compute_edf(\n        object$trend_mgcv_model,\n        object,\n        'rho_trend',\n        'sigma_raw_trend'\n      )\n    }\n  }\n\n  #### Create structured summary object using extractors ####\n  summary_obj <- structure(\n    list(\n      model_spec = extract_model_spec(object),\n      parameters = extract_parameters(\n        object,\n        include_betas,\n        smooth_test,\n        digits,\n        variational\n      ),\n      diagnostics = extract_diagnostics(object, digits, variational),\n      sampling_info = extract_sampling_info(object)\n    ),\n    class = c(\"mvgam_summary\", \"list\")\n  )\n\n  return(summary_obj)\n}\n\n#' Print method for mvgam_summary objects\n#'\n#' @param x An object of class \\code{mvgam_summary}\n#' @param ... Additional arguments (ignored)\n#' @return Invisibly returns the input object after printing\n#' @export\nprint.mvgam_summary <- function(x, ...) {\n  print_model_specification(x$model_spec)\n  print_sampling_information(x$sampling_info)\n  print_parameters(x$parameters)\n  print_diagnostics(x$diagnostics)\n\n  cat('\\nUse how_to_cite() to get started describing this model')\n  invisible(x)\n}\n\n#' Print model specification section\n#' @param model_spec Model specification from mvgam_summary\n#' @noRd\nprint_model_specification <- function(model_spec) {\n  # Print formulas\n  if (!is.null(model_spec$formulas$process)) {\n    cat(\"GAM observation formula:\\n\")\n    print(model_spec$formulas$observation)\n    cat(\"\\nGAM process formula:\\n\")\n    print(model_spec$formulas$process)\n  } else {\n    cat(\"GAM formula:\\n\")\n    print(model_spec$formulas$observation)\n  }\n\n  # Print family and link\n  cat(\"\\nFamily:\\n\")\n  cat(paste0(model_spec$family, '\\n'))\n\n  cat(\"\\nLink function:\\n\")\n  cat(paste0(model_spec$link, '\\n'))\n\n  # Print trend model\n  if (!model_spec$is_jsdgam) {\n    cat(\"\\nTrend model:\\n\")\n    if (is.call(model_spec$trend_model)) {\n      print(model_spec$trend_model)\n    } else {\n      cat(paste0(model_spec$trend_model, '\\n'))\n    }\n  }\n\n  # Print latent variable info\n  if (!is.null(model_spec$latent_variables)) {\n    if (model_spec$latent_variables$type == \"process_models\") {\n      cat(\"\\nN process models:\\n\")\n      cat(model_spec$latent_variables$count, '\\n')\n    } else {\n      cat(\"\\nN latent factors:\\n\")\n      cat(model_spec$latent_variables$count, '\\n')\n    }\n  }\n\n  # Print dimensions\n  if (model_spec$is_jsdgam) {\n    cat('\\nN species:\\n')\n    cat(model_spec$dimensions$n_species, '\\n')\n    cat('\\nN sites:\\n')\n    cat(model_spec$dimensions$n_sites, '\\n')\n  } else {\n    cat('\\nN series:\\n')\n    cat(model_spec$dimensions$n_series, '\\n')\n    cat('\\nN timepoints:\\n')\n    cat(model_spec$dimensions$n_timepoints, '\\n')\n  }\n\n  # Print upper bounds if present\n  if (!is.null(model_spec$upper_bounds)) {\n    cat('\\nUpper bounds:\\n')\n    cat(model_spec$upper_bounds, '\\n')\n  }\n}\n\n#' Print sampling information section\n#' @param sampling_info Sampling information from mvgam_summary\n#' @noRd\nprint_sampling_information <- function(sampling_info) {\n  cat('\\nStatus:\\n')\n\n  if (sampling_info$fit_engine == 'jags') {\n    cat('Fitted using JAGS', '\\n')\n  } else if (sampling_info$fit_engine == 'stan') {\n    cat('Fitted using Stan', '\\n')\n\n    if (!is.null(sampling_info$chains)) {\n      cat(\n        sampling_info$chains,\n        \" chains, each with iter = \",\n        sampling_info$iter,\n        \"; warmup = \",\n        sampling_info$warmup,\n        \"; thin = \",\n        sampling_info$thin,\n        \" \\n\",\n        \"Total post-warmup draws = \",\n        sampling_info$total_draws,\n        \"\\n\",\n        sep = ''\n      )\n    }\n  }\n}\n\n#' Print parameters section\n#' @param parameters Parameters from mvgam_summary\n#' @noRd\nprint_parameters <- function(parameters) {\n  # Print family parameters\n  family_param_labels <- c(\n    \"observation_error\",\n    \"log_observation_error\",\n    \"observation_df\",\n    \"observation_shape\",\n    \"observation_precision\",\n    \"observation_dispersion\"\n  )\n\n  for (label in family_param_labels) {\n    if (!is.null(parameters[[label]])) {\n      cat(paste0(\"\\n\", format_param_header(label), \":\\n\"))\n      print(parameters[[label]])\n    }\n  }\n\n  # Print GAM coefficients\n  if (!is.null(parameters$gam_coefficients)) {\n    cat(\"\\nGAM coefficient (beta) estimates:\\n\")\n    print(parameters$gam_coefficients)\n  }\n\n  if (!is.null(parameters$gam_obs_coefficients)) {\n    cat(\"\\nGAM observation model coefficient (beta) estimates:\\n\")\n    print(parameters$gam_obs_coefficients)\n  }\n\n  # Print group-level parameters\n  if (!is.null(parameters$gam_group_level)) {\n    cat(\"\\nGAM group-level estimates:\\n\")\n    print(parameters$gam_group_level)\n  }\n\n  if (!is.null(parameters$gam_obs_group_level)) {\n    cat(\"\\nGAM observation model group-level estimates:\\n\")\n    print(parameters$gam_obs_group_level)\n  }\n\n  # Print GP parameters\n  if (!is.null(parameters$gam_gp_parameters)) {\n    cat(\n      \"\\nGAM gp term marginal deviation (alpha) and length scale (rho) estimates:\\n\"\n    )\n    print(parameters$gam_gp_parameters)\n  }\n\n  if (!is.null(parameters$gam_obs_gp_parameters)) {\n    cat(\n      \"\\nGAM observation model gp term marginal deviation (alpha) and length scale (rho) estimates:\\n\"\n    )\n    print(parameters$gam_obs_gp_parameters)\n  }\n\n  # Print smooth tests\n  if (!is.null(parameters$gam_smooth_tests)) {\n    cat(\"\\nApproximate significance of GAM smooths:\\n\")\n    suppressWarnings(printCoefmat(\n      parameters$gam_smooth_tests,\n      digits = 4,\n      signif.stars = getOption(\"show.signif.stars\"),\n      has.Pvalue = TRUE,\n      na.print = \"NA\",\n      cs.ind = 1\n    ))\n  }\n\n  if (!is.null(parameters$gam_obs_smooth_tests)) {\n    cat(\"\\nApproximate significance of GAM observation smooths:\\n\")\n    suppressWarnings(printCoefmat(\n      parameters$gam_obs_smooth_tests,\n      digits = 4,\n      signif.stars = getOption(\"show.signif.stars\"),\n      has.Pvalue = TRUE,\n      na.print = \"NA\",\n      cs.ind = 1\n    ))\n  }\n\n  # Print trend parameters (using labels from param_info)\n  trend_param_patterns <- c(\n    \"drift_parameter\",\n    \"standard_deviation\",\n    \"precision_parameter\",\n    \"autoregressive_coef\",\n    \"var_coefficient\",\n    \"marginal_deviation\",\n    \"length_scale\",\n    \"growth_rate\",\n    \"offset_parameter\"\n  )\n\n  for (pattern in trend_param_patterns) {\n    matching_params <- names(parameters)[grepl(pattern, names(parameters))]\n    for (param_name in matching_params) {\n      if (!is.null(parameters[[param_name]])) {\n        cat(paste0(\"\\n\", format_trend_header(param_name), \":\\n\"))\n        print(parameters[[param_name]])\n      }\n    }\n  }\n\n  # Print hierarchical correlation\n  if (!is.null(parameters$hierarchical_correlation)) {\n    cat(\n      \"\\nHierarchical correlation weighting parameter (alpha_cor) estimates:\\n\"\n    )\n    print(parameters$hierarchical_correlation)\n  }\n\n  # Print trend GAM parameters\n  if (!is.null(parameters$gam_process_coefficients)) {\n    cat(\"\\nGAM process model coefficient (beta) estimates:\\n\")\n    print(parameters$gam_process_coefficients)\n  }\n\n  if (!is.null(parameters$gam_process_group_level)) {\n    cat(\"\\nGAM process model group-level estimates:\\n\")\n    print(parameters$gam_process_group_level)\n  }\n\n  if (!is.null(parameters$gam_process_gp_parameters)) {\n    cat(\n      \"\\nGAM process model gp term marginal deviation (alpha) and length scale (rho) estimates:\\n\"\n    )\n    print(parameters$gam_process_gp_parameters)\n  }\n\n  if (!is.null(parameters$gam_process_smooth_tests)) {\n    cat(\"\\nApproximate significance of GAM process smooths:\\n\")\n    suppressWarnings(printCoefmat(\n      parameters$gam_process_smooth_tests,\n      digits = 4,\n      signif.stars = getOption(\"show.signif.stars\"),\n      has.Pvalue = TRUE,\n      na.print = \"NA\",\n      cs.ind = 1\n    ))\n  }\n}\n\n#' Print diagnostics section\n#' @param diagnostics Diagnostics from mvgam_summary\n#' @noRd\nprint_diagnostics <- function(diagnostics) {\n  if (diagnostics$fit_engine == 'stan' && diagnostics$algorithm == 'sampling') {\n    if (diagnostics$stan_diagnostics_available) {\n      cat('\\nStan MCMC diagnostics:\\n')\n\n      if (!is.null(diagnostics$sampler_message)) {\n        cat(insight::format_message(diagnostics$sampler_message, indent = \"\"))\n        cat('\\n')\n      }\n    }\n  } else if (diagnostics$algorithm != 'sampling') {\n    if (!is.null(diagnostics$message)) {\n      cat(paste0('\\n', diagnostics$message, '\\n'))\n    }\n  } else if (diagnostics$fit_engine == 'jags') {\n    cat('\\nJAGS MCMC diagnostics:\\n')\n    if (!is.null(diagnostics$jags_diagnostics)) {\n      if (diagnostics$jags_diagnostics$rhat_ok) {\n        cat('\\nRhat looks reasonable for all parameters\\n')\n      } else {\n        cat(\n          '\\nRhats above 1.05 found for',\n          diagnostics$jags_diagnostics$n_high_rhat,\n          'parameters\\n* Use pairs() to investigate\\n'\n        )\n      }\n    }\n  }\n}\n\n#' Format parameter header for display\n#' @param label Parameter label\n#' @return Formatted header string\n#' @noRd\nformat_param_header <- function(label) {\n  switch(\n    label,\n    \"observation_error\" = \"Observation error parameter estimates\",\n    \"log_observation_error\" = \"log(observation error) parameter estimates\",\n    \"observation_df\" = \"Observation df parameter estimates\",\n    \"observation_shape\" = \"Observation shape parameter estimates\",\n    \"observation_precision\" = \"Observation precision parameter estimates\",\n    \"observation_dispersion\" = \"Observation dispersion parameter estimates\",\n    label # fallback\n  )\n}\n\n#' Format trend parameter header for display\n#' @param param_name Parameter name\n#' @return Formatted header string\n#' @noRd\nformat_trend_header <- function(param_name) {\n  # This would need more sophisticated logic to match the original formatting\n  # For now, return a simple transformation\n  gsub(\"_\", \" \", param_name)\n}\n\n#' @rdname summary.mvgam\n#'\n#' @export\nsummary.mvgam_prefit = function(object, ...) {\n  if (!is.null(object$trend_call)) {\n    cat(\"\\nGAM observation formula:\\n\")\n    print(object$call)\n\n    cat(\"\\nGAM process formula:\\n\")\n    print(object$trend_call)\n  } else {\n    cat(\"\\nGAM formula:\\n\")\n    print(object$call)\n  }\n\n  cat(\"\\n\\nFamily:\\n\")\n  cat(paste0(object$family, '\\n'))\n\n  cat(\"\\nLink function:\\n\")\n  cat(paste0(family_links(object$family), '\\n'))\n\n  if (!inherits(object, 'jsdgam')) {\n    cat(\"\\nTrend model:\\n\")\n    if (inherits(object$trend_model, 'mvgam_trend')) {\n      print(object$trend_model$label)\n      cat('\\n')\n    } else {\n      cat(paste0(object$trend_model, '\\n'))\n    }\n  }\n\n  if (object$use_lv) {\n    if (!is.null(object$trend_call)) {\n      cat(\"\\nN process models:\\n\")\n      cat(object$n_lv, '\\n')\n    } else {\n      cat(\"\\nN latent factors:\\n\")\n      cat(object$n_lv, '\\n')\n    }\n  }\n\n  if (inherits(object, 'jsdgam')) {\n    cat('\\nN species:\\n')\n    cat(NCOL(object$ytimes), '\\n')\n  } else {\n    cat('\\nN series:\\n')\n    cat(NCOL(object$ytimes), '\\n')\n  }\n\n  if (inherits(object, 'jsdgam')) {\n    cat('\\nN sites:\\n')\n    cat(NROW(object$ytimes), '\\n')\n  } else {\n    cat('\\nN timepoints:\\n')\n    cat(NROW(object$ytimes), '\\n')\n  }\n\n  cat('\\nStatus:')\n  cat('Not fitted', '\\n')\n}\n\n#' @rdname summary.mvgam\n#'\n#' @export\n#'\n#' @title Extract mvgam beta coefficients from the GAM component\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}\n#'\n#' @param summarise \\code{logical}. Summaries of coefficients will be returned\n#'  if \\code{TRUE}. Otherwise the full posterior distribution will be returned\n#'\n#' @method coef mvgam\n#'\n#' @export\ncoef.mvgam = function(object, summarise = TRUE, ...) {\n  coef_names <- names(object$mgcv_model$coefficients)\n\n  if (summarise) {\n    mvgam_coefs <- mcmc_summary(object$model_output, 'b')[, c(3:7)]\n    rownames(mvgam_coefs) <- coef_names\n  } else {\n    mvgam_coefs <- mcmc_chains(object$model_output, 'b')\n    colnames(mvgam_coefs) <- coef_names\n  }\n\n  return(mvgam_coefs)\n}\n\n#' Extract a clean mcmc_summary table of params\n#' @param object An `mvgam` or `jsdgam` object\n#' @param params A string of parameters to extract\n#' @param digits The number of significant digits for printing out the summary\n#' @param variational Logical indicating whether a variational approximation was used\n#' @noRd\nclean_summary_table = function(\n  object,\n  params,\n  digits = 2,\n  variational = FALSE\n) {\n  mcmc_summary(\n    object$model_output,\n    params,\n    ISB = TRUE,\n    digits = digits,\n    variational = variational\n  )[, c(3:7)]\n}\n\n#' Calculate and return summary table for GP parameters\n#' @param object An `mvgam` or `jsdgam` object\n#' @param mgcv_model A `gam` object containing GP effects\n#' @param trend_effects Logical indicating whether this is a trend_mgcv_model\n#' @param digits The number of significant digits for printing out the summary\n#' @param variational Logical indicating whether a variational approximation was used\n#' @noRd\ngp_param_summary = function(\n  object,\n  mgcv_model,\n  trend_effects = FALSE,\n  digits = 2,\n  variational = FALSE\n) {\n  # Extract GP name and isotropic information\n  gp_names <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'name'),\n    use.names = FALSE\n  )\n  gp_isos <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'iso'),\n    use.names = FALSE\n  )\n  gp_dims <- unlist(\n    purrr::map(attr(mgcv_model, 'gp_att_table'), 'dim'),\n    use.names = FALSE\n  )\n\n  # Create full list of rho parameter names\n  full_names <- vector(mode = 'list', length = length(gp_names))\n  for (i in seq_len(length(gp_names))) {\n    if (gp_isos[i]) {\n      full_names[[i]] <- gp_names[i]\n    } else {\n      full_names[[i]] <- paste0(gp_names[i], '[', 1:gp_dims[i], ']')\n    }\n  }\n  full_names <- unlist(full_names, use.names = FALSE)\n\n  # Determine which parameters to extract\n  if (trend_effects) {\n    alpha_params <- gsub(\n      'gp_',\n      'gp_trend_',\n      gsub(\n        'series',\n        'trend',\n        paste0('alpha_', clean_gpnames(gp_names)),\n        fixed = TRUE\n      ),\n      fixed = TRUE\n    )\n    rho_params <- gsub(\n      'gp_',\n      'gp_trend_',\n      gsub(\n        'series',\n        'trend',\n        paste0('rho_', clean_gpnames(gp_names)),\n        fixed = TRUE\n      ),\n      fixed = TRUE\n    )\n  } else {\n    alpha_params <- paste0('alpha_', clean_gpnames(gp_names))\n    rho_params <- paste0('rho_', clean_gpnames(gp_names))\n  }\n\n  # Create summary tables\n  alpha_summary <- clean_summary_table(\n    object = object,\n    params = alpha_params,\n    digits = digits,\n    variational = variational\n  )\n  rownames(alpha_summary) <- paste0('alpha_', gp_names)\n\n  rho_summary <- clean_summary_table(\n    object = object,\n    params = rho_params,\n    digits = digits,\n    variational = variational\n  )\n  rownames(rho_summary) <- paste0('rho_', full_names)\n\n  # Return as a list\n  return(list(alpha_summary = alpha_summary, rho_summary = rho_summary))\n}\n\n#' Extract model specification information from mvgam object\n#' @param object An mvgam object\n#' @return List containing model specification details\n#' @noRd\nextract_model_spec <- function(object) {\n  # Extract formulas - always use same structure\n  formulas <- list(\n    observation = object$call,\n    process = if (!is.null(object$trend_call)) object$trend_call else NULL\n  )\n\n  # Extract trend model information\n  if (!inherits(object, 'jsdgam')) {\n    if (inherits(object$trend_model, 'mvgam_trend')) {\n      trend_model <- object$trend_model$label\n    } else {\n      trend_model <- object$trend_model\n    }\n  } else {\n    trend_model <- NULL\n  }\n\n  # Extract dimensions and counts\n  if (object$use_lv) {\n    if (!is.null(object$trend_call)) {\n      lv_info <- list(\n        type = \"process_models\",\n        count = object$n_lv\n      )\n    } else {\n      lv_info <- list(\n        type = \"latent_factors\",\n        count = object$n_lv\n      )\n    }\n  } else {\n    lv_info <- NULL\n  }\n\n  # Extract series/species and timepoints/sites information\n  if (inherits(object, 'jsdgam')) {\n    dimensions <- list(\n      n_species = NCOL(object$ytimes),\n      n_sites = NROW(object$ytimes)\n    )\n  } else {\n    dimensions <- list(\n      n_series = NCOL(object$ytimes),\n      n_timepoints = NROW(object$ytimes)\n    )\n  }\n\n  # Compile model specification\n  model_spec <- list(\n    formulas = formulas,\n    family = object$family,\n    link = family_links(object$family),\n    trend_model = trend_model,\n    upper_bounds = object$upper_bounds,\n    latent_variables = lv_info,\n    dimensions = dimensions,\n    is_jsdgam = inherits(object, 'jsdgam')\n  )\n\n  return(model_spec)\n}\n\n#' Extract sampling information from mvgam object\n#' @param object An mvgam object\n#' @return List containing sampling details\n#' @noRd\nextract_sampling_info <- function(object) {\n  sampling_info <- list(\n    fit_engine = object$fit_engine,\n    algorithm = object$algorithm\n  )\n\n  if (object$fit_engine == 'stan') {\n    n_kept <- object$model_output@sim$n_save - object$model_output@sim$warmup2\n\n    sampling_info$chains <- object$model_output@sim$chains\n    sampling_info$iter <- object$model_output@sim$iter\n    sampling_info$warmup <- object$model_output@sim$warmup\n    sampling_info$thin <- object$model_output@sim$thin\n    sampling_info$total_draws <- sum(n_kept)\n\n    if (object$algorithm == 'sampling') {\n      sampler <- attr(object$model_output@sim$samples[[1]], \"args\")$sampler_t\n      if (sampler == \"NUTS(diag_e)\") {\n        sampler <- 'sampling(hmc)'\n      }\n      sampling_info$sampler <- sampler\n    }\n  }\n\n  return(sampling_info)\n}\n\n#' Extract diagnostic information from mvgam object\n#' @param object An mvgam object\n#' @param digits Number of digits for summary statistics\n#' @param variational Logical indicating if variational approximation was used\n#' @return List containing diagnostic information\n#' @noRd\nextract_diagnostics <- function(object, digits = 2, variational = FALSE) {\n  diagnostics <- list(\n    fit_engine = object$fit_engine,\n    algorithm = object$algorithm\n  )\n\n  if (object$fit_engine == 'stan' & object$algorithm == 'sampling') {\n    diagnostics$stan_diagnostics_available <- TRUE\n    diagnostics$max_treedepth <- object$max_treedepth\n    diagnostics$ignore_b_trend <- inherits(object, 'jsdgam')\n\n    # Get sampler information for message\n    sampler <- attr(object$model_output@sim$samples[[1]], \"args\")$sampler_t\n    if (sampler == \"NUTS(diag_e)\") {\n      sampler <- 'sampling(hmc)'\n    }\n\n    # Capture Stan diagnostic messages\n    diag_output <- utils::capture.output({\n      check_all_diagnostics(\n        object$model_output,\n        max_treedepth = object$max_treedepth,\n        ignore_b_trend = diagnostics$ignore_b_trend\n      )\n    })\n\n    diagnostics$sampler_message <- c(\n      diag_output,\n      paste0(\n        \"\\n\",\n        \"Samples were drawn using \",\n        sampler,\n        \". For each parameter, n_eff is\",\n        \" a crude measure of effective\",\n        \" sample size, and Rhat is the\",\n        \" potential scale reduction factor\",\n        \" on split MCMC chains (at\",\n        \" convergence, Rhat = 1)\"\n      )\n    )\n  } else if (object$algorithm != 'sampling') {\n    diagnostics$message <- \"Posterior approximation used: no diagnostics to compute\"\n  } else if (object$fit_engine == 'jags') {\n    # Extract JAGS diagnostics\n    rhats <- mcmc_summary(\n      object$model_output,\n      digits = digits,\n      variational = variational\n    )[, 6]\n\n    diagnostics$jags_diagnostics <- list(\n      rhats = rhats,\n      n_high_rhat = length(which(rhats > 1.05)),\n      rhat_ok = !any(rhats > 1.05)\n    )\n  }\n\n  return(diagnostics)\n}\n\n#' Helper function to extract parameter summary with consistent columns\n#' @param model_output MCMC output object\n#' @param param_name Parameter name to extract\n#' @param digits Number of digits\n#' @param variational Logical for variational approximation\n#' @param ISB Logical for ISB parameter (used for group-level effects)\n#' @return Parameter summary matrix\n#' @noRd\nextract_param_summary <- function(\n  model_output,\n  param_name,\n  digits = 2,\n  variational = FALSE,\n  ISB = TRUE\n) {\n  mcmc_summary(\n    model_output,\n    param_name,\n    ISB = ISB,\n    digits = digits,\n    variational = variational\n  )[, c(3:7)]\n}\n\n#' Extract family-specific parameters\n#' @param object An mvgam object\n#' @param digits Number of digits\n#' @param variational Logical for variational approximation\n#' @return List of family parameter summaries\n#' @noRd\nextract_family_parameters <- function(object, digits = 2, variational = FALSE) {\n  family_info <- family_param_info(object$family)\n  family_params <- list()\n\n  if (length(family_info$param_names) > 0) {\n    for (i in seq_along(family_info$param_names)) {\n      param_name <- family_info$param_names[i]\n      param_label <- family_info$labels[i]\n\n      family_params[[param_label]] <- extract_param_summary(\n        object$model_output,\n        param_name,\n        digits,\n        variational\n      )\n    }\n  }\n\n  return(family_params)\n}\n\n#' Extract GAM coefficient parameters\n#' @param object An mvgam object\n#' @param include_betas Logical to include all coefficients\n#' @param digits Number of digits\n#' @param variational Logical for variational approximation\n#' @return List of coefficient summaries\n#' @noRd\nextract_gam_coefficients <- function(\n  object,\n  include_betas = TRUE,\n  digits = 2,\n  variational = FALSE\n) {\n  gam_params <- list()\n\n  # Determine coefficient subset\n  if (include_betas) {\n    coef_indices <- seq_along(object$mgcv_model$coefficients)\n  } else {\n    coef_indices <- if (object$mgcv_model$nsdf > 0) {\n      1:object$mgcv_model$nsdf\n    } else {\n      integer(0)\n    }\n  }\n\n  if (length(coef_indices) > 0) {\n    coef_names <- names(object$mgcv_model$coefficients)[coef_indices]\n    mvgam_coefs <- extract_param_summary(\n      object$model_output,\n      'b',\n      digits,\n      variational\n    )\n\n    if (nrow(mvgam_coefs) >= max(coef_indices)) {\n      mvgam_coefs <- mvgam_coefs[coef_indices, , drop = FALSE]\n      rownames(mvgam_coefs) <- coef_names\n\n      # Choose appropriate label based on model structure\n      coef_label <- if (!is.null(object$trend_call)) {\n        \"gam_obs_coefficients\"\n      } else {\n        \"gam_coefficients\"\n      }\n      gam_params[[coef_label]] <- mvgam_coefs\n    }\n  }\n\n  return(gam_params)\n}\n\n#' Extract parameter estimates from mvgam object\n#' @param object An mvgam object\n#' @param include_betas Logical, include all beta coefficients\n#' @param smooth_test Logical, compute significance tests for smooths\n#' @param digits Number of digits for summaries\n#' @param variational Logical indicating if variational approximation was used\n#' @return List containing all parameter estimates\n#' @noRd\nextract_parameters <- function(\n  object,\n  include_betas = TRUE,\n  smooth_test = TRUE,\n  digits = 2,\n  variational = FALSE\n) {\n  parameters <- list()\n\n  # Extract family-specific parameters\n  parameters <- c(\n    parameters,\n    extract_family_parameters(object, digits, variational)\n  )\n\n  # Extract GAM coefficients\n  parameters <- c(\n    parameters,\n    extract_gam_coefficients(object, include_betas, digits, variational)\n  )\n\n  # Extract remaining parameter types\n  parameters <- c(\n    parameters,\n    extract_group_level_parameters(object, digits, variational)\n  )\n  parameters <- c(\n    parameters,\n    extract_gp_parameters(object, digits, variational)\n  )\n  parameters <- c(parameters, extract_smooth_tests(object, smooth_test, digits))\n  parameters <- c(\n    parameters,\n    extract_trend_parameters(\n      object,\n      include_betas,\n      smooth_test,\n      digits,\n      variational\n    )\n  )\n\n  return(parameters)\n}\n\n#' Extract group-level (random effect) parameters\n#' @param object An mvgam object\n#' @param digits Number of digits\n#' @param variational Logical for variational approximation\n#' @return List of group-level parameter summaries\n#' @noRd\nextract_group_level_parameters <- function(\n  object,\n  digits = 2,\n  variational = FALSE\n) {\n  group_params <- list()\n\n  if (!all(is.na(object$sp_names))) {\n    has_random_effects <- any(unlist(purrr::map(\n      object$mgcv_model$smooth,\n      inherits,\n      'random.effect'\n    )))\n\n    if (has_random_effects) {\n      re_labs <- unlist(lapply(\n        purrr::map(object$mgcv_model$smooth, 'label'),\n        paste,\n        collapse = ','\n      ))[unlist(purrr::map(\n        object$mgcv_model$smooth,\n        inherits,\n        'random.effect'\n      ))]\n\n      re_sds <- extract_param_summary(\n        object$model_output,\n        'sigma_raw',\n        digits = digits,\n        variational = variational,\n        ISB = TRUE\n      )\n\n      re_mus <- extract_param_summary(\n        object$model_output,\n        'mu_raw',\n        digits = digits,\n        variational = variational,\n        ISB = TRUE\n      )\n\n      rownames(re_sds) <- paste0('sd(', re_labs, ')')\n      rownames(re_mus) <- paste0('mean(', re_labs, ')')\n\n      param_label <- if (!is.null(object$trend_call)) {\n        \"gam_obs_group_level\"\n      } else {\n        \"gam_group_level\"\n      }\n      group_params[[param_label]] <- rbind(re_mus, re_sds)\n    }\n  }\n\n  return(group_params)\n}\n\n#' Extract Gaussian Process parameters\n#' @param object An mvgam object\n#' @param digits Number of digits\n#' @param variational Logical for variational approximation\n#' @return List of GP parameter summaries\n#' @noRd\nextract_gp_parameters <- function(object, digits = 2, variational = FALSE) {\n  gp_params <- list()\n\n  if (!is.null(attr(object$mgcv_model, 'gp_att_table'))) {\n    gp_summaries <- gp_param_summary(\n      object = object,\n      mgcv_model = object$mgcv_model,\n      digits = digits,\n      variational = variational\n    )\n\n    param_label <- if (!is.null(object$trend_call)) {\n      \"gam_obs_gp_parameters\"\n    } else {\n      \"gam_gp_parameters\"\n    }\n    gp_params[[param_label]] <- rbind(\n      gp_summaries$alpha_summary,\n      gp_summaries$rho_summary\n    )\n  }\n\n  return(gp_params)\n}\n\n#' Extract smooth significance tests\n#' @param object An mvgam object\n#' @param smooth_test Logical to compute tests\n#' @param digits Number of digits\n#' @return List with smooth test results\n#' @noRd\nextract_smooth_tests <- function(object, smooth_test = TRUE, digits = 2) {\n  smooth_params <- list()\n\n  if (any(!is.na(object$sp_names)) & smooth_test) {\n    gam_sig_table <- try(\n      suppressWarnings(summary(object$mgcv_model)$s.table[,\n        c(1, 2, 3, 4),\n        drop = FALSE\n      ]),\n      silent = TRUE\n    )\n\n    if (inherits(gam_sig_table, 'try-error')) {\n      object$mgcv_model$R <- NULL\n      gam_sig_table <- suppressWarnings(summary(object$mgcv_model)$s.table[,\n        c(1, 2, 3, 4),\n        drop = FALSE\n      ])\n      gam_sig_table[, 2] <- unlist(\n        purrr::map(object$mgcv_model$smooth, 'df'),\n        use.names = FALSE\n      )\n    }\n\n    # Handle GP terms\n    if (!is.null(attr(object$mgcv_model, 'gp_att_table'))) {\n      gp_names <- unlist(purrr::map(\n        attr(object$mgcv_model, 'gp_att_table'),\n        'name'\n      ))\n      if (\n        !all(\n          rownames(gam_sig_table) %in% gsub('gp(', 's(', gp_names, fixed = TRUE)\n        )\n      ) {\n        gam_sig_table <- gam_sig_table[\n          !rownames(gam_sig_table) %in%\n            gsub('gp(', 's(', gp_names, fixed = TRUE),\n          ,\n          drop = FALSE\n        ]\n      } else {\n        gam_sig_table <- NULL\n      }\n    }\n\n    if (!is.null(gam_sig_table) && nrow(gam_sig_table) > 0) {\n      param_label <- if (!is.null(object$trend_call)) {\n        \"gam_obs_smooth_tests\"\n      } else {\n        \"gam_smooth_tests\"\n      }\n      smooth_params[[param_label]] <- gam_sig_table\n    }\n  }\n\n  return(smooth_params)\n}\n\n#' Extract trend model parameters using param_info from trend objects\n#' @param object An mvgam object\n#' @param include_betas Logical to include all coefficients\n#' @param smooth_test Logical to compute smooth tests\n#' @param digits Number of digits\n#' @param variational Logical for variational approximation\n#' @return List of trend parameter summaries\n#' @noRd\nextract_trend_parameters <- function(\n  object,\n  include_betas = TRUE,\n  smooth_test = TRUE,\n  digits = 2,\n  variational = FALSE\n) {\n  trend_params <- list()\n\n  # Get trend model information\n  if (inherits(object$trend_model, 'mvgam_trend')) {\n    trend_info <- attr(object$trend_model, 'param_info')\n    if (!is.null(trend_info)) {\n      # Extract parameters that are available in the model\n      available_params <- get_available_trend_params(\n        object,\n        trend_info$param_names\n      )\n\n      if (length(available_params) > 0) {\n        for (i in seq_along(available_params)) {\n          param_name <- available_params[i]\n          param_label <- trend_info$labels[match(\n            param_name,\n            trend_info$param_names\n          )]\n\n          # Skip trend estimates as they're not summary statistics\n          if (param_name == 'trend') {\n            next\n          }\n\n          tryCatch(\n            {\n              param_summary <- extract_param_summary(\n                object$model_output,\n                param_name,\n                digits,\n                variational\n              )\n              if (!is.null(param_summary) && nrow(param_summary) > 0) {\n                trend_params[[param_label]] <- param_summary\n              }\n            },\n            error = function(e) {\n              # Parameter not available in this model, skip silently\n            }\n          )\n        }\n      }\n    }\n  }\n\n  # Handle hierarchical correlation parameters\n  if (grepl('hiercor', validate_trend_model(object$trend_model))) {\n    tryCatch(\n      {\n        trend_params[[\"hierarchical_correlation\"]] <- extract_param_summary(\n          object$model_output,\n          'alpha_cor',\n          digits,\n          variational\n        )\n      },\n      error = function(e) {\n        # Parameter not available, skip\n      }\n    )\n  }\n\n  # Process model coefficients (trend_call section)\n  if (!is.null(object$trend_call) && !inherits(object, 'jsdgam')) {\n    trend_params <- c(\n      trend_params,\n      extract_trend_gam_parameters(\n        object,\n        include_betas,\n        smooth_test,\n        digits,\n        variational\n      )\n    )\n  }\n\n  return(trend_params)\n}\n\n#' Get available trend parameters for a given model\n#' @param object An mvgam object\n#' @param param_names Vector of parameter names from trend param_info\n#' @return Vector of available parameter names\n#' @noRd\nget_available_trend_params <- function(object, param_names) {\n  available <- character(0)\n\n  # Check which parameters are likely to exist based on model characteristics\n  trend_model_attr <- attr(object$model_data, 'trend_model')\n\n  for (param in param_names) {\n    # Always include basic parameters that most trend models have\n    if (param %in% c('sigma', 'tau', 'theta', 'Sigma', 'drift')) {\n      available <- c(available, param)\n    }\n\n    # AR parameters - check if AR model\n    if (grepl('^ar[0-9]', param) && grepl('^AR', trend_model_attr)) {\n      available <- c(available, param)\n    }\n\n    # VAR parameters\n    if (param == 'A' && trend_model_attr == 'VAR1') {\n      available <- c(available, param)\n    }\n\n    # GP parameters\n    if (\n      param %in% c('alpha_gp', 'rho_gp', 'b_gp') && trend_model_attr == 'GP'\n    ) {\n      available <- c(available, param)\n    }\n\n    # Piecewise parameters\n    if (\n      param %in%\n        c('k_trend', 'm_trend', 'delta_trend') &&\n        trend_model_attr %in% c('PWlinear', 'PWlogistic')\n    ) {\n      available <- c(available, param)\n    }\n\n    # Other specific parameters can be added as needed\n  }\n\n  return(available)\n}\n\n#' Extract trend GAM parameters (coefficients, group-level, GP, smooth tests)\n#' @param object An mvgam object\n#' @param include_betas Logical to include all coefficients\n#' @param smooth_test Logical to compute smooth tests\n#' @param digits Number of digits\n#' @param variational Logical for variational approximation\n#' @return List of trend GAM parameter summaries\n#' @noRd\nextract_trend_gam_parameters <- function(\n  object,\n  include_betas = TRUE,\n  smooth_test = TRUE,\n  digits = 2,\n  variational = FALSE\n) {\n  trend_gam_params <- list()\n\n  # Extract trend GAM coefficients\n  if (include_betas) {\n    coef_names <- paste0(names(object$trend_mgcv_model$coefficients), '_trend')\n    mvgam_coefs <- extract_param_summary(\n      object$model_output,\n      'b_trend',\n      digits,\n      variational\n    )\n    rownames(mvgam_coefs) <- gsub('series', 'trend', coef_names, fixed = TRUE)\n    trend_gam_params[[\"gam_process_coefficients\"]] <- mvgam_coefs\n  } else {\n    if (object$trend_mgcv_model$nsdf > 0) {\n      coefs_include <- 1:object$trend_mgcv_model$nsdf\n      coef_names <- paste0(\n        names(object$trend_mgcv_model$coefficients),\n        '_trend'\n      )[coefs_include]\n      mvgam_coefs <- extract_param_summary(\n        object$model_output,\n        'b_trend',\n        digits,\n        variational\n      )[coefs_include, , drop = FALSE]\n      rownames(mvgam_coefs) <- gsub('series', 'trend', coef_names, fixed = TRUE)\n      trend_gam_params[[\"gam_process_coefficients\"]] <- mvgam_coefs\n    }\n  }\n\n  # Extract trend group-level parameters\n  if (!all(is.na(object$trend_sp_names))) {\n    has_random_effects <- any(unlist(purrr::map(\n      object$trend_mgcv_model$smooth,\n      inherits,\n      'random.effect'\n    )))\n\n    if (has_random_effects) {\n      re_labs <- unlist(lapply(\n        purrr::map(object$trend_mgcv_model$smooth, 'label'),\n        paste,\n        collapse = ','\n      ))[unlist(purrr::map(\n        object$trend_mgcv_model$smooth,\n        inherits,\n        'random.effect'\n      ))]\n\n      re_labs <- gsub('series', 'trend', re_labs)\n\n      re_sds <- extract_param_summary(\n        object$model_output,\n        'sigma_raw_trend',\n        digits = digits,\n        variational = variational,\n        ISB = TRUE\n      )\n      re_mus <- extract_param_summary(\n        object$model_output,\n        'mu_raw_trend',\n        digits = digits,\n        variational = variational,\n        ISB = TRUE\n      )\n\n      rownames(re_sds) <- paste0('sd(', re_labs, ')_trend')\n      rownames(re_mus) <- paste0('mean(', re_labs, ')_trend')\n\n      trend_gam_params[[\"gam_process_group_level\"]] <- rbind(re_mus, re_sds)\n    }\n  }\n\n  # Extract trend GP parameters\n  if (!is.null(attr(object$trend_mgcv_model, 'gp_att_table'))) {\n    gp_summaries <- gp_param_summary(\n      object = object,\n      mgcv_model = object$trend_mgcv_model,\n      trend_effects = TRUE,\n      digits = digits,\n      variational = variational\n    )\n\n    trend_gam_params[[\"gam_process_gp_parameters\"]] <- rbind(\n      gp_summaries$alpha_summary,\n      gp_summaries$rho_summary\n    )\n  }\n\n  # Extract trend smooth tests\n  if (any(!is.na(object$trend_sp_names)) && smooth_test) {\n    gam_sig_table <- try(\n      suppressWarnings(summary(object$trend_mgcv_model)$s.table[,\n        c(1, 2, 3, 4),\n        drop = FALSE\n      ]),\n      silent = TRUE\n    )\n\n    if (inherits(gam_sig_table, 'try-error')) {\n      object$trend_mgcv_model$R <- NULL\n      gam_sig_table <- suppressWarnings(summary(\n        object$trend_mgcv_model\n      )$s.table[, c(1, 2, 3, 4), drop = FALSE])\n      gam_sig_table[, 2] <- unlist(\n        purrr::map(object$trend_mgcv_model$smooth, 'df'),\n        use.names = FALSE\n      )\n    }\n\n    # Handle trend GP terms\n    if (!is.null(attr(object$trend_mgcv_model, 'gp_att_table'))) {\n      gp_names <- unlist(purrr::map(\n        attr(object$trend_mgcv_model, 'gp_att_table'),\n        'name'\n      ))\n      if (\n        !all(\n          rownames(gam_sig_table) %in% gsub('gp(', 's(', gp_names, fixed = TRUE)\n        )\n      ) {\n        gam_sig_table <- gam_sig_table[\n          !rownames(gam_sig_table) %in%\n            gsub('gp(', 's(', gp_names, fixed = TRUE),\n          ,\n          drop = FALSE\n        ]\n      } else {\n        gam_sig_table <- NULL\n      }\n    }\n\n    if (!is.null(gam_sig_table) && nrow(gam_sig_table) > 0) {\n      trend_gam_params[[\"gam_process_smooth_tests\"]] <- gam_sig_table\n    }\n  }\n\n  return(trend_gam_params)\n}\n"
  },
  {
    "path": "R/tidier_methods.R",
    "content": "#' @importFrom generics tidy\n#' @export\ngenerics::tidy\n\n#' @importFrom generics augment\n#' @export\ngenerics::augment\n\n\n#' Tidy an `mvgam` object's parameter posteriors\n#'\n#' Get parameters' posterior statistics, implementing the generic `tidy` from\n#' the package \\pkg{broom}.\n#'\n#' The parameters are categorized by the column \"type\". For instance, the\n#' intercept of the observation model (i.e. the \"formula\" arg to `mvgam()`) has\n#' the \"type\" \"observation_beta\". The possible \"type\"s are:\n#'\n#'   * observation_family_extra_param: any extra parameters for your observation\n#'     model, e.g. sigma for a gaussian observation model. These parameters are\n#'     not directly derived from the latent trend components (contrast to mu).\n#'\n#'   * observation_beta: betas from your observation model, excluding any\n#'     smooths. If your formula was `y ~ x1 + s(x2, bs='cr')`, then your\n#'     intercept and `x1`'s beta would be categorized as this.\n#'\n#'   * random_effect_group_level: Group-level random effects parameters, i.e.\n#'     the mean and sd of the distribution from which the specific random\n#'     intercepts/slopes are considered to be drawn from.\n#'\n#'   * random_effect_beta: betas for the individual random intercepts/slopes.\n#'\n#'   * trend_model_param: parameters from your `trend_model`.\n#'\n#'   * trend_beta: analog of \"observation_beta\", but for any `trend_formula`.\n#'\n#'   * trend_random_effect_group_level: analog of\n#'     \"random_effect_group_level\", but for any `trend_formula`.\n#'\n#'   * trend_random_effect_beta: analog of \"random_effect_beta\", but for any\n#'     `trend_formula`.\n#'\n#' Additionally, GP terms can be incorporated in several ways, leading to\n#' different \"type\"s (or absence!):\n#'\n#'   * `s(bs = \"gp\")`: No parameters returned.\n#'\n#'   * `gp()` in `formula`: \"type\" of \"observation_param\".\n#'\n#'   * `gp()` in `trend_formula`: \"type\" of \"trend_formula_param\".\n#'\n#'   * `GP()` in `trend_model`: \"type\" of \"trend_model_param\".\n#'\n#' @param x An object of class `mvgam`.\n#'\n#' @param probs The desired probability levels of the parameters' posteriors.\n#'   Defaults to `c(0.025, 0.5, 0.975)`, i.e. 2.5%, 50%, and 97.5%.\n#'\n#' @param ... Unused, included for generic consistency only.\n#'\n#' @returns A `tibble` containing:\n#'\n#'   * \"parameter\": The parameter in question.\n#'\n#'   * \"type\": The component of the model that the parameter belongs to (see\n#'     details).\n#'\n#'   * \"mean\": The posterior mean.\n#'\n#'   * \"sd\": The posterior standard deviation.\n#'\n#'   * percentile(s): Any percentiles of interest from these posteriors.\n#'\n#' @family tidiers\n#'\n#' @examples\n#' \\dontrun{\n#' set.seed(0)\n#' simdat <- sim_mvgam(\n#'   T = 100,\n#'   n_series = 3,\n#'   trend_model = AR(),\n#'   prop_trend = 0.75,\n#'   family = gaussian()\n#' )\n#'\n#' simdat$data_train$x <- rnorm(nrow(simdat$data_train))\n#' simdat$data_train$year_fac <- factor(simdat$data_train$year)\n#'\n#' mod <- mvgam(\n#'   y ~ -1 + s(time, by = series, bs = 'cr', k = 20) + x,\n#'   trend_formula = ~ s(year_fac, bs = 're') - 1,\n#'   trend_model = AR(cor = TRUE),\n#'   family = gaussian(),\n#'   data = simdat$data_train,\n#'   silent = 2\n#' )\n#'\n#' tidy(mod, probs = c(0.2, 0.5, 0.8))\n#' }\n#'\n#' @export\ntidy.mvgam <- function(x, probs = c(0.025, 0.5, 0.975), ...) {\n  object <- x\n  obj_vars <- variables(object)\n  digits <- 2 # TODO: Let user change?\n  partialized_mcmc_summary <- purrr::partial(\n    mcmc_summary,\n    object$model_output,\n    ... = ,\n    ISB = FALSE, # Matches `x[i]`'s rather than `x`.\n    probs = probs,\n    digits = digits,\n    Rhat = FALSE,\n    n.eff = FALSE\n  )\n  out <- tibble::tibble()\n\n  # Helper to add parameter column from row names before tibble operations\n  add_param_col <- function(df, aliases = NULL) {\n    df$parameter <- if (!is.null(aliases)) aliases else row.names(df)\n    row.names(df) <- NULL\n    df\n  }\n\n  # Observation family extra parameters --------\n  xp_names_all <- obj_vars$observation_pars$orig_name\n  # no matches -> length(xp_names) == 0, even if xp_names_all is NULL\n  xp_names <- grep(\"vec\", xp_names_all, value = TRUE, invert = TRUE)\n  if (length(xp_names) > 0) {\n    extra_params_out <- partialized_mcmc_summary(params = xp_names)\n    extra_params_out <- add_param_col(extra_params_out)\n    extra_params_out <- tibble::add_column(\n      extra_params_out,\n      type = \"observation_family_extra_param\",\n      .before = 1\n    )\n    out <- dplyr::bind_rows(out, extra_params_out)\n  }\n  # END Observation family extra parameters\n\n  # obs non-smoother betas --------\n  if (object$mgcv_model$nsdf > 0) {\n    obs_beta_name_map <- dplyr::slice_head(\n      obj_vars$observation_betas,\n      n = object$mgcv_model$nsdf\n    ) # df(\"orig_name\", \"alias\")\n    obs_betas_out <- partialized_mcmc_summary(\n      params = obs_beta_name_map$orig_name\n    )\n    obs_betas_out <- add_param_col(obs_betas_out, obs_beta_name_map$alias)\n    obs_betas_out <- tibble::add_column(\n      obs_betas_out,\n      type = \"observation_beta\",\n      .before = 1\n    )\n    out <- dplyr::bind_rows(out, obs_betas_out)\n  }\n  # END obs non-smoother betas\n\n  # random effects --------\n  # TODO: names for random slopes\n  re_param_name_map <- obj_vars$observation_re_params\n  if (!is.null(re_param_name_map)) {\n    re_params_out <- partialized_mcmc_summary(\n      params = re_param_name_map$orig_name\n    )\n    re_params_out <- add_param_col(re_params_out, re_param_name_map$alias)\n    re_params_out <- tibble::add_column(\n      re_params_out,\n      type = \"random_effect_group_level\",\n      .before = 1\n    )\n    out <- dplyr::bind_rows(out, re_params_out)\n\n    # specific betas\n    for (sp in object$mgcv_model$smooth) {\n      if (inherits(sp, \"random.effect\")) {\n        re_label <- sp$label\n        betas_all <- obj_vars$observation_betas\n        re_beta_idxs <- grep(re_label, betas_all$alias, fixed = TRUE)\n        re_beta_name_map <- dplyr::slice(betas_all, re_beta_idxs)\n        re_betas_out <- partialized_mcmc_summary(\n          params = re_beta_name_map$orig_name\n        )\n        re_betas_out <- add_param_col(re_betas_out, re_beta_name_map$alias)\n        re_betas_out <- tibble::add_column(\n          re_betas_out,\n          type = \"random_effect_beta\",\n          .before = 1\n        )\n        out <- dplyr::bind_rows(out, re_betas_out)\n      }\n    }\n  }\n  # END random effects\n\n  # GPs --------\n  if (!is.null(obj_vars$trend_pars)) {\n    tm_param_names_all <- obj_vars$trend_pars$orig_name\n    gp_param_names <- grep(\n      \"^alpha_gp|^rho_gp\",\n      tm_param_names_all,\n      value = TRUE\n    )\n    if (length(gp_param_names) > 0) {\n      gp_params_out <- partialized_mcmc_summary(params = gp_param_names)\n      gp_params_out <- add_param_col(gp_params_out)\n      # where is GP? can be in formula, trend_formula, or trend_model\n      if (grepl(\"^(alpha|rho)_gp_trend\", gp_param_names[[1]])) {\n        param_type <- \"trend_formula_param\"\n      } else if (grepl(\"^(alpha|rho)_gp_\", gp_param_names[[1]])) {\n        # hmph.\n        param_type <- \"observation_param\"\n      } else {\n        param_type <- \"trend_model_param\"\n      }\n      gp_params_out <- tibble::add_column(\n        gp_params_out,\n        type = param_type,\n        .before = 1\n      )\n      out <- dplyr::bind_rows(out, gp_params_out)\n    }\n  }\n  # END GPs\n\n  # RW, AR, CAR, VAR, ZMVN --------\n  # TODO: split out Sigma for heircor?\n  trend_model_name <- ifelse(\n    inherits(object$trend_model, \"mvgam_trend\"),\n    object$trend_model$trend_model,\n    object$trend_model\n  ) # str vs called obj as arg to mvgam\n  if (grepl(\"^VAR|^CAR|^AR|^RW|^ZMVN\", trend_model_name)) {\n    # theta = MA terms\n    # alpha_cor = heirarchical corr term\n    # A = VAR auto-regressive matrix\n    # Sigma = correlated errors matrix\n    # sigma = errors\n\n    # setting up the params to extract\n    if (trend_model_name == \"VAR\") {\n      trend_model_params <- c(\"^A\\\\[\", \"^alpha_cor\", \"^theta\", \"^Sigma\")\n    } else if (grepl(\"^CAR|^AR|^RW\", trend_model_name)) {\n      cor <- inherits(object$trend_model, \"mvgam_trend\") &&\n        object$trend_model$cor\n      sigma_name <- ifelse(cor, \"^Sigma\", \"^sigma\")\n      trend_model_params <- c(\"^ar\", \"^alpha_cor\", \"^theta\", sigma_name)\n    } else if (grepl(\"^ZMVN\", trend_model_name)) {\n      trend_model_params <- c(\"^alpha_cor\", \"^Sigma\")\n    }\n\n    # extracting the params\n    trend_model_params <- paste(trend_model_params, collapse = \"|\")\n    tm_param_names_all <- obj_vars$trend_pars$orig_name\n    tm_param_names <- grep(trend_model_params, tm_param_names_all, value = TRUE)\n    tm_params_out <- partialized_mcmc_summary(params = tm_param_names)\n    tm_params_out <- add_param_col(tm_params_out)\n    tm_params_out <- tibble::add_column(\n      tm_params_out,\n      type = \"trend_model_param\",\n      .before = 1\n    )\n    out <- dplyr::bind_rows(out, tm_params_out)\n  }\n  # END RW, AR, CAR, VAR\n\n  # 'None' trend_model with a trend_formula --------\n  if (trend_model_name == \"None\" && !is.null(object$trend_call)) {\n    trend_pars_names_all <- obj_vars$trend_pars$orig_name\n    trend_pars_names <- grep(\"sigma\", trend_pars_names_all, value = TRUE)\n    if (length(trend_pars_names) > 0) {\n      trend_params_out <- partialized_mcmc_summary(params = trend_pars_names)\n      trend_params_out <- add_param_col(trend_params_out)\n      trend_params_out <- tibble::add_column(\n        trend_params_out,\n        type = \"trend_model_param\",\n        .before = 1\n      )\n      out <- dplyr::bind_rows(out, trend_params_out)\n    }\n  }\n  # END 'None' trend_model with a trend_formula\n\n  # Piecewise --------\n  # TODO: potentially lump into AR section, above; how to handle change points?\n  # to lump in, just add an\n  # `else if (grepl(\"^PW\", trend_model_name)`, then\n  # `trend_model_params <- c(\"^k_trend\", \"^m_trend\", \"^delta_trend\")`\n  # and change initial grep(ar car var) call\n  if (grepl(\"^PW\", trend_model_name)) {\n    trend_model_params <- \"^k_trend|^m_trend|^delta_trend\"\n    tm_param_names_all <- obj_vars$trend_pars$orig_name\n    tm_param_names <- grep(trend_model_params, tm_param_names_all, value = TRUE)\n    tm_params_out <- partialized_mcmc_summary(params = tm_param_names)\n    tm_params_out <- add_param_col(tm_params_out)\n    tm_params_out <- tibble::add_column(\n      tm_params_out,\n      type = \"trend_model_param\",\n      .before = 1\n    )\n    out <- dplyr::bind_rows(out, tm_params_out)\n  }\n  # END Piecewise\n\n  # Trend formula betas --------\n  if (!is.null(object$trend_call) && object$trend_mgcv_model$nsdf > 0) {\n    trend_beta_name_map <- dplyr::slice_head(\n      obj_vars$trend_betas,\n      n = object$trend_mgcv_model$nsdf\n    ) # df(\"orig_name\", \"alias\")\n    trend_betas_out <- partialized_mcmc_summary(\n      params = trend_beta_name_map$orig_name\n    )\n    trend_betas_out <- add_param_col(\n      trend_betas_out,\n      trend_beta_name_map$alias\n    )\n    trend_betas_out <- tibble::add_column(\n      trend_betas_out,\n      type = \"trend_beta\",\n      .before = 1\n    )\n    out <- dplyr::bind_rows(out, trend_betas_out)\n  }\n  # END Trend formula betas\n\n  # trend random effects --------\n  trend_re_param_name_map <- obj_vars$trend_re_params\n  if (!is.null(trend_re_param_name_map)) {\n    trend_re_params_out <- partialized_mcmc_summary(\n      params = trend_re_param_name_map$orig_name\n    )\n    trend_re_params_out <- add_param_col(\n      trend_re_params_out,\n      trend_re_param_name_map$alias\n    )\n    trend_re_params_out <- tibble::add_column(\n      trend_re_params_out,\n      type = \"trend_random_effect_group_level\",\n      .before = 1\n    )\n    out <- dplyr::bind_rows(out, trend_re_params_out)\n\n    # specific betas\n    for (sp in object$trend_mgcv_model$smooth) {\n      if (inherits(sp, \"random.effect\")) {\n        trend_re_label <- sp$label\n        trend_betas_all <- obj_vars$trend_betas\n        trend_re_beta_idxs <- grep(\n          trend_re_label,\n          trend_betas_all$alias,\n          fixed = TRUE\n        )\n        trend_re_beta_name_map <- dplyr::slice(\n          trend_betas_all,\n          trend_re_beta_idxs\n        )\n        trend_re_betas_out <- partialized_mcmc_summary(\n          params = trend_re_beta_name_map$orig_name\n        )\n        trend_re_betas_out <- add_param_col(\n          trend_re_betas_out,\n          trend_re_beta_name_map$alias\n        )\n        trend_re_betas_out <- tibble::add_column(\n          trend_re_betas_out,\n          type = \"trend_random_effect_beta\",\n          .before = 1\n        )\n        out <- dplyr::bind_rows(out, trend_re_betas_out)\n      }\n    }\n  }\n  # END trend random effects\n\n  # Cleanup output --------\n  # Reorder columns to put parameter first\n  out <- out[c(\"parameter\", setdiff(names(out), \"parameter\"))]\n\n  # Split Sigma in case of hierarchical residual correlations\n  alpha_cor_matches <- grep(\"alpha_cor\", out$parameter, fixed = TRUE)\n  if (length(alpha_cor_matches) > 0) {\n    out <- split_hier_Sigma(object, out)\n  }\n  # END Cleanup output\n\n  out\n}\n\n\n#' Helper function to split apart Sigma into its constituent sub-matrixes in\n#' the case of a hierarchical latent process.\n#'\n#' The default MCMC output has dummy parameters filling out Sigma to make it\n#' an nxn matrix. This removes those, and renames the remaining sub-matrixes\n#' to align with the `gr` and `subgr` sizes from `mvgam()`'s `trend_model` argument.\n#'\n#' @param object An object of class `mvgam`.\n#'\n#' @param params `tibble` The parameters that are going to be returned by\n#'   `tidy.mvgam()`. Assumed that the columns match what `tidy.mvgam()` will return.\n#'   Specifically, that there is a \"parameter\" column.\n#'\n#' @returns `tibble` The `params`, but with the Sigma parameters split up by `gr`.\n#'\n#' @noRd\nsplit_hier_Sigma <- function(object, params) {\n  params_nonSigma <- dplyr::filter(params, !grepl(\"^Sigma\", parameter))\n  params_Sigma <- dplyr::filter(params, grepl(\"^Sigma\", parameter))\n\n  gr <- object$trend_model$gr\n  subgr <- object$trend_model$subgr\n  gr_levels <- levels(object$obs_data[[gr]])\n  subgr_levels <- levels(object$obs_data[[subgr]])\n  n_gr <- length(gr_levels)\n  n_subgr <- length(subgr_levels)\n\n  # anything besides the dummy params should have non-zero sd\n  params_Sigma <- dplyr::filter(params_Sigma, mean != 0, sd != 0)\n  index_strs <- sub(\"Sigma\", \"\", params_Sigma$parameter)[1:(n_subgr**2)]\n\n  # new names\n  new_names <- paste0(\n    \"Sigma_\",\n    rep(seq_len(n_gr), each = n_subgr**2),\n    index_strs\n  )\n  params_Sigma[\"parameter\"] <- new_names\n\n  dplyr::bind_rows(params_nonSigma, params_Sigma)\n}\n\n\n#' Augment an `mvgam` object's data\n#'\n#' Add fits and residuals to the data, implementing the generic `augment` from\n#' the package \\pkg{broom}.\n#'\n#' A `list` is returned if `class(x$obs_data) == 'list'`, otherwise a `tibble`\n#' is returned, but the contents of either object is the same.\n#'\n#' The arguments `robust` and `probs` are applied to both the fit and residuals\n#' calls (see [fitted.mvgam()] and [residuals.mvgam()] for details).\n#'\n#' @importFrom stats residuals\n#'\n#' @param x An object of class `mvgam`.\n#'\n#' @param robust If `FALSE` (the default) the mean is used as the measure of\n#'   central tendency and the standard deviation as the measure of variability.\n#'   If `TRUE`, the median and the median absolute deviation (MAD) are applied\n#'   instead.\n#'\n#' @param probs The percentiles to be computed by the quantile function.\n#'\n#' @param ... Unused, included for generic consistency only.\n#'\n#' @returns A `list` or `tibble` (see details) combining:\n#'\n#'   * The data supplied to `mvgam()`.\n#'\n#'   * The outcome variable, named as `.observed`.\n#'\n#'   * The fitted backcasts, along with their variability and credible bounds.\n#'\n#'   * The residuals, along with their variability and credible bounds.\n#'\n#' @seealso\n#'   \\code{\\link{residuals.mvgam}},\n#'   \\code{\\link{fitted.mvgam}}\n#'\n#' @family tidiers\n#'\n#' @examples\n#' \\dontrun{\n#' set.seed(0)\n#' dat <- sim_mvgam(\n#'   T = 80,\n#'   n_series = 3,\n#'   mu = 2,\n#'   trend_model = AR(p = 1),\n#'   prop_missing = 0.1,\n#'   prop_trend = 0.6\n#' )\n#'\n#' mod1 <- mvgam(\n#'   formula = y ~ s(season, bs = 'cc', k = 6),\n#'   data = dat$data_train,\n#'   trend_model = AR(),\n#'   family = poisson(),\n#'   noncentred = TRUE,\n#'   chains = 2,\n#'   silent = 2\n#' )\n#'\n#' augment(mod1, robust = TRUE, probs = c(0.25, 0.75))\n#' }\n#'\n#'\n#' @export\naugment.mvgam <- function(x, robust = FALSE, probs = c(0.025, 0.975), ...) {\n  obs_data <- x$obs_data\n  obs_data$.observed <- obs_data$y\n  obs_data <- purrr::discard_at(\n    obs_data,\n    c(\"index..orig..order\", \"index..time..index\")\n  )\n\n  resids <- residuals(x, robust = robust, probs = probs) %>%\n    tibble::as_tibble()\n  fits <- fitted(x, robust = robust, probs = probs) %>%\n    tibble::as_tibble()\n  hc_fits <- fits %>%\n    dplyr::slice_head(n = NROW(resids)) # fits can include fcs\n  colnames(resids) <- c(\n    \".resid\",\n    \".resid.variability\",\n    \".resid.cred.low\",\n    \".resid.cred.high\"\n  )\n  colnames(hc_fits) <- c(\n    \".fitted\",\n    \".fit.variability\",\n    \".fit.cred.low\",\n    \".fit.cred.high\"\n  )\n\n  augmented <- c(obs_data, hc_fits, resids) # coerces to list\n  if (!identical(class(x$obs_data), \"list\")) {\n    # data.frame\n    augmented <- tibble::as_tibble(augmented)\n  }\n\n  augmented\n}\n"
  },
  {
    "path": "R/trends.R",
    "content": "#' Supported latent trend models in \\pkg{mvgam}\n#'\n#' @importFrom utils tail\n#' @importFrom stats rnorm\n#'\n#' @details\n#' \\code{mvgam} currently supports the following dynamic trend models:\n#' \\itemize{\n#'   \\item `None` (no latent trend component; i.e. the GAM component is all\n#'     that contributes to the linear predictor, and the observation process is\n#'     the only source of error; similar to what is estimated by\n#'     \\code{\\link[mgcv]{gam}})\n#'   \\item `ZMVN()` (zero-mean correlated errors, useful for modelling time\n#'     series where no autoregressive terms are needed or for modelling data\n#'     that are not sampled as time series)\n#'   \\item `RW()`\n#'   \\item `AR(p = 1, 2, or 3)`\n#'   \\item `CAR(p = 1)` (continuous time autoregressive trends; only available\n#'     in \\code{Stan})\n#'   \\item `VAR()` (only available in \\code{Stan})\n#'   \\item `PW()` (piecewise linear or logistic trends; only available in\n#'     \\code{Stan})\n#'   \\item `GP()` (Gaussian Process with squared exponential kernel; only\n#'     available in \\code{Stan})\n#' }\n#'\n#' For most dynamic trend types available in `mvgam` (see argument\n#' `trend_model`), time should be measured in discrete, regularly spaced\n#' intervals (i.e. `c(1, 2, 3, ...)`). However, you can use irregularly spaced\n#' intervals if using `trend_model = CAR(1)`, though note that any temporal\n#' intervals that are exactly `0` will be adjusted to a very small number\n#' (`1e-12`) to prevent sampling errors.\n#'\n#' For all autoregressive trend types apart from `CAR()`, moving average and/or\n#' correlated process error terms can also be estimated (for example,\n#' `RW(cor = TRUE)` will set up a multivariate Random Walk if `data` contains\n#' `>1` series). Hierarchical process error correlations can also be handled if\n#' the data contain relevant observation units that are nested into relevant\n#' grouping and subgrouping levels (i.e. using\n#' `AR(gr = region, subgr = species)`).\n#'\n#' Note that only `RW`, `AR1`, `AR2` and `AR3` are available if using `JAGS`.\n#' All trend models are supported if using `Stan`.\n#'\n#' Dynamic factor models can be used in which the latent factors evolve as\n#' either `RW`, `AR1-3`, `VAR` or `GP`. For `VAR` models (i.e. `VAR` and\n#' `VARcor` models), users can either fix the trend error covariances to be `0`\n#' (using `VAR`) or estimate them and potentially allow for contemporaneously\n#' correlated errors using `VARcor`.\n#'\n#' For all `VAR` models, stationarity of the latent process is enforced through\n#' the prior using the parameterisation given by Heaps (2022). Stationarity is\n#' not enforced when using `AR1`, `AR2` or `AR3` models, though this can be\n#' changed by the user by specifying lower and upper bounds on autoregressive\n#' parameters using functionality in [get_mvgam_priors] and the `priors`\n#' argument in [mvgam].\n#'\n#' Piecewise trends follow the formulation in the popular `prophet` package\n#' produced by `Facebook`, where users can allow for changepoints to control\n#' the potential flexibility of the trend. See Taylor and Letham (2018) for\n#' details.\n#'\n#' @seealso\n#' \\code{\\link{RW}},\n#' \\code{\\link{AR}},\n#' \\code{\\link{CAR}},\n#' \\code{\\link{VAR}},\n#' \\code{\\link{PW}},\n#' \\code{\\link{GP}},\n#' \\code{\\link{ZMVN}}\n#'\n#' @references\n#' Sarah E. Heaps (2022) Enforcing stationarity through the prior in Vector\n#' Autoregressions. Journal of Computational and Graphical Statistics. 32:1,\n#' 1–10.\n#'\n#' Sean J. Taylor and Benjamin Letham (2018) Forecasting at scale. The American\n#' Statistician 72.1, 37–45.\n#'\n#' @name mvgam_trends\nNULL\n\n\n#### Generic trend information ####\n#' @noRd\ntrend_model_choices = function() {\n  # Will make the commented out versions available soon\n  c(\n    \"RW\",\n    \"RWMA\",\n    \"RWcor\",\n    \"RWhiercor\",\n    \"RWMAcor\",\n    \"GP\",\n    'AR1',\n    'AR1MA',\n    'AR1cor',\n    'AR1hiercor',\n    'AR1MAcor',\n    'AR2',\n    'AR2MA',\n    'AR2cor',\n    'AR2hiercor',\n    'AR2MAcor',\n    'AR3',\n    'AR3MA',\n    'AR3cor',\n    'AR3hiercor',\n    'AR3MAcor',\n    'CAR1',\n    'VAR',\n    'VARcor',\n    'VARhiercor',\n    'VAR1',\n    'VAR1cor',\n    'VAR1hiercor',\n    'VARMA',\n    'VARMAcor',\n    'VARMA1,1cor',\n    'PWlinear',\n    'PWlogistic',\n    'ZMVN',\n    'ZMVNcor',\n    'ZMVNhiercor',\n    'None'\n  )\n}\n\n# Additions needed for adding moving average / correlated process errors\n#' @noRd\nma_cor_additions = function(trend_model) {\n  use_var1 <- use_var1cor <- add_ma <- add_cor <- FALSE\n  if (grepl('MA', trend_model, fixed = TRUE)) {\n    add_ma <- TRUE\n  }\n\n  if (trend_model == 'RWMA') {\n    trend_model <- 'RW'\n  }\n\n  if (trend_model == 'AR1MA') {\n    trend_model <- 'AR1'\n  }\n\n  if (trend_model == 'AR2MA') {\n    trend_model <- 'AR2'\n  }\n\n  if (trend_model == 'AR3MA') {\n    trend_model <- 'AR3'\n  }\n\n  if (trend_model %in% c('RWcor', 'RWhiercor', 'RWMAcor')) {\n    add_cor <- TRUE\n    trend_model <- 'RW'\n  }\n\n  if (trend_model %in% c('ZMVNcor', 'ZMVNhiercor')) {\n    add_cor <- TRUE\n    trend_model <- 'ZMVN'\n  }\n\n  if (trend_model %in% c('AR1cor', 'AR1hiercor', 'AR1MAcor')) {\n    add_cor <- TRUE\n    trend_model <- 'AR1'\n  }\n\n  if (trend_model %in% c('AR2cor', 'AR2hiercor', 'AR2MAcor')) {\n    add_cor <- TRUE\n    trend_model <- 'AR2'\n  }\n\n  if (trend_model %in% c('AR3cor', 'AR3hiercor', 'AR3MAcor')) {\n    add_cor <- TRUE\n    trend_model <- 'AR3'\n  }\n\n  if (trend_model == 'VAR1') {\n    use_var1 <- TRUE\n  }\n\n  if (trend_model %in% c('VAR1cor', 'VAR1hiercor', 'VARMA1,1cor')) {\n    use_var1cor <- TRUE\n\n    if (trend_model == 'VAR1hiercor') {\n      add_cor <- TRUE\n    }\n\n    trend_model <- 'VAR1'\n  }\n\n  return(list(\n    trend_model = trend_model,\n    use_var1 = use_var1,\n    use_var1cor = use_var1cor,\n    add_ma = add_ma,\n    add_cor = add_cor\n  ))\n}\n\n#' Evaluate the piecewise linear function\n#' This code is borrowed from the {prophet} R package\n#' All credit goes directly to the prophet development team\n#' https://github.com/facebook/prophet/blob/main/R/R/prophet.R\n#'\n#' @param t Vector of times on which the function is evaluated\n#'\n#' @param deltas Vector of rate changes at each changepoint\n#'\n#' @param k Float initial rate\n#'\n#' @param m Float initial offset\n#'\n#' @param changepoint_ts Vector of changepoint times\n#'\n#' @return Vector y(t)\n#'\n#' @noRd\npiecewise_linear <- function(t, deltas, k, m = 0, changepoint_ts) {\n  # Intercept changes\n  gammas <- -changepoint_ts * deltas\n  # Get cumulative slope and intercept at each t\n  k_t <- rep(k, length(t))\n  m_t <- rep(m, length(t))\n  for (s in 1:length(changepoint_ts)) {\n    indx <- t >= changepoint_ts[s]\n    k_t[indx] <- k_t[indx] + deltas[s]\n    m_t[indx] <- m_t[indx] + gammas[s]\n  }\n  y <- k_t * t + m_t\n  return(y)\n}\n\n#' Evaluate the piecewise logistic function.\n#' This code is borrowed from the {prophet} R package\n#' All credit goes directly to the prophet development team\n#' https://github.com/facebook/prophet/blob/main/R/R/prophet.R\n#' @param t Vector of times on which the function is evaluated.\n#' @param cap Vector of capacities at each t.\n#' @param deltas Vector of rate changes at each changepoint.\n#' @param k Float initial rate.\n#' @param m Float initial offset.\n#' @param changepoint_ts Vector of changepoint times.\n#'\n#' @return Vector y(t).\n#'\n#' @noRd\npiecewise_logistic <- function(t, cap, deltas, k, m, changepoint_ts) {\n  # Compute offset changes\n  k.cum <- c(k, cumsum(deltas) + k)\n  gammas <- rep(0, length(changepoint_ts))\n  for (i in 1:length(changepoint_ts)) {\n    gammas[i] <- ((changepoint_ts[i] - m - sum(gammas)) *\n      (1 - k.cum[i] / k.cum[i + 1]))\n  }\n  # Get cumulative rate and offset at each t\n  k_t <- rep(k, length(t))\n  m_t <- rep(m, length(t))\n  for (s in 1:length(changepoint_ts)) {\n    indx <- t >= changepoint_ts[s]\n    k_t[indx] <- k_t[indx] + deltas[s]\n    m_t[indx] <- m_t[indx] + gammas[s]\n  }\n  y <- cap / (1 + exp(-k_t * (t - m_t)))\n  return(y)\n}\n\n#' Squared exponential GP simulation function\n#' @param last_trends Vector of trend estimates leading up to the current timepoint\n#' @param h \\code{integer} specifying the forecast horizon\n#' @param rho_gp length scale parameter\n#' @param alpha_gp marginal variation parameter\n#' @noRd\nsim_gp = function(last_trends, h, rho_gp, alpha_gp) {\n  t <- as.numeric(1:length(last_trends))\n  t_new <- as.numeric(1:(length(last_trends) + h))\n  Sigma_new <- alpha_gp^2 *\n    exp(-0.5 * ((outer(t, t_new, \"-\") / rho_gp)^2))\n  Sigma_star <- alpha_gp^2 *\n    exp(-0.5 * ((outer(t_new, t_new, \"-\") / rho_gp)^2)) +\n    diag(1e-4, length(t_new))\n  Sigma <- alpha_gp^2 *\n    exp(-0.5 * ((outer(t, t, \"-\") / rho_gp)^2)) +\n    diag(1e-4, length(t))\n\n  as.vector(\n    tail(t(Sigma_new) %*% solve(Sigma, last_trends), h) +\n      tail(\n        mvnfast::rmvn(\n          1,\n          mu = rep(0, length(t_new)),\n          sigma = Sigma_star -\n            t(Sigma_new) %*%\n              solve(Sigma, Sigma_new)\n        )[1, ],\n        h\n      )\n  )\n}\n\n#' AR3  simulation function\n#' @param last_trends Vector of trend estimates leading up to the current timepoint\n#' @param h \\code{integer} specifying the forecast horizon\n#' @param drift drift parameter\n#' @param ar1 AR1 parameter\n#' @param ar2 AR2 parameter\n#' @param ar3 AR3 parameter\n#' @param tau precision parameter\n#' @param Xp_trend optional linear predictor matrix\n#' @param betas_trend optional coefficients associated with lp matrix\n#' @noRd\nsim_ar3 = function(\n  drift = 0,\n  ar1 = 1,\n  ar2 = 0,\n  ar3 = 0,\n  tau = 1,\n  Xp_trend = NULL,\n  betas_trend = NULL,\n  last_trends = rnorm(3),\n  h = 50\n) {\n  # Draw errors\n  errors <- rnorm(h + 3, sd = sqrt(1 / tau))\n\n  # Prepare linear predictors (if necessary)\n  if (!is.null(Xp_trend)) {\n    linpreds <- c(\n      rep(0, 3),\n      as.vector(\n        ((matrix(Xp_trend, ncol = NCOL(Xp_trend)) %*%\n          betas_trend)) +\n          attr(Xp_trend, 'model.offset')\n      )\n    )\n  } else {\n    linpreds <- rep(0, h + 3)\n  }\n\n  # Propagate the process\n  ar3_recursC(\n    drift = drift,\n    ar1 = ar1,\n    ar2 = ar2,\n    ar3 = ar3,\n    linpreds = linpreds,\n    h = h,\n    errors = errors,\n    last_trends = tail(last_trends, 3)\n  )\n}\n\n#' VAR1 simulation function\n#' @noRd\nsim_var1 = function(\n  drift,\n  A,\n  Sigma,\n  last_trends,\n  Xp_trend = NULL,\n  betas_trend = NULL,\n  h\n) {\n  if (NCOL(A) != NCOL(Sigma)) {\n    stop(\n      'VAR coefficient matrix \"A\" and error matrix \"Sigma\" must have equal dimensions',\n      call. = FALSE\n    )\n  }\n\n  if (NROW(A) != NROW(Sigma)) {\n    stop(\n      'VAR coefficient matrix \"A\" and error matrix \"Sigma\" must have equal dimensions',\n      call. = FALSE\n    )\n  }\n\n  if (missing(drift)) {\n    drift <- rep(0, NROW(A))\n  }\n\n  if (length(drift) != NROW(A)) {\n    stop(\n      'Number of drift parameters must match number of rows in VAR coefficient matrix \"A\"',\n      call. = FALSE\n    )\n  }\n\n  # Linear predictor, if supplied\n  if (!is.null(Xp_trend)) {\n    linpreds <- as.vector(\n      ((matrix(Xp_trend, ncol = NCOL(Xp_trend)) %*%\n        betas_trend)) +\n        attr(Xp_trend, 'model.offset')\n    )\n    linpreds <- matrix(linpreds, ncol = NROW(A), byrow = TRUE)\n    linpreds <- rbind(rep(0, NROW(A)), linpreds)\n  } else {\n    linpreds <- matrix(0, nrow = h + 1, ncol = NROW(A))\n  }\n\n  # Draw errors\n  errors <- mvnfast::rmvn(h + 1, mu = rep(0, NROW(A)), sigma = Sigma)\n\n  # Stochastic realisations\n  var1_recursC(\n    A = A,\n    drift = drift,\n    linpreds = linpreds,\n    errors = errors,\n    last_trends = last_trends,\n    h = h\n  )\n}\n\n#' VARMA(1-3, 0-1) simulation function\n#' @noRd\nsim_varma = function(\n  drift,\n  A,\n  A2,\n  A3,\n  theta,\n  Sigma,\n  last_trends,\n  last_errors,\n  Xp_trend = NULL,\n  betas_trend = NULL,\n  h\n) {\n  # Validate dimensions\n  validate_equaldims(A, Sigma)\n  validate_equaldims(A2, Sigma)\n  validate_equaldims(A3, Sigma)\n  validate_equaldims(theta, Sigma)\n\n  if (NROW(last_trends) != 3) {\n    stop('Last 3 state estimates are required, in matrix form', call. = FALSE)\n  }\n\n  if (NROW(last_errors) != 3) {\n    stop('Last 3 error estimates are required, in matrix form', call. = FALSE)\n  }\n\n  if (missing(drift)) {\n    drift <- rep(0, NROW(A))\n  }\n\n  if (length(drift) != NROW(A)) {\n    stop(\n      'Number of drift parameters must match number of rows in VAR coefficient matrix \"A\"',\n      call. = FALSE\n    )\n  }\n\n  # Linear predictor, if supplied\n  if (!is.null(Xp_trend)) {\n    linpreds <- as.vector(\n      ((matrix(Xp_trend, ncol = NCOL(Xp_trend)) %*%\n        betas_trend)) +\n        attr(Xp_trend, 'model.offset')\n    )\n    linpreds <- matrix(linpreds, ncol = NROW(A), byrow = TRUE)\n    if (NROW(linpreds) != h + 3) {\n      stop(\n        'trend linear predictor matrix should be h + 3 rows in dimension',\n        call. = FALSE\n      )\n    }\n  } else {\n    linpreds <- matrix(0, nrow = h + 3, ncol = NROW(A))\n  }\n\n  # Draw forecast errors\n  errors <- rbind(\n    last_errors,\n    mvnfast::rmvn(h, mu = rep(0, NROW(A)), sigma = Sigma)\n  )\n\n  # Stochastic realisations\n  varma_recursC(\n    A = A,\n    A2 = A2,\n    A3 = A3,\n    theta = theta,\n    drift = drift,\n    linpreds = linpreds,\n    errors = errors,\n    last_trends = last_trends,\n    h = h\n  )\n}\n\n#' Continuous time AR1 simulation function\n#' @noRd\nsim_corcar1 = function(\n  drift,\n  A,\n  A2,\n  A3,\n  theta,\n  Sigma,\n  last_trends,\n  last_errors,\n  Xp_trend = NULL,\n  betas_trend = NULL,\n  h,\n  time_dis\n) {\n  # Validate dimensions\n  validate_equaldims(A, Sigma)\n  validate_equaldims(A2, Sigma)\n  validate_equaldims(A3, Sigma)\n  validate_equaldims(theta, Sigma)\n\n  if (NROW(last_trends) != 3) {\n    stop('Last 3 state estimates are required, in matrix form', call. = FALSE)\n  }\n\n  if (NROW(last_errors) != 3) {\n    stop('Last 3 error estimates are required, in matrix form', call. = FALSE)\n  }\n\n  if (missing(drift)) {\n    drift <- rep(0, NROW(A))\n  }\n\n  if (length(drift) != NROW(A)) {\n    stop(\n      'Number of drift parameters must match number of rows in VAR coefficient matrix \"A\"',\n      call. = FALSE\n    )\n  }\n\n  # Linear predictor, if supplied\n  if (!is.null(Xp_trend)) {\n    linpreds <- as.vector(\n      ((matrix(Xp_trend, ncol = NCOL(Xp_trend)) %*%\n        betas_trend)) +\n        attr(Xp_trend, 'model.offset')\n    )\n    linpreds <- matrix(linpreds, ncol = NROW(A), byrow = TRUE)\n    if (NROW(linpreds) != h + 3) {\n      stop(\n        'trend linear predictor matrix should be h + 3 rows in dimension',\n        call. = FALSE\n      )\n    }\n  } else {\n    linpreds <- matrix(0, nrow = h + 3, ncol = NROW(A))\n  }\n\n  # Draw forecast errors\n  errors <- rbind(\n    last_errors,\n    mvnfast::rmvn(h, mu = rep(0, NROW(A)), sigma = Sigma)\n  )\n\n  # Stochastic realisations (will move to c++ eventually)\n  d_A <- diag(A)\n  states <- matrix(NA, nrow = h + 3, ncol = NCOL(A))\n  states[1, ] <- last_trends[1, ]\n  states[2, ] <- last_trends[2, ]\n  states[3, ] <- last_trends[3, ]\n  for (t in 4:NROW(states)) {\n    states[t, ] <-\n      # autoregressive means\n      (states[t - 1, ] - linpreds[t - 1, ]) %*%\n      (A^time_dis[t - 3, ]) +\n\n      # linear predictor contributions\n      linpreds[t, ] +\n\n      # drift terms\n      drift +\n\n      # stochastic errors\n      errors[t, ] *\n        (1 - d_A^(2 * time_dis[t - 3, ])) /\n        (1 - d_A^2)\n  }\n  states[4:NROW(states), ]\n}\n\n#' Generic function to take outputs from different trend models\n#' and prepare the objects needed to propagate VARMA(3,1) processes\n#' so that only a single Rcpp function is needed for propagating\n#' autoregressive trends\n#' @noRd\nprep_varma_params = function(\n  ar1,\n  ar2,\n  ar3,\n  A,\n  A2,\n  A3,\n  drift,\n  theta,\n  Sigma,\n  tau,\n  Xp_trend,\n  betas_trend,\n  last_trends,\n  last_errors,\n  h\n) {\n  # Construct Autoregressive matrices\n  if (missing(A) & missing(A2) & missing(A3)) {\n    A <- A2 <- A3 <- matrix(0, ncol = length(ar1), nrow = length(ar1))\n    diag(A) <- ar1\n    diag(A2) <- ar2\n    diag(A3) <- ar3\n  }\n\n  if (missing(A2) & !missing(A)) {\n    A2 <- matrix(0, ncol = NROW(A), nrow = NROW(A))\n  }\n\n  if (missing(A3) & !missing(A)) {\n    A3 <- matrix(0, ncol = NROW(A), nrow = NROW(A))\n  }\n\n  # Drift terms\n  if (missing(drift)) {\n    drift <- rep(0, NROW(A))\n  }\n\n  # Construct moving average matrix\n  if (missing(theta)) {\n    theta <- matrix(0, ncol = NROW(A), nrow = NROW(A))\n  }\n\n  if (!is.matrix(theta)) {\n    theta2 <- matrix(0, ncol = NROW(A), nrow = NROW(A))\n    diag(theta2) <- theta\n    theta <- theta2\n  }\n\n  # Construct covariance matrix\n  if (missing(Sigma)) {\n    Sigma <- matrix(0, ncol = NROW(A), nrow = NROW(A))\n    diag(Sigma) <- 1 / tau\n  }\n\n  # Construct last trend estimates\n  if (!is.matrix(last_trends) | NROW(last_trends) == 1) {\n    last_trends <- matrix(last_trends)\n  }\n\n  # Construct last error estimates\n  if (missing(last_errors)) {\n    last_errors <- matrix(0, ncol = NROW(A), nrow = 3)\n  }\n\n  if (!is.matrix(last_errors) | NROW(last_errors) == 1) {\n    last_errors <- matrix(last_errors)\n  }\n\n  return(list(\n    A = A,\n    A2 = A2,\n    A3 = A3,\n    drift = drift,\n    theta = theta,\n    Sigma = Sigma,\n    last_trends = last_trends,\n    last_errors = last_errors,\n    Xp_trend = Xp_trend,\n    betas_trend = betas_trend,\n    h = h\n  ))\n}\n\n#' Simulate stationary VAR(p) phi matrices using the algorithm proposed by\n#' Ansley and Kohn (1986)\n#' @noRd\nstationary_VAR_phi <- function(p = 1, n_series = 3, ar_scale = 1) {\n  stopifnot(ar_scale > 0)\n  Id <- diag(nrow = n_series)\n  all_P <- array(dim = c(n_series, n_series, p))\n  for (i in 1:p) {\n    A <- matrix(rnorm(n_series * n_series, sd = ar_scale), nrow = n_series)\n\n    # Enforce diagonal AR terms to be positive if this is\n    # the first phi matrix\n    if (i == 1) {\n      diag(A) <- abs(diag(A))\n    }\n    B <- t(chol(Id + tcrossprod(A, A)))\n    all_P[,, i] <- solve(B, A)\n  }\n\n  all_phi <- array(dim = c(n_series, n_series, p, p))\n  all_phi_star <- array(dim = c(n_series, n_series, p, p))\n\n  # Set initial values\n  L <- L_star <- Sigma <- Sigma_star <- Gamma <- Id\n\n  # Recursion algorithm (Ansley and Kohn 1986, lemma 2.1)\n  for (s in 0:(p - 1)) {\n    all_phi[,, s + 1, s + 1] <- L %*%\n      all_P[,, s + 1] %*%\n      solve(L_star)\n    all_phi_star[,, s + 1, s + 1] <- tcrossprod(L_star, all_P[,, s + 1]) %*%\n      solve(L)\n\n    if (s >= 1) {\n      for (k in 1:s) {\n        all_phi[,, s + 1, k] <- all_phi[,, s, k] -\n          all_phi[,, s + 1, s + 1] %*%\n            all_phi_star[,, s, s - k + 1]\n        all_phi_star[,, s + 1, k] <- all_phi_star[,, s, k] -\n          all_phi_star[,, s + 1, s + 1] %*%\n            all_phi[,, s, s - k + 1]\n      }\n    }\n\n    if (s < p - 1) {\n      Sigma_next <- Sigma -\n        all_phi[,, s + 1, s + 1] %*%\n          tcrossprod(Sigma_star, all_phi[,, s + 1, s + 1])\n      if (s < p + 1) {\n        Sigma_star <- Sigma_star -\n          all_phi_star[,, s + 1, s + 1] %*%\n            tcrossprod(Sigma, all_phi_star[,, s + 1, s + 1])\n        L_star <- t(chol(Sigma_star))\n      }\n      Sigma <- Sigma_next\n      L <- t(chol(Sigma))\n    }\n  }\n  out <- vector(mode = 'list')\n  for (i in 1:p) {\n    out[[i]] <- all_phi[,, i, i]\n  }\n  return(out)\n}\n\n#' Parameters to monitor / extract\n#' @noRd\ntrend_par_names = function(\n  trend_model,\n  trend_map,\n  use_lv = FALSE,\n  drift = FALSE\n) {\n  # Check arguments\n  trend_model <- validate_trend_model(trend_model, drift = drift, warn = FALSE)\n\n  if (use_lv) {\n    if (grepl('ZMVN', trend_model)) {\n      param <- c(\n        'trend',\n        'LV',\n        'penalty',\n        'lv_coefs',\n        'theta',\n        'Sigma',\n        'error'\n      )\n    }\n\n    if (grepl('RW', trend_model)) {\n      param <- c(\n        'trend',\n        'LV',\n        'penalty',\n        'lv_coefs',\n        'theta',\n        'Sigma',\n        'error'\n      )\n    }\n\n    if (grepl('AR1', trend_model)) {\n      param <- c(\n        'trend',\n        'ar1',\n        'LV',\n        'penalty',\n        'lv_coefs',\n        'theta',\n        'Sigma',\n        'error'\n      )\n    }\n\n    if (grepl('AR2', trend_model)) {\n      param <- c(\n        'trend',\n        'ar1',\n        'ar2',\n        'LV',\n        'penalty',\n        'lv_coefs',\n        'theta',\n        'Sigma',\n        'error'\n      )\n    }\n\n    if (grepl('AR3', trend_model)) {\n      param <- c(\n        'trend',\n        'ar1',\n        'ar2',\n        'ar3',\n        'LV',\n        'penalty',\n        'lv_coefs',\n        'theta',\n        'Sigma',\n        'error'\n      )\n    }\n\n    if (trend_model == 'CAR1') {\n      param <- c('trend', 'ar1', 'LV', 'penalty', 'lv_coefs', 'Sigma')\n    }\n\n    if (trend_model == 'GP') {\n      param <- c('trend', 'alpha_gp', 'rho_gp', 'LV', 'lv_coefs', 'b_gp')\n    }\n\n    if (grepl('VAR', trend_model)) {\n      param <- c(\n        'trend',\n        'A',\n        'Sigma',\n        'lv_coefs',\n        'LV',\n        'P_real',\n        'sigma',\n        'theta',\n        'error'\n      )\n    }\n  }\n\n  if (!use_lv) {\n    if (grepl('ZMVN', trend_model)) {\n      param <- c('trend', 'tau', 'sigma', 'theta', 'Sigma', 'error')\n    }\n\n    if (grepl('RW', trend_model)) {\n      param <- c('trend', 'tau', 'sigma', 'theta', 'Sigma', 'error')\n    }\n\n    if (grepl('AR1', trend_model)) {\n      param <- c('trend', 'tau', 'sigma', 'ar1', 'theta', 'Sigma', 'error')\n    }\n\n    if (grepl('AR2', trend_model)) {\n      param <- c(\n        'trend',\n        'tau',\n        'sigma',\n        'ar1',\n        'ar2',\n        'theta',\n        'Sigma',\n        'error'\n      )\n    }\n\n    if (grepl('AR3', trend_model)) {\n      param <- c(\n        'trend',\n        'tau',\n        'sigma',\n        'ar1',\n        'ar2',\n        'ar3',\n        'theta',\n        'Sigma',\n        'error'\n      )\n    }\n\n    if (trend_model == 'CAR1') {\n      param <- c('trend', 'tau', 'sigma', 'ar1', 'Sigma')\n    }\n\n    if (trend_model == 'GP') {\n      param <- c('trend', 'alpha_gp', 'rho_gp', 'b_gp')\n    }\n\n    if (grepl('VAR', trend_model)) {\n      param <- c('trend', 'A', 'Sigma', 'P_real', 'sigma', 'theta', 'error')\n    }\n\n    if (trend_model %in% c('PWlinear', 'PWlogistic')) {\n      param <- c('trend', 'delta_trend', 'k_trend', 'm_trend')\n    }\n  }\n\n  if (trend_model != 'None') {\n    if (drift) {\n      param <- c(param, 'drift')\n    }\n  }\n\n  if (grepl('hiercor', trend_model)) {\n    param <- c(param, 'alpha_cor')\n  }\n\n  if (trend_model == 'None') {\n    param <- NULL\n  }\n\n  param\n}\n\n#' Extraction of particular parameters\n#' @noRd\nextract_trend_pars = function(\n  object,\n  keep_all_estimates = TRUE,\n  ending_time = NULL\n) {\n  # Get names of parameters to extract\n  pars_to_extract <- trend_par_names(\n    trend_model = attr(object$model_data, 'trend_model'),\n    trend_map = object$trend_map,\n    use_lv = object$use_lv,\n    drift = object$drift\n  )\n\n  # Extract into a named list\n  if (length(pars_to_extract) > 0) {\n    out <- vector(mode = 'list')\n    included <- vector(length = length(pars_to_extract))\n    for (i in 1:length(pars_to_extract)) {\n      # Check if it can be extracted first\n      suppressWarnings(\n        estimates <- try(\n          mcmc_chains(object$model_output, params = pars_to_extract[i]),\n          silent = TRUE\n        )\n      )\n\n      if (inherits(estimates, 'try-error')) {\n        included[i] <- FALSE\n      } else {\n        included[i] <- TRUE\n        out[[i]] <- estimates\n      }\n    }\n    out <- out[included]\n    names(out) <- pars_to_extract[included]\n  } else {\n    out <- list()\n  }\n\n  # delta params for piecewise trends\n  if (\n    attr(object$model_data, 'trend_model') %in%\n      c('PWlinear', 'PWlogistic')\n  ) {\n    out$delta_trend <- lapply(\n      seq_along(levels(object$obs_data$series)),\n      function(series) {\n        if (object$fit_engine == 'stan') {\n          delta_estimates <- mcmc_chains(\n            object$model_output,\n            'delta_trend'\n          )[, seq(\n            series,\n            dim(mcmc_chains(object$model_output, 'delta_trend'))[2],\n            by = NCOL(object$ytimes)\n          )]\n        } else {\n          delta_estimates <- mcmc_chains(object$model_output, 'delta_trend')[,\n            starts[series]:ends[series]\n          ]\n        }\n      }\n    )\n    if (attr(object$model_data, 'trend_model') == 'PWlogistic') {\n      out$cap <- lapply(\n        seq_along(levels(object$obs_data$series)),\n        function(series) {\n          t(replicate(\n            NROW(out$delta_trend[[1]]),\n            object$trend_model$cap[, series]\n          ))\n        }\n      )\n    }\n    out$changepoints <- t(replicate(\n      NROW(out$delta_trend[[1]]),\n      object$trend_model$changepoints\n    ))\n    out$change_freq <- replicate(\n      NROW(out$delta_trend[[1]]),\n      object$trend_model$change_freq\n    )\n    out$change_scale <- replicate(\n      NROW(out$delta_trend[[1]]),\n      object$trend_model$changepoint_scale\n    )\n  }\n\n  # Latent trend loadings for dynamic factor models\n  if (object$use_lv) {\n    if (\n      attr(object$model_data, 'trend_model') %in%\n        c('RW', 'AR1', 'AR2', 'AR3', 'CAR1', 'ZMVN')\n    ) {\n      # Just due to legacy reasons from working in JAGS, the simulation\n      # functions use precision (tau) rather than SD (sigma)\n      out$tau <- mcmc_chains(object$model_output, 'penalty')\n      out$penalty <- NULL\n    }\n\n    n_series <- NCOL(object$ytimes)\n    n_lv <- object$n_lv\n    out$lv_coefs <- lapply(seq_len(n_series), function(series) {\n      if (object$fit_engine == 'stan') {\n        coef_start <- min(which(sort(rep(1:n_series, n_lv)) == series))\n        coef_end <- coef_start + n_lv - 1\n        as.matrix(mcmc_chains(object$model_output, 'lv_coefs')[,\n          coef_start:coef_end\n        ])\n      } else {\n        lv_indices <- seq(1, n_series * n_lv, by = n_series) + (series - 1)\n        as.matrix(mcmc_chains(object$model_output, 'lv_coefs')[, lv_indices])\n      }\n    })\n  } else {\n    if (\n      attr(object$model_data, 'trend_model') %in%\n        c('RW', 'AR1', 'AR2', 'AR3', 'CAR1')\n    ) {\n      out$sigma <- NULL\n    }\n  }\n\n  if (!keep_all_estimates) {\n    #### Extract last xxx timepoints of latent trends for propagating forecasts\n    # forward ####\n\n    # Latent trend estimates for dynamic factor models\n    if (object$use_lv) {\n      n_lv <- object$n_lv\n      if (object$fit_engine == 'stan') {\n        out$last_lvs <- lapply(seq_len(n_lv), function(lv) {\n          inds_lv <- seq(lv, dim(out$LV)[2], by = n_lv)\n          lv_estimates <- out$LV[, inds_lv]\n          # Need to only use estimates from the training period\n          if (inherits(object$obs_data, 'list')) {\n            end_train <- data.frame(\n              y = object$obs_data$y,\n              series = object$obs_data$series,\n              time = object$obs_data$time\n            ) %>%\n              dplyr::filter(series == !!(levels(object$obs_data$series)[1])) %>%\n              NROW()\n          } else {\n            end_train <- object$obs_data %>%\n              dplyr::filter(series == !!(levels(object$obs_data$series)[1])) %>%\n              NROW()\n          }\n\n          if (attr(object$model_data, 'trend_model') == 'GP') {\n            if (!is.null(ending_time)) {\n              lv_estimates <- lv_estimates[, 1:ending_time]\n            } else {\n              lv_estimates <- lv_estimates[, 1:end_train]\n            }\n          } else {\n            if (!is.null(ending_time)) {\n              lv_estimates <- lv_estimates[, 1:ending_time]\n            } else {\n              lv_estimates <- lv_estimates[,\n                (NCOL(lv_estimates) - 2):(NCOL(lv_estimates))\n              ]\n            }\n          }\n          lv_estimates\n        })\n      } else {\n        ends <- seq(0, dim(out$LV)[2], length.out = n_lv + 1)\n        starts <- ends + 1\n        starts <- c(1, starts[-c(1, (n_lv + 1))])\n        ends <- ends[-1]\n\n        out$last_lvs <- lapply(seq_len(n_lv), function(lv) {\n          lv_estimates <- out$LV[, starts[lv]:ends[lv]]\n\n          # Need to only use estimates from the training period\n          if (class(object$obs_data)[1] == 'list') {\n            end_train <- data.frame(\n              y = object$obs_data$y,\n              series = object$obs_data$series,\n              time = object$obs_data$time\n            ) %>%\n              dplyr::filter(series == !!(levels(object$obs_data$series)[1])) %>%\n              NROW()\n          } else {\n            end_train <- object$obs_data %>%\n              dplyr::filter(series == !!(levels(object$obs_data$series)[1])) %>%\n              NROW()\n          }\n\n          # GP models not available in JAGS\n          if (!is.null(ending_time)) {\n            lv_estimates <- lv_estimates[, 1:ending_time]\n          } else {\n            lv_estimates <- lv_estimates[,\n              (NCOL(lv_estimates) - 2):(NCOL(lv_estimates))\n            ]\n          }\n        })\n      }\n\n      # Get rid of the large posterior arrays for trend and LV estimates;\n      # they won't be needed for propagating the trends forward\n      out$LV <- NULL\n      out$trend <- NULL\n    }\n\n    if (!object$use_lv) {\n      if (attr(object$model_data, 'trend_model') != 'None') {\n        out$last_trends <- lapply(\n          seq_along(levels(object$obs_data$series)),\n          function(series) {\n            if (object$fit_engine == 'stan') {\n              trend_estimates <- mcmc_chains(\n                object$model_output,\n                'trend'\n              )[, seq(\n                series,\n                dim(mcmc_chains(object$model_output, 'trend'))[2],\n                by = NCOL(object$ytimes)\n              )]\n            } else {\n              trend_estimates <- mcmc_chains(object$model_output, 'trend')[,\n                starts[series]:ends[series]\n              ]\n            }\n\n            # Need to only use estimates from the training period\n            if (class(object$obs_data)[1] == 'list') {\n              end_train <- data.frame(\n                y = object$obs_data$y,\n                series = object$obs_data$series,\n                time = object$obs_data$time\n              ) %>%\n                dplyr::filter(\n                  series == !!(levels(object$obs_data$series)[series])\n                ) %>%\n                NROW()\n            } else {\n              end_train <- object$obs_data %>%\n                dplyr::filter(\n                  series == !!(levels(object$obs_data$series)[series])\n                ) %>%\n                NROW()\n            }\n\n            trend_estimates <- trend_estimates[, 1:end_train]\n\n            # Only need last 3 timesteps if this is not a GP trend model\n            if (attr(object$model_data, 'trend_model') == 'GP') {\n              if (!is.null(ending_time)) {\n                trend_estimates <- trend_estimates[, 1:ending_time]\n              } else {\n                trend_estimates <- trend_estimates\n              }\n            } else {\n              if (!is.null(ending_time)) {\n                trend_estimates <- trend_estimates[, 1:ending_time]\n              } else {\n                trend_estimates <- trend_estimates[,\n                  (NCOL(trend_estimates) - 2):(NCOL(trend_estimates))\n                ]\n              }\n            }\n\n            trend_estimates\n          }\n        )\n\n        out$trend <- NULL\n\n        if (attr(object$model_data, 'trend_model') == 'VAR1') {\n          # Need to ensure all series' trends are retained when subsampling\n          # to produce draw-specific forecasts from VAR models\n          out$last_lvs <- out$last_trends\n          out$last_trends <- NULL\n        }\n      }\n    }\n  }\n\n  # Extract centred training times and number of GP basis functions\n  # if this is a GP model\n  if (attr(object$model_data, 'trend_model') == 'GP') {\n    num_basis_line <- object$model_file[grep(\n      'num_gp_basis = ',\n      object$model_file\n    )]\n    out$num_gp_basis <- as.numeric(unlist(regmatches(\n      num_basis_line,\n      gregexpr(\"[[:digit:]]+\", num_basis_line)\n    )))\n    out$mean_time <- mean(unique(object$obs_data$time))\n    out$time_cent <- unique(object$obs_data$time) -\n      mean(unique(object$obs_data$time))\n\n    # Get the basis coefficients in the correct format\n    n_series <- NCOL(object$ytimes)\n\n    if (object$use_lv) {\n      n_lv <- object$n_lv\n      all_bgps <- out$b_gp\n      out$b_gp <- lapply(seq_len(n_lv), function(lv) {\n        all_bgps[, seq(lv, NCOL(all_bgps), by = NCOL(out$alpha_gp))]\n      })\n    } else {\n      all_bgps <- out$b_gp\n      out$b_gp <- lapply(seq_len(n_series), function(series) {\n        all_bgps[, seq(series, NCOL(all_bgps), by = NCOL(out$alpha_gp))]\n      })\n    }\n  }\n\n  if (attr(object$model_data, 'trend_model') == 'ZMVN') {\n    out$ar1 <- rep(0, NROW(out$Sigma))\n  }\n\n  # Return list of extracted posterior parameter samples\n  out\n}\n\n#' Function for extracting a single draw of trend parameters for use\n#' in many of the forecasting / evaluation functions\n#' @noRd\nextract_general_trend_pars = function(samp_index, trend_pars) {\n  general_trend_pars <- lapply(seq_along(trend_pars), function(x) {\n    if (\n      names(trend_pars)[x] %in%\n        c(\n          'last_lvs',\n          'lv_coefs',\n          'last_trends',\n          'A',\n          'Sigma',\n          'theta',\n          'b_gp',\n          'error',\n          'delta_trend',\n          'cap'\n        )\n    ) {\n      if (\n        names(trend_pars)[x] %in%\n          c('last_lvs', 'lv_coefs', 'last_trends', 'b_gp', 'delta_trend', 'cap')\n      ) {\n        out <- unname(lapply(trend_pars[[x]], `[`, samp_index, ))\n      }\n\n      if (names(trend_pars)[x] %in% c('A', 'Sigma', 'theta', 'error')) {\n        out <- unname(trend_pars[[x]][samp_index, ])\n      }\n    } else if (names(trend_pars)[x] %in% c('time_cent', 'mean_time')) {\n      out <- trend_pars[[x]]\n    } else {\n      if (is.matrix(trend_pars[[x]])) {\n        out <- unname(trend_pars[[x]][samp_index, ])\n      } else {\n        out <- unname(trend_pars[[x]][samp_index])\n      }\n    }\n    out\n  })\n  names(general_trend_pars) <- names(trend_pars)\n  return(general_trend_pars)\n}\n\n#' Function for extracting a single draw of trend parameters for a single series;\n#' deprecated as all forecasting / prediction functions now operate jointly on all\n#' series at once\n#' @noRd\nextract_series_trend_pars = function(\n  series,\n  samp_index,\n  trend_pars,\n  use_lv = FALSE\n) {\n  trend_extracts <- lapply(seq_along(trend_pars), function(x) {\n    if (\n      names(trend_pars)[x] %in%\n        c(\n          'last_lvs',\n          'lv_coefs',\n          'last_trends',\n          'A',\n          'Sigma',\n          'theta',\n          'b_gp',\n          'error'\n        )\n    ) {\n      if (!use_lv & names(trend_pars)[x] == 'b_gp') {\n        out <- trend_pars[[x]][[series]][samp_index, ]\n      }\n\n      if (use_lv & names(trend_pars)[x] == 'b_gp') {\n        out <- lapply(trend_pars[[x]], `[`, samp_index, )\n      }\n\n      if (names(trend_pars)[x] %in% c('last_trends', 'lv_coefs')) {\n        out <- trend_pars[[x]][[series]][samp_index, ]\n      }\n\n      if (names(trend_pars)[x] %in% c('last_lvs')) {\n        out <- lapply(trend_pars[[x]], `[`, samp_index, )\n      }\n\n      if (names(trend_pars)[x] %in% c('A', 'Sigma', 'theta', 'error')) {\n        out <- trend_pars[[x]][samp_index, ]\n      }\n    } else if (names(trend_pars)[x] %in% c('time_cent', 'mean_time')) {\n      out <- trend_pars[[x]]\n    } else {\n      if (is.matrix(trend_pars[[x]])) {\n        if (use_lv) {\n          out <- trend_pars[[x]][samp_index, ]\n        } else {\n          out <- trend_pars[[x]][samp_index, series]\n        }\n      } else {\n        out <- trend_pars[[x]][samp_index]\n      }\n    }\n    out\n  })\n  names(trend_extracts) <- names(trend_pars)\n  return(trend_extracts)\n}\n\n#' Wrapper function to forecast trends\n#' @noRd\nforecast_trend = function(\n  trend_model,\n  use_lv,\n  trend_pars,\n  Xp_trend = NULL,\n  betas_trend = NULL,\n  h = 1,\n  time = NULL,\n  cap = NULL,\n  time_dis = NULL\n) {\n  # Propagate dynamic factors forward\n  if (use_lv) {\n    n_lv <- length(trend_pars$last_lvs)\n    if (trend_model == 'CAR1') {\n      ar1 <- trend_pars$ar1\n      Sigma <- rlang::missing_arg()\n      if ('drift' %in% names(trend_pars)) {\n        drift <- trend_pars$drift\n      } else {\n        drift <- rep(0, length(ar1))\n      }\n      varma_params <- prep_varma_params(\n        drift = drift,\n        ar1 = ar1,\n        ar2 = 0,\n        ar3 = 0,\n        theta = 0,\n        Sigma = Sigma,\n        tau = trend_pars$tau,\n        Xp_trend = Xp_trend,\n        betas_trend = betas_trend,\n        last_trends = do.call(\n          cbind,\n          (lapply(trend_pars$last_lvs, function(x) tail(x, 3)))\n        ),\n        h = h\n      )\n\n      # Propagate forward\n      next_lvs <- sim_corcar1(\n        A = varma_params$A,\n        A2 = varma_params$A2,\n        A3 = varma_params$A3,\n        drift = varma_params$drift,\n        theta = varma_params$theta,\n        Sigma = varma_params$Sigma,\n        last_trends = varma_params$last_trends,\n        last_errors = varma_params$last_errors,\n        Xp_trend = varma_params$Xp_trend,\n        betas_trend = varma_params$betas_trend,\n        h = varma_params$h,\n        time_dis = time_dis\n      )\n    }\n\n    if (trend_model == 'GP') {\n      next_lvs <- do.call(\n        cbind,\n        lapply(seq_len(n_lv), function(lv) {\n          sim_gp(\n            alpha_gp = trend_pars$alpha_gp[lv],\n            rho_gp = trend_pars$rho_gp[lv],\n            last_trends = trend_pars$last_lvs[[lv]],\n            h = h\n          )\n        })\n      )\n    }\n\n    if (trend_model == 'VAR1') {\n      # Reconstruct the A and Sigma matrices\n      if ('A' %in% names(trend_pars)) {\n        Amat <- matrix(\n          trend_pars$A,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        ar1 <- rlang::missing_arg()\n      } else if ('ar1' %in% names(trend_pars)) {\n        if (trend_pars$ar1[1] == 0) {\n          ar1 <- rep(0, length(trend_pars$last_lvs))\n        } else {\n          ar1 <- trend_pars$ar1\n        }\n        Amat <- rlang::missing_arg()\n      } else {\n        ar1 <- rep(1, length(trend_pars$last_lvs))\n        Amat <- rlang::missing_arg()\n      }\n\n      if ('ar2' %in% names(trend_pars)) {\n        ar2 <- trend_pars$ar2\n      } else {\n        ar2 <- rep(0, length(trend_pars$last_lvs))\n      }\n\n      if ('ar3' %in% names(trend_pars)) {\n        ar3 <- trend_pars$ar3\n      } else {\n        ar3 <- rep(0, length(trend_pars$last_lvs))\n      }\n\n      if ('Sigma' %in% names(trend_pars)) {\n        Sigmamat <- matrix(\n          trend_pars$Sigma,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n      } else if ('sigma' %in% names(trend_pars)) {\n        Sigmamat <- matrix(\n          0,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        diag(Sigmamat) <- trend_pars$sigma\n      } else {\n        Sigmamat <- matrix(\n          0,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        diag(Sigmamat) <- 1 / trend_pars$tau\n      }\n\n      # Reconstruct the last trend matrix\n      last_trendmat <- do.call(\n        cbind,\n        (lapply(trend_pars$last_lvs, function(x) tail(x, 3)))\n      )\n\n      # If this is a moving average model, reconstruct theta matrix and\n      # last error matrix\n      if ('theta' %in% names(trend_pars)) {\n        thetamat <- matrix(\n          trend_pars$theta,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        errormat <- rbind(\n          rep(0, length(trend_pars$last_lvs)),\n          rep(0, length(trend_pars$last_lvs)),\n          tail(trend_pars$error, length(trend_pars$last_lvs))\n        )\n      } else {\n        thetamat <- rlang::missing_arg()\n        errormat <- rlang::missing_arg()\n      }\n\n      # Prep VARMA parameters\n      varma_params <- prep_varma_params(\n        A = Amat,\n        ar1 = ar1,\n        ar2 = ar2,\n        ar3 = ar3,\n        Sigma = Sigmamat,\n        last_trends = last_trendmat,\n        last_errors = errormat,\n        theta = thetamat,\n        Xp_trend = Xp_trend,\n        betas_trend = betas_trend,\n        h = h\n      )\n\n      next_lvs <- sim_varma(\n        A = varma_params$A,\n        A2 = varma_params$A2,\n        A3 = varma_params$A3,\n        drift = varma_params$drift,\n        theta = varma_params$theta,\n        Sigma = varma_params$Sigma,\n        last_trends = varma_params$last_trends,\n        last_errors = varma_params$last_errors,\n        Xp_trend = varma_params$Xp_trend,\n        betas_trend = varma_params$betas_trend,\n        h = varma_params$h\n      )\n    }\n    trend_fc <- next_lvs\n  }\n\n  # Simpler if not using dynamic factors\n  if (!use_lv) {\n    if (trend_model == 'CAR1') {\n      ar1 <- trend_pars$ar1\n      Sigma <- rlang::missing_arg()\n      if ('drift' %in% names(trend_pars)) {\n        drift <- trend_pars$drift\n      } else {\n        drift <- rep(0, length(ar1))\n      }\n      varma_params <- prep_varma_params(\n        drift = drift,\n        ar1 = ar1,\n        ar2 = 0,\n        ar3 = 0,\n        theta = 0,\n        Sigma = Sigma,\n        tau = trend_pars$tau,\n        Xp_trend = Xp_trend,\n        betas_trend = betas_trend,\n        last_trends = do.call(\n          cbind,\n          (lapply(trend_pars$last_lvs, function(x) tail(x, 3)))\n        ),\n        h = h\n      )\n\n      # Propagate forward\n      trend_fc <- sim_corcar1(\n        A = varma_params$A,\n        A2 = varma_params$A2,\n        A3 = varma_params$A3,\n        drift = varma_params$drift,\n        theta = varma_params$theta,\n        Sigma = varma_params$Sigma,\n        last_trends = varma_params$last_trends,\n        last_errors = varma_params$last_errors,\n        Xp_trend = varma_params$Xp_trend,\n        betas_trend = varma_params$betas_trend,\n        h = varma_params$h,\n        time_dis = time_dis\n      )\n    }\n\n    if (trend_model == 'GP') {\n      trend_fc <- sim_hilbert_gp(\n        alpha_gp = trend_pars$alpha_gp,\n        rho_gp = trend_pars$rho_gp,\n        b_gp = trend_pars$b_gp,\n        last_trends = trend_pars$last_trends,\n        fc_times = time,\n        train_times = trend_pars$time_cent,\n        mean_train_times = trend_pars$mean_time\n      )\n    }\n\n    if (trend_model == 'VAR1') {\n      # Reconstruct the A and Sigma matrices\n      if ('A' %in% names(trend_pars)) {\n        Amat <- matrix(\n          trend_pars$A,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        ar1 <- rlang::missing_arg()\n      } else if ('ar1' %in% names(trend_pars)) {\n        if (trend_pars$ar1[1] == 0) {\n          ar1 <- rep(0, length(trend_pars$last_lvs))\n        } else {\n          ar1 <- trend_pars$ar1\n        }\n        Amat <- rlang::missing_arg()\n      } else {\n        ar1 <- rep(1, length(trend_pars$last_lvs))\n        Amat <- rlang::missing_arg()\n      }\n\n      if ('ar2' %in% names(trend_pars)) {\n        ar2 <- trend_pars$ar2\n      } else {\n        ar2 <- rep(0, length(trend_pars$last_lvs))\n      }\n\n      if ('ar3' %in% names(trend_pars)) {\n        ar3 <- trend_pars$ar3\n      } else {\n        ar3 <- rep(0, length(trend_pars$last_lvs))\n      }\n\n      if ('Sigma' %in% names(trend_pars)) {\n        Sigmamat <- matrix(\n          trend_pars$Sigma,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n      } else if ('sigma' %in% names(trend_pars)) {\n        Sigmamat <- matrix(\n          0,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        diag(Sigmamat) <- trend_pars$sigma\n      } else {\n        Sigmamat <- matrix(\n          0,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        diag(Sigmamat) <- 1 / trend_pars$tau\n      }\n\n      # Reconstruct the last trend matrix\n      last_trendmat <- do.call(\n        cbind,\n        (lapply(trend_pars$last_lvs, function(x) tail(x, 3)))\n      )\n\n      # If this is a moving average model, reconstruct theta matrix and\n      # last error matrix\n      if ('theta' %in% names(trend_pars)) {\n        thetamat <- matrix(\n          trend_pars$theta,\n          nrow = length(trend_pars$last_lvs),\n          ncol = length(trend_pars$last_lvs),\n          byrow = TRUE\n        )\n        errormat <- rbind(\n          rep(0, length(trend_pars$last_lvs)),\n          rep(0, length(trend_pars$last_lvs)),\n          tail(trend_pars$error, length(trend_pars$last_lvs))\n        )\n      } else {\n        thetamat <- rlang::missing_arg()\n        errormat <- rlang::missing_arg()\n      }\n\n      # Prep VARMA parameters\n      varma_params <- prep_varma_params(\n        A = Amat,\n        ar1 = ar1,\n        ar2 = ar2,\n        ar3 = ar3,\n        Sigma = Sigmamat,\n        last_trends = last_trendmat,\n        last_errors = errormat,\n        theta = thetamat,\n        Xp_trend = Xp_trend,\n        betas_trend = betas_trend,\n        h = h\n      )\n      # Propagate forward\n      trend_fc <- sim_varma(\n        A = varma_params$A,\n        A2 = varma_params$A2,\n        A3 = varma_params$A3,\n        drift = varma_params$drift,\n        theta = varma_params$theta,\n        Sigma = varma_params$Sigma,\n        last_trends = varma_params$last_trends,\n        last_errors = varma_params$last_errors,\n        Xp_trend = varma_params$Xp_trend,\n        betas_trend = varma_params$betas_trend,\n        h = varma_params$h\n      )\n    }\n\n    if (trend_model == 'PWlinear') {\n      insight::check_if_installed(\n        \"extraDistr\",\n        reason = 'to simulate from piecewise trends'\n      )\n      trend_fc <- do.call(\n        cbind,\n        lapply(seq_along(trend_pars$delta_trend), function(x) {\n          # Sample forecast horizon changepoints\n          n_changes <- stats::rpois(\n            1,\n            (trend_pars$change_freq *\n              (max(time) -\n                min(time)))\n          )\n\n          # Sample deltas\n          lambda <- median(abs(c(trend_pars$delta_trend[[x]]))) + 1e-8\n          deltas_new <- extraDistr::rlaplace(n_changes, mu = 0, sigma = lambda)\n\n          # Spread changepoints evenly across the forecast horizon\n          t_change_new <- unique(sample(\n            min(time):max(time),\n            n_changes,\n            replace = TRUE\n          ))\n\n          # Combine with changepoints from the history\n          deltas <- c(trend_pars$delta_trend[[x]], deltas_new)\n          changepoint_ts <- sort(c(trend_pars$changepoints, t_change_new))\n\n          # Generate a trend draw\n          draw <- suppressWarnings(piecewise_linear(\n            t = 1:max(time),\n            deltas = deltas,\n            k = trend_pars$k_trend[x],\n            m = trend_pars$m_trend[x],\n            changepoint_ts = changepoint_ts\n          ))\n\n          # Keep only the forecast horizon estimates\n          tail(draw, max(time) - min(time) + 1)\n        })\n      )\n    }\n\n    if (trend_model == 'PWlogistic') {\n      insight::check_if_installed(\n        \"extraDistr\",\n        reason = 'to simulate from piecewise trends'\n      )\n      trend_fc <- do.call(\n        cbind,\n        lapply(seq_along(trend_pars$delta_trend), function(x) {\n          # Sample forecast horizon changepoints\n          n_changes <- stats::rpois(\n            1,\n            (trend_pars$change_freq *\n              (max(time) - min(time)))\n          )\n\n          # Sample deltas\n          lambda <- median(abs(c(trend_pars$delta_trend[[x]]))) + 1e-8\n          deltas_new <- extraDistr::rlaplace(n_changes, mu = 0, sigma = lambda)\n\n          # Spread changepoints evenly across the forecast horizon\n          t_change_new <- unique(sample(\n            min(time):max(time),\n            n_changes,\n            replace = TRUE\n          ))\n\n          # Combine with changepoints from the history\n          deltas <- c(trend_pars$delta_trend[[x]], deltas_new)\n          changepoint_ts <- sort(c(trend_pars$changepoints, t_change_new))\n\n          # Get historical capacities\n          oldcaps <- trend_pars$cap[[x]]\n\n          # And forecast capacities\n          s_name <- levels(cap$series)[x]\n          newcaps = cap %>%\n            dplyr::filter(series == s_name) %>%\n            dplyr::arrange(time) %>%\n            dplyr::pull(cap)\n          caps <- c(oldcaps, newcaps)\n\n          # Generate a trend draw\n          draw <- piecewise_logistic(\n            t = 1:max(time),\n            cap = caps,\n            deltas = deltas,\n            k = trend_pars$k_trend[x],\n            m = trend_pars$m_trend[x],\n            changepoint_ts = changepoint_ts\n          )\n\n          # Keep only the forecast horizon estimates\n          tail(draw, max(time) - min(time) + 1)\n        })\n      )\n    }\n  }\n  return(trend_fc)\n}\n"
  },
  {
    "path": "R/update.mvgam.R",
    "content": "#' Update an existing \\pkg{mvgam} model object\n#'\n#' This function allows a previously fitted \\pkg{mvgam} model to be updated.\n#'\n#' @name update.mvgam\n#'\n#' @importFrom mgcv nb betar\n#' @importFrom rlang missing_arg\n#'\n#' @inheritParams mvgam\n#'\n#' @param object \\code{list} object returned from \\code{mvgam}. See [mvgam()]\n#'\n#' @param formula Optional new `formula` object. Note, `mvgam` currently does\n#'   not support dynamic formula updates such as removal of specific terms with\n#'   `- term`. When updating, the entire formula needs to be supplied.\n#'\n#' @param ... Other arguments to be passed to \\code{\\link{mvgam}} or\n#'   \\code{\\link{jsdgam}}\n#'\n#' @return A \\code{list} object of class \\code{mvgam} containing model output,\n#'   the text representation of the model file, the mgcv model output (for\n#'   easily generating simulations at unsampled covariate values), Dunn-Smyth\n#'   residuals for each outcome variable and key information needed for other\n#'   functions in the package. See \\code{\\link{mvgam-class}} for details. Use\n#'   `methods(class = \"mvgam\")` for an overview on available methods.\n#'\n#' @author Nicholas J Clark\n#'\n#' @examples\n#' \\dontrun{\n#' # Simulate some data and fit a Poisson AR1 model\n#' simdat <- sim_mvgam(n_series = 1, trend_model = AR())\n#'\n#' mod <- mvgam(\n#'   y ~ s(season, bs = 'cc'),\n#'   trend_model = AR(),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   chains = 2\n#' )\n#'\n#' summary(mod)\n#' conditional_effects(mod, type = 'link')\n#'\n#' # Update to an AR2 model\n#' updated_mod <- update(\n#'   mod,\n#'   trend_model = AR(p = 2),\n#'   noncentred = TRUE\n#' )\n#'\n#' summary(updated_mod)\n#' conditional_effects(updated_mod, type = 'link')\n#'\n#' # Now update to a Binomial AR1 by adding information on trials\n#' # requires that we supply newdata that contains the 'trials' variable\n#' simdat$data_train$trials <- max(simdat$data_train$y) + 15\n#'\n#' updated_mod <- update(\n#'   mod,\n#'   formula = cbind(y, trials) ~ s(season, bs = 'cc'),\n#'   noncentred = TRUE,\n#'   data = simdat$data_train,\n#'   family = binomial()\n#' )\n#'\n#' summary(updated_mod)\n#' conditional_effects(updated_mod, type = 'link')\n#' }\n#'\n#' @export\nupdate.mvgam = function(\n  object,\n  formula,\n  trend_formula,\n  knots,\n  trend_knots,\n  trend_model,\n  family,\n  share_obs_params,\n  data,\n  newdata,\n  trend_map,\n  use_lv,\n  n_lv,\n  priors,\n  chains,\n  burnin,\n  samples,\n  threads,\n  algorithm,\n  lfo = FALSE,\n  ...\n) {\n  if (missing(chains)) {\n    chains <- object$model_output@sim$chains\n  }\n\n  if (missing(burnin)) {\n    burnin <- object$model_output@sim$warmup\n    if (is.null(burnin)) burnin <- 0\n  }\n\n  if (missing(samples)) {\n    samples <- object$model_output@sim$iter - burnin\n  }\n\n  if (missing(threads)) {\n    threads <- attr(object$model_data, 'threads')\n    if (is.null(threads)) threads <- 1\n  }\n\n  if (missing(algorithm)) {\n    algorithm <- object$algorithm\n  }\n\n  if (!algorithm %in% 'sampling') {\n    burnin <- 1\n  }\n\n  if (missing(formula)) {\n    formula <- object$call\n\n    if (attr(object$mgcv_model, 'drop_obs_intercept')) {\n      formula <- update(formula, ~ . - 1)\n    }\n  }\n\n  if (missing(knots)) {\n    if (is.null(attr(object$mgcv_model, 'knots'))) {\n      knots <- missing_arg()\n    } else {\n      knots <- attr(object$mgcv_model, 'knots')\n    }\n  }\n\n  if (missing(share_obs_params)) {\n    share_obs_params <- object$share_obs_params\n  }\n\n  if (missing(trend_formula)) {\n    if (is.null(object$trend_call)) {\n      trend_formula <- missing_arg()\n    } else {\n      trend_formula <- object$trend_call\n    }\n  }\n\n  if (!missing(trend_formula)) {\n    if (missing(trend_knots)) {\n      if (is.null(attr(object$trend_mgcv_model, 'knots'))) {\n        trend_knots <- missing_arg()\n      } else {\n        trend_knots <- attr(object$trend_mgcv_model, 'knots')\n      }\n    }\n  }\n\n  if (missing(trend_map)) {\n    if (is.null(object$trend_map)) {\n      trend_map <- missing_arg()\n    } else {\n      trend_map <- object$trend_map\n    }\n  }\n\n  if (missing(data)) {\n    data_train <- object$obs_data\n  } else {\n    data_train <- data\n  }\n\n  if (missing(priors)) {\n    if (!is.null(object$priors)) {\n      priors <- object$priors\n    } else {\n      priors <- rlang::missing_arg()\n    }\n  }\n\n  if (!missing(newdata)) {\n    # If new  testing data supplied, include as the test data\n    data_test <- newdata\n    include_fc <- TRUE\n  } else if (!is.null(object$test_data)) {\n    # only include test data when no new training data is supplied\n    if (missing(data)) {\n      include_fc <- TRUE\n      data_test <- object$test_data\n    } else {\n      include_fc <- FALSE\n    }\n  } else {\n    include_fc <- FALSE\n  }\n\n  if (missing(trend_model)) {\n    trend_model <- object$trend_model\n  }\n\n  if (missing(use_lv)) {\n    use_lv <- object$use_lv\n  }\n\n  if (missing(n_lv)) {\n    n_lv <- object$n_lv\n  }\n\n  if (missing(family)) {\n    family_char <- object$family\n    family <- family_char\n    if (family_char == 'negative binomial') {\n      family <- nb()\n    }\n    if (family_char == 'beta') {\n      family <- betar()\n    }\n    if (family_char == 'student') {\n      family <- student_t()\n    }\n  }\n\n  if (include_fc) {\n    updated_mod <- mvgam(\n      formula = formula,\n      trend_formula = trend_formula,\n      trend_map = trend_map,\n      knots = knots,\n      trend_knots = trend_knots,\n      data = data_train,\n      newdata = data_test,\n      trend_model = trend_model,\n      use_lv = use_lv,\n      n_lv = n_lv,\n      family = family,\n      share_obs_params = share_obs_params,\n      refit = TRUE,\n      lfo = lfo,\n      use_stan = ifelse(object$fit_engine == 'stan', TRUE, FALSE),\n      priors = priors,\n      chains = chains,\n      burnin = burnin,\n      samples = samples,\n      algorithm = algorithm,\n      threads = threads,\n      ...\n    )\n  } else {\n    updated_mod <- mvgam(\n      formula = formula,\n      trend_formula = trend_formula,\n      trend_map = trend_map,\n      knots = knots,\n      trend_knots = trend_knots,\n      data = data_train,\n      trend_model = trend_model,\n      use_lv = use_lv,\n      n_lv = n_lv,\n      family = family,\n      share_obs_params = share_obs_params,\n      refit = TRUE,\n      lfo = lfo,\n      use_stan = ifelse(object$fit_engine == 'stan', TRUE, FALSE),\n      priors = priors,\n      chains = chains,\n      burnin = burnin,\n      samples = samples,\n      algorithm = algorithm,\n      threads = threads,\n      ...\n    )\n  }\n\n  return(updated_mod)\n}\n\n\n#' @rdname update.mvgam\n#'\n#' @inheritParams jsdgam\n#' @inheritParams update.mvgam\n#'\n#' @param formula Optional new `formula` object. Note, `mvgam` currently does\n#'   not support dynamic formula updates such as removal of specific terms with\n#'   `- term`. When updating, the entire formula needs to be supplied.\n#'\n#' @param factor_formula Optional new `formula` object for the factor linear\n#'   predictors\n#'\n#' @return A \\code{list} object of class \\code{mvgam} containing model output,\n#'   the text representation of the model file, the mgcv model output (for\n#'   easily generating simulations at unsampled covariate values), Dunn-Smyth\n#'   residuals for each series and key information needed for other functions in\n#'   the package. See \\code{\\link{mvgam-class}} for details. Use\n#'   `methods(class = \"mvgam\")` for an overview on available methods.\n#'\n#' @author Nicholas J Clark\n#'\n#' @export\nupdate.jsdgam = function(\n  object,\n  formula,\n  factor_formula,\n  knots,\n  factor_knots,\n  data,\n  newdata,\n  n_lv,\n  family,\n  share_obs_params,\n  priors,\n  chains,\n  burnin,\n  samples,\n  threads,\n  algorithm,\n  lfo = FALSE,\n  ...\n) {\n  if (missing(chains)) {\n    chains <- object$model_output@sim$chains\n  }\n\n  if (missing(burnin)) {\n    burnin <- object$model_output@sim$warmup\n    if (is.null(burnin)) burnin <- 0\n  }\n\n  if (missing(samples)) {\n    samples <- object$model_output@sim$iter - burnin\n  }\n\n  if (missing(threads)) {\n    threads <- attr(object$model_data, 'threads')\n    if (is.null(threads)) threads <- 1\n  }\n\n  if (missing(algorithm)) {\n    algorithm <- object$algorithm\n  }\n\n  if (!algorithm %in% 'sampling') {\n    burnin <- 1\n  }\n\n  if (missing(formula)) {\n    formula <- object$call\n\n    if (attr(object$mgcv_model, 'drop_obs_intercept')) {\n      formula <- update(formula, ~ . - 1)\n    }\n  }\n\n  if (missing(factor_formula)) {\n    factor_formula <- object$trend_call\n  }\n\n  if (missing(knots)) {\n    if (is.null(attr(object$mgcv_model, 'knots'))) {\n      knots <- missing_arg()\n    } else {\n      knots <- attr(object$mgcv_model, 'knots')\n    }\n  }\n\n  if (missing(factor_knots)) {\n    if (is.null(attr(object$trend_mgcv_model, 'knots'))) {\n      factor_knots <- missing_arg()\n    } else {\n      factor_knots <- attr(object$trend_mgcv_model, 'knots')\n    }\n  }\n\n  if (missing(share_obs_params)) {\n    share_obs_params <- object$share_obs_params\n  }\n\n  if (missing(data)) {\n    data_train <- object$obs_data\n  } else {\n    data_train <- data\n  }\n\n  if (missing(priors)) {\n    if (!is.null(object$priors)) {\n      priors <- object$priors\n    } else {\n      priors <- rlang::missing_arg()\n    }\n  }\n\n  if (!missing(newdata)) {\n    # If new testing data supplied, include as the test data\n    data_test <- newdata\n    include_fc <- TRUE\n  } else if (!is.null(object$test_data)) {\n    # only include test data when no new training data is supplied\n    if (missing(data)) {\n      include_fc <- TRUE\n      data_test <- object$test_data\n    } else {\n      include_fc <- FALSE\n    }\n  } else {\n    include_fc <- FALSE\n  }\n\n  if (missing(n_lv)) {\n    n_lv <- object$n_lv\n  }\n\n  if (missing(family)) {\n    family_char <- object$family\n    family <- family_char\n    if (family_char == 'negative binomial') {\n      family <- nb()\n    }\n    if (family_char == 'beta') {\n      family <- betar()\n    }\n    if (family_char == 'student') {\n      family <- student_t()\n    }\n  }\n\n  if (include_fc) {\n    updated_mod <- jsdgam(\n      formula = formula,\n      factor_formula = factor_formula,\n      knots = knots,\n      factor_knots = factor_knots,\n      data = data_train,\n      newdata = data_test,\n      trend_model = trend_model,\n      n_lv = n_lv,\n      family = family,\n      share_obs_params = share_obs_params,\n      refit = TRUE,\n      lfo = lfo,\n      use_stan = ifelse(object$fit_engine == 'stan', TRUE, FALSE),\n      priors = priors,\n      chains = chains,\n      burnin = burnin,\n      samples = samples,\n      algorithm = algorithm,\n      threads = threads,\n      ...\n    )\n  } else {\n    updated_mod <- mvgam(\n      formula = formula,\n      factor_formula = factor_formula,\n      knots = knots,\n      factor_knots = factor_knots,\n      data = data_train,\n      trend_model = trend_model,\n      n_lv = n_lv,\n      family = family,\n      share_obs_params = share_obs_params,\n      refit = TRUE,\n      lfo = lfo,\n      use_stan = ifelse(object$fit_engine == 'stan', TRUE, FALSE),\n      priors = priors,\n      chains = chains,\n      burnin = burnin,\n      samples = samples,\n      algorithm = algorithm,\n      threads = threads,\n      ...\n    )\n  }\n\n  return(updated_mod)\n}\n"
  },
  {
    "path": "R/update_priors.R",
    "content": "#' Update priors for a JAGS or Stan model file\n#'\n#'\n#' @param model_file Prepared mvgam model file\n#' @param priors \\code{data.frame} with prior definitions (in JAGS or Stan syntax)\n#' @param use_stan \\code{logical}. Only Stan models can have parameter bounds edited\n#' @return A `character string` containing the updated model file\n#' @noRd\nupdate_priors = function(model_file, priors, use_stan) {\n  # Check the prior df structure\n  if (!any(class(priors) == 'data.frame')) {\n    stop(\n      'priors must be a data.frame with at least the colnames: param_name, prior'\n    )\n  }\n\n  if (!'prior' %in% names(priors)) {\n    stop(\n      'priors must be a data.frame with at least the colnames: param_name, prior'\n    )\n  }\n\n  if (!'param_name' %in% names(priors)) {\n    stop(\n      'priors must be a data.frame with at least the colnames: param_name, prior'\n    )\n  }\n\n  # Replace any call to 'Intercept' with '(Intercept)' to match mgcv style\n  priors[] <- lapply(\n    priors,\n    function(x) gsub(\"Intercept(?!.*[^()]*\\\\))\", \"(Intercept)\", x, perl = TRUE)\n  )\n\n  if (!is.null(attr(priors, 'posterior_to_prior'))) {\n    model_file <- posterior_to_prior(model_file, priors)\n  } else {\n    # Modify the file to update the prior definitions\n    for (i in 1:NROW(priors)) {\n      # gp() terms can be supplied using more mgcv-like syntax; replace\n      # with the uglier syntax that is used in the Stan code so the prior\n      # can be correctly updated\n      if (\n        grepl('gp(', priors$prior[i], fixed = TRUE) |\n          grepl('gp_trend', priors$prior[i], fixed = TRUE)\n      ) {\n        priors$prior[i] <- paste(\n          clean_gp_priorname(trimws(strsplit(priors$prior[i], \"[~]\")[[1]][1])),\n          '~',\n          trimws(strsplit(priors$prior[i], \"[~]\")[[1]][2])\n        )\n      }\n\n      if (\n        !any(grepl(\n          paste(trimws(strsplit(priors$prior[i], \"[~]\")[[1]][1]), '~'),\n          model_file,\n          fixed = TRUE\n        ))\n      ) {\n        # Updating parametric effects\n        if (\n          any(grepl(\n            paste0('// prior for ', priors$param_name[i], '...'),\n            model_file,\n            fixed = TRUE\n          ))\n        ) {\n          header_line <- grep(\n            paste0('// prior for ', priors$param_name[i], '...'),\n            model_file,\n            fixed = TRUE\n          )\n          newprior <- paste(trimws(strsplit(priors$prior[i], \"[~]\")[[1]][2]))\n          model_file[header_line + 1] <-\n            paste(\n              trimws(strsplit(model_file[header_line + 1], \"[~]\")[[1]][1]),\n              '~',\n              newprior\n            )\n        } else if (grepl('num_gp_basis', priors$prior[i])) {\n          model_file[grep(\n            'num_gp_basis = min(20, n);',\n            model_file,\n            fixed = TRUE\n          )] <-\n            priors$prior[i]\n        } else if (grepl('=', priors$prior[i])) {\n          tomatch <- trimws(strsplit(\n            paste0(\n              '\\\\b',\n              gsub(\n                ']',\n                '\\\\]',\n                gsub('[', '\\\\[', priors$prior[i], fixed = TRUE),\n                fixed = TRUE\n              )\n            ),\n            \"[=]\"\n          )[[1]][1])\n          model_file[grep(tomatch, model_file, fixed = TRUE)] <-\n            priors$prior[i]\n        } else {\n          warning(\n            'no match found in model_file for parameter: ',\n            trimws(strsplit(priors$prior[i], \"[~]\")[[1]][1]),\n            call. = FALSE\n          )\n        }\n      } else {\n        model_file[grep(\n          paste(trimws(strsplit(priors$prior[i], \"[~]\")[[1]][1]), '~'),\n          model_file,\n          fixed = TRUE\n        )] <-\n          priors$prior[i]\n      }\n    }\n\n    # Modify the file to update any bounds on parameters\n    if (use_stan) {\n      if (any(!is.na(c(priors$new_lowerbound, priors$new_upperbound)))) {\n        for (i in 1:NROW(priors)) {\n          # Not currently possible to include new bounds on parametric effect\n          # priors\n          if (grepl('fixed effect|Intercept', priors$param_info[i])) {\n            if (\n              !is.na(priors$new_lowerbound)[i] |\n                !is.na(priors$new_upperbound)[i]\n            ) {\n              warning(\n                'not currently possible to place bounds on fixed effect priors: ',\n                trimws(strsplit(priors$prior[i], \"[~]\")[[1]][1]),\n                call. = FALSE\n              )\n            }\n          } else {\n            # gp() terms can be supplied using more mgcv-like syntax; replace\n            # with the uglier syntax that is used in the Stan code so the prior\n            # can be correctly updated\n            if (\n              grepl('gp(', priors$param_name[i], fixed = TRUE) |\n                grepl('gp_trend', priors$param_name[i], fixed = TRUE)\n            ) {\n              priors$param_name[i] <- gsub(\n                '(',\n                '_',\n                priors$param_name[i],\n                fixed = TRUE\n              )\n              priors$param_name[i] <- gsub(\n                ')',\n                '_',\n                priors$param_name[i],\n                fixed = TRUE\n              )\n              priors$param_name[i] <- gsub(\n                ':',\n                'by',\n                priors$param_name[i],\n                fixed = TRUE\n              )\n            }\n\n            # Create boundary text strings\n            if (!is.na(priors$new_lowerbound[i])) {\n              change_lower <- TRUE\n              lower_text <- paste0('lower=', priors$new_lowerbound[i])\n            } else {\n              if (grepl('lower=', priors$param_name[i])) {\n                change_lower <- TRUE\n                lower_text <-\n                  paste0(\n                    'lower=',\n                    regmatches(\n                      priors$param_name[i],\n                      regexpr(\n                        \"lower=.*?\\\\K-?\\\\d+\",\n                        priors$param_name[i],\n                        perl = TRUE\n                      )\n                    )\n                  )\n              } else {\n                change_lower <- FALSE\n              }\n            }\n\n            if (!is.na(priors$new_upperbound[i])) {\n              change_upper <- TRUE\n              upper_text <- paste0('upper=', priors$new_upperbound[i])\n            } else {\n              if (grepl('upper=', priors$param_name[i])) {\n                change_upper <- TRUE\n                upper_text <-\n                  paste0(\n                    'upper=',\n                    regmatches(\n                      priors$param_name[i],\n                      regexpr(\n                        \"upper=.*?\\\\K-?\\\\d+\",\n                        priors$param_name[i],\n                        perl = TRUE\n                      )\n                    )\n                  )\n              } else {\n                change_upper <- FALSE\n              }\n            }\n\n            # Insert changes\n            if (change_lower & change_upper) {\n              model_file[grep(\n                trimws(priors$param_name[i]),\n                model_file,\n                fixed = TRUE\n              )] <-\n                ifelse(\n                  !grepl('<', priors$param_name[i]),\n                  sub(\n                    '\\\\[',\n                    paste0('<', lower_text, ',', upper_text, '>\\\\['),\n                    priors$param_name[i]\n                  ),\n                  sub(\n                    \"<[^\\\\)]+>\",\n                    paste0('<', lower_text, ',', upper_text, '>'),\n                    priors$param_name[i]\n                  )\n                )\n            }\n\n            if (change_lower & !change_upper) {\n              model_file[grep(\n                trimws(priors$param_name[i]),\n                model_file,\n                fixed = TRUE\n              )] <-\n                ifelse(\n                  !grepl('<', priors$param_name[i]),\n                  sub(\n                    '\\\\[',\n                    paste0('<', lower_text, '>\\\\['),\n                    priors$param_name[i]\n                  ),\n                  sub(\n                    \"<[^\\\\)]+>\",\n                    paste0('<', lower_text, '>'),\n                    priors$param_name[i]\n                  )\n                )\n            }\n\n            if (change_upper & !change_lower) {\n              model_file[grep(\n                trimws(priors$param_name[i]),\n                model_file,\n                fixed = TRUE\n              )] <-\n                ifelse(\n                  !grepl('<', priors$param_name[i]),\n                  sub(\n                    '\\\\[',\n                    paste0('<', upper_text, '>\\\\['),\n                    priors$param_name[i]\n                  ),\n                  sub(\n                    \"<[^\\\\)]+>\",\n                    paste0('<', upper_text, '>'),\n                    priors$param_name[i]\n                  )\n                )\n            }\n          }\n\n          change_lower <- FALSE\n          change_upper <- FALSE\n        }\n      }\n    }\n  }\n\n  return(model_file)\n}\n\n#' Make detailed changes to allow a prior model to as closely match a posterior\n#' from a previous model as possible\n#' @noRd\nposterior_to_prior = function(model_file, priors) {\n  # parametric terms\n  para_terms <- priors$group[which(priors$parametric == TRUE)]\n  para_priors <- priors$prior[which(priors$parametric == TRUE)]\n  para_lowers <- priors$lb[which(priors$parametric == TRUE)]\n  para_uppers <- priors$ub[which(priors$parametric == TRUE)]\n  if (length(para_terms) > 0) {\n    for (i in 1:length(para_terms)) {\n      header_line <- grep(\n        paste0(para_terms[i], '...'),\n        model_file,\n        fixed = TRUE\n      )\n      model_file[header_line + 1] <-\n        paste0(\n          trimws(strsplit(model_file[header_line + 1], \"[~]\")[[1]][1]),\n          ' ~ ',\n          para_priors[i],\n          ';'\n        )\n    }\n  }\n\n  # Other lines to modify\n  mainlines_to_modify <- unique(priors$group[which(priors$parametric == FALSE)])\n  for (i in 1:length(mainlines_to_modify)) {\n    priors %>%\n      dplyr::filter(group == mainlines_to_modify[i]) -> group_priors\n    replace_line <- c()\n    for (j in 1:NROW(group_priors)) {\n      replace_line <- c(\n        replace_line,\n        paste0(group_priors$class[j], ' ~ ', group_priors$prior[j])\n      )\n    }\n    replace_line <- paste0(paste(replace_line, collapse = ';\\n'), ';\\n')\n\n    orig_line <- grep(\n      paste(trimws(strsplit(mainlines_to_modify[i], \"[~]\")[[1]][1]), '~'),\n      model_file,\n      fixed = TRUE\n    )\n    model_file[orig_line] <- replace_line\n  }\n  model_file <- readLines(textConnection(model_file), n = -1)\n\n  if ('P_real' %in% mainlines_to_modify) {\n    priors %>%\n      dplyr::filter(group == 'P_real') -> group_priors\n    replace_line <- c()\n    for (j in 1:NROW(group_priors)) {\n      replace_line <- c(\n        replace_line,\n        paste0(group_priors$class[j], ' ~ ', group_priors$prior[j])\n      )\n    }\n    replace_line <- paste0(paste(replace_line, collapse = ';\\n'), ';\\n')\n\n    remove_start <- grep(\n      '// partial autocorrelation hyperpriors',\n      model_file,\n      fixed = TRUE\n    ) +\n      1\n    remove_end <- grep(\n      'P_real[i, j] ~ normal(Pmu[2], 1 / sqrt(Pomega[2]));',\n      model_file,\n      fixed = TRUE\n    ) +\n      2\n    model_file <- model_file[-c(remove_start:remove_end)]\n    model_file[grep(\n      '// partial autocorrelation hyperpriors',\n      model_file,\n      fixed = TRUE\n    )] <-\n      paste0('  // partial autocorrelation hyperpriors\\n', replace_line)\n    model_file <- readLines(textConnection(model_file), n = -1)\n  }\n\n  return(model_file)\n}\n\n\n#' Allow brmsprior objects to be supplied to mvgam()\n#' @noRd\nadapt_brms_priors = function(\n  priors,\n  formula,\n  trend_formula,\n  data,\n  family = 'poisson',\n  use_lv = FALSE,\n  n_lv,\n  trend_model = 'None',\n  trend_map,\n  drift = FALSE,\n  warnings = FALSE,\n  knots\n) {\n  # Replace any call to 'Intercept' with '(Intercept)' to match mgcv style\n  priors[] <- lapply(\n    priors,\n    function(x) gsub(\"Intercept(?!.*[^()]*\\\\))\", \"(Intercept)\", x, perl = TRUE)\n  )\n\n  # Get priors that are able to be updated\n  priors_df <- get_mvgam_priors(\n    formula = formula,\n    trend_formula = trend_formula,\n    data = data,\n    family = family,\n    use_lv = use_lv,\n    n_lv = n_lv,\n    trend_model = trend_model,\n    trend_map = trend_map,\n    knots = knots\n  )\n\n  if (\n    any(\n      grepl('_gp', priors$class, fixed = TRUE) &\n        (!is.na(priors$ub) | !is.na(priors$lb))\n    )\n  ) {\n    warning(\n      'bounds cannot currently be changed for gp parameters',\n      call. = FALSE\n    )\n  }\n\n  # Update using priors from the brmsprior object\n  for (i in 1:NROW(priors)) {\n    newclass <- ifelse(\n      grepl('_gp(', priors$class[i], fixed = TRUE),\n      clean_gp_priorname(priors$class[i]),\n      priors$class[i]\n    )\n    newcoef <- ifelse(\n      grepl('_gp(', priors$coef[i], fixed = TRUE),\n      clean_gp_priorname(priors$coef[i]),\n      priors$coef[i]\n    )\n\n    if (\n      any(grepl(paste0(priors$class[i], ' ~ '), priors_df$prior, fixed = TRUE))\n    ) {\n      # Update the prior distribution\n      priors_df$prior[grepl(\n        paste0(priors$class[i], ' ~ '),\n        priors_df$prior,\n        fixed = TRUE\n      )] <-\n        paste0(newclass, ' ~ ', priors$prior[i], ';')\n\n      # Now update bounds\n      priors_df$new_lowerbound[grepl(\n        paste0(priors$class[i], ' ~ '),\n        priors_df$prior,\n        fixed = TRUE\n      )] <-\n        priors$lb[i]\n\n      priors_df$new_upperbound[grepl(\n        paste0(priors$class[i], ' ~ '),\n        priors_df$prior,\n        fixed = TRUE\n      )] <-\n        priors$ub[i]\n    } else if (\n      priors$coef[i] != '' &\n        any(grepl(paste0(priors$coef[i], ' ~ '), priors_df$prior, fixed = TRUE))\n    ) {\n      # Update the prior distribution\n      priors_df$prior[grepl(\n        paste0(priors$coef[i], ' ~ '),\n        priors_df$prior,\n        fixed = TRUE\n      )] <-\n        paste0(newcoef, ' ~ ', priors$prior[i], ';')\n\n      # Now update bounds\n      priors_df$new_lowerbound[grepl(\n        paste0(priors$coef[i], ' ~ '),\n        priors_df$prior,\n        fixed = TRUE\n      )] <-\n        priors$lb[i]\n\n      priors_df$new_upperbound[grepl(\n        paste0(priors$coef[i], ' ~ '),\n        priors_df$prior,\n        fixed = TRUE\n      )] <-\n        priors$ub[i]\n    } else if (priors$class[i] == 'b') {\n      # Update all fixed effect priors\n      if (any(grepl('fixed effect', priors_df$param_info))) {\n        for (j in 1:NROW(priors_df)) {\n          if (grepl('fixed effect', priors_df$param_info[j])) {\n            priors_df$prior[j] <-\n              paste0(\n                paste(\n                  trimws(\n                    strsplit(priors_df$prior[j], \"[~]\")[[1]][1]\n                  ),\n                  '~ '\n                ),\n                priors$prior[i],\n                ';'\n              )\n          }\n        }\n      }\n    } else {\n      if (warnings) {\n        warning(\n          paste0(\n            'no match found in model_file for parameter: ',\n            paste0(priors$class[i], ' ', priors$coef[i])\n          ),\n          call. = FALSE\n        )\n      }\n    }\n  }\n\n  return(priors_df)\n}\n\n#'@noRd\nclean_gp_priorname = function(prior) {\n  if (grepl('[', prior, fixed = TRUE)) {\n    newlhs <- trimws(strsplit(prior, \"\\\\[\")[[1]][1])\n    if (grepl('[1][', prior, fixed = TRUE)) {\n      index <- paste0('[1][', trimws(strsplit(prior, \"\\\\[\")[[1]][3]))\n    } else {\n      index <- '[1]'\n    }\n\n    out <- paste0(clean_gpnames(newlhs), index)\n  } else {\n    out <- clean_gpnames(prior)\n  }\n  out\n}\n"
  },
  {
    "path": "R/utils-pipe.R",
    "content": "#' Pipe operator\n#'\n#' See \\code{magrittr::\\link[magrittr:pipe]{\\%>\\%}} for details.\n#'\n#' @name %>%\n#' @rdname pipe\n#' @keywords internal\n#' @export\n#' @importFrom magrittr %>%\n#' @usage lhs \\%>\\% rhs\n#' @param lhs A value or the magrittr placeholder.\n#' @param rhs A function call using the magrittr semantics.\n#' @return The result of calling `rhs(lhs)`.\nNULL\n"
  },
  {
    "path": "R/validations.R",
    "content": "#'Argument validation functions\n#'@param data Data to be validated (list or data.frame)\n#'@noRd\nvalidate_series_time = function(\n  data,\n  name = 'data',\n  trend_model,\n  check_levels = TRUE,\n  check_times = TRUE\n) {\n  # First validation requires the full trend_model object\n  if (!inherits(trend_model, 'mvgam_trend')) {\n    trend_model <- list(\n      trend_model = trend_model,\n      unit = 'time',\n      gr = 'NA',\n      subgr = 'series'\n    )\n  }\n\n  # Respect any original additions of implicit_vars\n  implicit_series <- implicit_time <- FALSE\n  if (!is.null(attr(data, 'implicit_vars'))) {\n    implicit_series <- 'series' %in% attr(data, 'implicit_vars')\n    implicit_time <- 'time' %in% attr(data, 'implicit_vars')\n  }\n\n  # Validate any grouping structure and update the data accordingly\n  data <- validate_series_groups(\n    data = data,\n    trend_model = trend_model,\n    name = name\n  )\n  if (!is.null(attr(data, 'implicit_vars'))) {\n    implicit_series <- 'series' %in% attr(data, 'implicit_vars')\n    implicit_time <- 'time' %in% attr(data, 'implicit_vars')\n  }\n\n  # Now we only need the character trend_model string\n  trend_model <- trend_model$trend_model\n\n  # Series label must be present as a factor and\n  # must contain a time variable\n  if (inherits(data, 'data.frame')) {\n    data %>%\n      dplyr::ungroup() -> data\n\n    if (!'series' %in% colnames(data)) {\n      data$series <- factor('series1')\n      implicit_series <- TRUE\n    }\n\n    # Series factor must have all unique levels present\n    if (!is.factor(data$series)) {\n      stop('Variable \"series\" must be a factor type', call. = FALSE)\n    }\n\n    if (!'time' %in% colnames(data)) {\n      if (trend_model == 'None') {\n        # Add a time indicator if missing\n        data %>%\n          dplyr::group_by(series) %>%\n          dplyr::mutate(time = dplyr::row_number()) %>%\n          dplyr::ungroup() -> data\n        implicit_time <- TRUE\n      } else {\n        stop(name, \" does not contain a 'time' variable\", call. = FALSE)\n      }\n    }\n  }\n\n  if (inherits(data, 'list')) {\n    if (!'series' %in% names(data)) {\n      data$series <- factor('series1')\n      implicit_series <- TRUE\n    }\n\n    # Series factor must have all unique levels present\n    if (!is.factor(data$series)) {\n      stop('Variable \"series\" must be a factor type', call. = FALSE)\n    }\n\n    if (!'time' %in% names(data)) {\n      if (trend_model == 'None') {\n        # Add a time indicator if missing\n        data.frame(series = data$series) %>%\n          dplyr::group_by(series) %>%\n          dplyr::mutate(time = dplyr::row_number()) %>%\n          dplyr::pull(time) -> times\n        implicit_time <- TRUE\n        data$time <- times\n      } else {\n        stop(name, \" does not contain a 'time' variable\", call. = FALSE)\n      }\n    }\n  }\n\n  # Add an identifier so post-processing functions know\n  # what the original supplied data ordering was; this is needed\n  # for ensuring that functions such as fitted() and\n  # residuals() return objects that match the original order that\n  # the user supplied, if no newdata are given\n  data$index..orig..order <- 1:length(data$time)\n\n  # Add a new 'time' variable that will be useful for rearranging data for\n  # modeling, in case 'time' is also supplied as a covariate or if this is\n  # a continuous time model (CAR1)\n  data$index..time..index <- data$time\n\n  # Use the data ordering to set the index of time for CAR1\n  if (trend_model == 'CAR1') {\n    data.frame(series = data$series, time = data$time) %>%\n      dplyr::mutate(orig_rows = dplyr::row_number()) %>%\n      dplyr::group_by(series) %>%\n      dplyr::mutate(idx = dplyr::row_number()) %>%\n      dplyr::arrange(time) %>%\n      dplyr::mutate(time. = dplyr::row_number()) %>%\n      dplyr::ungroup() %>%\n      dplyr::arrange(orig_rows) %>%\n      dplyr::pull(time.) -> times\n    data$index..time..index <- times\n  }\n\n  # Series factor must have all unique levels present if this is a\n  # forecast check\n  if (check_levels) {\n    if (!all(levels(data$series) %in% unique(data$series))) {\n      stop(\n        paste0(\n          'Mismatch between factor levels of \"series\" and unique values of \"series\"',\n          '\\n',\n          'Use\\n  `setdiff(levels(data$series), unique(data$series))` \\nand',\n          '\\n',\n          '  `intersect(levels(data$series), unique(data$series))`\\nfor guidance'\n        ),\n        call. = FALSE\n      )\n    }\n  }\n\n  # Ensure each series has an observation, even if NA, for each\n  # unique timepoint (only for trend models that require discrete time with\n  # regularly spaced sampling intervals)\n  if (check_times) {\n    all_times_avail = function(time, min_time, max_time) {\n      identical(\n        as.numeric(sort(time)),\n        as.numeric(seq.int(from = min_time, to = max_time))\n      )\n    }\n    min_time <- as.numeric(min(data$index..time..index))\n    max_time <- as.numeric(max(data$index..time..index))\n    data.frame(series = data$series, time = data$index..time..index) %>%\n      dplyr::group_by(series) %>%\n      dplyr::summarise(\n        all_there = all_times_avail(time, min_time, max_time)\n      ) -> checked_times\n    if (any(checked_times$all_there == FALSE)) {\n      stop(\n        \"One or more series in \",\n        name,\n        \" is missing observations for one or more timepoints\",\n        call. = FALSE\n      )\n    }\n  }\n\n  if (implicit_series & implicit_time) {\n    attr(data, 'implicit_vars') <- c('series', 'time')\n  }\n\n  if (implicit_series & !implicit_time) {\n    attr(data, 'implicit_vars') <- 'series'\n  }\n\n  if (implicit_time & !implicit_series) {\n    attr(data, 'implicit_vars') <- 'time'\n  }\n\n  if (!implicit_time & !implicit_series) {\n    attr(data, 'implicit_vars') <- NULL\n  }\n\n  return(data)\n}\n\n# Function to ensure units of analysis, groups and subgroups are arranged\n# and formatted properly for mvgam processing and modelling\n#'@noRd\nvalidate_series_groups = function(data, trend_model, name = 'data') {\n  implicit_series <- implicit_time <- FALSE\n\n  # Checks only needed if trend_model isn't 'None'\n  if (trend_model$trend_model != 'None') {\n    # Check that unit and subgr exist in data and are the correct type\n    if (is.null(trend_model$gr)) {\n      trend_model$gr <- 'NA'\n    }\n    if (is.null(trend_model$unit)) {\n      trend_model$unit <- 'time'\n    }\n    if (is.null(trend_model$subgr)) {\n      trend_model$subgr <- 'series'\n    }\n\n    if (\n      trend_model$gr == 'NA' &\n        trend_model$unit == 'time' &\n        trend_model$subgr == 'series'\n    ) {\n      if (!'series' %in% names(data)) {\n        data$series <- factor('series1')\n        implicit_series <- TRUE\n      }\n\n      if (!'time' %in% names(data)) {\n        if (trend_model$trend_model %in% c('ZMVNcor', 'ZMVNhiercor')) {\n          # Add a time indicator if missing\n          data.frame(series = data$series) %>%\n            dplyr::group_by(series) %>%\n            dplyr::mutate(time = dplyr::row_number()) %>%\n            dplyr::pull(time) -> times\n          implicit_time <- TRUE\n          data$time <- times\n        } else {\n          stop(name, \" does not contain a 'time' variable\", call. = FALSE)\n        }\n      }\n    }\n    validate_var_exists(\n      data = data,\n      variable = trend_model$unit,\n      type = 'num/int',\n      name = name,\n      trend_char = trend_model$trend_model\n    )\n\n    validate_var_exists(\n      data = data,\n      variable = trend_model$subgr,\n      type = 'factor',\n      name = name,\n      trend_char = trend_model$trend_model\n    )\n\n    # If gr is supplied, check it exists and is the correct type\n    if (trend_model$gr != 'NA') {\n      implicit_series <- implicit_time <- TRUE\n      validate_var_exists(\n        data = data,\n        variable = trend_model$gr,\n        type = 'factor',\n        name = name,\n        trend_char = trend_model$trend_model\n      )\n      if (trend_model$subgr == 'series') {\n        stop(\n          'argument \"subgr\" cannot be set to \"series\" if \"gr\" is also supplied',\n          call. = FALSE\n        )\n      }\n\n      # Add necessary 'time' variable\n      gr_dat <- data.frame(\n        time = data[[trend_model$unit]],\n        gr = data[[trend_model$gr]],\n        subgr = data[[trend_model$subgr]]\n      )\n\n      # Check that each level of gr contains all possible levels of subgr\n      gr_total_levels <- gr_dat %>%\n        dplyr::group_by(gr) %>%\n        dplyr::summarise(tot_subgrs = length(unique(subgr))) %>%\n        dplyr::ungroup() %>%\n        dplyr::pull(tot_subgrs)\n      if (length(gr_total_levels) > 1) {\n        if (stats::var(gr_total_levels) != 0) {\n          stop(\n            paste0(\n              'Some levels of \"',\n              trend_model$gr,\n              '\" do not contain all\\n',\n              'unique levels of \"',\n              trend_model$subgr,\n              '\"',\n              \" in \",\n              name\n            ),\n            call. = FALSE\n          )\n        }\n      }\n\n      gr_dat %>%\n        dplyr::mutate(\n          series = interaction(\n            gr,\n            subgr,\n            drop = TRUE,\n            sep = '_',\n            lex.order = TRUE\n          )\n        ) -> gr_dat\n    } else {\n      if (trend_model$unit != 'time') {\n        implicit_time <- TRUE\n      }\n      if (trend_model$subgr != 'series') {\n        implicit_series <- TRUE\n      }\n      gr_dat <- data.frame(\n        time = data[[trend_model$unit]],\n        subgr = data[[trend_model$subgr]]\n      ) %>%\n        dplyr::mutate(series = as.factor(subgr))\n    }\n\n    # Add the possibly new 'series' and 'time' variables to\n    # the data and return\n    data$series <- gr_dat$series\n    data$time <- gr_dat$time\n  }\n\n  if (implicit_series & implicit_time) {\n    attr(data, 'implicit_vars') <- c('series', 'time')\n  }\n\n  if (implicit_series & !implicit_time) {\n    attr(data, 'implicit_vars') <- 'series'\n  }\n\n  if (implicit_time & !implicit_series) {\n    attr(data, 'implicit_vars') <- 'time'\n  }\n\n  if (!implicit_time & !implicit_series) {\n    attr(data, 'implicit_vars') <- NULL\n  }\n\n  return(data)\n}\n\n#'@noRd\nvalidate_var_exists = function(\n  data,\n  variable,\n  type = 'factor',\n  name = 'data',\n  trend_char\n) {\n  if (trend_char != 'None') {\n    if (!exists(variable, data)) {\n      stop(\n        paste0('Variable \"', variable, '\" not found in ', name),\n        call. = FALSE\n      )\n    }\n\n    if (type == 'num/int') {\n      if (!is.numeric(data[[variable]])) {\n        stop(\n          paste0(\n            'Variable \"',\n            variable,\n            '\" must be either numeric or integer type'\n          ),\n          call. = FALSE\n        )\n      }\n    }\n\n    if (type == 'factor') {\n      if (!is.factor(data[[variable]])) {\n        stop(\n          paste0('Variable \"', variable, '\" must be a factor type'),\n          call. = FALSE\n        )\n      }\n    }\n  }\n}\n\n#'@noRd\ndeparse_variable = function(...) {\n  deparse0(substitute(...))\n}\n\n#'@noRd\nas_one_logical = function(x, allow_na = FALSE) {\n  s <- substitute(x)\n  x <- as.logical(x)\n  if (length(x) != 1L || anyNA(x) && !allow_na) {\n    s <- deparse0(s, max_char = 100L)\n    stop(\"Cannot coerce '\", s, \"' to a single logical value.\", call. = FALSE)\n  }\n  x\n}\n\n#'@noRd\nas_one_integer <- function(x, allow_na = FALSE) {\n  s <- substitute(x)\n  x <- suppressWarnings(as.integer(x))\n  if (length(x) != 1L || anyNA(x) && !allow_na) {\n    s <- deparse0(s, max_char = 100L)\n    stop(\"Cannot coerce '\", s, \"' to a single integer value.\", call. = FALSE)\n  }\n  x\n}\n\n#'@noRd\ndeparse0 <- function(x, max_char = NULL, ...) {\n  out <- collapse(deparse(x, ...))\n  if (isTRUE(max_char > 0)) {\n    out <- substr(out, 1L, max_char)\n  }\n  out\n}\n\n#'@noRd\ncollapse <- function(..., sep = \"\") {\n  paste(..., sep = sep, collapse = \"\")\n}\n\n#'@noRd\nvalidate_silent <- function(silent) {\n  silent <- as_one_integer(silent)\n  if (silent < 0 || silent > 2) {\n    stop(\"'silent' must be between 0 and 2.\", call. = FALSE)\n  }\n  silent\n}\n\n#'@importFrom rlang warn\n#'@noRd\nvalidate_family = function(family, use_stan = TRUE) {\n  if (is.character(family)) {\n    if (family == 'beta') {\n      family <- betar()\n    }\n\n    family <- try(eval(parse(text = family)), silent = TRUE)\n\n    if (inherits(family, 'try-error')) {\n      stop(\"family not recognized\", call. = FALSE)\n    }\n  }\n\n  if (is.function(family)) {\n    family <- family()\n  }\n\n  if (is.null(family$family)) {\n    stop(\"family not recognized\", call. = FALSE)\n  }\n\n  if (!inherits(family, 'family')) {\n    stop('family not recognized', call. = FALSE)\n  }\n\n  if (family$family == 'Beta regression') {\n    family$family <- 'beta'\n  }\n\n  if (family$family == 'tweedie') {\n    insight::check_if_installed(\n      \"tweedie\",\n      reason = 'to simulate from Tweedie distributions'\n    )\n  }\n\n  if (\n    !family$family %in% c('poisson', 'negative binomial', 'tweedie') & !use_stan\n  ) {\n    stop(\n      'JAGS only supports poisson(), nb() or tweedie() families',\n      call. = FALSE\n    )\n  }\n\n  # Stan cannot support Tweedie\n  if (use_stan & family$family == 'tweedie') {\n    stop('Tweedie family not supported for stan', call. = FALSE)\n  }\n\n  if (family$family %in% c('binomial', 'beta_binomial')) {\n    rlang::warn(\n      paste0(\n        \"Binomial and Beta-binomial families require cbind(n_successes, n_trials)\\n\",\n        \"in the formula left-hand side. Do not use cbind(n_successes, n_failures)!\"\n      ),\n      .frequency = \"once\",\n      .frequency_id = 'cbind_binomials'\n    )\n  }\n  return(family)\n}\n\n#'@noRd\nvalidate_family_restrictions = function(response, family) {\n  response <- response[!is.na(response)]\n\n  # 0s and 1s only for Bernoulli\n  if (family$family == 'bernoulli') {\n    y <- response\n    nobs <- length(response)\n    weights <- rep(1, length(response))\n    eval(binomial()$initialize)\n  }\n\n  # 0s and 1s not allowed for Beta\n  if (family$family == 'beta') {\n    if (any(response <= 0)) {\n      stop('Values <= 0 not allowed for beta responses', call. = FALSE)\n    }\n    if (any(response >= 1)) {\n      stop('Values >= 1 not allowed for beta responses', call. = FALSE)\n    }\n  }\n\n  # negatives not allowed for several families\n  if (\n    family$family %in%\n      c('poisson', 'negative binomial', 'tweedie', 'binomial', 'beta_binomial')\n  ) {\n    if (any(response < 0)) {\n      stop(\n        paste0('Values < 0 not allowed for count family responses'),\n        call. = FALSE\n      )\n    }\n  }\n\n  # negatives and/or zeros not allowed for several families\n  if (family$family %in% c('lognormal', 'Gamma')) {\n    if (any(response <= 0)) {\n      stop(\n        paste0('Values <= 0 not allowed for ', family$family, ' responses'),\n        call. = FALSE\n      )\n    }\n  }\n}\n\n#'@noRd\nvalidate_trend_model = function(\n  trend_model,\n  drift = FALSE,\n  noncentred = FALSE,\n  warn = TRUE\n) {\n  if (inherits(trend_model, 'mvgam_trend')) {\n    ma_term <- if (trend_model$ma) {\n      'MA'\n    } else {\n      NULL\n    }\n    cor_term <- if (trend_model$cor) {\n      'cor'\n    } else {\n      NULL\n    }\n    if (is.null(trend_model$gr)) {\n      trend_model$gr <- 'NA'\n    }\n    if (trend_model$gr != 'NA') {\n      gr_term <- 'hier'\n    } else {\n      gr_term <- NULL\n    }\n    trend_model <- paste0(\n      trend_model$trend_model,\n      trend_model$p,\n      ma_term,\n      gr_term,\n      cor_term\n    )\n  } else {\n    if (trend_model != 'None' & warn) {\n      rlang::warn(\n        paste0(\n          \"Supplying trend_model as a character string is deprecated\\n\",\n          \"Please use the dedicated functions (i.e. RW() or ZMVN()) instead\"\n        ),\n        .frequency = \"once\",\n        .frequency_id = 'trend_characters'\n      )\n    }\n  }\n\n  trend_model <- match.arg(arg = trend_model, choices = trend_model_choices())\n\n  if (trend_model == 'VAR') {\n    trend_model <- 'VAR1'\n  }\n  if (trend_model == 'VARcor') {\n    trend_model <- 'VAR1cor'\n  }\n  if (trend_model == 'VARhiercor') {\n    trend_model <- 'VAR1hiercor'\n  }\n  if (trend_model %in% c('VARMA', 'VARMAcor')) {\n    trend_model <- 'VARMA1,1cor'\n  }\n\n  if (\n    !trend_model %in% c('None', 'RW', 'AR1', 'AR2', 'AR3', 'CAR1') & noncentred\n  ) {\n    message('Non-centering of trends currently not available for this model')\n  }\n\n  if (trend_model %in% c('PWlinear', 'PWlogistic')) {\n    insight::check_if_installed(\n      \"extraDistr\",\n      reason = 'to simulate from piecewise trends'\n    )\n  }\n  return(trend_model)\n}\n\n#'@noRd\nvalidate_obs_formula = function(formula, data, refit = FALSE) {\n  if (attr(terms(formula), \"response\") == 0L) {\n    stop('response variable is missing from formula', call. = FALSE)\n  }\n\n  # Check that response terms are in the data; account for possible\n  # 'cbind' in there if this is a binomial model\n  resp_terms <- as.character(terms(formula(formula))[[2]])\n  if (length(resp_terms) == 1) {\n    out_name <- as.character(terms(formula(formula))[[2]])\n    if (!as.character(terms(formula(formula))[[2]]) %in% names(data)) {\n      stop(\n        paste0('variable ', terms(formula(formula))[[2]], ' not found in data'),\n        call. = FALSE\n      )\n    }\n  } else {\n    if (any(grepl('cbind', resp_terms))) {\n      resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n      out_name <- resp_terms[1]\n      for (i in 1:length(resp_terms)) {\n        if (!resp_terms[i] %in% names(data)) {\n          stop(\n            paste0('variable ', resp_terms[i], ' not found in data'),\n            call. = FALSE\n          )\n        }\n      }\n    } else {\n      stop(\n        'Not sure how to deal with this response variable specification',\n        call. = FALSE\n      )\n    }\n  }\n\n  if (any(attr(terms(formula), 'term.labels') %in% 'y')) {\n    stop(\n      'due to internal data processing, \"y\" should not be used as the name of a predictor in mvgam',\n      call. = FALSE\n    )\n  }\n\n  # Add a y outcome for sending to the modelling backend\n  data$y <- data[[out_name]]\n\n  return(data)\n}\n\n#'@noRd\nvalidate_trend_formula = function(formula) {\n  if (!is.null(rlang::f_lhs(formula))) {\n    stop(\n      'Argument \"trend_formula\" should not have a left-hand side',\n      call. = FALSE\n    )\n  }\n\n  if (any(grepl('series', as.character(formula)))) {\n    stop(\n      'Argument \"trend_formula\" should not have the identifier \"series\" in it.\\nUse \"trend\" instead for varying effects',\n      call. = FALSE\n    )\n  }\n\n  if (!is.null(attr(terms(formula(formula)), 'offset'))) {\n    stop('Offsets not allowed in argument \"trend_formula\"', call. = FALSE)\n  }\n}\n\n#'@noRd\nvalidate_gr_subgr = function(gr, subgr, cor) {\n  gr <- deparse0(substitute(gr))\n  subgr <- deparse0(substitute(subgr))\n\n  if (gr != 'NA') {\n    if (subgr == 'NA') {\n      stop(\n        'argument \"subgr\" must be supplied if \"gr\" is also supplied',\n        call. = FALSE\n      )\n    }\n  }\n\n  if (subgr != 'NA') {\n    if (gr == 'NA') {\n      stop(\n        'argument \"gr\" must be supplied if \"subgr\" is also supplied',\n        call. = FALSE\n      )\n    } else {\n      cor <- TRUE\n    }\n  }\n\n  list(.group = gr, .subgroup = subgr, .cor = cor)\n}\n\n#'@noRd\nvalidate_proportional = function(x) {\n  s <- substitute(x)\n  x <- base::suppressWarnings(as.numeric(x))\n  if (length(x) != 1L || anyNA(x)) {\n    stop(\"Argument '\", s, \"' must be a single numeric value\", call. = FALSE)\n  }\n\n  if (x < 0 || x > 1) {\n    stop(\n      \"Argument '\",\n      s,\n      \"' must be a proportion ranging from 0 to 1, inclusive\",\n      call. = FALSE\n    )\n  }\n}\n\n#'@noRd\nvalidate_equaldims = function(x, y) {\n  s <- substitute(x)\n  q <- substitute(y)\n\n  if (NCOL(x) != NCOL(y)) {\n    stop(\n      \"Argument '\",\n      s,\n      \"' and argument '\",\n      q,\n      \"' must have equal dimensions\",\n      call. = FALSE\n    )\n  }\n\n  if (NROW(x) != NROW(y)) {\n    stop(\n      \"Argument '\",\n      s,\n      \"' and argument '\",\n      q,\n      \"' must have equal dimensions\",\n      call. = FALSE\n    )\n  }\n}\n\n#'@noRd\nvalidate_pos_integer = function(x) {\n  s <- substitute(x)\n  x <- base::suppressWarnings(as.numeric(x))\n  if (length(x) != 1L || anyNA(x)) {\n    stop(\"Argument '\", s, \"' must be a single numeric value\", call. = FALSE)\n  }\n\n  if (sign(x) != 1) {\n    stop(\"Argument '\", s, \"' must be a positive integer\", call. = FALSE)\n  } else {\n    if (x %% 1 != 0) {\n      stop(\"Argument '\", s, \"' must be a positive integer\", call. = FALSE)\n    }\n  }\n}\n\n#'@noRd\nvalidate_pos_integers = function(x) {\n  s <- substitute(x)\n\n  val_pos = function(y, s) {\n    y <- base::suppressWarnings(as.numeric(y))\n    if (sign(y) != 1) {\n      stop(\"Negative values in \", s, \" detected\", call. = FALSE)\n    } else {\n      if (y %% 1 != 0) {\n        stop(\"Non-integer values in \", s, \" detected\", call. = FALSE)\n      }\n    }\n  }\n  res <- lapply(seq_along(x), function(i) val_pos(x[i], s))\n}\n\n#'@noRd\nvalidate_predictors = function(object, newdata) {\n  # Check names of supplied variables against those required\n  # for prediction\n  required_vars <- insight::find_predictors(\n    object,\n    component = \"all\"\n  )$conditional\n  required_vars <- setdiff(\n    required_vars,\n    attr(object$obs_data, 'implicit_vars')\n  )\n\n  # If time and / or series were in original data but not used,\n  # there is no need for them in the newdata for models with\n  # no trend_model\n  if (!inherits(object$trend_model, 'mvgam_trend')) {\n    if (object$trend_model == 'None') {\n      # Find all predictor terms that were used by the model\n      obs_preds <- insight::find_predictors(\n        object$mgcv_model,\n        effects = 'all',\n        component = 'all',\n        flatten = TRUE\n      )\n\n      trend_preds <- vector()\n      if (!is.null(object$trend_call)) {\n        trend_preds <- insight::find_predictors(\n          object$trend_mgcv_model,\n          effects = 'all',\n          component = 'all',\n          flatten = TRUE\n        )\n\n        preds <- unique(c(obs_preds, trend_preds))\n      } else {\n        preds <- obs_preds\n      }\n\n      # If time and series not used as predictors, no need for them\n      # to be in required_vars\n      if ('time' %in% required_vars & !'time' %in% preds) {\n        required_vars <- setdiff(required_vars, 'time')\n      }\n\n      if (\n        'series' %in%\n          required_vars &\n          !'series' %in% preds &\n          (!object$use_lv | is.null(object$trend_call))\n      ) {\n        required_vars <- setdiff(required_vars, 'series')\n      }\n    }\n  }\n\n  if (length(required_vars)) {\n    if (any(required_vars %in% names(newdata) == FALSE)) {\n      stop(\n        paste0(\n          'the following required variables are missing from newdata:\\n ',\n          paste(\n            required_vars[which(!required_vars %in% names(newdata))],\n            collapse = ', '\n          )\n        ),\n        call. = FALSE\n      )\n    }\n  }\n}\n\n#'@noRd\nvalidate_even <- function(x) {\n  s <- substitute(x)\n  x <- base::suppressWarnings(as.numeric(x))\n  if (x %% 2 != 0) {\n    stop(\"Argument '\", s, \"'  must be an even integer\", call. = FALSE)\n  }\n}\n\n#'@noRd\nvalidate_pos_real = function(x) {\n  s <- substitute(x)\n  x <- base::suppressWarnings(as.numeric(x))\n  if (length(x) != 1L || anyNA(x)) {\n    stop(\"Argument '\", s, \"' must be a single numeric value\", call. = FALSE)\n  }\n\n  if (sign(x) != 1) {\n    stop(\"Argument '\", s, \"' must be a positive real value\", call. = FALSE)\n  }\n}\n\n#'@noRd\nvalidate_trendmap = function(trend_map, data_train, trend_model, use_stan) {\n  # Trend mapping not supported by JAGS\n  if (!use_stan) {\n    stop('trend mapping not available for JAGS', call. = FALSE)\n  }\n\n  # trend_map must have an entry for each unique time series\n  if (!all(sort(trend_map$series) == sort(unique(data_train$series)))) {\n    stop(\n      'Argument \"trend_map\" must have an entry for every unique time series in \"data\"',\n      call. = FALSE\n    )\n  }\n\n  # trend_map must not specify a greater number of trends than there are series\n  if (max(trend_map$trend) > length(unique(data_train$series))) {\n    stop(\n      'Argument \"trend_map\" specifies more latent trends than there are series in \"data\"',\n      call. = FALSE\n    )\n  }\n\n  # trend_map must not skip any trends, but can have zeros for some entries\n  drop_zero = function(x) {\n    x[x != 0]\n  }\n\n  if (\n    !all(\n      drop_zero(sort(unique(trend_map$trend))) == seq(1:max(trend_map$trend))\n    )\n  ) {\n    stop(\n      'Argument \"trend_map\" must link at least one series to each latent trend',\n      call. = FALSE\n    )\n  }\n\n  # series variable must be a factor with same levels as the series variable\n  # in the data\n  if (!is.factor(trend_map$series)) {\n    stop(\n      'trend_map$series must be a factor with levels matching levels of data$series',\n      call. = FALSE\n    )\n  }\n\n  if (!all(levels(trend_map$series) == levels(data_train$series))) {\n    stop(\n      'trend_map$series must be a factor with levels matching levels of data$series',\n      call. = FALSE\n    )\n  }\n}\n\n#'@noRd\nvalidate_trend_restrictions = function(\n  trend_model,\n  formula,\n  trend_formula,\n  trend_map,\n  drift = FALSE,\n  drop_obs_intercept = FALSE,\n  use_lv = FALSE,\n  n_lv,\n  data_train,\n  use_stan = TRUE,\n  priors = FALSE\n) {\n  # Assess whether additional moving average or correlated errors are needed\n  ma_cor_adds <- ma_cor_additions(trend_model)\n  list2env(ma_cor_adds, envir = environment())\n\n  if (length(unique(data_train$series)) == 1 & add_cor) {\n    warning(\n      'Correlated process errors not possible with only 1 series',\n      call. = FALSE\n    )\n    add_cor <- FALSE\n  }\n\n  # Some checks on general trend setup restrictions\n  if (!priors) {\n    if (trend_model %in% c('PWlinear', 'PWlogistic')) {\n      if (attr(terms(formula), 'intercept') == 1 & !drop_obs_intercept) {\n        warning(\n          paste0(\n            'It is difficult / impossible to estimate intercepts\\n',\n            'and piecewise trend offset parameters. You may want to\\n',\n            'consider dropping the intercept from the formula'\n          ),\n          call. = FALSE\n        )\n      }\n\n      if (use_lv) {\n        stop(\n          'Cannot estimate piecewise trends using dynamic factors',\n          call. = FALSE\n        )\n      }\n    }\n  }\n\n  if (use_lv & (add_ma | add_cor) & missing(trend_formula)) {\n    stop(\n      'Cannot estimate moving averages or correlated errors for dynamic factors',\n      call. = FALSE\n    )\n  }\n\n  if (use_lv & drift) {\n    warning(\n      'Cannot identify drift terms for this model\\ninclude \"time\" as a fixed effect instead',\n      call. = FALSE\n    )\n    drift <- FALSE\n  }\n\n  if (drift && trend_model == 'CAR1') {\n    warning(\n      'Cannot identify drift terms for CAR models; setting \"drift = FALSE\"',\n      call. = FALSE\n    )\n    drift <- FALSE\n  }\n\n  if (\n    trend_model %in% c('VAR', 'VAR1', 'VAR1cor', 'VARMA1,1cor', 'GP') & drift\n  ) {\n    warning(\n      'Cannot identify drift terms for VAR or GP models; setting \"drift = FALSE\"',\n      call. = FALSE\n    )\n    drift <- FALSE\n  }\n\n  if (use_lv & trend_model == 'VAR1' & missing(trend_formula)) {\n    stop(\n      'Cannot identify dynamic factor models that evolve as VAR processes',\n      call. = FALSE\n    )\n  }\n\n  if (!use_stan & trend_model %in% c('GP', 'VAR1', 'PWlinear', 'PWlogistic')) {\n    stop(\n      'Gaussian Process, VAR and piecewise trends not supported for JAGS',\n      call. = FALSE\n    )\n  }\n\n  # Check trend formula and create the trend_map if missing\n  if (!missing(trend_formula)) {\n    validate_trend_formula(trend_formula)\n    if (missing(trend_map)) {\n      trend_map <- data.frame(\n        series = factor(\n          levels(data_train$series),\n          levels = levels(data_train$series)\n        ),\n        trend = 1:length(unique(data_train$series))\n      )\n    }\n\n    if (\n      !trend_model %in%\n        c('None', 'RW', 'AR1', 'AR2', 'AR3', 'VAR1', 'CAR1', 'ZMVN')\n    ) {\n      stop(\n        'only None, ZMVN, RW, AR1, AR2, AR3, CAR1 and VAR trends currently supported for trend predictor models',\n        call. = FALSE\n      )\n    }\n  }\n\n  # Check trend_map is correctly specified\n  if (!missing(trend_map)) {\n    validate_trendmap(\n      trend_map = trend_map,\n      data_train = data_train,\n      trend_model = trend_model,\n      use_stan = use_stan\n    )\n\n    # If trend_map correctly specified, set use_lv to TRUE for\n    # most models (but not yet for VAR models, which require additional\n    # modifications)\n    if (trend_model == 'VAR1') {\n      use_lv <- FALSE\n    } else {\n      use_lv <- TRUE\n    }\n    n_lv <- max(trend_map$trend)\n  }\n\n  # Number of latent variables cannot be greater than number of series\n  if (use_lv) {\n    if (missing(n_lv)) {\n      n_lv <- min(2, floor(length(unique(data_train$series)) / 2))\n    }\n    if (n_lv > length(unique(data_train$series))) {\n      stop('number of latent variables cannot be greater than number of series')\n    }\n  }\n\n  if (missing(trend_map)) {\n    trend_map <- NULL\n  }\n\n  if (missing(n_lv)) {\n    n_lv <- NULL\n  }\n\n  return(list(\n    trend_model = trend_model,\n    add_cor = add_cor,\n    add_ma = add_ma,\n    use_var1 = use_var1,\n    use_var1cor = use_var1cor,\n    use_lv = use_lv,\n    n_lv = n_lv,\n    trend_map = trend_map,\n    drift = drift\n  ))\n}\n\n#'@noRd\ncheck_priorsim = function(prior_simulation, data_train, orig_y, formula) {\n  # Fill y with NAs if this is a simulation from the priors\n  if (prior_simulation) {\n    data_train$y <- rep(NA, length(data_train$y))\n  } else {\n    data_train$y <- orig_y\n  }\n\n  # Fill response variable with original supplied values\n  resp_terms <- as.character(terms(formula(formula))[[2]])\n  if (length(resp_terms) == 1) {\n    out_name <- as.character(terms(formula(formula))[[2]])\n  } else {\n    if (any(grepl('cbind', resp_terms))) {\n      resp_terms <- resp_terms[-grepl('cbind', resp_terms)]\n      out_name <- resp_terms[1]\n    }\n  }\n  data_train[[out_name]] <- orig_y\n\n  return(data_train)\n}\n\n#'@noRd\ncheck_gp_terms = function(formula, data_train, family) {\n  # Check for proper binomial specification\n  if (!missing(family)) {\n    if (is.character(family)) {\n      if (family == 'beta') {\n        family <- betar()\n      }\n\n      family <- try(eval(parse(text = family)), silent = TRUE)\n\n      if (inherits(family, 'try-error')) {\n        stop(\"family not recognized\", call. = FALSE)\n      }\n    }\n\n    if (is.function(family)) {\n      family <- family()\n    }\n\n    if (family$family %in% c('binomial', 'beta_binomial')) {\n      # Check that response terms use the cbind() syntax\n      resp_terms <- as.character(terms(formula(formula))[[2]])\n      if (length(resp_terms) == 1) {\n        stop(\n          'Binomial family requires cbind() syntax in the formula left-hand side',\n          call. = FALSE\n        )\n      } else {\n        if (any(grepl('cbind', resp_terms))) {} else {\n          stop(\n            'Binomial family requires cbind() syntax in the formula left-hand side',\n            call. = FALSE\n          )\n        }\n      }\n    }\n  }\n\n  # Check for gp terms in the validated formula\n  orig_formula <- gp_terms <- gp_details <- NULL\n  if (any(grepl('gp(', attr(terms(formula), 'term.labels'), fixed = TRUE))) {\n    formula <- interpret_mvgam(\n      formula,\n      N = max(data_train$time),\n      family = family\n    )\n    orig_formula <- formula\n\n    # Keep intercept?\n    keep_intercept <- attr(terms(formula), 'intercept') == 1\n\n    # Indices of gp() terms in formula\n    gp_terms <- which_are_gp(formula)\n\n    # Extract attributes\n    gp_details <- get_gp_attributes(formula, data_train, family)\n\n    # Replace with s() terms so the correct terms are included\n    # in the model.frame\n    formula <- gp_to_s(formula, data_train, family)\n    if (!keep_intercept) formula <- update(formula, . ~ . - 1)\n  }\n\n  return(list(\n    orig_formula = orig_formula,\n    gp_terms = gp_terms,\n    formula = formula,\n    gp_details = gp_details\n  ))\n}\n\n#'@noRd\ncheck_obs_intercept = function(formula, orig_formula) {\n  # Check for missing rhs in formula\n  # If there are no terms in the observation formula (i.e. y ~ -1),\n  # we will use an intercept-only observation formula and fix\n  # the intercept coefficient at zero\n  drop_obs_intercept <- FALSE\n  if (\n    length(attr(terms(formula), 'term.labels')) == 0 &\n      !attr(terms(formula), 'intercept') == 1\n  ) {\n    formula_envir <- attr(formula, '.Environment')\n\n    if (length(attr(terms(formula), 'factors')) == 0) {\n      resp <- as.character(attr(terms(formula), 'variables'))[2]\n    } else {\n      resp <- dimnames(attr(terms(formula), 'factors'))[[1]][1]\n    }\n\n    if (!is.null(attr(terms(formula(formula)), 'offset'))) {\n      formula <- formula(paste0(\n        resp,\n        ' ~ ',\n        paste(gsub(' - 1', ' + 1', rlang::f_text(formula)))\n      ))\n    } else {\n      formula <- formula(paste(resp, '~ 1'))\n    }\n    attr(formula, '.Environment') <- formula_envir\n    drop_obs_intercept <- TRUE\n  }\n\n  if (is.null(orig_formula)) {\n    orig_formula <- formula\n  }\n\n  return(list(\n    orig_formula = orig_formula,\n    formula = formula,\n    drop_obs_intercept = drop_obs_intercept\n  ))\n}\n\n#'@noRd\ncheck_nmix = function(\n  family,\n  family_char,\n  trend_formula,\n  trend_model,\n  trend_map,\n  data_train,\n  priors = FALSE\n) {\n  # Check for N-mixture modifications\n  add_nmix <- FALSE\n  nmix_trendmap <- TRUE\n  if (family_char == 'nmix') {\n    if (!(exists('cap', where = data_train))) {\n      stop(\n        'Max abundances must be supplied as a variable named \"cap\" for N-mixture models',\n        call. = FALSE\n      )\n    }\n\n    add_nmix <- TRUE\n    if (!priors) {\n      family <- poisson()\n      family_char <- 'poisson'\n      if (missing(trend_formula)) {\n        stop('Argument \"trend_formula\" required for nmix models', call. = FALSE)\n      }\n    }\n\n    if (!missing(trend_map)) {\n      nmix_trendmap <- TRUE\n    }\n    use_lv <- TRUE\n    if (trend_model == 'None') {\n      trend_model <- 'RW'\n    }\n  }\n\n  return(list(\n    trend_model = trend_model,\n    add_nmix = add_nmix,\n    nmix_trendmap = nmix_trendmap,\n    family = family,\n    family_char = family_char\n  ))\n}\n\n#'@noRd\nvalidate_threads = function(family_char, threads) {\n  if (\n    threads > 1 &\n      !family_char %in%\n        c(\n          'poisson',\n          'negative binomial',\n          'gaussian',\n          'lognormal',\n          'beta',\n          'student',\n          'Gamma'\n        )\n  ) {\n    warning(\n      'multithreading not yet supported for this family; setting threads = 1'\n    )\n    threads <- 1\n  }\n  return(threads)\n}\n\n#'@noRd\nfind_jags = function(jags_path) {\n  if (!requireNamespace('runjags', quietly = TRUE)) {\n    stop('runjags library is required but not found', call. = FALSE)\n  }\n\n  if (missing(jags_path)) {\n    requireNamespace('runjags', quietly = TRUE)\n    jags_path <- runjags::findjags()\n  }\n\n  # Code borrowed from the runjags package\n  jags_status <- runjags::testjags(jags_path, silent = TRUE)\n  if (!jags_status$JAGS.available) {\n    if (jags_status$os == \"windows\") {\n      Sys.sleep(0.2)\n      jags_status <- runjags::testjags(jags_path, silent = TRUE)\n    }\n\n    if (!jags_status$JAGS.available) {\n      cat(\n        \"Unable to call JAGS using '\",\n        jags_path,\n        \"'\\nTry specifying the path to the JAGS binary as jags_path argument, or re-installing the rjags package.\\nUse the runjags::testjags() function for more detailed diagnostics.\\n\",\n        sep = \"\"\n      )\n      stop(\n        \"Unable to call JAGS.\\nEither use the Stan backend or follow examples in ?mvgam to generate data / model files and run outside of mvgam\",\n        call. = FALSE\n      )\n    }\n  }\n}\n\n#'@noRd\nfind_stan = function() {\n  if (!requireNamespace('rstan', quietly = TRUE)) {\n    warning('rstan library not found; checking for cmdstanr library')\n\n    if (!requireNamespace('cmdstanr', quietly = TRUE)) {\n      stop('cmdstanr library not found', call. = FALSE)\n    }\n  }\n}\n\n#'@noRd\nas_one_character <- function(x, allow_na = FALSE) {\n  s <- substitute(x)\n  x <- as.character(x)\n  if (length(x) != 1L || anyNA(x) && !allow_na) {\n    s <- deparse0(s, max_char = 100L)\n    stop(\"Cannot coerce '\", s, \"' to a single character value.\", call. = FALSE)\n  }\n  x\n}\n"
  },
  {
    "path": "README.Rmd",
    "content": "---\noutput: github_document\n---\n\n<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n```{r, echo = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  fig.path = \"man/figures/README-\",\n  dev = \"png\",\n  dpi = 150,\n  fig.height = 6,\n  fig.width = 9,\n  out.width = \"100%\"\n)\n```\n\n<img src=\"man/figures/mvgam_logo.png\" width = 120 alt=\"mvgam R package logo\"/>[<img src=\"https://raw.githubusercontent.com/stan-dev/logos/master/logo_tm.png\" align=\"right\" width=120 alt=\"Stan Logo\"/>](https://mc-stan.org/)\n\n\n# mvgam\n\n> **M**ulti**V**ariate (Dynamic) **G**eneralized **A**dditive **M**odels\n\n[![R-CMD-check](https://github.com/nicholasjclark/mvgam/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/nicholasjclark/mvgam/actions/)\n[![Coverage status](https://codecov.io/gh/nicholasjclark/mvgam/graph/badge.svg?token=RCJ2B7S0BL)](https://app.codecov.io/gh/nicholasjclark/mvgam)\n[![Documentation](https://img.shields.io/badge/documentation-mvgam-orange.svg?colorB=brightgreen)](https://nicholasjclark.github.io/mvgam/)\n[![Methods in Ecology & Evolution](https://img.shields.io/badge/Methods%20in%20Ecology%20&%20Evolution-14,%20771–784-blue.svg)](https://doi.org/10.1111/2041-210X.13974)\n[![CRAN Version](https://www.r-pkg.org/badges/version/mvgam)](https://cran.r-project.org/package=mvgam)\n[![CRAN Downloads](https://cranlogs.r-pkg.org/badges/grand-total/mvgam?color=brightgreen)](https://cran.r-project.org/package=mvgam)\n\nThe `mvgam` 📦 fits Bayesian Dynamic Generalized Additive Models (DGAMs) that can include highly flexible nonlinear predictor effects, latent variables and multivariate time series models. The package does this by relying on functionalities from the impressive [`brms`](https://paulbuerkner.com/brms/){target=\"_blank\"} and [`mgcv`](https://cran.r-project.org/package=mgcv){target=\"_blank\"} packages. Parameters are estimated using the probabilistic programming language [`Stan`](https://mc-stan.org/), giving users access to the most advanced Bayesian inference algorithms available. This allows `mvgam` to fit a very wide range of models, including:\n\n* [Multivariate State-Space Time Series Models](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html){target=\"_blank\"}\n* [Continuous-Time Autoregressive Time Series Models](https://nicholasjclark.github.io/mvgam/reference/RW.html#ref-examples){target=\"_blank\"}\n* [Shared Signal Time Series Models](https://nicholasjclark.github.io/mvgam/articles/shared_states.html){target=\"_blank\"}\n* [Dynamic Factor Models](https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html){target=\"_blank\"}\n* [Hierarchical N-mixture Models](https://nicholasjclark.github.io/mvgam/articles/nmixtures.html){target=\"_blank\"}\n* [Hierarchical Generalized Additive Models](https://www.youtube.com/watch?v=2POK_FVwCHk){target=\"_blank\"}\n* [Joint Species Distribution Models](https://nicholasjclark.github.io/mvgam/reference/jsdgam.html){target=\"_blank\"}\n\n## Installation\nYou can install the stable package version from `CRAN` using: `install.packages('mvgam')`, or install the latest development version using: `devtools::install_github(\"nicholasjclark/mvgam\")`. You will also need a working version of `Stan` installed (along with either `rstan` and/or `cmdstanr`). Please refer to installation links for `Stan` with `rstan` [here](https://mc-stan.org/users/interfaces/rstan){target=\"_blank\"}, or for `Stan` with `cmdstandr` [here](https://mc-stan.org/cmdstanr/){target=\"_blank\"}.\n\n## Cheatsheet\n[![`mvgam` usage cheatsheet](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.png)](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf)\n\n## A simple example\nWe can explore the package’s primary functions using one of it's built-in datasets. Use `plot_mvgam_series()` to inspect features for time series from [the Portal Project](https://portal.weecology.org/){target=\"_blank\"}, which represent counts of baited captures for four desert rodent species over time (see `?portal_data` for more details about the dataset).\n```{r include = FALSE}\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12))\n```\n\n```{r echo = FALSE}\nlibrary(mvgam)\n```\n\n```{r, fig.alt = \"Visualizing multivariate time series in R using mvgam\", warning=FALSE}\ndata(portal_data)\nplot_mvgam_series(\n  data = portal_data, \n  y = 'captures',\n  series = 'all'\n)\nplot_mvgam_series(\n  data = portal_data, \n  y = 'captures',\n  series = 1\n)\nplot_mvgam_series(\n  data = portal_data, \n  y = 'captures',\n  series = 4\n)\n```\n\nThese plots show that the time series are count responses, with missing data, many zeroes, seasonality and temporal autocorrelation all present. These features make time series analysis and forecasting very difficult using conventional software. But `mvgam` shines in these tasks. \n\nFor most forecasting exercises, we'll want to split the data into training and testing folds:\n```{r}\ndata_train <- portal_data %>%\n  dplyr::filter(time <= 60)\ndata_test <- portal_data %>%\n  dplyr::filter(time > 60 &\n                  time <= 65)\n```\n\nFormulate an `mvgam` model; this model fits a State-Space GAM in which each species has its own intercept, linear association with `ndvi_ma12` and potentially nonlinear association with `mintemp`. These effects are estimated jointly with a full time series model for the temporal dynamics (in this case a Vector Autoregressive process). We assume the outcome follows a Poisson distribution and will condition the model in `Stan` using MCMC sampling with `Cmdstan`:\n```{r, include=FALSE}\nmod <- mvgam(\n  # Observation model is empty as we don't have any\n  # covariates that impact observation error\n  formula = captures ~ 0,\n  \n  # Process model contains varying intercepts, \n  # varying slopes of ndvi_ma12 and varying smooths \n  # of mintemp for each series. \n  # Temporal dynamics are modelled with a Vector \n  # Autoregression (VAR(1))\n  trend_formula = ~ \n    trend +\n    s(trend, bs = 're', by = ndvi_ma12) +\n    s(mintemp, bs = 'bs', by = trend) - 1,\n  trend_model = VAR(cor = TRUE),\n  \n  # Obvservations are conditionally Poisson\n  family = poisson(),\n  priors = c(prior(normal(0, 2),\n                 class = b),\n             prior(exponential(2.5),\n                   class = sigma)),\n  \n  # Condition on the training data\n  data = data_train,\n  control = list(adapt_delta = 0.99),\n  burnin = 1500\n)\n```\n\n```{r, eval=FALSE}\nmod <- mvgam(\n  # Observation model is empty as we don't have any\n  # covariates that impact observation error\n  formula = captures ~ 0,\n  \n  # Process model contains varying intercepts, \n  # varying slopes of ndvi_ma12 and varying smooths \n  # of mintemp for each series. \n  # Temporal dynamics are modelled with a Vector \n  # Autoregression (VAR(1))\n  trend_formula = ~ \n    trend +\n    s(trend, bs = 're', by = ndvi_ma12) +\n    s(mintemp, bs = 'bs', by = trend) - 1,\n  trend_model = VAR(cor = TRUE),\n  \n  # Obvservations are conditionally Poisson\n  family = poisson(),\n\n  # Condition on the training data\n  data = data_train,\n  backend = 'cmdstanr'\n)\n```\n\nUsing `print()` returns a quick summary of the object:\n```{r}\nmod\n```\n\nSplit Rhat and Effective Sample Size diagnostics show good convergence of model estimates\n```{r, fig.alt = \"Rhats of parameters estimated with Stan in mvgam\", warning=FALSE}\nmcmc_plot(mod, \n          type = 'rhat_hist')\n```\n\n```{r, fig.alt = \"Effective sample sizes of parameters estimated with Stan in mvgam\", warning=FALSE}\nmcmc_plot(mod, \n          type = 'neff_hist')\n```\n\nUse `conditional_effects()` for a quick visualisation of the main terms in model formulae\n```{r, fig.alt = \"Plotting GAM effects in mvgam and R\"}\nconditional_effects(mod, \n                    type = 'link')\n```\n\nIf you have the `gratia` package installed, it can also be used to plot partial effects of smooths\n```{r, fig.alt = \"Plotting GAM smooth functions in mvgam using gratia\", message=FALSE}\nrequire(gratia)\ndraw(mod, \n     trend_effects = TRUE)\n```\n\nOr design more targeted plots using `plot_predictions()` from the `marginaleffects` package\n```{r, fig.alt = \"Using marginaleffects and mvgam to plot GAM smooth functions in R\"}\nplot_predictions(\n  mod,\n  condition = c('ndvi_ma12',\n                'series',\n                'series'),\n  type = 'link'\n)\n```\n\n```{r, fig.alt = \"Using marginaleffects and mvgam to plot GAM smooth functions in R\"}\nplot_predictions(\n  mod,\n  condition = c('mintemp',\n                'series',\n                'series'),\n  type = 'link'\n)\n```\n\nWe can also view the model's posterior predictions for the entire series (testing and training). Forecasts can be scored using a range of proper scoring rules. See `?score.mvgam_forecast` for more details\n```{r, fig.alt = \"Plotting forecast distributions using mvgam in R\", warning=FALSE}\nfcs <- forecast(mod, \n                newdata = data_test)\nplot(fcs, series = 1) +\n  plot(fcs, series = 2) +\n  plot(fcs, series = 3) +\n  plot(fcs, series = 4)\n```\n\nFor Vector Autoregressions fit in `mvgam`, we can inspect [impulse response functions and forecast error variance decompositions](https://ecogambler.netlify.app/blog/vector-autoregressions/#impulse-response-functions){target=\"_blank\"}. The `irf()` function runs an Impulse Response Function (IRF) simulation whereby a positive “shock” is generated for a target process at time `t = 0`. All else remaining stable, it then monitors how each of the remaining processes in the latent VAR would be expected to respond over the forecast horizon `h`. The function computes impulse responses for all processes in the object and returns them in an array that can be plotted using the S3 `plot()` function. Here we will use the generalized IRF, which makes no assumptions about the order in which the series appear in the VAR process, and inspect how each process is expected to respond to a sudden, positive pulse from the other processes over a horizon of 12 timepoints.\n```{r, fig.alt = \"Impulse response functions computed using mvgam in R\"}\nirfs <- irf(mod, \n            h = 12, \n            orthogonal = FALSE)\nplot(irfs, \n     series = 1)\nplot(irfs, \n     series = 3)\n```\n\nUsing the same logic as above, we can inspect forecast error variance decompositions (FEVDs) for each process using`fevd()`. This type of analysis asks how orthogonal shocks to all process in the system contribute to the variance of forecast uncertainty for a focal process over increasing horizons. In other words, the proportion of the forecast variance of each latent time series can be attributed to the effects of the other series in the VAR process. FEVDs are useful because some shocks may not be expected to cause variations in the short-term but may cause longer-term fluctuations\n```{r, fig.alt = \"Forecast error variance decompositions computed using mvgam in R\"}\nfevds <- fevd(mod, \n              h = 12)\nplot(fevds)\n```\n\nThis plot shows that the variance of forecast uncertainty for each process is initially dominated by contributions from that same process (i.e. self-dependent effects) but that effects from other processes become more important over increasing forecast horizons. Given what we saw from the IRF plots above, these long-term contributions from interactions among the processes makes sense.\n  \nPlotting randomized quantile residuals over `time` for each series can give useful information about what might be missing from the model. We can use the highly versatile `pp_check()` function to plot these:\n```{r, warning=FALSE}\npp_check(\n  mod, \n  type = 'resid_ribbon_grouped',\n  group = 'series',\n  x = 'time',\n  ndraws = 200\n)\n```\n\nWhen describing the model, it can be helpful to use the `how_to_cite()` function to generate a scaffold for describing the model and sampling details in scientific communications\n```{r}\ndescription <- how_to_cite(mod)\n```\n\n```{r, eval = FALSE}\ndescription\n```\n\n```{r, echo=FALSE}\ncat(\"Methods text skeleton\\n\")\ncat(insight::format_message(description$methods_text))\n```\n\n```{r echo=FALSE}\ncat(\"\\nPrimary references\\n\")\nfor (i in seq_along(description$citations)) {\n  cat(insight::format_message(description$citations[[i]]))\n  cat('\\n')\n}\ncat(\"\\nOther useful references\\n\")\nfor (i in seq_along(description$other_citations)) {\n  cat(insight::format_message(description$other_citations[[i]]))\n  cat('\\n')\n}\n```\n\nThe post-processing methods we have shown above are just the tip of the iceberg. For a full list of methods to apply on fitted model objects, type `methods(class = \"mvgam\")`. \n\n## Extended observation families\n`mvgam` was originally designed to analyse and forecast non-negative integer-valued data. But further development of `mvgam` has resulted in support for a growing number of observation families. Currently, the package can handle data for the following:  \n  \n* `gaussian()` for real-valued data \n* `student_t()` for heavy-tailed real-valued data\n* `lognormal()` for non-negative real-valued data\n* `Gamma()` for non-negative real-valued data\n* `betar()` for proportional data on `(0,1)`\n* `bernoulli()` for binary data\n* `poisson()` for count data\n* `nb()` for overdispersed count data\n* `binomial()` for count data with known number of trials\n* `beta_binomial()` for overdispersed count data with known number of trials\n* `nmix()` for count data with imperfect detection (unknown number of trials)\n  \nSee `??mvgam_families` for more information. Below is a simple example for simulating and modelling proportional data with `Beta` observations over a set of seasonal series with independent Gaussian Process dynamic trends:\n```{r beta_sim, message=FALSE, warning=FALSE}\nset.seed(100)\ndata <- sim_mvgam(\n  family = betar(),\n  T = 80,\n  trend_model = GP(),\n  prop_trend = 0.5,\n  seasonality = \"shared\"\n)\nplot_mvgam_series(\n  data = data$data_train, \n  series = \"all\"\n)\n```\n\n```{r, include=FALSE}\nmod <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 7) +\n    s(season, by = series, m = 1, k = 5),\n  trend_model = GP(),\n  data = data$data_train,\n  newdata = data$data_test,\n  family = betar()\n)\n```\n\n```{r, eval=FALSE}\nmod <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 7) +\n    s(season, by = series, m = 1, k = 5),\n  trend_model = GP(),\n  data = data$data_train,\n  newdata = data$data_test,\n  family = betar()\n)\n```\n\nInspect the summary to see that the posterior now also contains estimates for the `Beta` precision parameters $\\phi$.\n```{r}\nsummary(mod, \n        include_betas = FALSE)\n```\n\nPlot the hindcast and forecast distributions for each series\n```{r eval=FALSE}\nlibrary(patchwork)\nfc <- forecast(mod)\nwrap_plots(\n  plot(fc, series = 1),\n  plot(fc, series = 2),\n  plot(fc, series = 3),\n  ncol = 2\n)\n```\n\n```{r beta_fc, echo=FALSE, message=FALSE}\nlibrary(patchwork)\nfc <- forecast(mod)\nwrap_plots(\n  plot(fc, series = 1),\n  plot(fc, series = 2),\n  plot(fc, series = 3),\n  ncol = 2\n)\n```\n\nThere are many more extended uses of `mvgam`, including the ability to fit hierarchical State-Space GAMs that include dynamic and spatially varying coefficient models, dynamic factors, Joint Species Distribution Models and much more. See the [package documentation](https://nicholasjclark.github.io/mvgam/){target=\"_blank\"} for more details. `mvgam` can also be used to generate all necessary data structures and modelling code necessary to fit DGAMs using `Stan`. This can be helpful if users wish to make changes to the model to better suit their own bespoke research / analysis goals. The [`Stan` Discourse](https://discourse.mc-stan.org/){target=\"_blank\"} is a helpful place to troubleshoot.\n\n## Citing `mvgam` and related software\nWhen using any software please make sure to appropriately acknowledge the hard work that developers and maintainers put into making these packages available. Citations are currently the best way to formally acknowledge this work (but feel free to ⭐ this repo as well).\n\nWhen using `mvgam`, please cite the following:\n\n> Clark, N.J. and Wells, K. (2023). Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series. *Methods in Ecology and Evolution*. DOI: https://doi.org/10.1111/2041-210X.13974\n\nAs `mvgam` acts as an interface to `Stan`, please additionally cite:\n\n> Carpenter B., Gelman A., Hoffman M. D., Lee D., Goodrich B., Betancourt M., Brubaker M., Guo J., Li P., and Riddell A. (2017). Stan: A probabilistic programming language. *Journal of Statistical Software*. 76(1). DOI: https://doi.org/10.18637/jss.v076.i01\n\n`mvgam` relies on several other `R` packages and, of course, on `R` itself. Use `how_to_cite()` to simplify the process of finding appropriate citations for your software setup.\n\n## Getting help\nIf you encounter a clear bug, please file an issue with a minimal reproducible example on [GitHub](https://github.com/nicholasjclark/mvgam/issues). Please also feel free to use the [`mvgam` Discussion Board](https://github.com/nicholasjclark/mvgam/discussions) to hunt for or post other discussion topics related to the package, and do check out the [`mvgam` Changelog](https://nicholasjclark.github.io/mvgam/news/index.html) for any updates about recent upgrades that the package has incorporated.\n\n## Other resources\nA series of [vignettes cover data formatting, forecasting and several extended case studies of DGAMs](https://nicholasjclark.github.io/mvgam/){target=\"_blank\"}. A number of other examples, including some step-by-step introductory webinars, have also been compiled:\n  \n* [Time series in R and Stan using the `mvgam` package](https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3){target=\"_blank\"}\n* [Ecological Forecasting with Dynamic Generalized Additive Models](https://www.youtube.com/watch?v=0zZopLlomsQ){target=\"_blank\"}\n* [Distributed lags (and hierarchical distributed lags) using `mgcv` and `mvgam`](https://ecogambler.netlify.app/blog/distributed-lags-mgcv/){target=\"_blank\"}\n* [State-Space Vector Autoregressions in `mvgam`](https://ecogambler.netlify.app/blog/vector-autoregressions/){target=\"_blank\"}\n* [Ecological Forecasting with Dynamic GAMs; a tutorial and detailed case study](https://www.youtube.com/watch?v=RwllLjgPUmM){target=\"_blank\"}\n* [Incorporating time-varying seasonality in forecast models](https://ecogambler.netlify.app/blog/time-varying-seasonality/){target=\"_blank\"}\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please reach out if you are interested (n.clark'at'uq.edu.au). Other contributions are also very welcome, but please see [The Contributor Instructions](https://github.com/nicholasjclark/mvgam/blob/master/.github/CONTRIBUTING.md) for general guidelines. Note that by participating in this project you agree to abide by the terms of its [Contributor Code of Conduct](https://dplyr.tidyverse.org/CODE_OF_CONDUCT).\n\n## License\nThe `mvgam` project is licensed under an `MIT` open source license\n"
  },
  {
    "path": "README.md",
    "content": "<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n<img src=\"man/figures/mvgam_logo.png\" width = 120 alt=\"mvgam R package logo\"/>[<img src=\"https://raw.githubusercontent.com/stan-dev/logos/master/logo_tm.png\" align=\"right\" width=120 alt=\"Stan Logo\"/>](https://mc-stan.org/)\n\n# mvgam\n\n> **M**ulti**V**ariate (Dynamic) **G**eneralized **A**dditive **M**odels\n\n[![R-CMD-check](https://github.com/nicholasjclark/mvgam/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/nicholasjclark/mvgam/actions/)\n[![Coverage\nstatus](https://codecov.io/gh/nicholasjclark/mvgam/graph/badge.svg?token=RCJ2B7S0BL)](https://app.codecov.io/gh/nicholasjclark/mvgam)\n[![Documentation](https://img.shields.io/badge/documentation-mvgam-orange.svg?colorB=brightgreen)](https://nicholasjclark.github.io/mvgam/)\n[![Methods in Ecology &\nEvolution](https://img.shields.io/badge/Methods%20in%20Ecology%20&%20Evolution-14,%20771–784-blue.svg)](https://doi.org/10.1111/2041-210X.13974)\n[![CRAN\nVersion](https://www.r-pkg.org/badges/version/mvgam)](https://cran.r-project.org/package=mvgam)\n[![CRAN\nDownloads](https://cranlogs.r-pkg.org/badges/grand-total/mvgam?color=brightgreen)](https://cran.r-project.org/package=mvgam)\n\nThe `mvgam` 📦 fits Bayesian Dynamic Generalized Additive Models (DGAMs)\nthat can include highly flexible nonlinear predictor effects, latent\nvariables and multivariate time series models. The package does this by\nrelying on functionalities from the impressive\n<a href=\"https://paulbuerkner.com/brms/\"\ntarget=\"_blank\"><code>brms</code></a> and\n<a href=\"https://cran.r-project.org/package=mgcv\"\ntarget=\"_blank\"><code>mgcv</code></a> packages. Parameters are estimated\nusing the probabilistic programming language\n[`Stan`](https://mc-stan.org/), giving users access to the most advanced\nBayesian inference algorithms available. This allows `mvgam` to fit a\nvery wide range of models, including:\n\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\"\n    target=\"_blank\">Multivariate State-Space Time Series Models</a>\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/reference/RW.html#ref-examples\"\n    target=\"_blank\">Continuous-Time Autoregressive Time Series Models</a>\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\"\n    target=\"_blank\">Shared Signal Time Series Models</a>\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html\"\n    target=\"_blank\">Dynamic Factor Models</a>\n-   <a href=\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\"\n    target=\"_blank\">Hierarchical N-mixture Models</a>\n-   <a href=\"https://www.youtube.com/watch?v=2POK_FVwCHk\"\n    target=\"_blank\">Hierarchical Generalized Additive Models</a>\n-   <a href=\"https://nicholasjclark.github.io/mvgam/reference/jsdgam.html\"\n    target=\"_blank\">Joint Species Distribution Models</a>\n\n## Installation\n\nYou can install the stable package version from `CRAN` using:\n`install.packages('mvgam')`, or install the latest development version\nusing: `devtools::install_github(\"nicholasjclark/mvgam\")`. You will also\nneed a working version of `Stan` installed (along with either `rstan`\nand/or `cmdstanr`). Please refer to installation links for `Stan` with\n`rstan` <a href=\"https://mc-stan.org/users/interfaces/rstan\"\ntarget=\"_blank\">here</a>, or for `Stan` with `cmdstandr`\n<a href=\"https://mc-stan.org/cmdstanr/\" target=\"_blank\">here</a>.\n\n## Cheatsheet\n\n[![`mvgam` usage\ncheatsheet](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.png)](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf)\n\n## A simple example\n\nWe can explore the package’s primary functions using one of it’s\nbuilt-in datasets. Use `plot_mvgam_series()` to inspect features for\ntime series from\n<a href=\"https://portal.weecology.org/\" target=\"_blank\">the Portal\nProject</a>, which represent counts of baited captures for four desert\nrodent species over time (see `?portal_data` for more details about the\ndataset).\n\n    data(portal_data)\n    plot_mvgam_series(\n      data = portal_data, \n      y = 'captures',\n      series = 'all'\n    )\n\n<img src=\"man/figures/README-unnamed-chunk-4-1.png\" alt=\"Visualizing multivariate time series in R using mvgam\" width=\"100%\" />\n\n    plot_mvgam_series(\n      data = portal_data, \n      y = 'captures',\n      series = 1\n    )\n\n<img src=\"man/figures/README-unnamed-chunk-4-2.png\" alt=\"Visualizing multivariate time series in R using mvgam\" width=\"100%\" />\n\n    plot_mvgam_series(\n      data = portal_data, \n      y = 'captures',\n      series = 4\n    )\n\n<img src=\"man/figures/README-unnamed-chunk-4-3.png\" alt=\"Visualizing multivariate time series in R using mvgam\" width=\"100%\" />\n\nThese plots show that the time series are count responses, with missing\ndata, many zeroes, seasonality and temporal autocorrelation all present.\nThese features make time series analysis and forecasting very difficult\nusing conventional software. But `mvgam` shines in these tasks.\n\nFor most forecasting exercises, we’ll want to split the data into\ntraining and testing folds:\n\n    data_train <- portal_data %>%\n      dplyr::filter(time <= 60)\n    data_test <- portal_data %>%\n      dplyr::filter(time > 60 &\n                      time <= 65)\n\nFormulate an `mvgam` model; this model fits a State-Space GAM in which\neach species has its own intercept, linear association with `ndvi_ma12`\nand potentially nonlinear association with `mintemp`. These effects are\nestimated jointly with a full time series model for the temporal\ndynamics (in this case a Vector Autoregressive process). We assume the\noutcome follows a Poisson distribution and will condition the model in\n`Stan` using MCMC sampling with `Cmdstan`:\n\n    mod <- mvgam(\n      # Observation model is empty as we don't have any\n      # covariates that impact observation error\n      formula = captures ~ 0,\n      \n      # Process model contains varying intercepts, \n      # varying slopes of ndvi_ma12 and varying smooths \n      # of mintemp for each series. \n      # Temporal dynamics are modelled with a Vector \n      # Autoregression (VAR(1))\n      trend_formula = ~ \n        trend +\n        s(trend, bs = 're', by = ndvi_ma12) +\n        s(mintemp, bs = 'bs', by = trend) - 1,\n      trend_model = VAR(cor = TRUE),\n      \n      # Obvservations are conditionally Poisson\n      family = poisson(),\n\n      # Condition on the training data\n      data = data_train,\n      backend = 'cmdstanr'\n    )\n\nUsing `print()` returns a quick summary of the object:\n\n    mod\n    #> GAM observation formula:\n    #> captures ~ 1\n    #> \n    #> GAM process formula:\n    #> ~trend + s(trend, bs = \"re\", by = ndvi_ma12) + s(mintemp, bs = \"bs\", \n    #>     by = trend) - 1\n    #> \n    #> Family:\n    #> poisson\n    #> \n    #> Link function:\n    #> log\n    #> \n    #> Trend model:\n    #> VAR(cor = TRUE)\n    #> \n    #> \n    #> N latent factors:\n    #> 4 \n    #> \n    #> N series:\n    #> 4 \n    #> \n    #> N timepoints:\n    #> 60 \n    #> \n    #> Status:\n    #> Fitted using Stan \n    #> 4 chains, each with iter = 2000; warmup = 1500; thin = 1 \n    #> Total post-warmup draws = 2000\n\nSplit Rhat and Effective Sample Size diagnostics show good convergence\nof model estimates\n\n    mcmc_plot(mod, \n              type = 'rhat_hist')\n    #> `stat_bin()` using `bins = 30`. Pick better value `binwidth`.\n\n<img src=\"man/figures/README-unnamed-chunk-9-1.png\" alt=\"Rhats of parameters estimated with Stan in mvgam\" width=\"100%\" />\n\n    mcmc_plot(mod, \n              type = 'neff_hist')\n    #> `stat_bin()` using `bins = 30`. Pick better value `binwidth`.\n\n<img src=\"man/figures/README-unnamed-chunk-10-1.png\" alt=\"Effective sample sizes of parameters estimated with Stan in mvgam\" width=\"100%\" />\n\nUse `conditional_effects()` for a quick visualisation of the main terms\nin model formulae\n\n    conditional_effects(mod, \n                        type = 'link')\n\n<img src=\"man/figures/README-unnamed-chunk-11-1.png\" alt=\"Plotting GAM effects in mvgam and R\" width=\"100%\" /><img src=\"man/figures/README-unnamed-chunk-11-2.png\" alt=\"Plotting GAM effects in mvgam and R\" width=\"100%\" /><img src=\"man/figures/README-unnamed-chunk-11-3.png\" alt=\"Plotting GAM effects in mvgam and R\" width=\"100%\" />\n\nIf you have the `gratia` package installed, it can also be used to plot\npartial effects of smooths\n\n    require(gratia)\n    draw(mod, \n         trend_effects = TRUE)\n\n<img src=\"man/figures/README-unnamed-chunk-12-1.png\" alt=\"Plotting GAM smooth functions in mvgam using gratia\" width=\"100%\" />\n\nOr design more targeted plots using `plot_predictions()` from the\n`marginaleffects` package\n\n    plot_predictions(\n      mod,\n      condition = c('ndvi_ma12',\n                    'series',\n                    'series'),\n      type = 'link'\n    )\n\n<img src=\"man/figures/README-unnamed-chunk-13-1.png\" alt=\"Using marginaleffects and mvgam to plot GAM smooth functions in R\" width=\"100%\" />\n\n    plot_predictions(\n      mod,\n      condition = c('mintemp',\n                    'series',\n                    'series'),\n      type = 'link'\n    )\n\n<img src=\"man/figures/README-unnamed-chunk-14-1.png\" alt=\"Using marginaleffects and mvgam to plot GAM smooth functions in R\" width=\"100%\" />\n\nWe can also view the model’s posterior predictions for the entire series\n(testing and training). Forecasts can be scored using a range of proper\nscoring rules. See `?score.mvgam_forecast` for more details\n\n    fcs <- forecast(mod, \n                    newdata = data_test)\n    plot(fcs, series = 1) +\n      plot(fcs, series = 2) +\n      plot(fcs, series = 3) +\n      plot(fcs, series = 4)\n    #> Out of sample DRPS:\n    #> 8.451467\n    #> Out of sample DRPS:\n    #> 5.168817\n    #> Out of sample DRPS:\n    #> 8.52922325\n    #> Out of sample DRPS:\n    #> 3.60317975\n\n<img src=\"man/figures/README-unnamed-chunk-15-1.png\" alt=\"Plotting forecast distributions using mvgam in R\" width=\"100%\" />\n\nFor Vector Autoregressions fit in `mvgam`, we can inspect <a\nhref=\"https://ecogambler.netlify.app/blog/vector-autoregressions/#impulse-response-functions\"\ntarget=\"_blank\">impulse response functions and forecast error variance\ndecompositions</a>. The `irf()` function runs an Impulse Response\nFunction (IRF) simulation whereby a positive “shock” is generated for a\ntarget process at time `t = 0`. All else remaining stable, it then\nmonitors how each of the remaining processes in the latent VAR would be\nexpected to respond over the forecast horizon `h`. The function computes\nimpulse responses for all processes in the object and returns them in an\narray that can be plotted using the S3 `plot()` function. Here we will\nuse the generalized IRF, which makes no assumptions about the order in\nwhich the series appear in the VAR process, and inspect how each process\nis expected to respond to a sudden, positive pulse from the other\nprocesses over a horizon of 12 timepoints.\n\n    irfs <- irf(mod, \n                h = 12, \n                orthogonal = FALSE)\n    plot(irfs, \n         series = 1)\n\n<img src=\"man/figures/README-unnamed-chunk-16-1.png\" alt=\"Impulse response functions computed using mvgam in R\" width=\"100%\" />\n\n    plot(irfs, \n         series = 3)\n\n<img src=\"man/figures/README-unnamed-chunk-16-2.png\" alt=\"Impulse response functions computed using mvgam in R\" width=\"100%\" />\n\nUsing the same logic as above, we can inspect forecast error variance\ndecompositions (FEVDs) for each process using`fevd()`. This type of\nanalysis asks how orthogonal shocks to all process in the system\ncontribute to the variance of forecast uncertainty for a focal process\nover increasing horizons. In other words, the proportion of the forecast\nvariance of each latent time series can be attributed to the effects of\nthe other series in the VAR process. FEVDs are useful because some\nshocks may not be expected to cause variations in the short-term but may\ncause longer-term fluctuations\n\n    fevds <- fevd(mod, \n                  h = 12)\n    plot(fevds)\n\n<img src=\"man/figures/README-unnamed-chunk-17-1.png\" alt=\"Forecast error variance decompositions computed using mvgam in R\" width=\"100%\" />\n\nThis plot shows that the variance of forecast uncertainty for each\nprocess is initially dominated by contributions from that same process\n(i.e. self-dependent effects) but that effects from other processes\nbecome more important over increasing forecast horizons. Given what we\nsaw from the IRF plots above, these long-term contributions from\ninteractions among the processes makes sense.\n\nPlotting randomized quantile residuals over `time` for each series can\ngive useful information about what might be missing from the model. We\ncan use the highly versatile `pp_check()` function to plot these:\n\n    pp_check(\n      mod, \n      type = 'resid_ribbon_grouped',\n      group = 'series',\n      x = 'time',\n      ndraws = 200\n    )\n\n<img src=\"man/figures/README-unnamed-chunk-18-1.png\" alt=\"\" width=\"100%\" />\n\nWhen describing the model, it can be helpful to use the `how_to_cite()`\nfunction to generate a scaffold for describing the model and sampling\ndetails in scientific communications\n\n    description <- how_to_cite(mod)\n\n    description\n\n    #> Methods text skeleton\n    #> We used the R package mvgam (version 1.1.594; Clark & Wells, 2023) to\n    #>   construct, fit and interrogate the model. mvgam fits Bayesian\n    #>   State-Space models that can include flexible predictor effects in both\n    #>   the process and observation components by incorporating functionalities\n    #>   from the brms (Burkner 2017), mgcv (Wood 2017) and splines2 (Wang & Yan,\n    #>   2023) packages. To encourage stability and prevent forecast variance\n    #>   from increasing indefinitely, we enforced stationarity of the Vector\n    #>   Autoregressive process following methods described by Heaps (2023) and\n    #>   Clark et al. (2025). The mvgam-constructed model and observed data were\n    #>   passed to the probabilistic programming environment Stan (version\n    #>   2.38.0; Carpenter et al. 2017, Stan Development Team 2026), specifically\n    #>   through the cmdstanr interface (Gabry & Cesnovar, 2021). We ran 4\n    #>   Hamiltonian Monte Carlo chains for 1500 warmup iterations and 500\n    #>   sampling iterations for joint posterior estimation. Rank normalized\n    #>   split Rhat (Vehtari et al. 2021) and effective sample sizes were used to\n    #>   monitor convergence.\n\n    #> \n    #> Primary references\n    #> Clark, NJ and Wells K (2023). Dynamic Generalized Additive Models\n    #>   (DGAMs) for forecasting discrete ecological time series. Methods in\n    #>   Ecology and Evolution, 14, 771-784. doi.org/10.1111/2041-210X.13974\n    #> Burkner, PC (2017). brms: An R Package for Bayesian Multilevel Models\n    #>   Using Stan. Journal of Statistical Software, 80(1), 1-28.\n    #>   doi:10.18637/jss.v080.i01\n    #> Wood, SN (2017). Generalized Additive Models: An Introduction with R\n    #>   (2nd edition). Chapman and Hall/CRC.\n    #> Wang W and Yan J (2021). Shape-Restricted Regression Splines with R\n    #>   Package splines2. Journal of Data Science, 19(3), 498-517.\n    #>   doi:10.6339/21-JDS1020 https://doi.org/10.6339/21-JDS1020.\n    #> Heaps, SE (2023). Enforcing stationarity through the prior in vector\n    #>   autoregressions. Journal of Computational and Graphical Statistics 32,\n    #>   74-83.\n    #> Clark NJ, Ernest SKM, Senyondo H, Simonis J, White EP, Yenni GM,\n    #>   Karunarathna KANK (2025). Beyond single-species models: leveraging\n    #>   multispecies forecasts to navigate the dynamics of ecological\n    #>   predictability. PeerJ 13:e18929.\n    #> Carpenter B, Gelman A, Hoffman MD, Lee D, Goodrich B, Betancourt M,\n    #>   Brubaker M, Guo J, Li P and Riddell A (2017). Stan: A probabilistic\n    #>   programming language. Journal of Statistical Software 76.\n    #> Gabry J, Cesnovar R, Johnson A, and Bronder S (2026). cmdstanr: R\n    #>   Interface to 'CmdStan'. https://mc-stan.org/cmdstanr/,\n    #>   https://discourse.mc-stan.org.\n    #> Vehtari A, Gelman A, Simpson D, Carpenter B, and Burkner P (2021).\n    #>   Rank-normalization, folding, and localization: An improved Rhat for\n    #>   assessing convergence of MCMC (with discussion). Bayesian Analysis 16(2)\n    #>   667-718. https://doi.org/10.1214/20-BA1221.\n    #> \n    #> Other useful references\n    #> Arel-Bundock V, Greifer N, and Heiss A (2024). How to interpret\n    #>   statistical models using marginaleffects for R and Python. Journal of\n    #>   Statistical Software, 111(9), 1-32.\n    #>   https://doi.org/10.18637/jss.v111.i09\n    #> Gabry J, Simpson D, Vehtari A, Betancourt M, and Gelman A (2019).\n    #>   Visualization in Bayesian workflow. Journal of the Royal Statatistical\n    #>   Society A, 182, 389-402. doi:10.1111/rssa.12378.\n    #> Vehtari A, Gelman A, and Gabry J (2017). Practical Bayesian model\n    #>   evaluation using leave-one-out cross-validation and WAIC. Statistics and\n    #>   Computing, 27, 1413-1432. doi:10.1007/s11222-016-9696-4.\n    #> Burkner PC, Gabry J, and Vehtari A. (2020). Approximate leave-future-out\n    #>   cross-validation for Bayesian time series models. Journal of Statistical\n    #>   Computation and Simulation, 90(14), 2499-2523.\n    #>   https://doi.org/10.1080/00949655.2020.1783262\n\nThe post-processing methods we have shown above are just the tip of the\niceberg. For a full list of methods to apply on fitted model objects,\ntype `methods(class = \"mvgam\")`.\n\n## Extended observation families\n\n`mvgam` was originally designed to analyse and forecast non-negative\ninteger-valued data. But further development of `mvgam` has resulted in\nsupport for a growing number of observation families. Currently, the\npackage can handle data for the following:\n\n-   `gaussian()` for real-valued data\n-   `student_t()` for heavy-tailed real-valued data\n-   `lognormal()` for non-negative real-valued data\n-   `Gamma()` for non-negative real-valued data\n-   `betar()` for proportional data on `(0,1)`\n-   `bernoulli()` for binary data\n-   `poisson()` for count data\n-   `nb()` for overdispersed count data\n-   `binomial()` for count data with known number of trials\n-   `beta_binomial()` for overdispersed count data with known number of\n    trials\n-   `nmix()` for count data with imperfect detection (unknown number of\n    trials)\n\nSee `??mvgam_families` for more information. Below is a simple example\nfor simulating and modelling proportional data with `Beta` observations\nover a set of seasonal series with independent Gaussian Process dynamic\ntrends:\n\n    set.seed(100)\n    data <- sim_mvgam(\n      family = betar(),\n      T = 80,\n      trend_model = GP(),\n      prop_trend = 0.5,\n      seasonality = \"shared\"\n    )\n    plot_mvgam_series(\n      data = data$data_train, \n      series = \"all\"\n    )\n\n<img src=\"man/figures/README-beta_sim-1.png\" alt=\"\" width=\"100%\" />\n\n    mod <- mvgam(\n      y ~ s(season, bs = \"cc\", k = 7) +\n        s(season, by = series, m = 1, k = 5),\n      trend_model = GP(),\n      data = data$data_train,\n      newdata = data$data_test,\n      family = betar()\n    )\n\nInspect the summary to see that the posterior now also contains\nestimates for the `Beta` precision parameters *ϕ*.\n\n    summary(mod, \n            include_betas = FALSE)\n    #> GAM formula:\n    #> y ~ s(season, bs = \"cc\", k = 7) + s(season, by = series, m = 1, \n    #>     k = 5)\n    #> \n    #> Family:\n    #> beta\n    #> \n    #> Link function:\n    #> logit\n    #> \n    #> Trend model:\n    #> GP()\n    #> \n    #> N series:\n    #> 3 \n    #> \n    #> N timepoints:\n    #> 80 \n    #> \n    #> Status:\n    #> Fitted using Stan \n    #> 4 chains, each with iter = 1000; warmup = 500; thin = 1 \n    #> Total post-warmup draws = 2000\n    #> \n    #> Observation precision parameter estimates:\n    #>        2.5%  50% 97.5% Rhat n_eff\n    #> phi[1]  7.8 12.0  18.0    1  1829\n    #> phi[2]  5.6  8.6  13.0    1  1023\n    #> phi[3]  4.1  6.0   8.7    1  1404\n    #> \n    #> GAM coefficient (beta) estimates:\n    #>             2.5%  50% 97.5% Rhat n_eff\n    #> (Intercept) 0.11 0.45   0.7 1.01   602\n    #> \n    #> Approximate significance of GAM smooths:\n    #>                             edf Ref.df Chi.sq p-value  \n    #> s(season)                3.9071      5  9.792  0.0653 .\n    #> s(season):seriesseries_1 1.0934      4 11.307  0.2695  \n    #> s(season):seriesseries_2 2.5629      4  2.227  0.4544  \n    #> s(season):seriesseries_3 0.8565      4  6.556  0.5358  \n    #> ---\n    #> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1\n    #> \n    #> marginal deviation:\n    #>              2.5%  50% 97.5% Rhat n_eff\n    #> alpha_gp[1] 0.150 0.40  0.88 1.00   828\n    #> alpha_gp[2] 0.570 0.93  1.50 1.00  1018\n    #> alpha_gp[3] 0.052 0.40  0.92 1.01   672\n    #> \n    #> length scale:\n    #>           2.5%  50% 97.5% Rhat n_eff\n    #> rho_gp[1]  1.2  3.6    11 1.00  1482\n    #> rho_gp[2]  3.0 12.0    30 1.01   367\n    #> rho_gp[3]  1.3  4.9    26 1.00   532\n    #> \n    #> Stan MCMC diagnostics:\n    #> ✔ No issues with effective samples per iteration\n    #> ✔ Rhat looks good for all parameters\n    #> ✔ No issues with divergences\n    #> ✔ No issues with maximum tree depth\n    #> \n    #> Samples were drawn using sampling(hmc). For each parameter, n_eff is a\n    #>   crude measure of effective sample size, and Rhat is the potential scale\n    #>   reduction factor on split MCMC chains (at convergence, Rhat = 1)\n    #> \n    #> Use how_to_cite() to get started describing this model\n\nPlot the hindcast and forecast distributions for each series\n\n    library(patchwork)\n    fc <- forecast(mod)\n    wrap_plots(\n      plot(fc, series = 1),\n      plot(fc, series = 2),\n      plot(fc, series = 3),\n      ncol = 2\n    )\n\n<img src=\"man/figures/README-beta_fc-1.png\" alt=\"\" width=\"100%\" />\n\nThere are many more extended uses of `mvgam`, including the ability to\nfit hierarchical State-Space GAMs that include dynamic and spatially\nvarying coefficient models, dynamic factors, Joint Species Distribution\nModels and much more. See the\n<a href=\"https://nicholasjclark.github.io/mvgam/\"\ntarget=\"_blank\">package documentation</a> for more details. `mvgam` can\nalso be used to generate all necessary data structures and modelling\ncode necessary to fit DGAMs using `Stan`. This can be helpful if users\nwish to make changes to the model to better suit their own bespoke\nresearch / analysis goals. The <a href=\"https://discourse.mc-stan.org/\"\ntarget=\"_blank\"><code>Stan</code> Discourse</a> is a helpful place to\ntroubleshoot.\n\n## Citing `mvgam` and related software\n\nWhen using any software please make sure to appropriately acknowledge\nthe hard work that developers and maintainers put into making these\npackages available. Citations are currently the best way to formally\nacknowledge this work (but feel free to ⭐ this repo as well).\n\nWhen using `mvgam`, please cite the following:\n\n> Clark, N.J. and Wells, K. (2023). Dynamic Generalized Additive Models\n> (DGAMs) for forecasting discrete ecological time series. *Methods in\n> Ecology and Evolution*. DOI: <https://doi.org/10.1111/2041-210X.13974>\n\nAs `mvgam` acts as an interface to `Stan`, please additionally cite:\n\n> Carpenter B., Gelman A., Hoffman M. D., Lee D., Goodrich B.,\n> Betancourt M., Brubaker M., Guo J., Li P., and Riddell A. (2017).\n> Stan: A probabilistic programming language. *Journal of Statistical\n> Software*. 76(1). DOI: <https://doi.org/10.18637/jss.v076.i01>\n\n`mvgam` relies on several other `R` packages and, of course, on `R`\nitself. Use `how_to_cite()` to simplify the process of finding\nappropriate citations for your software setup.\n\n## Getting help\n\nIf you encounter a clear bug, please file an issue with a minimal\nreproducible example on\n[GitHub](https://github.com/nicholasjclark/mvgam/issues). Please also\nfeel free to use the [`mvgam` Discussion\nBoard](https://github.com/nicholasjclark/mvgam/discussions) to hunt for\nor post other discussion topics related to the package, and do check out\nthe [`mvgam`\nChangelog](https://nicholasjclark.github.io/mvgam/news/index.html) for\nany updates about recent upgrades that the package has incorporated.\n\n## Other resources\n\nA series of <a href=\"https://nicholasjclark.github.io/mvgam/\"\ntarget=\"_blank\">vignettes cover data formatting, forecasting and several\nextended case studies of DGAMs</a>. A number of other examples,\nincluding some step-by-step introductory webinars, have also been\ncompiled:\n\n-   <a\n    href=\"https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3\"\n    target=\"_blank\">Time series in R and Stan using the <code>mvgam</code>\n    package</a>\n-   <a href=\"https://www.youtube.com/watch?v=0zZopLlomsQ\"\n    target=\"_blank\">Ecological Forecasting with Dynamic Generalized Additive\n    Models</a>\n-   <a href=\"https://ecogambler.netlify.app/blog/distributed-lags-mgcv/\"\n    target=\"_blank\">Distributed lags (and hierarchical distributed lags)\n    using <code>mgcv</code> and <code>mvgam</code></a>\n-   <a href=\"https://ecogambler.netlify.app/blog/vector-autoregressions/\"\n    target=\"_blank\">State-Space Vector Autoregressions in\n    <code>mvgam</code></a>\n-   <a href=\"https://www.youtube.com/watch?v=RwllLjgPUmM\"\n    target=\"_blank\">Ecological Forecasting with Dynamic GAMs; a tutorial and\n    detailed case study</a>\n-   <a href=\"https://ecogambler.netlify.app/blog/time-varying-seasonality/\"\n    target=\"_blank\">Incorporating time-varying seasonality in forecast\n    models</a>\n\n## Interested in contributing?\n\nI’m actively seeking PhD students and other researchers to work in the\nareas of ecological forecasting, multivariate model evaluation and\ndevelopment of `mvgam`. Please reach out if you are interested\n(n.clark’at’uq.edu.au). Other contributions are also very welcome, but\nplease see [The Contributor\nInstructions](https://github.com/nicholasjclark/mvgam/blob/master/.github/CONTRIBUTING.md)\nfor general guidelines. Note that by participating in this project you\nagree to abide by the terms of its [Contributor Code of\nConduct](https://dplyr.tidyverse.org/CODE_OF_CONDUCT).\n\n## License\n\nThe `mvgam` project is licensed under an `MIT` open source license\n"
  },
  {
    "path": "build_vignettes_CRAN.R",
    "content": "# Vignette names\nvignettes <- list.files('./vignettes', pattern = '.Rmd')\n\n# Generate R script versions of vignettes\npurl_vignettes <- function(x) {\n  # Generate the R script version\n  knitr::purl(\n    input = paste0('vignettes/', x),\n    output = paste0('doc/', sub('.Rmd', '.R', x))\n  )\n\n  # Copy this version to inst/doc\n  file.copy(\n    from = paste0('doc/', sub('.Rmd', '.R', x)),\n    to = paste0('inst/doc/', sub('.Rmd', '.R', x)),\n    overwrite = TRUE\n  )\n}\n\n# Build vignette htmls\nbuild_vignettes = function(x) {\n  # Build the vignette html file\n  devtools::build_rmd(\n    paste0('vignettes/', x)\n  )\n\n  # Copy the .Rmd to doc\n  file.copy(\n    from = paste0('vignettes/', x),\n    to = paste0('doc/', x),\n    overwrite = TRUE\n  )\n\n  # Copy the .Rmd to inst/doc\n  file.copy(\n    from = paste0('vignettes/', x),\n    to = paste0('inst/doc/', x),\n    overwrite = TRUE\n  )\n\n  # Copy the .html to inst/doc\n  file.copy(\n    from = sub('.Rmd', '.html', paste0('vignettes/', x)),\n    to = paste0('inst/doc/', sub('.Rmd', '.html', x)),\n    overwrite = TRUE\n  )\n\n  # Copy the .html to doc\n  file.copy(\n    from = sub('.Rmd', '.html', paste0('vignettes/', x)),\n    to = paste0('doc/', sub('.Rmd', '.html', x)),\n    overwrite = TRUE\n  )\n\n  # Remove the .html\n  file.remove(sub('.Rmd', '.html', paste0('vignettes/', x)))\n}\n\n# Apply these functions to all vignette .Rmds\nlapply(vignettes, purl_vignettes)\nlapply(vignettes, build_vignettes)\n"
  },
  {
    "path": "cran-comments.md",
    "content": "## Version 1.1.594\n\n## Summary of changes\nThis version is a minor patch update to fix a test that spawned more than two cores. It also brings several cosmetic updates to improve the way summaries are printed and stored. There are no major structural changes or modifications that would break pre-existing workflows\n\n## Test environments\n* Windows install: R 4.4.3\n* win-builder: R-devel\n* win-builder: R-release\n* ubuntu-latest: R-release\n* ubuntu-latest: R-devel\n* macOS-latest: R-release\n\n## R CMD check results\n* There were no ERRORs or WARNINGs. There were 2 NOTEs due to listing 'cmdstanr' in Suggests. This package is not a dependency but provides an additional backend option for users to select when fitting 'Stan' models, if they wish. A similar package that has been available on CRAN for quite some time ('brms') uses the same convention. I have included the `Additional_repositories` field in the DESCRIPTION to appropriately tell users where they can find this package.\n\n* There is one compilation WARNING about RcppArmadillo fallback compilation that appears in the CRAN check system. This warning originates from the RcppArmadillo system headers (suggesting to define -DARMA_USE_CURRENT) and is not related to any code in the mvgam package. It is a system-level compilation flag recommendation that would typically be addressed by system administrators or RcppArmadillo maintainers.\n\n## `valgrind` memory check results\n* Running all examples using `--run-donttest`, and all package tests (including those skipped on CRAN) with `R -d \"valgrind --tool=memcheck --leak-check=full\"` resulted in no WARNINGs or ERRORs\n\nMaintainer: 'Nicholas J Clark <nicholas.j.clark1214@gmail.com>'\n"
  },
  {
    "path": "doc/data_in_mvgam.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nsimdat <- sim_mvgam(\n  n_series = 4,\n  T = 24,\n  prop_missing = 0.2\n)\nhead(simdat$data_train, 16)\n\n\n## --------------------------------------------------------------------------------\nclass(simdat$data_train$series)\nlevels(simdat$data_train$series)\n\n\n## --------------------------------------------------------------------------------\nall(\n  levels(simdat$data_train$series) %in%\n    unique(simdat$data_train$series)\n)\n\n\n## --------------------------------------------------------------------------------\nsummary(glm(\n  y ~ series + time,\n  data = simdat$data_train,\n  family = poisson()\n))\n\n\n## --------------------------------------------------------------------------------\nsummary(mgcv::gam(\n  y ~ series + s(time, by = series),\n  data = simdat$data_train,\n  family = poisson()\n))\n\n\n## --------------------------------------------------------------------------------\ngauss_dat <- data.frame(\n  outcome = rnorm(10),\n  series = factor(\"series1\", levels = \"series1\"),\n  time = 1:10\n)\ngauss_dat\n\n\n## --------------------------------------------------------------------------------\nmgcv::gam(outcome ~ time, family = betar(), data = gauss_dat)\n\n\n## ----error=TRUE------------------------------------------------------------------\ntry({\n  mvgam(outcome ~ time, family = betar(), data = gauss_dat)\n})\n\n\n## --------------------------------------------------------------------------------\n# A function to ensure all timepoints within a sequence are identical\nall_times_avail <- function(time, min_time, max_time) {\n  identical(\n    as.numeric(sort(time)),\n    as.numeric(seq.int(from = min_time, to = max_time))\n  )\n}\n\n# Get min and max times from the data\nmin_time <- min(simdat$data_train$time)\nmax_time <- max(simdat$data_train$time)\n\n# Check that all times are recorded for each series\ndata.frame(\n  series = simdat$data_train$series,\n  time = simdat$data_train$time\n) %>%\n  dplyr::group_by(series) %>%\n  dplyr::summarise(\n    all_there = all_times_avail(\n      time,\n      min_time,\n      max_time\n    )\n  ) -> checked_times\nif (any(checked_times$all_there == FALSE)) {\n  warning(\n    \"One or more series in is missing observations for one or more timepoints\"\n  )\n} else {\n  cat(\"All series have observations at all timepoints :)\")\n}\n\n\n## --------------------------------------------------------------------------------\nbad_times <- data.frame(\n  time = seq(1, 16, by = 2),\n  series = factor(\"series_1\"),\n  outcome = rnorm(8)\n)\nbad_times\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(outcome ~ 1, data = bad_times, family = gaussian())\n})\n\n\n## --------------------------------------------------------------------------------\nbad_times %>%\n  dplyr::right_join(expand.grid(\n    time = seq(\n      min(bad_times$time),\n      max(bad_times$time)\n    ),\n    series = factor(unique(bad_times$series), levels = levels(bad_times$series))\n  )) %>%\n  dplyr::arrange(time) -> good_times\ngood_times\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(outcome ~ 1, data = good_times, family = gaussian())\n})\n\n\n## --------------------------------------------------------------------------------\nbad_levels <- data.frame(\n  time = 1:8,\n  series = factor(\n    \"series_1\",\n    levels = c(\n      \"series_1\",\n      \"series_2\"\n    )\n  ),\n  outcome = rnorm(8)\n)\n\nlevels(bad_levels$series)\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(outcome ~ 1, data = bad_levels, family = gaussian())\n})\n\n\n## --------------------------------------------------------------------------------\nsetdiff(levels(bad_levels$series), unique(bad_levels$series))\n\n\n## --------------------------------------------------------------------------------\nbad_levels %>%\n  dplyr::mutate(series = droplevels(series)) -> good_levels\nlevels(good_levels$series)\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    outcome ~ 1,\n    data = good_levels,\n    family = gaussian()\n  )\n})\n\n\n## --------------------------------------------------------------------------------\nmiss_dat <- data.frame(\n  outcome = rnorm(10),\n  cov = c(NA, rnorm(9)),\n  series = factor(\"series1\", levels = \"series1\"),\n  time = 1:10\n)\nmiss_dat\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    outcome ~ cov,\n    data = miss_dat,\n    family = gaussian()\n  )\n})\n\n\n## --------------------------------------------------------------------------------\nmiss_dat <- list(\n  outcome = rnorm(10),\n  series = factor(\"series1\", levels = \"series1\"),\n  time = 1:10\n)\nmiss_dat$cov <- matrix(rnorm(50), ncol = 5, nrow = 10)\nmiss_dat$cov[2, 3] <- NA\n\n\n## ----error=TRUE------------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    outcome ~ cov,\n    data = miss_dat,\n    family = gaussian()\n  )\n})\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = \"all\"\n)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = 1\n)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  y = \"y\",\n  series = 1\n)\n\n\n## --------------------------------------------------------------------------------\ndata(\"all_neon_tick_data\")\nstr(dplyr::ungroup(all_neon_tick_data))\n\n\n## --------------------------------------------------------------------------------\nplotIDs <- c(\n  \"SCBI_013\",\n  \"SCBI_002\",\n  \"SERC_001\",\n  \"SERC_005\",\n  \"SERC_006\",\n  \"SERC_012\",\n  \"BLAN_012\",\n  \"BLAN_005\"\n)\n\n\n## --------------------------------------------------------------------------------\nmodel_dat <- all_neon_tick_data %>%\n  dplyr::ungroup() %>%\n  dplyr::mutate(target = ixodes_scapularis) %>%\n  dplyr::filter(plotID %in% plotIDs) %>%\n  dplyr::select(Year, epiWeek, plotID, target) %>%\n  dplyr::mutate(epiWeek = as.numeric(epiWeek))\n\n\n## --------------------------------------------------------------------------------\nmodel_dat %>%\n  # Create all possible combos of plotID, Year and epiWeek;\n  # missing outcomes will be filled in as NA\n  dplyr::full_join(expand.grid(\n    plotID = unique(model_dat$plotID),\n    Year = unique(model_dat$Year),\n    epiWeek = seq(1, 52)\n  )) %>%\n  # left_join back to original data so plotID and siteID will\n  # match up, in case you need the siteID for anything else later on\n  dplyr::left_join(\n    all_neon_tick_data %>%\n      dplyr::select(siteID, plotID) %>%\n      dplyr::distinct()\n  ) -> model_dat\n\n\n## --------------------------------------------------------------------------------\nmodel_dat %>%\n  dplyr::mutate(\n    series = plotID,\n    y = target\n  ) %>%\n  dplyr::mutate(\n    siteID = factor(siteID),\n    series = factor(series)\n  ) %>%\n  dplyr::select(-target, -plotID) %>%\n  dplyr::arrange(Year, epiWeek, series) -> model_dat\n\n\n## --------------------------------------------------------------------------------\nmodel_dat %>%\n  dplyr::ungroup() %>%\n  dplyr::group_by(series) %>%\n  dplyr::arrange(Year, epiWeek) %>%\n  dplyr::mutate(time = seq(1, dplyr::n())) %>%\n  dplyr::ungroup() -> model_dat\n\n\n## --------------------------------------------------------------------------------\nlevels(model_dat$series)\n\n\n## ----error=TRUE------------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    y ~ 1,\n    data = model_dat,\n    family = poisson()\n  )\n})\n\n\n## --------------------------------------------------------------------------------\ntestmod <- mvgam(\n  y ~ s(epiWeek, by = series, bs = \"cc\") +\n    s(series, bs = \"re\"),\n  trend_model = AR(),\n  data = model_dat,\n  backend = \"cmdstanr\",\n  run_model = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\nstr(testmod$model_data)\n\n\n## --------------------------------------------------------------------------------\nstancode(testmod)\n"
  },
  {
    "path": "doc/data_in_mvgam.Rmd",
    "content": "---\ntitle: \"Formatting data for use in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Formatting data for use in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThis vignette gives an example of how to take raw data and format it for use in `mvgam`. This is not an exhaustive example, as data can be recorded and stored in a variety of ways, which requires different approaches to wrangle the data into the necessary format for `mvgam`. For full details on the basic `mvgam` functionality, please see [the introductory vignette](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html) and [the growing set of walk through video tutorials on `mvgam` applications](https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3&si=lyg7qUrMLbD-tHCB).\n\n## Required *tidy* data format\nManipulating the data into a 'long' format (i.e. *tidy* format) is necessary for modelling in `mvgam`. By 'long' format, we mean that each `series x time` observation needs to have its own entry in the `dataframe` or `list` object that we wish to pass as data for to the two primary modelling functions, `mvgam()` and `jsdgam()`. A simple example can be viewed by simulating data using the `sim_mvgam()` function. See `?sim_mvgam` for more details\n```{r}\nsimdat <- sim_mvgam(\n  n_series = 4, \n  T = 24, \n  prop_missing = 0.2\n)\nhead(simdat$data_train, 16)\n```\n\n### `series` as a `factor` variable\nNotice how we have four different time series in these simulated data, and we have identified the series-level indicator as a `factor` variable.\n```{r}\nclass(simdat$data_train$series)\nlevels(simdat$data_train$series)\n```\n\nIt is important that the number of levels matches the number of unique series in the data to ensure indexing across series works properly in the underlying modelling functions. Several of the main workhorse functions in the package (including `mvgam()` and `get_mvgam_priors()`) will give an error if this is not the case, but it may be worth checking anyway:\n```{r}\nall(levels(simdat$data_train$series) %in% \n      unique(simdat$data_train$series))\n```\n\nNote that you can technically supply data that does not have a `series` indicator, and the package will generally assume that you are only using a single time series. There are exceptions to this, for example if you have grouped data and would like to estimate hierarchical dependencies (see an example of hierarchical process error correlations in the `?AR` documentation) or if you would like to set up a Joint Species Distribution Model (JSDM) using a Zero-Mean Multivariate Gaussian distribution for the latent residuals (see examples in the `?ZMVN` documentation).\n\n### A single outcome variable\nYou may also have notices that we do not spread the `numeric / integer`-classed outcome variable into different columns. Rather, there is only a single column for the outcome variable, labelled `y` in these simulated data (though the outcome does not have to be labelled `y`). This is another important requirement in `mvgam`, but it shouldn't be too unfamiliar to `R` users who frequently use modelling packages such as `lme4`, `mgcv`, `brms` or the many other regression modelling packages out there. The advantage of this format is that it is now very easy to specify effects that vary among time series:\n```{r}\nsummary(glm(\n  y ~ series + time,\n  data = simdat$data_train,\n  family = poisson()\n))\n```\n\n```{r}\nsummary(mgcv::gam(\n  y ~ series + s(time, by = series),\n  data = simdat$data_train,\n  family = poisson()\n))\n```\n\nDepending on the observation families you plan to use when building models, there may be some restrictions that need to be satisfied within the outcome variable. For example, a Beta regression can only handle proportional data, so values `>= 1` or `<= 0` are not allowed. Likewise, a Poisson regression can only handle non-negative integers. Most regression functions in `R` will assume the user knows all of this and so will not issue any warnings or errors if you choose the wrong distribution, but often this ends up leading to some unhelpful error from an optimizer that is difficult to interpret and diagnose. `mvgam` will attempt to provide some errors if you do something that is simply not allowed. For example, we can simulate data from a zero-centred Gaussian distribution (ensuring that some of our values will be `< 1`) and attempt a Beta regression in `mvgam` using the `betar` family:\n```{r}\ngauss_dat <- data.frame(\n  outcome = rnorm(10),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\ngauss_dat\n```\n\nA call to `gam()` using the `mgcv` package leads to a model that actually fits (though it does give an unhelpful warning message):\n```{r}\nmgcv::gam(outcome ~ time,\n  family = betar(),\n  data = gauss_dat\n)\n```\n\nBut the same call to `mvgam()` gives us something more useful:\n```{r error=TRUE}\nmvgam(outcome ~ time,\n  family = betar(),\n  data = gauss_dat\n)\n```\n\nPlease see `?mvgam_families` for more information on the types of responses that the package can handle and their restrictions\n\n### A `time` variable\nThe other requirement for most models that can be fit in `mvgam` is a `numeric / integer`-classed variable labelled `time`. This ensures the modelling software knows how to arrange the time series when building models. This setup still allows us to formulate multivariate time series models. If you plan to use any of the autoregressive dynamic trend functions available in `mvgam` (see `?mvgam_trends` for details of available dynamic processes), you will need to ensure your time series are entered with a fixed sampling interval (i.e. the time between timesteps 1 and 2 should be the same as the time between timesteps 2 and 3, etc...). But note that you can have missing observations for some (or all) series. `mvgam()` will check this for you, but again it is useful to ensure you have no missing timepoint x series combinations in your data. You can generally do this with a simple `dplyr` call:\n```{r}\n# A function to ensure all timepoints within a sequence are identical\nall_times_avail <- function(time, min_time, max_time) {\n  identical(\n    as.numeric(sort(time)),\n    as.numeric(seq.int(from = min_time, to = max_time))\n  )\n}\n\n# Get min and max times from the data\nmin_time <- min(simdat$data_train$time)\nmax_time <- max(simdat$data_train$time)\n\n# Check that all times are recorded for each series\ndata.frame(\n  series = simdat$data_train$series,\n  time = simdat$data_train$time\n) %>%\n  dplyr::group_by(series) %>%\n  dplyr::summarise(all_there = all_times_avail(\n    time,\n    min_time,\n    max_time\n  )) -> checked_times\nif (any(checked_times$all_there == FALSE)) {\n  warning(\"One or more series in is missing observations for one or more timepoints\")\n} else {\n  cat(\"All series have observations at all timepoints :)\")\n}\n```\n\nNote that models which use dynamic components will assume that smaller values of `time` are *older* (i.e. `time = 1` came *before* `time = 2`, etc...)\n\n### Irregular sampling intervals?\nMost `mvgam` dynamic trend models expect `time` to be measured in discrete, evenly-spaced intervals (i.e. one measurement per week, or one per year, for example; though missing values are allowed). But please note that irregularly sampled time intervals are allowed, in which case the `CAR()` trend model (continuous time autoregressive) is appropriate. You can see an example of this kind of model in the **Examples** section in `?CAR`. You can also use `trend_model = 'None'` (the default in `mvgam()`) and instead use a Gaussian Process to model temporal variation for irregularly-sampled time series. See the `?brms::gp` for details. But to reiterate the point from above, if you do not have time series data (or don't want to estimate latent temporal dynamics) but you would like to estimate correlated latent residuals among multivariate outcomes, you can set up models that use `trend_model = ZMVN(...)` without the need for a `time` variable (see `?ZMVN` for details).\n\n## Checking data with `get_mvgam_priors()`\nThe `get_mvgam_priors()` function is designed to return information about the parameters in a model whose prior distributions can be modified by the user. But in doing so, it will perform a series of checks to ensure the data are formatted properly. It can therefore be very useful to new users for ensuring there isn't anything strange going on in the data setup. For example, we can replicate the steps taken above (to check factor levels and timepoint x series combinations) with a single call to `get_mvgam_priors()`. Here we first simulate some data in which some of the timepoints in the `time` variable are not included in the data:\n```{r}\nbad_times <- data.frame(\n  time = seq(1, 16, by = 2),\n  series = factor(\"series_1\"),\n  outcome = rnorm(8)\n)\nbad_times\n```\n\nNext we call `get_mvgam_priors()` by simply specifying an intercept-only model, which is enough to trigger all the checks:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = bad_times,\n  family = gaussian()\n)\n```\n\nThis error is useful as it tells us where the problem is. There are many ways to fill in missing timepoints, so the correct way will have to be left up to the user. But if you don't have any covariates, it should be pretty easy using `expand.grid()`:\n```{r}\nbad_times %>%\n  dplyr::right_join(expand.grid(\n    time = seq(\n      min(bad_times$time),\n      max(bad_times$time)\n    ),\n    series = factor(unique(bad_times$series),\n      levels = levels(bad_times$series)\n    )\n  )) %>%\n  dplyr::arrange(time) -> good_times\ngood_times\n```\n\nNow the call to `get_mvgam_priors()`, using our filled in data, should work:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = good_times,\n  family = gaussian()\n)\n```\n\nThis function should also pick up on misaligned factor levels for the `series` variable. We can check this by again simulating, this time adding an additional factor level that is not included in the data:\n```{r}\nbad_levels <- data.frame(\n  time = 1:8,\n  series = factor(\"series_1\",\n    levels = c(\n      \"series_1\",\n      \"series_2\"\n    )\n  ),\n  outcome = rnorm(8)\n)\n\nlevels(bad_levels$series)\n```\n\nAnother call to `get_mvgam_priors()` brings up a useful error:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = bad_levels,\n  family = gaussian()\n)\n```\n\nFollowing the message's advice tells us there is a level for `series_2` in the `series` variable, but there are no observations for this series in the data:\n```{r}\nsetdiff(levels(bad_levels$series), \n        unique(bad_levels$series))\n```\n\nRe-assigning the levels fixes the issue:\n```{r}\nbad_levels %>%\n  dplyr::mutate(series = droplevels(series)) -> good_levels\nlevels(good_levels$series)\n```\n\n```{r error = TRUE}\nget_mvgam_priors(\n  outcome ~ 1,\n  data = good_levels,\n  family = gaussian()\n)\n```\n\n### Covariates with no `NA`s\nCovariates can be used in models just as you would when using `mgcv` (see `?formula.gam` for details of the formula syntax). But although the outcome variable can have `NA`s, covariates cannot. Most regression software will silently drop any raws in the model matrix that have `NA`s, which is not helpful when debugging. Both the `mvgam()` and `get_mvgam_priors()` functions will run some simple checks for you, and hopefully will return useful errors if it finds in missing values:\n```{r}\nmiss_dat <- data.frame(\n  outcome = rnorm(10),\n  cov = c(NA, rnorm(9)),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\nmiss_dat\n```\n\n```{r error = TRUE}\nget_mvgam_priors(\n  outcome ~ cov,\n  data = miss_dat,\n  family = gaussian()\n)\n```\n\nJust like with the `mgcv` package, `mvgam` can also accept data as a `list` object. This is useful if you want to set up linear functional predictors or even distributed lag predictors. The checks run by `mvgam` should still work on these data. Here we change the `cov` predictor to be a `matrix`:\n```{r}\nmiss_dat <- list(\n  outcome = rnorm(10),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\nmiss_dat$cov <- matrix(rnorm(50), ncol = 5, nrow = 10)\nmiss_dat$cov[2, 3] <- NA\n```\n\nA call to `get_mvgam_priors()` returns the same error:\n```{r error=TRUE}\nget_mvgam_priors(\n  outcome ~ cov,\n  data = miss_dat,\n  family = gaussian()\n)\n```\n\n## Plotting with `plot_mvgam_series()`\nPlotting the data is a useful way to ensure everything looks ok, once you've gone throug the above checks on factor levels and timepoint x series combinations. The `plot_mvgam_series()` function will take supplied data and plot either a series of line plots (if you choose `series = 'all'`) or a set of plots to describe the distribution for a single time series. For example, to plot all of the time series in our data, and highlight a single series in each plot, we can use:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = \"all\"\n)\n```\n\nOr we can look more closely at the distribution for the first time series:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = 1\n)\n```\n\nIf you have split your data into training and testing folds (i.e. for forecast evaluation), you can include the test data in your plots:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  y = \"y\",\n  series = 1\n)\n```\n\n## Example with NEON tick data\nTo give one example of how data can be reformatted for `mvgam` modelling, we will use observations from the National Ecological Observatory Network (NEON) tick drag cloth samples. *Ixodes scapularis* is a widespread tick species capable of transmitting a diversity of parasites to animals and humans, many of which are zoonotic. Due to the medical and ecological importance of this tick species, a common goal is to understand factors that influence their abundances. The NEON field team carries out standardised [long-term monitoring of tick abundances as well as other important indicators of ecological change](https://www.neonscience.org/data-collection/ticks){target=\"_blank\"}. Nymphal abundance of *I. scapularis* is routinely recorded across NEON plots using a field sampling method called drag cloth sampling, which is a common method for sampling ticks in the landscape. Field researchers sample ticks by dragging a large cloth behind themselves through terrain that is suspected of harboring ticks, usually working in a grid-like pattern. The sites have been sampled since 2014, resulting in a rich dataset of nymph abundance time series. These tick time series show strong seasonality and incorporate many of the challenging features associated with ecological data including overdispersion, high proportions of missingness and irregular sampling in time, making them useful for exploring the utility of dynamic GAMs. \n  \nWe begin by loading NEON tick data for the years 2014 - 2021, which were downloaded from NEON and prepared as described in [Clark & Wells 2022](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.13974){target=\"_blank\"}. You can read a bit about the data using the call `?all_neon_tick_data`\n```{r}\ndata(\"all_neon_tick_data\")\nstr(dplyr::ungroup(all_neon_tick_data))\n```\n\nFor this exercise, we will use the `epiWeek` variable as an index of seasonality, and we will only work with observations from a few sampling plots (labelled in the `plotID` column):\n```{r}\nplotIDs <- c(\n  \"SCBI_013\", \"SCBI_002\",\n  \"SERC_001\", \"SERC_005\",\n  \"SERC_006\", \"SERC_012\",\n  \"BLAN_012\", \"BLAN_005\"\n)\n```\n\nNow we can select the target species we want (*I. scapularis*), filter to the correct plot IDs and convert the `epiWeek` variable from `character` to `numeric`:\n```{r}\nmodel_dat <- all_neon_tick_data %>%\n  dplyr::ungroup() %>%\n  dplyr::mutate(target = ixodes_scapularis) %>%\n  dplyr::filter(plotID %in% plotIDs) %>%\n  dplyr::select(Year, epiWeek, plotID, target) %>%\n  dplyr::mutate(epiWeek = as.numeric(epiWeek))\n```\n\nNow is the tricky part: we need to fill in missing observations with `NA`s. The tick data are sparse in that field observers do not go out and sample in each possible `epiWeek`. So there are many particular weeks in which observations are not included in the data. But we can use `expand.grid()` again to take care of this:\n```{r}\nmodel_dat %>%\n  # Create all possible combos of plotID, Year and epiWeek;\n  # missing outcomes will be filled in as NA\n  dplyr::full_join(expand.grid(\n    plotID = unique(model_dat$plotID),\n    Year = unique(model_dat$Year),\n    epiWeek = seq(1, 52)\n  )) %>%\n  # left_join back to original data so plotID and siteID will\n  # match up, in case you need the siteID for anything else later on\n  dplyr::left_join(all_neon_tick_data %>%\n    dplyr::select(siteID, plotID) %>%\n    dplyr::distinct()) -> model_dat\n```\n\nCreate the `series` variable needed for `mvgam` modelling:\n```{r}\nmodel_dat %>%\n  dplyr::mutate(\n    series = plotID,\n    y = target\n  ) %>%\n  dplyr::mutate(\n    siteID = factor(siteID),\n    series = factor(series)\n  ) %>%\n  dplyr::select(-target, -plotID) %>%\n  dplyr::arrange(Year, epiWeek, series) -> model_dat\n```\n\nNow create the `time` variable, which needs to track `Year` and `epiWeek` for each unique series. The `n` function from `dplyr` is often useful if generating a `time` index for grouped dataframes:\n```{r}\nmodel_dat %>%\n  dplyr::ungroup() %>%\n  dplyr::group_by(series) %>%\n  dplyr::arrange(Year, epiWeek) %>%\n  dplyr::mutate(time = seq(1, dplyr::n())) %>%\n  dplyr::ungroup() -> model_dat\n```\n\nCheck factor levels for the `series`:\n```{r}\nlevels(model_dat$series)\n```\n\nThis looks good, as does a more rigorous check using `get_mvgam_priors()`:\n```{r error=TRUE}\nget_mvgam_priors(\n  y ~ 1,\n  data = model_dat,\n  family = poisson()\n)\n```\n\nWe can also set up a model in `mvgam()` but use `run_model = FALSE` to further ensure all of the necessary steps for creating the modelling code and objects will run. It is recommended that you use the `cmdstanr` backend if possible, as the auto-formatting options available in this package are very useful for checking the package-generated `Stan` code for any inefficiencies that can be fixed to lead to sampling performance improvements:\n```{r}\ntestmod <- mvgam(\n  y ~ s(epiWeek, by = series, bs = \"cc\") +\n    s(series, bs = \"re\"),\n  trend_model = AR(),\n  data = model_dat,\n  backend = \"cmdstanr\",\n  run_model = FALSE\n)\n```\n\nThis call runs without issue, and the resulting object now contains the model code and data objects that are needed to initiate sampling:\n```{r}\nstr(testmod$model_data)\n```\n\n```{r}\nstancode(testmod)\n```\n\n## Further reading\nThe following papers and resources offer useful material about Dynamic GAMs and how they can be applied in practice:\n  \nClark, Nicholas J. and Wells, K. [Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series](https://doi.org/10.1111/2041-210X.13974). *Methods in Ecology and Evolution*. (2023): 14, 771-784.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nde Sousa, Heitor C., et al. [Severe fire regimes decrease resilience of ectothermic populations](https://doi.org/10.1111/1365-2656.14188). *Journal of Animal Ecology* (2024): 93(11), 1656-1669.  \n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant.](https://doi.org/10.1016/j.csda.2022.107659) *Computational Statistics & Data Analysis* (2023): 179, 107659.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.\n  \nZhu, L., et al. [Responses of a widespread pest insect to extreme high temperatures are stage-dependent and divergent among seasonal cohorts](https://doi.org/10.1111/1365-2435.14711). *Functional Ecology* (2025): 39, 165–180. https://doi.org/10.1111/1365-2435.14711\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "doc/data_in_mvgam.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Formatting data for use in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Formatting data for use in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#required-tidy-data-format\" id=\"toc-required-tidy-data-format\">Required <em>tidy</em> data\nformat</a>\n<ul>\n<li><a href=\"#series-as-a-factor-variable\" id=\"toc-series-as-a-factor-variable\"><code>series</code> as a\n<code>factor</code> variable</a></li>\n<li><a href=\"#a-single-outcome-variable\" id=\"toc-a-single-outcome-variable\">A single outcome variable</a></li>\n<li><a href=\"#a-time-variable\" id=\"toc-a-time-variable\">A\n<code>time</code> variable</a></li>\n<li><a href=\"#irregular-sampling-intervals\" id=\"toc-irregular-sampling-intervals\">Irregular sampling\nintervals?</a></li>\n</ul></li>\n<li><a href=\"#checking-data-with-get_mvgam_priors\" id=\"toc-checking-data-with-get_mvgam_priors\">Checking data with\n<code>get_mvgam_priors()</code></a>\n<ul>\n<li><a href=\"#covariates-with-no-nas\" id=\"toc-covariates-with-no-nas\">Covariates with no\n<code>NA</code>s</a></li>\n</ul></li>\n<li><a href=\"#plotting-with-plot_mvgam_series\" id=\"toc-plotting-with-plot_mvgam_series\">Plotting with\n<code>plot_mvgam_series()</code></a></li>\n<li><a href=\"#example-with-neon-tick-data\" id=\"toc-example-with-neon-tick-data\">Example with NEON tick\ndata</a></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>This vignette gives an example of how to take raw data and format it\nfor use in <code>mvgam</code>. This is not an exhaustive example, as\ndata can be recorded and stored in a variety of ways, which requires\ndifferent approaches to wrangle the data into the necessary format for\n<code>mvgam</code>. For full details on the basic <code>mvgam</code>\nfunctionality, please see <a href=\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\">the\nintroductory vignette</a> and <a href=\"https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3&amp;si=lyg7qUrMLbD-tHCB\">the\ngrowing set of walk through video tutorials on <code>mvgam</code>\napplications</a>.</p>\n<div id=\"required-tidy-data-format\" class=\"section level2\">\n<h2>Required <em>tidy</em> data format</h2>\n<p>Manipulating the data into a ‘long’ format (i.e. <em>tidy</em>\nformat) is necessary for modelling in <code>mvgam</code>. By ‘long’\nformat, we mean that each <code>series x time</code> observation needs\nto have its own entry in the <code>dataframe</code> or <code>list</code>\nobject that we wish to pass as data for to the two primary modelling\nfunctions, <code>mvgam()</code> and <code>jsdgam()</code>. A simple\nexample can be viewed by simulating data using the\n<code>sim_mvgam()</code> function. See <code>?sim_mvgam</code> for more\ndetails</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a>simdat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>  <span class=\"at\">n_series =</span> <span class=\"dv\">4</span>, </span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>  <span class=\"at\">T =</span> <span class=\"dv\">24</span>, </span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">prop_missing =</span> <span class=\"fl\">0.2</span></span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(simdat<span class=\"sc\">$</span>data_train, <span class=\"dv\">16</span>)</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     y season year   series time</span></span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   3      1    1 series_1    1</span></span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   2      1    1 series_2    1</span></span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   2      1    1 series_3    1</span></span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   7      1    1 series_4    1</span></span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   1      2    1 series_1    2</span></span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6   3      2    1 series_2    2</span></span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7   3      2    1 series_3    2</span></span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   1      2    1 series_4    2</span></span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   1      3    1 series_1    3</span></span>\n<span id=\"cb1-17\"><a href=\"#cb1-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  4      3    1 series_2    3</span></span>\n<span id=\"cb1-18\"><a href=\"#cb1-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11  4      3    1 series_3    3</span></span>\n<span id=\"cb1-19\"><a href=\"#cb1-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 NA      3    1 series_4    3</span></span>\n<span id=\"cb1-20\"><a href=\"#cb1-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 NA      4    1 series_1    4</span></span>\n<span id=\"cb1-21\"><a href=\"#cb1-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14  2      4    1 series_2    4</span></span>\n<span id=\"cb1-22\"><a href=\"#cb1-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15  2      4    1 series_3    4</span></span>\n<span id=\"cb1-23\"><a href=\"#cb1-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16  5      4    1 series_4    4</span></span></code></pre></div>\n<div id=\"series-as-a-factor-variable\" class=\"section level3\">\n<h3><code>series</code> as a <code>factor</code> variable</h3>\n<p>Notice how we have four different time series in these simulated\ndata, and we have identified the series-level indicator as a\n<code>factor</code> variable.</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">class</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series)</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;factor&quot;</span></span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series)</span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_1&quot; &quot;series_2&quot; &quot;series_3&quot; &quot;series_4&quot;</span></span></code></pre></div>\n<p>It is important that the number of levels matches the number of\nunique series in the data to ensure indexing across series works\nproperly in the underlying modelling functions. Several of the main\nworkhorse functions in the package (including <code>mvgam()</code> and\n<code>get_mvgam_priors()</code>) will give an error if this is not the\ncase, but it may be worth checking anyway:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a><span class=\"fu\">all</span>(<span class=\"fu\">levels</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series) <span class=\"sc\">%in%</span> </span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>      <span class=\"fu\">unique</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series))</span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] TRUE</span></span></code></pre></div>\n<p>Note that you can technically supply data that does not have a\n<code>series</code> indicator, and the package will generally assume\nthat you are only using a single time series. There are exceptions to\nthis, for example if you have grouped data and would like to estimate\nhierarchical dependencies (see an example of hierarchical process error\ncorrelations in the <code>?AR</code> documentation) or if you would like\nto set up a Joint Species Distribution Model (JSDM) using a Zero-Mean\nMultivariate Gaussian distribution for the latent residuals (see\nexamples in the <code>?ZMVN</code> documentation).</p>\n</div>\n<div id=\"a-single-outcome-variable\" class=\"section level3\">\n<h3>A single outcome variable</h3>\n<p>You may also have notices that we do not spread the\n<code>numeric / integer</code>-classed outcome variable into different\ncolumns. Rather, there is only a single column for the outcome variable,\nlabelled <code>y</code> in these simulated data (though the outcome does\nnot have to be labelled <code>y</code>). This is another important\nrequirement in <code>mvgam</code>, but it shouldn’t be too unfamiliar to\n<code>R</code> users who frequently use modelling packages such as\n<code>lme4</code>, <code>mgcv</code>, <code>brms</code> or the many\nother regression modelling packages out there. The advantage of this\nformat is that it is now very easy to specify effects that vary among\ntime series:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(<span class=\"fu\">glm</span>(</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> series <span class=\"sc\">+</span> time,</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>))</span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Call:</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; glm(formula = y ~ series + time, family = poisson(), data = simdat$data_train)</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Coefficients:</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                Estimate Std. Error z value Pr(&gt;|z|)    </span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    -0.31987    0.37647  -0.850 0.395515    </span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_2  1.28070    0.37645   3.402 0.000669 ***</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_3  1.18080    0.38064   3.102 0.001921 ** </span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_4  1.17583    0.38161   3.081 0.002061 ** </span></span>\n<span id=\"cb4-16\"><a href=\"#cb4-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; time           -0.01996    0.01888  -1.057 0.290507    </span></span>\n<span id=\"cb4-17\"><a href=\"#cb4-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb4-18\"><a href=\"#cb4-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb4-19\"><a href=\"#cb4-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-20\"><a href=\"#cb4-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Dispersion parameter for poisson family taken to be 1)</span></span>\n<span id=\"cb4-21\"><a href=\"#cb4-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-22\"><a href=\"#cb4-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Null deviance: 115.3  on 59  degrees of freedom</span></span>\n<span id=\"cb4-23\"><a href=\"#cb4-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Residual deviance:  96.7  on 55  degrees of freedom</span></span>\n<span id=\"cb4-24\"><a href=\"#cb4-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   (12 observations deleted due to missingness)</span></span>\n<span id=\"cb4-25\"><a href=\"#cb4-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AIC: 214.96</span></span>\n<span id=\"cb4-26\"><a href=\"#cb4-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-27\"><a href=\"#cb4-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Number of Fisher Scoring iterations: 5</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mgcv<span class=\"sc\">::</span><span class=\"fu\">gam</span>(</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> series <span class=\"sc\">+</span> <span class=\"fu\">s</span>(time, <span class=\"at\">by =</span> series),</span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a>))</span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family: poisson </span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function: log </span></span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-10\"><a href=\"#cb5-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Formula:</span></span>\n<span id=\"cb5-11\"><a href=\"#cb5-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ series + s(time, by = series)</span></span>\n<span id=\"cb5-12\"><a href=\"#cb5-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-13\"><a href=\"#cb5-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Parametric coefficients:</span></span>\n<span id=\"cb5-14\"><a href=\"#cb5-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                Estimate Std. Error z value Pr(&gt;|z|)   </span></span>\n<span id=\"cb5-15\"><a href=\"#cb5-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)     -0.8004     0.4355  -1.838  0.06608 . </span></span>\n<span id=\"cb5-16\"><a href=\"#cb5-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_2   0.9043     0.5742   1.575  0.11526   </span></span>\n<span id=\"cb5-17\"><a href=\"#cb5-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_3   1.4777     0.4741   3.117  0.00183 **</span></span>\n<span id=\"cb5-18\"><a href=\"#cb5-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_4   1.3673     0.4806   2.845  0.00445 **</span></span>\n<span id=\"cb5-19\"><a href=\"#cb5-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb5-20\"><a href=\"#cb5-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb5-21\"><a href=\"#cb5-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-22\"><a href=\"#cb5-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of smooth terms:</span></span>\n<span id=\"cb5-23\"><a href=\"#cb5-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                          edf Ref.df Chi.sq p-value  </span></span>\n<span id=\"cb5-24\"><a href=\"#cb5-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_1 1.000  1.000  4.784  0.0287 *</span></span>\n<span id=\"cb5-25\"><a href=\"#cb5-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_2 5.767  6.810 15.826  0.0213 *</span></span>\n<span id=\"cb5-26\"><a href=\"#cb5-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_3 1.000  1.000  0.214  0.6433  </span></span>\n<span id=\"cb5-27\"><a href=\"#cb5-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_4 3.589  4.434 10.772  0.0395 *</span></span>\n<span id=\"cb5-28\"><a href=\"#cb5-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb5-29\"><a href=\"#cb5-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb5-30\"><a href=\"#cb5-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-31\"><a href=\"#cb5-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; R-sq.(adj) =  0.541   Deviance explained = 60.4%</span></span>\n<span id=\"cb5-32\"><a href=\"#cb5-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; UBRE = 0.27372  Scale est. = 1         n = 60</span></span></code></pre></div>\n<p>Depending on the observation families you plan to use when building\nmodels, there may be some restrictions that need to be satisfied within\nthe outcome variable. For example, a Beta regression can only handle\nproportional data, so values <code>&gt;= 1</code> or\n<code>&lt;= 0</code> are not allowed. Likewise, a Poisson regression can\nonly handle non-negative integers. Most regression functions in\n<code>R</code> will assume the user knows all of this and so will not\nissue any warnings or errors if you choose the wrong distribution, but\noften this ends up leading to some unhelpful error from an optimizer\nthat is difficult to interpret and diagnose. <code>mvgam</code> will\nattempt to provide some errors if you do something that is simply not\nallowed. For example, we can simulate data from a zero-centred Gaussian\ndistribution (ensuring that some of our values will be\n<code>&lt; 1</code>) and attempt a Beta regression in <code>mvgam</code>\nusing the <code>betar</code> family:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a>gauss_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">10</span>),</span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series1&quot;</span>,</span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"st\">&quot;series1&quot;</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">10</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a>gauss_dat</span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        outcome  series time</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  -0.57990666 series1    1</span></span>\n<span id=\"cb6-11\"><a href=\"#cb6-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  -0.86642679 series1    2</span></span>\n<span id=\"cb6-12\"><a href=\"#cb6-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.20127362 series1    3</span></span>\n<span id=\"cb6-13\"><a href=\"#cb6-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   1.36763744 series1    4</span></span>\n<span id=\"cb6-14\"><a href=\"#cb6-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  -0.03516434 series1    5</span></span>\n<span id=\"cb6-15\"><a href=\"#cb6-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6   0.23979092 series1    6</span></span>\n<span id=\"cb6-16\"><a href=\"#cb6-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7   0.01013158 series1    7</span></span>\n<span id=\"cb6-17\"><a href=\"#cb6-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8  -0.54771525 series1    8</span></span>\n<span id=\"cb6-18\"><a href=\"#cb6-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9  -0.48140890 series1    9</span></span>\n<span id=\"cb6-19\"><a href=\"#cb6-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 -1.20075974 series1   10</span></span></code></pre></div>\n<p>A call to <code>gam()</code> using the <code>mgcv</code> package\nleads to a model that actually fits (though it does give an unhelpful\nwarning message):</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a>mgcv<span class=\"sc\">::</span><span class=\"fu\">gam</span>(outcome <span class=\"sc\">~</span> time,</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> gauss_dat</span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family: Beta regression(0.124) </span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function: logit </span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Formula:</span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; outcome ~ time</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total model degrees of freedom 2 </span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; REML score: -180.7085</span></span></code></pre></div>\n<p>But the same call to <code>mvgam()</code> gives us something more\nuseful:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">mvgam</span>(outcome <span class=\"sc\">~</span> time,</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> gauss_dat</span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Error: Values &lt;= 0 not allowed for beta responses</span></span></code></pre></div>\n<p>Please see <code>?mvgam_families</code> for more information on the\ntypes of responses that the package can handle and their\nrestrictions</p>\n</div>\n<div id=\"a-time-variable\" class=\"section level3\">\n<h3>A <code>time</code> variable</h3>\n<p>The other requirement for most models that can be fit in\n<code>mvgam</code> is a <code>numeric / integer</code>-classed variable\nlabelled <code>time</code>. This ensures the modelling software knows\nhow to arrange the time series when building models. This setup still\nallows us to formulate multivariate time series models. If you plan to\nuse any of the autoregressive dynamic trend functions available in\n<code>mvgam</code> (see <code>?mvgam_trends</code> for details of\navailable dynamic processes), you will need to ensure your time series\nare entered with a fixed sampling interval (i.e. the time between\ntimesteps 1 and 2 should be the same as the time between timesteps 2 and\n3, etc…). But note that you can have missing observations for some (or\nall) series. <code>mvgam()</code> will check this for you, but again it\nis useful to ensure you have no missing timepoint x series combinations\nin your data. You can generally do this with a simple <code>dplyr</code>\ncall:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"co\"># A function to ensure all timepoints within a sequence are identical</span></span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a>all_times_avail <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(time, min_time, max_time) {</span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a>  <span class=\"fu\">identical</span>(</span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a>    <span class=\"fu\">as.numeric</span>(<span class=\"fu\">sort</span>(time)),</span>\n<span id=\"cb9-5\"><a href=\"#cb9-5\" tabindex=\"-1\"></a>    <span class=\"fu\">as.numeric</span>(<span class=\"fu\">seq.int</span>(<span class=\"at\">from =</span> min_time, <span class=\"at\">to =</span> max_time))</span>\n<span id=\"cb9-6\"><a href=\"#cb9-6\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb9-7\"><a href=\"#cb9-7\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb9-8\"><a href=\"#cb9-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb9-9\"><a href=\"#cb9-9\" tabindex=\"-1\"></a><span class=\"co\"># Get min and max times from the data</span></span>\n<span id=\"cb9-10\"><a href=\"#cb9-10\" tabindex=\"-1\"></a>min_time <span class=\"ot\">&lt;-</span> <span class=\"fu\">min</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>time)</span>\n<span id=\"cb9-11\"><a href=\"#cb9-11\" tabindex=\"-1\"></a>max_time <span class=\"ot\">&lt;-</span> <span class=\"fu\">max</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>time)</span>\n<span id=\"cb9-12\"><a href=\"#cb9-12\" tabindex=\"-1\"></a></span>\n<span id=\"cb9-13\"><a href=\"#cb9-13\" tabindex=\"-1\"></a><span class=\"co\"># Check that all times are recorded for each series</span></span>\n<span id=\"cb9-14\"><a href=\"#cb9-14\" tabindex=\"-1\"></a><span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb9-15\"><a href=\"#cb9-15\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series,</span>\n<span id=\"cb9-16\"><a href=\"#cb9-16\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>time</span>\n<span id=\"cb9-17\"><a href=\"#cb9-17\" tabindex=\"-1\"></a>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-18\"><a href=\"#cb9-18\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">group_by</span>(series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-19\"><a href=\"#cb9-19\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">summarise</span>(<span class=\"at\">all_there =</span> <span class=\"fu\">all_times_avail</span>(</span>\n<span id=\"cb9-20\"><a href=\"#cb9-20\" tabindex=\"-1\"></a>    time,</span>\n<span id=\"cb9-21\"><a href=\"#cb9-21\" tabindex=\"-1\"></a>    min_time,</span>\n<span id=\"cb9-22\"><a href=\"#cb9-22\" tabindex=\"-1\"></a>    max_time</span>\n<span id=\"cb9-23\"><a href=\"#cb9-23\" tabindex=\"-1\"></a>  )) <span class=\"ot\">-&gt;</span> checked_times</span>\n<span id=\"cb9-24\"><a href=\"#cb9-24\" tabindex=\"-1\"></a><span class=\"cf\">if</span> (<span class=\"fu\">any</span>(checked_times<span class=\"sc\">$</span>all_there <span class=\"sc\">==</span> <span class=\"cn\">FALSE</span>)) {</span>\n<span id=\"cb9-25\"><a href=\"#cb9-25\" tabindex=\"-1\"></a>  <span class=\"fu\">warning</span>(<span class=\"st\">&quot;One or more series in is missing observations for one or more timepoints&quot;</span>)</span>\n<span id=\"cb9-26\"><a href=\"#cb9-26\" tabindex=\"-1\"></a>} <span class=\"cf\">else</span> {</span>\n<span id=\"cb9-27\"><a href=\"#cb9-27\" tabindex=\"-1\"></a>  <span class=\"fu\">cat</span>(<span class=\"st\">&quot;All series have observations at all timepoints :)&quot;</span>)</span>\n<span id=\"cb9-28\"><a href=\"#cb9-28\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb9-29\"><a href=\"#cb9-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; All series have observations at all timepoints :)</span></span></code></pre></div>\n<p>Note that models which use dynamic components will assume that\nsmaller values of <code>time</code> are <em>older</em>\n(i.e. <code>time = 1</code> came <em>before</em> <code>time = 2</code>,\netc…)</p>\n</div>\n<div id=\"irregular-sampling-intervals\" class=\"section level3\">\n<h3>Irregular sampling intervals?</h3>\n<p>Most <code>mvgam</code> dynamic trend models expect <code>time</code>\nto be measured in discrete, evenly-spaced intervals (i.e. one\nmeasurement per week, or one per year, for example; though missing\nvalues are allowed). But please note that irregularly sampled time\nintervals are allowed, in which case the <code>CAR()</code> trend model\n(continuous time autoregressive) is appropriate. You can see an example\nof this kind of model in the <strong>Examples</strong> section in\n<code>?CAR</code>. You can also use <code>trend_model = &#39;None&#39;</code>\n(the default in <code>mvgam()</code>) and instead use a Gaussian Process\nto model temporal variation for irregularly-sampled time series. See the\n<code>?brms::gp</code> for details. But to reiterate the point from\nabove, if you do not have time series data (or don’t want to estimate\nlatent temporal dynamics) but you would like to estimate correlated\nlatent residuals among multivariate outcomes, you can set up models that\nuse <code>trend_model = ZMVN(...)</code> without the need for a\n<code>time</code> variable (see <code>?ZMVN</code> for details).</p>\n</div>\n</div>\n<div id=\"checking-data-with-get_mvgam_priors\" class=\"section level2\">\n<h2>Checking data with <code>get_mvgam_priors()</code></h2>\n<p>The <code>get_mvgam_priors()</code> function is designed to return\ninformation about the parameters in a model whose prior distributions\ncan be modified by the user. But in doing so, it will perform a series\nof checks to ensure the data are formatted properly. It can therefore be\nvery useful to new users for ensuring there isn’t anything strange going\non in the data setup. For example, we can replicate the steps taken\nabove (to check factor levels and timepoint x series combinations) with\na single call to <code>get_mvgam_priors()</code>. Here we first simulate\nsome data in which some of the timepoints in the <code>time</code>\nvariable are not included in the data:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>bad_times <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"fu\">seq</span>(<span class=\"dv\">1</span>, <span class=\"dv\">16</span>, <span class=\"at\">by =</span> <span class=\"dv\">2</span>),</span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series_1&quot;</span>),</span>\n<span id=\"cb10-4\"><a href=\"#cb10-4\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">8</span>)</span>\n<span id=\"cb10-5\"><a href=\"#cb10-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb10-6\"><a href=\"#cb10-6\" tabindex=\"-1\"></a>bad_times</span>\n<span id=\"cb10-7\"><a href=\"#cb10-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   time   series    outcome</span></span>\n<span id=\"cb10-8\"><a href=\"#cb10-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1    1 series_1  1.6357848</span></span>\n<span id=\"cb10-9\"><a href=\"#cb10-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2    3 series_1 -0.3858940</span></span>\n<span id=\"cb10-10\"><a href=\"#cb10-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3    5 series_1  1.7655861</span></span>\n<span id=\"cb10-11\"><a href=\"#cb10-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4    7 series_1 -1.4477319</span></span>\n<span id=\"cb10-12\"><a href=\"#cb10-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5    9 series_1 -1.0557525</span></span>\n<span id=\"cb10-13\"><a href=\"#cb10-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6   11 series_1  0.4308398</span></span>\n<span id=\"cb10-14\"><a href=\"#cb10-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7   13 series_1  1.9072537</span></span>\n<span id=\"cb10-15\"><a href=\"#cb10-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   15 series_1  0.1525545</span></span></code></pre></div>\n<p>Next we call <code>get_mvgam_priors()</code> by simply specifying an\nintercept-only model, which is enough to trigger all the checks:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> bad_times,</span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Error: One or more series in data is missing observations for one or more timepoints</span></span></code></pre></div>\n<p>This error is useful as it tells us where the problem is. There are\nmany ways to fill in missing timepoints, so the correct way will have to\nbe left up to the user. But if you don’t have any covariates, it should\nbe pretty easy using <code>expand.grid()</code>:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a>bad_times <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">right_join</span>(<span class=\"fu\">expand.grid</span>(</span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"fu\">seq</span>(</span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a>      <span class=\"fu\">min</span>(bad_times<span class=\"sc\">$</span>time),</span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a>      <span class=\"fu\">max</span>(bad_times<span class=\"sc\">$</span>time)</span>\n<span id=\"cb12-6\"><a href=\"#cb12-6\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb12-7\"><a href=\"#cb12-7\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"fu\">unique</span>(bad_times<span class=\"sc\">$</span>series),</span>\n<span id=\"cb12-8\"><a href=\"#cb12-8\" tabindex=\"-1\"></a>      <span class=\"at\">levels =</span> <span class=\"fu\">levels</span>(bad_times<span class=\"sc\">$</span>series)</span>\n<span id=\"cb12-9\"><a href=\"#cb12-9\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb12-10\"><a href=\"#cb12-10\" tabindex=\"-1\"></a>  )) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb12-11\"><a href=\"#cb12-11\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(time) <span class=\"ot\">-&gt;</span> good_times</span>\n<span id=\"cb12-12\"><a href=\"#cb12-12\" tabindex=\"-1\"></a>good_times</span>\n<span id=\"cb12-13\"><a href=\"#cb12-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    time   series    outcome</span></span>\n<span id=\"cb12-14\"><a href=\"#cb12-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1     1 series_1  1.6357848</span></span>\n<span id=\"cb12-15\"><a href=\"#cb12-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2     2 series_1         NA</span></span>\n<span id=\"cb12-16\"><a href=\"#cb12-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3     3 series_1 -0.3858940</span></span>\n<span id=\"cb12-17\"><a href=\"#cb12-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4     4 series_1         NA</span></span>\n<span id=\"cb12-18\"><a href=\"#cb12-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5     5 series_1  1.7655861</span></span>\n<span id=\"cb12-19\"><a href=\"#cb12-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6     6 series_1         NA</span></span>\n<span id=\"cb12-20\"><a href=\"#cb12-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7     7 series_1 -1.4477319</span></span>\n<span id=\"cb12-21\"><a href=\"#cb12-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8     8 series_1         NA</span></span>\n<span id=\"cb12-22\"><a href=\"#cb12-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9     9 series_1 -1.0557525</span></span>\n<span id=\"cb12-23\"><a href=\"#cb12-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10   10 series_1         NA</span></span>\n<span id=\"cb12-24\"><a href=\"#cb12-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11   11 series_1  0.4308398</span></span>\n<span id=\"cb12-25\"><a href=\"#cb12-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12   12 series_1         NA</span></span>\n<span id=\"cb12-26\"><a href=\"#cb12-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13   13 series_1  1.9072537</span></span>\n<span id=\"cb12-27\"><a href=\"#cb12-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14   14 series_1         NA</span></span>\n<span id=\"cb12-28\"><a href=\"#cb12-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15   15 series_1  0.1525545</span></span></code></pre></div>\n<p>Now the call to <code>get_mvgam_priors()</code>, using our filled in\ndata, should work:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> good_times,</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb13-5\"><a href=\"#cb13-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb13-6\"><a href=\"#cb13-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb13-7\"><a href=\"#cb13-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb13-8\"><a href=\"#cb13-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                   prior                   example_change</span></span>\n<span id=\"cb13-9\"><a href=\"#cb13-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.3, 2.5);      (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb13-10\"><a href=\"#cb13-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(-0.76, 0.83);</span></span>\n<span id=\"cb13-11\"><a href=\"#cb13-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb13-12\"><a href=\"#cb13-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb13-13\"><a href=\"#cb13-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<p>This function should also pick up on misaligned factor levels for the\n<code>series</code> variable. We can check this by again simulating,\nthis time adding an additional factor level that is not included in the\ndata:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a>bad_levels <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">8</span>,</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series_1&quot;</span>,</span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;series_1&quot;</span>,</span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;series_2&quot;</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">8</span>)</span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(bad_levels<span class=\"sc\">$</span>series)</span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_1&quot; &quot;series_2&quot;</span></span></code></pre></div>\n<p>Another call to <code>get_mvgam_priors()</code> brings up a useful\nerror:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> bad_levels,</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Error: Mismatch between factor levels of &quot;series&quot; and unique values of &quot;series&quot;</span></span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use</span></span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   `setdiff(levels(data$series), unique(data$series))` </span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; and</span></span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   `intersect(levels(data$series), unique(data$series))`</span></span>\n<span id=\"cb15-10\"><a href=\"#cb15-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; for guidance</span></span></code></pre></div>\n<p>Following the message’s advice tells us there is a level for\n<code>series_2</code> in the <code>series</code> variable, but there are\nno observations for this series in the data:</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">setdiff</span>(<span class=\"fu\">levels</span>(bad_levels<span class=\"sc\">$</span>series), </span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a>        <span class=\"fu\">unique</span>(bad_levels<span class=\"sc\">$</span>series))</span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_2&quot;</span></span></code></pre></div>\n<p>Re-assigning the levels fixes the issue:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a>bad_levels <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">droplevels</span>(series)) <span class=\"ot\">-&gt;</span> good_levels</span>\n<span id=\"cb17-3\"><a href=\"#cb17-3\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(good_levels<span class=\"sc\">$</span>series)</span>\n<span id=\"cb17-4\"><a href=\"#cb17-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_1&quot;</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> good_levels,</span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                  prior                  example_change</span></span>\n<span id=\"cb18-10\"><a href=\"#cb18-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  (Intercept) ~ student_t(3, 0, 2.5);     (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb18-11\"><a href=\"#cb18-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(0.46, 0.96);</span></span>\n<span id=\"cb18-12\"><a href=\"#cb18-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb18-13\"><a href=\"#cb18-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb18-14\"><a href=\"#cb18-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<div id=\"covariates-with-no-nas\" class=\"section level3\">\n<h3>Covariates with no <code>NA</code>s</h3>\n<p>Covariates can be used in models just as you would when using\n<code>mgcv</code> (see <code>?formula.gam</code> for details of the\nformula syntax). But although the outcome variable can have\n<code>NA</code>s, covariates cannot. Most regression software will\nsilently drop any raws in the model matrix that have <code>NA</code>s,\nwhich is not helpful when debugging. Both the <code>mvgam()</code> and\n<code>get_mvgam_priors()</code> functions will run some simple checks\nfor you, and hopefully will return useful errors if it finds in missing\nvalues:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a>miss_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">10</span>),</span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a>  <span class=\"at\">cov =</span> <span class=\"fu\">c</span>(<span class=\"cn\">NA</span>, <span class=\"fu\">rnorm</span>(<span class=\"dv\">9</span>)),</span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series1&quot;</span>,</span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"st\">&quot;series1&quot;</span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">10</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a>miss_dat</span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       outcome          cov  series time</span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  -0.5965054           NA series1    1</span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   0.2126416  0.154650377 series1    2</span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.9601485  1.553717403 series1    3</span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4  -0.8857684 -0.507988552 series1    4</span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  -0.4037936  0.245187700 series1    5</span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  -0.4738641 -0.009847922 series1    6</span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7  -1.2390329  0.342620485 series1    7</span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   1.9631220 -0.642393988 series1    8</span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9  -1.6783068 -1.335488789 series1    9</span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 -1.3909946 -0.254555529 series1   10</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb20-2\"><a href=\"#cb20-2\" tabindex=\"-1\"></a>  outcome <span class=\"sc\">~</span> cov,</span>\n<span id=\"cb20-3\"><a href=\"#cb20-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> miss_dat,</span>\n<span id=\"cb20-4\"><a href=\"#cb20-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb20-5\"><a href=\"#cb20-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb20-6\"><a href=\"#cb20-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb20-7\"><a href=\"#cb20-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb20-8\"><a href=\"#cb20-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2                                  cov            1     cov fixed effect</span></span>\n<span id=\"cb20-9\"><a href=\"#cb20-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb20-10\"><a href=\"#cb20-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                    prior                   example_change</span></span>\n<span id=\"cb20-11\"><a href=\"#cb20-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, -0.5, 2.5);      (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb20-12\"><a href=\"#cb20-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2              cov ~ student_t(3, 0, 2);              cov ~ normal(0, 1);</span></span>\n<span id=\"cb20-13\"><a href=\"#cb20-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(-0.43, 0.49);</span></span>\n<span id=\"cb20-14\"><a href=\"#cb20-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb20-15\"><a href=\"#cb20-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb20-16\"><a href=\"#cb20-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span>\n<span id=\"cb20-17\"><a href=\"#cb20-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3             NA             NA</span></span></code></pre></div>\n<p>Just like with the <code>mgcv</code> package, <code>mvgam</code> can\nalso accept data as a <code>list</code> object. This is useful if you\nwant to set up linear functional predictors or even distributed lag\npredictors. The checks run by <code>mvgam</code> should still work on\nthese data. Here we change the <code>cov</code> predictor to be a\n<code>matrix</code>:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>miss_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">list</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">10</span>),</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series1&quot;</span>,</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"st\">&quot;series1&quot;</span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">10</span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a>miss_dat<span class=\"sc\">$</span>cov <span class=\"ot\">&lt;-</span> <span class=\"fu\">matrix</span>(<span class=\"fu\">rnorm</span>(<span class=\"dv\">50</span>), <span class=\"at\">ncol =</span> <span class=\"dv\">5</span>, <span class=\"at\">nrow =</span> <span class=\"dv\">10</span>)</span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a>miss_dat<span class=\"sc\">$</span>cov[<span class=\"dv\">2</span>, <span class=\"dv\">3</span>] <span class=\"ot\">&lt;-</span> <span class=\"cn\">NA</span></span></code></pre></div>\n<p>A call to <code>get_mvgam_priors()</code> returns the same error:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>  outcome <span class=\"sc\">~</span> cov,</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> miss_dat,</span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb22-7\"><a href=\"#cb22-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb22-8\"><a href=\"#cb22-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2                                 cov1            1    cov1 fixed effect</span></span>\n<span id=\"cb22-9\"><a href=\"#cb22-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3                                 cov2            1    cov2 fixed effect</span></span>\n<span id=\"cb22-10\"><a href=\"#cb22-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4                                 cov3            1    cov3 fixed effect</span></span>\n<span id=\"cb22-11\"><a href=\"#cb22-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5                                 cov4            1    cov4 fixed effect</span></span>\n<span id=\"cb22-12\"><a href=\"#cb22-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6                                 cov5            1    cov5 fixed effect</span></span>\n<span id=\"cb22-13\"><a href=\"#cb22-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb22-14\"><a href=\"#cb22-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                   prior                   example_change</span></span>\n<span id=\"cb22-15\"><a href=\"#cb22-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.2, 2.5);      (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb22-16\"><a href=\"#cb22-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2            cov1 ~ student_t(3, 0, 2);             cov1 ~ normal(0, 1);</span></span>\n<span id=\"cb22-17\"><a href=\"#cb22-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3            cov2 ~ student_t(3, 0, 2);             cov2 ~ normal(0, 1);</span></span>\n<span id=\"cb22-18\"><a href=\"#cb22-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4            cov3 ~ student_t(3, 0, 2);             cov3 ~ normal(0, 1);</span></span>\n<span id=\"cb22-19\"><a href=\"#cb22-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5            cov4 ~ student_t(3, 0, 2);             cov4 ~ normal(0, 1);</span></span>\n<span id=\"cb22-20\"><a href=\"#cb22-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6            cov5 ~ student_t(3, 0, 2);             cov5 ~ normal(0, 1);</span></span>\n<span id=\"cb22-21\"><a href=\"#cb22-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7  sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(-0.86, 0.33);</span></span>\n<span id=\"cb22-22\"><a href=\"#cb22-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb22-23\"><a href=\"#cb22-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb22-24\"><a href=\"#cb22-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span>\n<span id=\"cb22-25\"><a href=\"#cb22-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3             NA             NA</span></span>\n<span id=\"cb22-26\"><a href=\"#cb22-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4             NA             NA</span></span>\n<span id=\"cb22-27\"><a href=\"#cb22-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5             NA             NA</span></span>\n<span id=\"cb22-28\"><a href=\"#cb22-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6             NA             NA</span></span>\n<span id=\"cb22-29\"><a href=\"#cb22-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7             NA             NA</span></span></code></pre></div>\n</div>\n</div>\n<div id=\"plotting-with-plot_mvgam_series\" class=\"section level2\">\n<h2>Plotting with <code>plot_mvgam_series()</code></h2>\n<p>Plotting the data is a useful way to ensure everything looks ok, once\nyou’ve gone throug the above checks on factor levels and timepoint x\nseries combinations. The <code>plot_mvgam_series()</code> function will\ntake supplied data and plot either a series of line plots (if you choose\n<code>series = &#39;all&#39;</code>) or a set of plots to describe the\ndistribution for a single time series. For example, to plot all of the\ntime series in our data, and highlight a single series in each plot, we\ncan use:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb23-3\"><a href=\"#cb23-3\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> <span class=\"st\">&quot;y&quot;</span>,</span>\n<span id=\"cb23-4\"><a href=\"#cb23-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span></span>\n<span id=\"cb23-5\"><a href=\"#cb23-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Or we can look more closely at the distribution for the first time\nseries:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> <span class=\"st\">&quot;y&quot;</span>,</span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>If you have split your data into training and testing folds (i.e. for\nforecast evaluation), you can include the test data in your plots:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test,</span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> <span class=\"st\">&quot;y&quot;</span>,</span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"example-with-neon-tick-data\" class=\"section level2\">\n<h2>Example with NEON tick data</h2>\n<p>To give one example of how data can be reformatted for\n<code>mvgam</code> modelling, we will use observations from the National\nEcological Observatory Network (NEON) tick drag cloth samples.\n<em>Ixodes scapularis</em> is a widespread tick species capable of\ntransmitting a diversity of parasites to animals and humans, many of\nwhich are zoonotic. Due to the medical and ecological importance of this\ntick species, a common goal is to understand factors that influence\ntheir abundances. The NEON field team carries out standardised <a href=\"https://www.neonscience.org/data-collection/ticks\" target=\"_blank\">long-term monitoring of tick abundances as well as other\nimportant indicators of ecological change</a>. Nymphal abundance of\n<em>I. scapularis</em> is routinely recorded across NEON plots using a\nfield sampling method called drag cloth sampling, which is a common\nmethod for sampling ticks in the landscape. Field researchers sample\nticks by dragging a large cloth behind themselves through terrain that\nis suspected of harboring ticks, usually working in a grid-like pattern.\nThe sites have been sampled since 2014, resulting in a rich dataset of\nnymph abundance time series. These tick time series show strong\nseasonality and incorporate many of the challenging features associated\nwith ecological data including overdispersion, high proportions of\nmissingness and irregular sampling in time, making them useful for\nexploring the utility of dynamic GAMs.</p>\n<p>We begin by loading NEON tick data for the years 2014 - 2021, which\nwere downloaded from NEON and prepared as described in <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.13974\" target=\"_blank\">Clark &amp; Wells 2022</a>. You can read a bit about the\ndata using the call <code>?all_neon_tick_data</code></p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">data</span>(<span class=\"st\">&quot;all_neon_tick_data&quot;</span>)</span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>(all_neon_tick_data))</span>\n<span id=\"cb26-3\"><a href=\"#cb26-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; tibble [3,505 × 24] (S3: tbl_df/tbl/data.frame)</span></span>\n<span id=\"cb26-4\"><a href=\"#cb26-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ Year                : num [1:3505] 2015 2015 2015 2015 2015 ...</span></span>\n<span id=\"cb26-5\"><a href=\"#cb26-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ epiWeek             : chr [1:3505] &quot;37&quot; &quot;38&quot; &quot;39&quot; &quot;40&quot; ...</span></span>\n<span id=\"cb26-6\"><a href=\"#cb26-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ yearWeek            : chr [1:3505] &quot;201537&quot; &quot;201538&quot; &quot;201539&quot; &quot;201540&quot; ...</span></span>\n<span id=\"cb26-7\"><a href=\"#cb26-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ plotID              : chr [1:3505] &quot;BLAN_005&quot; &quot;BLAN_005&quot; &quot;BLAN_005&quot; &quot;BLAN_005&quot; ...</span></span>\n<span id=\"cb26-8\"><a href=\"#cb26-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ siteID              : chr [1:3505] &quot;BLAN&quot; &quot;BLAN&quot; &quot;BLAN&quot; &quot;BLAN&quot; ...</span></span>\n<span id=\"cb26-9\"><a href=\"#cb26-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ nlcdClass           : chr [1:3505] &quot;deciduousForest&quot; &quot;deciduousForest&quot; &quot;deciduousForest&quot; &quot;deciduousForest&quot; ...</span></span>\n<span id=\"cb26-10\"><a href=\"#cb26-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ decimalLatitude     : num [1:3505] 39.1 39.1 39.1 39.1 39.1 ...</span></span>\n<span id=\"cb26-11\"><a href=\"#cb26-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ decimalLongitude    : num [1:3505] -78 -78 -78 -78 -78 ...</span></span>\n<span id=\"cb26-12\"><a href=\"#cb26-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ elevation           : num [1:3505] 168 168 168 168 168 ...</span></span>\n<span id=\"cb26-13\"><a href=\"#cb26-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ totalSampledArea    : num [1:3505] 162 NA NA NA 162 NA NA NA NA 164 ...</span></span>\n<span id=\"cb26-14\"><a href=\"#cb26-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ amblyomma_americanum: num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-15\"><a href=\"#cb26-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ ixodes_scapularis   : num [1:3505] 2 NA NA NA 0 NA NA NA NA 0 ...</span></span>\n<span id=\"cb26-16\"><a href=\"#cb26-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ time                : Date[1:3505], format: &quot;2015-09-13&quot; &quot;2015-09-20&quot; ...</span></span>\n<span id=\"cb26-17\"><a href=\"#cb26-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMin_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-18\"><a href=\"#cb26-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMin_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-19\"><a href=\"#cb26-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMax_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-20\"><a href=\"#cb26-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMax_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-21\"><a href=\"#cb26-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMin_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-22\"><a href=\"#cb26-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMin_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-23\"><a href=\"#cb26-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMax_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-24\"><a href=\"#cb26-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMax_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-25\"><a href=\"#cb26-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ soi                 : num [1:3505] -18.4 -17.9 -23.5 -28.4 -25.9 ...</span></span>\n<span id=\"cb26-26\"><a href=\"#cb26-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ cum_sdd             : num [1:3505] 173 173 173 173 173 ...</span></span>\n<span id=\"cb26-27\"><a href=\"#cb26-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ cum_gdd             : num [1:3505] 1129 1129 1129 1129 1129 ...</span></span></code></pre></div>\n<p>For this exercise, we will use the <code>epiWeek</code> variable as\nan index of seasonality, and we will only work with observations from a\nfew sampling plots (labelled in the <code>plotID</code> column):</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>plotIDs <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;SCBI_013&quot;</span>, <span class=\"st\">&quot;SCBI_002&quot;</span>,</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;SERC_001&quot;</span>, <span class=\"st\">&quot;SERC_005&quot;</span>,</span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;SERC_006&quot;</span>, <span class=\"st\">&quot;SERC_012&quot;</span>,</span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;BLAN_012&quot;</span>, <span class=\"st\">&quot;BLAN_005&quot;</span></span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Now we can select the target species we want (<em>I.\nscapularis</em>), filter to the correct plot IDs and convert the\n<code>epiWeek</code> variable from <code>character</code> to\n<code>numeric</code>:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a>model_dat <span class=\"ot\">&lt;-</span> all_neon_tick_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>() <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-3\"><a href=\"#cb28-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">target =</span> ixodes_scapularis) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-4\"><a href=\"#cb28-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(plotID <span class=\"sc\">%in%</span> plotIDs) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-5\"><a href=\"#cb28-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(Year, epiWeek, plotID, target) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-6\"><a href=\"#cb28-6\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">epiWeek =</span> <span class=\"fu\">as.numeric</span>(epiWeek))</span></code></pre></div>\n<p>Now is the tricky part: we need to fill in missing observations with\n<code>NA</code>s. The tick data are sparse in that field observers do\nnot go out and sample in each possible <code>epiWeek</code>. So there\nare many particular weeks in which observations are not included in the\ndata. But we can use <code>expand.grid()</code> again to take care of\nthis:</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a>model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a>  <span class=\"co\"># Create all possible combos of plotID, Year and epiWeek;</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a>  <span class=\"co\"># missing outcomes will be filled in as NA</span></span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">full_join</span>(<span class=\"fu\">expand.grid</span>(</span>\n<span id=\"cb29-5\"><a href=\"#cb29-5\" tabindex=\"-1\"></a>    <span class=\"at\">plotID =</span> <span class=\"fu\">unique</span>(model_dat<span class=\"sc\">$</span>plotID),</span>\n<span id=\"cb29-6\"><a href=\"#cb29-6\" tabindex=\"-1\"></a>    <span class=\"at\">Year =</span> <span class=\"fu\">unique</span>(model_dat<span class=\"sc\">$</span>Year),</span>\n<span id=\"cb29-7\"><a href=\"#cb29-7\" tabindex=\"-1\"></a>    <span class=\"at\">epiWeek =</span> <span class=\"fu\">seq</span>(<span class=\"dv\">1</span>, <span class=\"dv\">52</span>)</span>\n<span id=\"cb29-8\"><a href=\"#cb29-8\" tabindex=\"-1\"></a>  )) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-9\"><a href=\"#cb29-9\" tabindex=\"-1\"></a>  <span class=\"co\"># left_join back to original data so plotID and siteID will</span></span>\n<span id=\"cb29-10\"><a href=\"#cb29-10\" tabindex=\"-1\"></a>  <span class=\"co\"># match up, in case you need the siteID for anything else later on</span></span>\n<span id=\"cb29-11\"><a href=\"#cb29-11\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">left_join</span>(all_neon_tick_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-12\"><a href=\"#cb29-12\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(siteID, plotID) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-13\"><a href=\"#cb29-13\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">distinct</span>()) <span class=\"ot\">-&gt;</span> model_dat</span></code></pre></div>\n<p>Create the <code>series</code> variable needed for <code>mvgam</code>\nmodelling:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a>model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> plotID,</span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a>    <span class=\"at\">y =</span> target</span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a>    <span class=\"at\">siteID =</span> <span class=\"fu\">factor</span>(siteID),</span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(series)</span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(<span class=\"sc\">-</span>target, <span class=\"sc\">-</span>plotID) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-11\"><a href=\"#cb30-11\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(Year, epiWeek, series) <span class=\"ot\">-&gt;</span> model_dat</span></code></pre></div>\n<p>Now create the <code>time</code> variable, which needs to track\n<code>Year</code> and <code>epiWeek</code> for each unique series. The\n<code>n</code> function from <code>dplyr</code> is often useful if\ngenerating a <code>time</code> index for grouped dataframes:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb31-1\"><a href=\"#cb31-1\" tabindex=\"-1\"></a>model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-2\"><a href=\"#cb31-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>() <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-3\"><a href=\"#cb31-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">group_by</span>(series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-4\"><a href=\"#cb31-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(Year, epiWeek) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-5\"><a href=\"#cb31-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">time =</span> <span class=\"fu\">seq</span>(<span class=\"dv\">1</span>, dplyr<span class=\"sc\">::</span><span class=\"fu\">n</span>())) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-6\"><a href=\"#cb31-6\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>() <span class=\"ot\">-&gt;</span> model_dat</span></code></pre></div>\n<p>Check factor levels for the <code>series</code>:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb32-1\"><a href=\"#cb32-1\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(model_dat<span class=\"sc\">$</span>series)</span>\n<span id=\"cb32-2\"><a href=\"#cb32-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;BLAN_005&quot; &quot;BLAN_012&quot; &quot;SCBI_002&quot; &quot;SCBI_013&quot; &quot;SERC_001&quot; &quot;SERC_005&quot; &quot;SERC_006&quot;</span></span>\n<span id=\"cb32-3\"><a href=\"#cb32-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [8] &quot;SERC_012&quot;</span></span></code></pre></div>\n<p>This looks good, as does a more rigorous check using\n<code>get_mvgam_priors()</code>:</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb33-1\"><a href=\"#cb33-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb33-2\"><a href=\"#cb33-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb33-3\"><a href=\"#cb33-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat,</span>\n<span id=\"cb33-4\"><a href=\"#cb33-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb33-5\"><a href=\"#cb33-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb33-6\"><a href=\"#cb33-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    param_name param_length  param_info                                  prior</span></span>\n<span id=\"cb33-7\"><a href=\"#cb33-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept)            1 (Intercept) (Intercept) ~ student_t(3, -2.3, 2.5);</span></span>\n<span id=\"cb33-8\"><a href=\"#cb33-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                example_change new_lowerbound new_upperbound</span></span>\n<span id=\"cb33-9\"><a href=\"#cb33-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ normal(0, 1);             NA             NA</span></span></code></pre></div>\n<p>We can also set up a model in <code>mvgam()</code> but use\n<code>run_model = FALSE</code> to further ensure all of the necessary\nsteps for creating the modelling code and objects will run. It is\nrecommended that you use the <code>cmdstanr</code> backend if possible,\nas the auto-formatting options available in this package are very useful\nfor checking the package-generated <code>Stan</code> code for any\ninefficiencies that can be fixed to lead to sampling performance\nimprovements:</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb34-1\"><a href=\"#cb34-1\" tabindex=\"-1\"></a>testmod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb34-2\"><a href=\"#cb34-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"fu\">s</span>(epiWeek, <span class=\"at\">by =</span> series, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb34-3\"><a href=\"#cb34-3\" tabindex=\"-1\"></a>    <span class=\"fu\">s</span>(series, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>),</span>\n<span id=\"cb34-4\"><a href=\"#cb34-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb34-5\"><a href=\"#cb34-5\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat,</span>\n<span id=\"cb34-6\"><a href=\"#cb34-6\" tabindex=\"-1\"></a>  <span class=\"at\">backend =</span> <span class=\"st\">&quot;cmdstanr&quot;</span>,</span>\n<span id=\"cb34-7\"><a href=\"#cb34-7\" tabindex=\"-1\"></a>  <span class=\"at\">run_model =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb34-8\"><a href=\"#cb34-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>This call runs without issue, and the resulting object now contains\nthe model code and data objects that are needed to initiate\nsampling:</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb35-1\"><a href=\"#cb35-1\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(testmod<span class=\"sc\">$</span>model_data)</span>\n<span id=\"cb35-2\"><a href=\"#cb35-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 25</span></span>\n<span id=\"cb35-3\"><a href=\"#cb35-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ y           : num [1:416, 1:8] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...</span></span>\n<span id=\"cb35-4\"><a href=\"#cb35-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n           : int 416</span></span>\n<span id=\"cb35-5\"><a href=\"#cb35-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ X           : num [1:3328, 1:73] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb35-6\"><a href=\"#cb35-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb35-7\"><a href=\"#cb35-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:3328] &quot;1&quot; &quot;2&quot; &quot;3&quot; &quot;4&quot; ...</span></span>\n<span id=\"cb35-8\"><a href=\"#cb35-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:73] &quot;X.Intercept.&quot; &quot;V2&quot; &quot;V3&quot; &quot;V4&quot; ...</span></span>\n<span id=\"cb35-9\"><a href=\"#cb35-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S1          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-10\"><a href=\"#cb35-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ zero        : num [1:73] 0 0 0 0 0 0 0 0 0 0 ...</span></span>\n<span id=\"cb35-11\"><a href=\"#cb35-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S2          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-12\"><a href=\"#cb35-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S3          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-13\"><a href=\"#cb35-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S4          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-14\"><a href=\"#cb35-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S5          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-15\"><a href=\"#cb35-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S6          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-16\"><a href=\"#cb35-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S7          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-17\"><a href=\"#cb35-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S8          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-18\"><a href=\"#cb35-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ p_coefs     : Named num 0</span></span>\n<span id=\"cb35-19\"><a href=\"#cb35-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;names&quot;)= chr &quot;(Intercept)&quot;</span></span>\n<span id=\"cb35-20\"><a href=\"#cb35-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ p_taus      : num 1.02</span></span>\n<span id=\"cb35-21\"><a href=\"#cb35-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ ytimes      : int [1:416, 1:8] 1 9 17 25 33 41 49 57 65 73 ...</span></span>\n<span id=\"cb35-22\"><a href=\"#cb35-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n_series    : int 8</span></span>\n<span id=\"cb35-23\"><a href=\"#cb35-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ sp          : Named num [1:9] 0.368 0.368 0.368 0.368 0.368 ...</span></span>\n<span id=\"cb35-24\"><a href=\"#cb35-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;names&quot;)= chr [1:9] &quot;s(epiWeek):seriesBLAN_005&quot; &quot;s(epiWeek):seriesBLAN_012&quot; &quot;s(epiWeek):seriesSCBI_002&quot; &quot;s(epiWeek):seriesSCBI_013&quot; ...</span></span>\n<span id=\"cb35-25\"><a href=\"#cb35-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ y_observed  : num [1:416, 1:8] 0 0 0 0 0 0 0 0 0 0 ...</span></span>\n<span id=\"cb35-26\"><a href=\"#cb35-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ total_obs   : int 3328</span></span>\n<span id=\"cb35-27\"><a href=\"#cb35-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ num_basis   : int 73</span></span>\n<span id=\"cb35-28\"><a href=\"#cb35-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n_sp        : num 9</span></span>\n<span id=\"cb35-29\"><a href=\"#cb35-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n_nonmissing: int 400</span></span>\n<span id=\"cb35-30\"><a href=\"#cb35-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ obs_ind     : int [1:400] 89 93 98 101 115 118 121 124 127 130 ...</span></span>\n<span id=\"cb35-31\"><a href=\"#cb35-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ flat_ys     : num [1:400] 2 0 0 0 0 0 0 25 36 14 ...</span></span>\n<span id=\"cb35-32\"><a href=\"#cb35-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ flat_xs     : num [1:400, 1:73] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb35-33\"><a href=\"#cb35-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb35-34\"><a href=\"#cb35-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:400] &quot;705&quot; &quot;737&quot; &quot;777&quot; &quot;801&quot; ...</span></span>\n<span id=\"cb35-35\"><a href=\"#cb35-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:73] &quot;X.Intercept.&quot; &quot;V2&quot; &quot;V3&quot; &quot;V4&quot; ...</span></span>\n<span id=\"cb35-36\"><a href=\"#cb35-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;trend_model&quot;)= chr &quot;AR1&quot;</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb36-1\"><a href=\"#cb36-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(testmod)</span>\n<span id=\"cb36-2\"><a href=\"#cb36-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb36-3\"><a href=\"#cb36-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb36-4\"><a href=\"#cb36-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb36-5\"><a href=\"#cb36-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb36-6\"><a href=\"#cb36-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span></span>\n<span id=\"cb36-7\"><a href=\"#cb36-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb36-8\"><a href=\"#cb36-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb36-9\"><a href=\"#cb36-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] zero; // prior locations for basis coefficients</span></span>\n<span id=\"cb36-10\"><a href=\"#cb36-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb36-11\"><a href=\"#cb36-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb36-12\"><a href=\"#cb36-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span></span>\n<span id=\"cb36-13\"><a href=\"#cb36-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S2; // mgcv smooth penalty matrix S2</span></span>\n<span id=\"cb36-14\"><a href=\"#cb36-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S3; // mgcv smooth penalty matrix S3</span></span>\n<span id=\"cb36-15\"><a href=\"#cb36-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S4; // mgcv smooth penalty matrix S4</span></span>\n<span id=\"cb36-16\"><a href=\"#cb36-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S5; // mgcv smooth penalty matrix S5</span></span>\n<span id=\"cb36-17\"><a href=\"#cb36-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S6; // mgcv smooth penalty matrix S6</span></span>\n<span id=\"cb36-18\"><a href=\"#cb36-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S7; // mgcv smooth penalty matrix S7</span></span>\n<span id=\"cb36-19\"><a href=\"#cb36-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S8; // mgcv smooth penalty matrix S8</span></span>\n<span id=\"cb36-20\"><a href=\"#cb36-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb36-21\"><a href=\"#cb36-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb36-22\"><a href=\"#cb36-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb36-23\"><a href=\"#cb36-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb36-24\"><a href=\"#cb36-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-25\"><a href=\"#cb36-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb36-26\"><a href=\"#cb36-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb36-27\"><a href=\"#cb36-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb36-28\"><a href=\"#cb36-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-29\"><a href=\"#cb36-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect variances</span></span>\n<span id=\"cb36-30\"><a href=\"#cb36-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[1] sigma_raw;</span></span>\n<span id=\"cb36-31\"><a href=\"#cb36-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-32\"><a href=\"#cb36-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect means</span></span>\n<span id=\"cb36-33\"><a href=\"#cb36-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[1] mu_raw;</span></span>\n<span id=\"cb36-34\"><a href=\"#cb36-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-35\"><a href=\"#cb36-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent trend AR1 terms</span></span>\n<span id=\"cb36-36\"><a href=\"#cb36-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span></span>\n<span id=\"cb36-37\"><a href=\"#cb36-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-38\"><a href=\"#cb36-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent trend variance parameters</span></span>\n<span id=\"cb36-39\"><a href=\"#cb36-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_series] sigma;</span></span>\n<span id=\"cb36-40\"><a href=\"#cb36-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-41\"><a href=\"#cb36-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent trends</span></span>\n<span id=\"cb36-42\"><a href=\"#cb36-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span id=\"cb36-43\"><a href=\"#cb36-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-44\"><a href=\"#cb36-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb36-45\"><a href=\"#cb36-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp] lambda;</span></span>\n<span id=\"cb36-46\"><a href=\"#cb36-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-47\"><a href=\"#cb36-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb36-48\"><a href=\"#cb36-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb36-49\"><a href=\"#cb36-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb36-50\"><a href=\"#cb36-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : 65] = b_raw[1 : 65];</span></span>\n<span id=\"cb36-51\"><a href=\"#cb36-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[66 : 73] = mu_raw[1] + b_raw[66 : 73] * sigma_raw[1];</span></span>\n<span id=\"cb36-52\"><a href=\"#cb36-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-53\"><a href=\"#cb36-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb36-54\"><a href=\"#cb36-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population variances</span></span>\n<span id=\"cb36-55\"><a href=\"#cb36-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma_raw ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb36-56\"><a href=\"#cb36-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-57\"><a href=\"#cb36-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population means</span></span>\n<span id=\"cb36-58\"><a href=\"#cb36-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   mu_raw ~ std_normal();</span></span>\n<span id=\"cb36-59\"><a href=\"#cb36-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-60\"><a href=\"#cb36-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)...</span></span>\n<span id=\"cb36-61\"><a href=\"#cb36-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, -2.3, 2.5);</span></span>\n<span id=\"cb36-62\"><a href=\"#cb36-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-63\"><a href=\"#cb36-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesBLAN_005...</span></span>\n<span id=\"cb36-64\"><a href=\"#cb36-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2 : 9] ~ multi_normal_prec(zero[2 : 9], S1[1 : 8, 1 : 8] * lambda[1]);</span></span>\n<span id=\"cb36-65\"><a href=\"#cb36-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-66\"><a href=\"#cb36-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesBLAN_012...</span></span>\n<span id=\"cb36-67\"><a href=\"#cb36-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[10 : 17] ~ multi_normal_prec(zero[10 : 17],</span></span>\n<span id=\"cb36-68\"><a href=\"#cb36-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S2[1 : 8, 1 : 8] * lambda[2]);</span></span>\n<span id=\"cb36-69\"><a href=\"#cb36-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-70\"><a href=\"#cb36-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSCBI_002...</span></span>\n<span id=\"cb36-71\"><a href=\"#cb36-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[18 : 25] ~ multi_normal_prec(zero[18 : 25],</span></span>\n<span id=\"cb36-72\"><a href=\"#cb36-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S3[1 : 8, 1 : 8] * lambda[3]);</span></span>\n<span id=\"cb36-73\"><a href=\"#cb36-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-74\"><a href=\"#cb36-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSCBI_013...</span></span>\n<span id=\"cb36-75\"><a href=\"#cb36-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[26 : 33] ~ multi_normal_prec(zero[26 : 33],</span></span>\n<span id=\"cb36-76\"><a href=\"#cb36-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S4[1 : 8, 1 : 8] * lambda[4]);</span></span>\n<span id=\"cb36-77\"><a href=\"#cb36-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-78\"><a href=\"#cb36-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_001...</span></span>\n<span id=\"cb36-79\"><a href=\"#cb36-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[34 : 41] ~ multi_normal_prec(zero[34 : 41],</span></span>\n<span id=\"cb36-80\"><a href=\"#cb36-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S5[1 : 8, 1 : 8] * lambda[5]);</span></span>\n<span id=\"cb36-81\"><a href=\"#cb36-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-82\"><a href=\"#cb36-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_005...</span></span>\n<span id=\"cb36-83\"><a href=\"#cb36-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[42 : 49] ~ multi_normal_prec(zero[42 : 49],</span></span>\n<span id=\"cb36-84\"><a href=\"#cb36-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S6[1 : 8, 1 : 8] * lambda[6]);</span></span>\n<span id=\"cb36-85\"><a href=\"#cb36-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-86\"><a href=\"#cb36-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_006...</span></span>\n<span id=\"cb36-87\"><a href=\"#cb36-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[50 : 57] ~ multi_normal_prec(zero[50 : 57],</span></span>\n<span id=\"cb36-88\"><a href=\"#cb36-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S7[1 : 8, 1 : 8] * lambda[7]);</span></span>\n<span id=\"cb36-89\"><a href=\"#cb36-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-90\"><a href=\"#cb36-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_012...</span></span>\n<span id=\"cb36-91\"><a href=\"#cb36-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[58 : 65] ~ multi_normal_prec(zero[58 : 65],</span></span>\n<span id=\"cb36-92\"><a href=\"#cb36-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S8[1 : 8, 1 : 8] * lambda[8]);</span></span>\n<span id=\"cb36-93\"><a href=\"#cb36-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-94\"><a href=\"#cb36-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior (non-centred) for s(series)...</span></span>\n<span id=\"cb36-95\"><a href=\"#cb36-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[66 : 73] ~ std_normal();</span></span>\n<span id=\"cb36-96\"><a href=\"#cb36-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-97\"><a href=\"#cb36-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for AR parameters</span></span>\n<span id=\"cb36-98\"><a href=\"#cb36-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ar1 ~ std_normal();</span></span>\n<span id=\"cb36-99\"><a href=\"#cb36-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-100\"><a href=\"#cb36-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for smoothing parameters</span></span>\n<span id=\"cb36-101\"><a href=\"#cb36-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda ~ normal(5, 30);</span></span>\n<span id=\"cb36-102\"><a href=\"#cb36-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-103\"><a href=\"#cb36-103\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for latent trend variance parameters</span></span>\n<span id=\"cb36-104\"><a href=\"#cb36-104\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb36-105\"><a href=\"#cb36-105\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-106\"><a href=\"#cb36-106\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // trend estimates</span></span>\n<span id=\"cb36-107\"><a href=\"#cb36-107\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   trend[1, 1 : n_series] ~ normal(0, sigma);</span></span>\n<span id=\"cb36-108\"><a href=\"#cb36-108\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb36-109\"><a href=\"#cb36-109\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]);</span></span>\n<span id=\"cb36-110\"><a href=\"#cb36-110\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-111\"><a href=\"#cb36-111\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb36-112\"><a href=\"#cb36-112\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb36-113\"><a href=\"#cb36-113\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     vector[n_nonmissing] flat_trends;</span></span>\n<span id=\"cb36-114\"><a href=\"#cb36-114\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_trends = to_vector(trend)[obs_ind];</span></span>\n<span id=\"cb36-115\"><a href=\"#cb36-115\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span></span>\n<span id=\"cb36-116\"><a href=\"#cb36-116\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               append_row(b, 1.0));</span></span>\n<span id=\"cb36-117\"><a href=\"#cb36-117\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-118\"><a href=\"#cb36-118\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-119\"><a href=\"#cb36-119\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb36-120\"><a href=\"#cb36-120\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb36-121\"><a href=\"#cb36-121\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb36-122\"><a href=\"#cb36-122\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp] rho;</span></span>\n<span id=\"cb36-123\"><a href=\"#cb36-123\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_series] tau;</span></span>\n<span id=\"cb36-124\"><a href=\"#cb36-124\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb36-125\"><a href=\"#cb36-125\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   rho = log(lambda);</span></span>\n<span id=\"cb36-126\"><a href=\"#cb36-126\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb36-127\"><a href=\"#cb36-127\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     tau[s] = pow(sigma[s], -2.0);</span></span>\n<span id=\"cb36-128\"><a href=\"#cb36-128\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-129\"><a href=\"#cb36-129\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-130\"><a href=\"#cb36-130\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb36-131\"><a href=\"#cb36-131\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb36-132\"><a href=\"#cb36-132\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb36-133\"><a href=\"#cb36-133\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span></span>\n<span id=\"cb36-134\"><a href=\"#cb36-134\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb36-135\"><a href=\"#cb36-135\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-136\"><a href=\"#cb36-136\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nDynamic GAMs and how they can be applied in practice:</p>\n<p>Clark, Nicholas J. and Wells, K. <a href=\"https://doi.org/10.1111/2041-210X.13974\">Dynamic Generalized\nAdditive Models (DGAMs) for forecasting discrete ecological time\nseries</a>. <em>Methods in Ecology and Evolution</em>. (2023): 14,\n771-784.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>de Sousa, Heitor C., et al. <a href=\"https://doi.org/10.1111/1365-2656.14188\">Severe fire regimes\ndecrease resilience of ectothermic populations</a>. <em>Journal of\nAnimal Ecology</em> (2024): 93(11), 1656-1669.</p>\n<p>Hannaford, Naomi E., et al. <a href=\"https://doi.org/10.1016/j.csda.2022.107659\">A sparse Bayesian\nhierarchical vector autoregressive model for microbial dynamics in a\nwastewater treatment plant.</a> <em>Computational Statistics &amp; Data\nAnalysis</em> (2023): 179, 107659.</p>\n<p>Karunarathna, K.A.N.K., et al. <a href=\"https://doi.org/10.1016/j.ecolmodel.2024.110648\">Modelling\nnonlinear responses of a desert rodent species to environmental change\nwith hierarchical dynamic generalized additive models</a>.\n<em>Ecological Modelling</em> (2024): 490, 110648.</p>\n<p>Zhu, L., et al. <a href=\"https://doi.org/10.1111/1365-2435.14711\">Responses of a widespread\npest insect to extreme high temperatures are stage-dependent and\ndivergent among seasonal cohorts</a>. <em>Functional Ecology</em>\n(2025): 39, 165–180. <a href=\"https://doi.org/10.1111/1365-2435.14711\" class=\"uri\">https://doi.org/10.1111/1365-2435.14711</a></p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "doc/forecast_evaluation.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nset.seed(1)\nsimdat <- sim_mvgam(\n  T = 100,\n  n_series = 3,\n  mu = 2,\n  trend_model = GP(),\n  prop_trend = 0.75,\n  family = poisson(),\n  prop_missing = 0.10\n)\n\n\n## --------------------------------------------------------------------------------\nstr(simdat)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  series = \"all\"\n)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  series = 1\n)\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  newdata = simdat$data_test\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod1 <- mvgam(\n#   y ~ s(season, bs = \"cc\", k = 8) +\n#     s(time, by = series, bs = \"cr\", k = 20),\n#   knots = list(season = c(0.5, 12.5)),\n#   trend_model = \"None\",\n#   data = simdat$data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod1, include_betas = FALSE)\n\n\n## ----fig.alt = \"Plotting GAM smooth functions using mvgam\"-----------------------\nconditional_effects(mod1, type = \"link\")\n\n\n## ----include=FALSE, message=FALSE------------------------------------------------\nmod2 <- mvgam(\n  y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod2 <- mvgam(y ~ 1,\n#   trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n#   trend_knots = list(season = c(0.5, 12.5)),\n#   trend_model = AR(cor = TRUE),\n#   noncentred = TRUE,\n#   data = simdat$data_train,\n#   silent = 1\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod2, include_betas = FALSE)\n\n\n## ----fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"---------\nmcmc_plot(mod2, variable = \"ar\", regex = TRUE, type = \"areas\")\n\n\n## ----fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"---------\nmcmc_plot(mod2, variable = \"sigma\", regex = TRUE, type = \"areas\")\n\n\n## ----fig.alt = \"Plotting latent Gaussian Process effects in mvgam and marginaleffects\"----\nconditional_effects(mod2, type = \"link\")\n\n\n## --------------------------------------------------------------------------------\nfc_mod1 <- forecast(mod1, newdata = simdat$data_test)\nfc_mod2 <- forecast(mod2, newdata = simdat$data_test)\n\n\n## --------------------------------------------------------------------------------\nstr(fc_mod1)\n\n\n## --------------------------------------------------------------------------------\nplot(fc_mod1, series = 1)\nplot(fc_mod2, series = 1)\n\nplot(fc_mod1, series = 2)\nplot(fc_mod2, series = 2)\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod2 <- mvgam(\n  y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod2 <- mvgam(y ~ 1,\n#   trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n#   trend_knots = list(season = c(0.5, 12.5)),\n#   trend_model = AR(cor = TRUE),\n#   noncentred = TRUE,\n#   data = simdat$data_train,\n#   newdata = simdat$data_test,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nfc_mod2 <- forecast(mod2)\n\n\n## ----warning=FALSE, fig.alt = \"Plotting posterior forecast distributions using mvgam and R\"----\nplot(fc_mod2, series = 1)\n\n\n## ----warning=FALSE---------------------------------------------------------------\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\nstr(crps_mod1)\ncrps_mod1$series_1\n\n\n## ----warning=FALSE---------------------------------------------------------------\ncrps_mod1 <- score(fc_mod1, score = \"crps\", interval_width = 0.6)\ncrps_mod1$series_1\n\n\n## --------------------------------------------------------------------------------\nlink_mod1 <- forecast(mod1, newdata = simdat$data_test, type = \"link\")\nscore(link_mod1, score = \"elpd\")$series_1\n\n\n## --------------------------------------------------------------------------------\nenergy_mod2 <- score(fc_mod2, score = \"energy\")\nstr(energy_mod2)\n\n\n## --------------------------------------------------------------------------------\nenergy_mod2$all_series\n\n\n## --------------------------------------------------------------------------------\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\ncrps_mod2 <- score(fc_mod2, score = \"crps\")\n\ndiff_scores <- crps_mod2$series_1$score -\n  crps_mod1$series_1$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(\n  main = paste0(\n    \"AR(1) better in \",\n    ar1_better,\n    \" of \",\n    length(diff_scores),\n    \" evaluations\",\n    \"\\nMean difference = \",\n    round(mean(diff_scores, na.rm = TRUE), 2)\n  )\n)\n\n\ndiff_scores <- crps_mod2$series_2$score -\n  crps_mod1$series_2$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(\n  main = paste0(\n    \"AR(1) better in \",\n    ar1_better,\n    \" of \",\n    length(diff_scores),\n    \" evaluations\",\n    \"\\nMean difference = \",\n    round(mean(diff_scores, na.rm = TRUE), 2)\n  )\n)\n\ndiff_scores <- crps_mod2$series_3$score -\n  crps_mod1$series_3$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(\n  main = paste0(\n    \"AR(1) better in \",\n    ar1_better,\n    \" of \",\n    length(diff_scores),\n    \" evaluations\",\n    \"\\nMean difference = \",\n    round(mean(diff_scores, na.rm = TRUE), 2)\n  )\n)\n"
  },
  {
    "path": "doc/forecast_evaluation.Rmd",
    "content": "---\ntitle: \"Forecasting and forecast evaluation in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Forecasting and forecast evaluation in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to produce probabilistic forecasts and to evaluate those forecasts using a variety of proper scoring rules.\n\n## Simulating discrete time series\nWe begin by simulating some data to show how forecasts are computed and evaluated in `mvgam`. The `sim_mvgam()` function can be used to simulate series that come from a variety of response distributions as well as seasonal patterns and/or dynamic temporal patterns. Here we simulate a collection of three time count-valued series. These series all share the same seasonal pattern but have different temporal dynamics. By setting `trend_model = GP()` and `prop_trend = 0.75`, we are generating time series that have smooth underlying temporal trends (evolving as Gaussian Processes with squared exponential kernel) and moderate seasonal patterns. The observations are Poisson-distributed and we allow 10% of observations to be missing.\n```{r}\nset.seed(1)\nsimdat <- sim_mvgam(\n  T = 100,\n  n_series = 3,\n  mu = 2,\n  trend_model = GP(),\n  prop_trend = 0.75,\n  family = poisson(),\n  prop_missing = 0.10\n)\n```\n\nThe returned object is a `list` containing training and testing data (`sim_mvgam()` automatically splits the data into these folds for us) together with some other information about the data generating process that was used to simulate the data\n```{r}\nstr(simdat)\n```\n\nEach series in this case has a shared seasonal pattern. The resulting time series are similar to what we might encounter when dealing with count-valued data that can take small counts:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  series = \"all\"\n)\n```\n\nFor individual series, we can plot the training and testing data, as well as some more specific features of the observed data:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  series = 1\n)\n```\n\n### Modelling dynamics with splines\nThe first model we will fit uses a shared cyclic spline to capture the repeated seasonality, as well as series-specific splines of time to capture the long-term dynamics. We allow the temporal splines to be fairly complex so they can capture as much of the temporal variation as possible:\n```{r include=FALSE}\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  newdata = simdat$data_test\n)\n```\n\n```{r eval=FALSE}\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, bs = \"cr\", k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\nThe model fits without issue:\n```{r}\nsummary(mod1, include_betas = FALSE)\n```\n\nAnd we can plot the conditional effects of the splines (on the link scale) to see that they are estimated to be highly nonlinear\n```{r, fig.alt = \"Plotting GAM smooth functions using mvgam\"}\nconditional_effects(mod1, type = \"link\")\n```\n\n### Modelling dynamics with a correlated AR1\nBefore showing how to produce and evaluate forecasts, we will fit a second model to these data so the two models can be compared. This model is equivalent to the above, except we now use a correlated AR(1) process to model series-specific dynamics. See `?AR` for more details.\n```{r include=FALSE, message=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n```\n\n```{r eval=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n```\n\nThe summary for this model now contains information on the autoregressive and process error parameters for each time series:\n```{r}\nsummary(mod2, include_betas = FALSE)\n```\n\nWe can plot the posteriors for these parameters, and for any other parameter for that matter, using `bayesplot` routines. First the autoregressive parameters:\n```{r, fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"}\nmcmc_plot(mod2, variable = \"ar\", regex = TRUE, type = \"areas\")\n```\n\nAnd now the variance ($\\sigma$) parameters:\n```{r, fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"}\nmcmc_plot(mod2, variable = \"sigma\", regex = TRUE, type = \"areas\")\n```\n\nWe can again plot the conditional seasonal effect:\n```{r, fig.alt = \"Plotting latent Gaussian Process effects in mvgam and marginaleffects\"}\nconditional_effects(mod2, type = \"link\")\n```\n\nThe estimates for the seasonal component are fairly similar for the two models, but below we will see if they produce similar forecasts\n\n## Forecasting with the `forecast()` function\nProbabilistic forecasts can be computed in two main ways in `mvgam`. The first is to take a model that was fit only to training data (as we did above in the two example models) and produce temporal predictions from the posterior predictive distribution by feeding `newdata` to the `forecast()` function. It is crucial that any `newdata` fed to the `forecast()` function follows on sequentially from the data that was used to fit the model (this is not internally checked by the package because it might be a headache to do so when data are not supplied in a specific time-order). When calling the `forecast()` function, you have the option to generate different kinds of predictions (i.e. predicting on the link scale, response scale or to produce expectations; see `?forecast.mvgam` for details). We will use the default and produce forecasts on the response scale, which is the most common way to evaluate forecast distributions\n```{r}\nfc_mod1 <- forecast(mod1, newdata = simdat$data_test)\nfc_mod2 <- forecast(mod2, newdata = simdat$data_test)\n```\n\nThe objects we have created are of class `mvgam_forecast`, which contain information on hindcast distributions, forecast distributions and true observations for each series in the data:\n```{r}\nstr(fc_mod1)\n```\n\nWe can plot the forecasts for some series from each model using the `S3 plot` method for objects of this class:\n```{r}\nplot(fc_mod1, series = 1)\nplot(fc_mod2, series = 1)\n\nplot(fc_mod1, series = 2)\nplot(fc_mod2, series = 2)\n```\n\nClearly the two models do not produce equivalent forecasts. We will come back to scoring these forecasts in a moment.\n\n## Forecasting with `newdata` in `mvgam()`\nThe second way we can produce forecasts in `mvgam` is to feed the testing data directly to the `mvgam()` function as `newdata`. This will include the testing data as missing observations so that they are automatically predicted from the posterior predictive distribution using the `generated quantities` block in `Stan`. As an example, we can refit `mod2` but include the testing data for automatic forecasts:\n```{r include=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n```\n\nBecause the model already contains a forecast distribution, we do not need to feed `newdata` to the `forecast()` function:\n```{r}\nfc_mod2 <- forecast(mod2)\n```\n\nThe forecasts will be nearly identical to those calculated previously:\n```{r warning=FALSE, fig.alt = \"Plotting posterior forecast distributions using mvgam and R\"}\nplot(fc_mod2, series = 1)\n```\n\n## Scoring forecast distributions\nA primary purpose of the `mvgam_forecast` class is to readily allow forecast evaluations for each series in the data, using a variety of possible scoring functions. See `?mvgam::score.mvgam_forecast` to view the types of scores that are available. A useful scoring metric is the Continuous Rank Probability Score (CRPS). A CRPS value is similar to what we might get if we calculated a weighted absolute error using the full forecast distribution.\n```{r warning=FALSE}\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\nstr(crps_mod1)\ncrps_mod1$series_1\n```\n\nThe returned list contains a `data.frame` for each series in the data that shows the CRPS score for each evaluation in the testing data, along with some other useful information about the fit of the forecast distribution. In particular, we are given a logical value (1s and 0s) telling us whether the true value was within a pre-specified credible interval (i.e. the coverage of the forecast distribution). The default interval width is 0.9, so we would hope that the values in the `in_interval` column take a 1 approximately 90% of the time. This value can be changed if you wish to compute different coverages, say using a 60% interval:\n```{r warning=FALSE}\ncrps_mod1 <- score(fc_mod1, score = \"crps\", interval_width = 0.6)\ncrps_mod1$series_1\n```\n\nWe can also compare forecasts against out of sample observations using the [Expected Log Predictive Density (ELPD; also known as the log score)](https://link.springer.com/article/10.1007/s11222-016-9696-4){target=\"_blank\"}. The ELPD is a strictly proper scoring rule that can be applied to any distributional forecast, but to compute it we need predictions on the link scale rather than on the outcome scale. This is where it is advantageous to change the type of prediction we can get using the `forecast()` function:\n```{r}\nlink_mod1 <- forecast(mod1, newdata = simdat$data_test, type = \"link\")\nscore(link_mod1, score = \"elpd\")$series_1\n```\n\nFinally, when we have multiple time series it may also make sense to use a multivariate proper scoring rule. `mvgam` offers two such options: the Energy score and the Variogram score. The first penalizes forecast distributions that are less well calibrated against the truth, while the second penalizes forecasts that do not capture the observed true correlation structure. Which score to use depends on your goals, but both are very easy to compute:\n```{r}\nenergy_mod2 <- score(fc_mod2, score = \"energy\")\nstr(energy_mod2)\n```\n\nThe returned object still provides information on interval coverage for each individual series, but there is only a single score per horizon now (which is provided in the `all_series` slot):\n```{r}\nenergy_mod2$all_series\n```\n\nYou can use your score(s) of choice to compare different models. For example, we can compute and plot the difference in CRPS scores for each series in data. Here, a negative value means the AR(1) model (`mod2`) is better, while a positive value means the spline model (`mod1`) is better.\n```{r}\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\ncrps_mod2 <- score(fc_mod2, score = \"crps\")\n\ndiff_scores <- crps_mod2$series_1$score -\n  crps_mod1$series_1$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n\n\ndiff_scores <- crps_mod2$series_2$score -\n  crps_mod1$series_2$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n\ndiff_scores <- crps_mod2$series_3$score -\n  crps_mod1$series_3$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n```\n\nThe correlated AR(1) model consistently gives better forecasts, and the difference between scores tends to grow as the forecast horizon increases. This is not unexpected given the way that splines linearly extrapolate outside the range of training data\n\n## Further reading\nThe following papers and resources offer useful material about Bayesian forecasting and proper scoring rules:\n  \nClark N.J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ* 13:e18929 (2025) https://doi.org/10.7717/peerj.18929  \n  \nHyndman, Rob J., and George Athanasopoulos. [Forecasting: principles and practice](https://otexts.com/fpp3/distaccuracy.html). *OTexts*, (2018).\n  \nGneiting, Tilmann, and Adrian E. Raftery. [Strictly proper scoring rules, prediction, and estimation](https://www.tandfonline.com/doi/abs/10.1198/016214506000001437) *Journal of the American statistical Association* 102.477 (2007) 359-378.  \n  \nSimonis, Juniper L., et al. [Evaluating probabilistic ecological forecasts](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecy.3431) *Ecology* 102.8 (2021) e03431.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "doc/forecast_evaluation.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Forecasting and forecast evaluation in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Forecasting and forecast evaluation in\nmvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#simulating-discrete-time-series\" id=\"toc-simulating-discrete-time-series\">Simulating discrete time\nseries</a>\n<ul>\n<li><a href=\"#modelling-dynamics-with-splines\" id=\"toc-modelling-dynamics-with-splines\">Modelling dynamics with\nsplines</a></li>\n<li><a href=\"#modelling-dynamics-with-a-correlated-ar1\" id=\"toc-modelling-dynamics-with-a-correlated-ar1\">Modelling dynamics\nwith a correlated AR1</a></li>\n</ul></li>\n<li><a href=\"#forecasting-with-the-forecast-function\" id=\"toc-forecasting-with-the-forecast-function\">Forecasting with the\n<code>forecast()</code> function</a></li>\n<li><a href=\"#forecasting-with-newdata-in-mvgam\" id=\"toc-forecasting-with-newdata-in-mvgam\">Forecasting with\n<code>newdata</code> in <code>mvgam()</code></a></li>\n<li><a href=\"#scoring-forecast-distributions\" id=\"toc-scoring-forecast-distributions\">Scoring forecast\ndistributions</a></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to produce probabilistic forecasts and to evaluate\nthose forecasts using a variety of proper scoring rules.</p>\n<div id=\"simulating-discrete-time-series\" class=\"section level2\">\n<h2>Simulating discrete time series</h2>\n<p>We begin by simulating some data to show how forecasts are computed\nand evaluated in <code>mvgam</code>. The <code>sim_mvgam()</code>\nfunction can be used to simulate series that come from a variety of\nresponse distributions as well as seasonal patterns and/or dynamic\ntemporal patterns. Here we simulate a collection of three time\ncount-valued series. These series all share the same seasonal pattern\nbut have different temporal dynamics. By setting\n<code>trend_model = GP()</code> and <code>prop_trend = 0.75</code>, we\nare generating time series that have smooth underlying temporal trends\n(evolving as Gaussian Processes with squared exponential kernel) and\nmoderate seasonal patterns. The observations are Poisson-distributed and\nwe allow 10% of observations to be missing.</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">1</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>simdat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(</span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>  <span class=\"at\">T =</span> <span class=\"dv\">100</span>,</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">n_series =</span> <span class=\"dv\">3</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"at\">mu =</span> <span class=\"dv\">2</span>,</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">GP</span>(),</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>  <span class=\"at\">prop_trend =</span> <span class=\"fl\">0.75</span>,</span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a>  <span class=\"at\">prop_missing =</span> <span class=\"fl\">0.10</span></span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The returned object is a <code>list</code> containing training and\ntesting data (<code>sim_mvgam()</code> automatically splits the data\ninto these folds for us) together with some other information about the\ndata generating process that was used to simulate the data</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(simdat)</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 6</span></span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ data_train        :&#39;data.frame&#39;:  225 obs. of  5 variables:</span></span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ y     : int [1:225] 6 NA 11 2 5 20 7 8 NA 11 ...</span></span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ season: int [1:225] 1 1 1 2 2 2 3 3 3 4 ...</span></span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ year  : int [1:225] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb2-7\"><a href=\"#cb2-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series: Factor w/ 3 levels &quot;series_1&quot;,&quot;series_2&quot;,..: 1 2 3 1 2 3 1 2 3 1 ...</span></span>\n<span id=\"cb2-8\"><a href=\"#cb2-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ time  : int [1:225] 1 1 1 2 2 2 3 3 3 4 ...</span></span>\n<span id=\"cb2-9\"><a href=\"#cb2-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ data_test         :&#39;data.frame&#39;:  75 obs. of  5 variables:</span></span>\n<span id=\"cb2-10\"><a href=\"#cb2-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ y     : int [1:75] 4 23 8 3 NA 3 1 20 8 3 ...</span></span>\n<span id=\"cb2-11\"><a href=\"#cb2-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ season: int [1:75] 4 4 4 5 5 5 6 6 6 7 ...</span></span>\n<span id=\"cb2-12\"><a href=\"#cb2-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ year  : int [1:75] 7 7 7 7 7 7 7 7 7 7 ...</span></span>\n<span id=\"cb2-13\"><a href=\"#cb2-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series: Factor w/ 3 levels &quot;series_1&quot;,&quot;series_2&quot;,..: 1 2 3 1 2 3 1 2 3 1 ...</span></span>\n<span id=\"cb2-14\"><a href=\"#cb2-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ time  : int [1:75] 76 76 76 77 77 77 78 78 78 79 ...</span></span>\n<span id=\"cb2-15\"><a href=\"#cb2-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ true_corrs        : num [1:3, 1:3] 1 0.0861 0.1161 0.0861 1 ...</span></span>\n<span id=\"cb2-16\"><a href=\"#cb2-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ true_trends       : num [1:100, 1:3] -0.851 -0.758 -0.664 -0.571 -0.48 ...</span></span>\n<span id=\"cb2-17\"><a href=\"#cb2-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ global_seasonality: num [1:100] -0.966 -0.197 0.771 1.083 0.37 ...</span></span>\n<span id=\"cb2-18\"><a href=\"#cb2-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_params      :List of 2</span></span>\n<span id=\"cb2-19\"><a href=\"#cb2-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ alpha: num [1:3] 0.883 0.936 1.036</span></span>\n<span id=\"cb2-20\"><a href=\"#cb2-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ rho  : num [1:3] 7.54 4.01 7.49</span></span></code></pre></div>\n<p>Each series in this case has a shared seasonal pattern. The resulting\ntime series are similar to what we might encounter when dealing with\ncount-valued data that can take small counts:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>For individual series, we can plot the training and testing data, as\nwell as some more specific features of the observed data:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test,</span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"modelling-dynamics-with-splines\" class=\"section level3\">\n<h3>Modelling dynamics with splines</h3>\n<p>The first model we will fit uses a shared cyclic spline to capture\nthe repeated seasonality, as well as series-specific splines of time to\ncapture the long-term dynamics. We allow the temporal splines to be\nfairly complex so they can capture as much of the temporal variation as\npossible:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>    <span class=\"fu\">s</span>(time, <span class=\"at\">by =</span> series, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cr&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">20</span>),</span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"at\">knots =</span> <span class=\"fu\">list</span>(<span class=\"at\">season =</span> <span class=\"fu\">c</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span>)),</span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"st\">&quot;None&quot;</span>,</span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model fits without issue:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod1, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ s(season, bs = &quot;cc&quot;, k = 8) + s(time, by = series, k = 20)</span></span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000022e41d5a728&gt;</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb6-11\"><a href=\"#cb6-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-12\"><a href=\"#cb6-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb6-13\"><a href=\"#cb6-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb6-14\"><a href=\"#cb6-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-15\"><a href=\"#cb6-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb6-16\"><a href=\"#cb6-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb6-17\"><a href=\"#cb6-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-18\"><a href=\"#cb6-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb6-19\"><a href=\"#cb6-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 100 </span></span>\n<span id=\"cb6-20\"><a href=\"#cb6-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-21\"><a href=\"#cb6-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb6-22\"><a href=\"#cb6-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb6-23\"><a href=\"#cb6-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb6-24\"><a href=\"#cb6-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb6-25\"><a href=\"#cb6-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-26\"><a href=\"#cb6-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb6-27\"><a href=\"#cb6-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb6-28\"><a href=\"#cb6-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)  1.9 1.9     2    1   979</span></span>\n<span id=\"cb6-29\"><a href=\"#cb6-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-30\"><a href=\"#cb6-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb6-31\"><a href=\"#cb6-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                          edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb6-32\"><a href=\"#cb6-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season)              3.418      6  22.91  &lt; 2e-16 ***</span></span>\n<span id=\"cb6-33\"><a href=\"#cb6-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_1 8.763     19  30.85 4.25e-06 ***</span></span>\n<span id=\"cb6-34\"><a href=\"#cb6-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_2 9.635     19  41.49  &lt; 2e-16 ***</span></span>\n<span id=\"cb6-35\"><a href=\"#cb6-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_3 6.676     19  56.28   0.0862 .  </span></span>\n<span id=\"cb6-36\"><a href=\"#cb6-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb6-37\"><a href=\"#cb6-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb6-38\"><a href=\"#cb6-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-39\"><a href=\"#cb6-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb6-40\"><a href=\"#cb6-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb6-41\"><a href=\"#cb6-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb6-42\"><a href=\"#cb6-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb6-43\"><a href=\"#cb6-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✖ 51 of 2000 iterations saturated the maximum tree depth of 10 (2.55%)</span></span>\n<span id=\"cb6-44\"><a href=\"#cb6-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Try a larger max_treedepth to avoid saturation</span></span>\n<span id=\"cb6-45\"><a href=\"#cb6-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-46\"><a href=\"#cb6-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb6-47\"><a href=\"#cb6-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb6-48\"><a href=\"#cb6-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb6-49\"><a href=\"#cb6-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-50\"><a href=\"#cb6-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>And we can plot the conditional effects of the splines (on the link\nscale) to see that they are estimated to be highly nonlinear</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting GAM smooth functions using mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting GAM smooth functions using mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" aria-label=\"Plotting GAM smooth functions using mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting GAM smooth functions using mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"modelling-dynamics-with-a-correlated-ar1\" class=\"section level3\">\n<h3>Modelling dynamics with a correlated AR1</h3>\n<p>Before showing how to produce and evaluate forecasts, we will fit a\nsecond model to these data so the two models can be compared. This model\nis equivalent to the above, except we now use a correlated AR(1) process\nto model series-specific dynamics. See <code>?AR</code> for more\ndetails.</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a>mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(y <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_knots =</span> <span class=\"fu\">list</span>(<span class=\"at\">season =</span> <span class=\"fu\">c</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span>)),</span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(<span class=\"at\">cor =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary for this model now contains information on the\nautoregressive and process error parameters for each time series:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod2, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ 1</span></span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000022e41d5a728&gt;</span></span>\n<span id=\"cb9-5\"><a href=\"#cb9-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-6\"><a href=\"#cb9-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb9-7\"><a href=\"#cb9-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(season, bs = &quot;cc&quot;, k = 8) - 1</span></span>\n<span id=\"cb9-8\"><a href=\"#cb9-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000022e41d5a728&gt;</span></span>\n<span id=\"cb9-9\"><a href=\"#cb9-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-10\"><a href=\"#cb9-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb9-11\"><a href=\"#cb9-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb9-12\"><a href=\"#cb9-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-13\"><a href=\"#cb9-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb9-14\"><a href=\"#cb9-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb9-15\"><a href=\"#cb9-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-16\"><a href=\"#cb9-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb9-17\"><a href=\"#cb9-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR(cor = TRUE)</span></span>\n<span id=\"cb9-18\"><a href=\"#cb9-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-19\"><a href=\"#cb9-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb9-20\"><a href=\"#cb9-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb9-21\"><a href=\"#cb9-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-22\"><a href=\"#cb9-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb9-23\"><a href=\"#cb9-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb9-24\"><a href=\"#cb9-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-25\"><a href=\"#cb9-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb9-26\"><a href=\"#cb9-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 75 </span></span>\n<span id=\"cb9-27\"><a href=\"#cb9-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-28\"><a href=\"#cb9-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb9-29\"><a href=\"#cb9-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb9-30\"><a href=\"#cb9-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb9-31\"><a href=\"#cb9-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb9-32\"><a href=\"#cb9-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-33\"><a href=\"#cb9-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb9-34\"><a href=\"#cb9-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb9-35\"><a href=\"#cb9-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)  1.8   2   2.4 1.01   512</span></span>\n<span id=\"cb9-36\"><a href=\"#cb9-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-37\"><a href=\"#cb9-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb9-38\"><a href=\"#cb9-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb9-39\"><a href=\"#cb9-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.23 0.32  0.44 1.01   318</span></span>\n<span id=\"cb9-40\"><a href=\"#cb9-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[2] 0.30 0.43  0.58 1.01   498</span></span>\n<span id=\"cb9-41\"><a href=\"#cb9-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[3] 0.18 0.25  0.36 1.01   329</span></span>\n<span id=\"cb9-42\"><a href=\"#cb9-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-43\"><a href=\"#cb9-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb9-44\"><a href=\"#cb9-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb9-45\"><a href=\"#cb9-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.75 0.89  0.99 1.01   438</span></span>\n<span id=\"cb9-46\"><a href=\"#cb9-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[2] 0.66 0.83  0.96 1.02   379</span></span>\n<span id=\"cb9-47\"><a href=\"#cb9-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[3] 0.87 0.96  1.00 1.01   478</span></span>\n<span id=\"cb9-48\"><a href=\"#cb9-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-49\"><a href=\"#cb9-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb9-50\"><a href=\"#cb9-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb9-51\"><a href=\"#cb9-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season) 1.737      6  23.81 1.22e-05 ***</span></span>\n<span id=\"cb9-52\"><a href=\"#cb9-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb9-53\"><a href=\"#cb9-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb9-54\"><a href=\"#cb9-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-55\"><a href=\"#cb9-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb9-56\"><a href=\"#cb9-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb9-57\"><a href=\"#cb9-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb9-58\"><a href=\"#cb9-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb9-59\"><a href=\"#cb9-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb9-60\"><a href=\"#cb9-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-61\"><a href=\"#cb9-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb9-62\"><a href=\"#cb9-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb9-63\"><a href=\"#cb9-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb9-64\"><a href=\"#cb9-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-65\"><a href=\"#cb9-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>We can plot the posteriors for these parameters, and for any other\nparameter for that matter, using <code>bayesplot</code> routines. First\nthe autoregressive parameters:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(mod2, <span class=\"at\">variable =</span> <span class=\"st\">&quot;ar&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">type =</span> <span class=\"st\">&quot;areas&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Summarising latent Gaussian Process parameters in mvgam\" src=\"data:image/png;base64,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\" alt=\"Summarising latent Gaussian Process parameters in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>And now the variance (<span class=\"math inline\">\\(\\sigma\\)</span>)\nparameters:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(mod2, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">type =</span> <span class=\"st\">&quot;areas&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Summarising latent Gaussian Process parameters in mvgam\" src=\"data:image/png;base64,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\" alt=\"Summarising latent Gaussian Process parameters in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can again plot the conditional seasonal effect:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(mod2, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting latent Gaussian Process effects in mvgam and marginaleffects\" src=\"data:image/png;base64,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\" alt=\"Plotting latent Gaussian Process effects in mvgam and marginaleffects\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The estimates for the seasonal component are fairly similar for the\ntwo models, but below we will see if they produce similar forecasts</p>\n</div>\n</div>\n<div id=\"forecasting-with-the-forecast-function\" class=\"section level2\">\n<h2>Forecasting with the <code>forecast()</code> function</h2>\n<p>Probabilistic forecasts can be computed in two main ways in\n<code>mvgam</code>. The first is to take a model that was fit only to\ntraining data (as we did above in the two example models) and produce\ntemporal predictions from the posterior predictive distribution by\nfeeding <code>newdata</code> to the <code>forecast()</code> function. It\nis crucial that any <code>newdata</code> fed to the\n<code>forecast()</code> function follows on sequentially from the data\nthat was used to fit the model (this is not internally checked by the\npackage because it might be a headache to do so when data are not\nsupplied in a specific time-order). When calling the\n<code>forecast()</code> function, you have the option to generate\ndifferent kinds of predictions (i.e. predicting on the link scale,\nresponse scale or to produce expectations; see\n<code>?forecast.mvgam</code> for details). We will use the default and\nproduce forecasts on the response scale, which is the most common way to\nevaluate forecast distributions</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a>fc_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod1, <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test)</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>fc_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod2, <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test)</span></code></pre></div>\n<p>The objects we have created are of class <code>mvgam_forecast</code>,\nwhich contain information on hindcast distributions, forecast\ndistributions and true observations for each series in the data:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(fc_mod1)</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 16</span></span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ call              :Class &#39;formula&#39;  language y ~ s(season, bs = &quot;cc&quot;, k = 8) + s(time, by = series, k = 20)</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;.Environment&quot;)=&lt;environment: 0x0000022e41d5a728&gt; </span></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family            : chr &quot;poisson&quot;</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family_pars       : NULL</span></span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_model       : chr &quot;None&quot;</span></span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ fit_engine        : chr &quot;stan&quot;</span></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ type              : chr &quot;response&quot;</span></span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_names      : Factor w/ 3 levels &quot;series_1&quot;,&quot;series_2&quot;,..: 1 2 3</span></span>\n<span id=\"cb14-14\"><a href=\"#cb14-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_observations:List of 3</span></span>\n<span id=\"cb14-15\"><a href=\"#cb14-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:75] 6 2 7 11 8 6 9 11 7 4 ...</span></span>\n<span id=\"cb14-16\"><a href=\"#cb14-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:75] NA 5 8 2 1 NA 2 4 0 2 ...</span></span>\n<span id=\"cb14-17\"><a href=\"#cb14-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:75] 11 20 NA 36 44 34 57 50 26 28 ...</span></span>\n<span id=\"cb14-18\"><a href=\"#cb14-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_times       :List of 3</span></span>\n<span id=\"cb14-19\"><a href=\"#cb14-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb14-20\"><a href=\"#cb14-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb14-21\"><a href=\"#cb14-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb14-22\"><a href=\"#cb14-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_observations :List of 3</span></span>\n<span id=\"cb14-23\"><a href=\"#cb14-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:25] 4 3 1 3 1 NA NA 7 9 8 ...</span></span>\n<span id=\"cb14-24\"><a href=\"#cb14-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:25] 23 NA 20 20 14 7 6 6 6 1 ...</span></span>\n<span id=\"cb14-25\"><a href=\"#cb14-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:25] 8 3 8 3 NA 1 1 9 8 NA ...</span></span>\n<span id=\"cb14-26\"><a href=\"#cb14-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_times        :List of 3</span></span>\n<span id=\"cb14-27\"><a href=\"#cb14-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span></span>\n<span id=\"cb14-28\"><a href=\"#cb14-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span></span>\n<span id=\"cb14-29\"><a href=\"#cb14-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span></span>\n<span id=\"cb14-30\"><a href=\"#cb14-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ hindcasts         :List of 3</span></span>\n<span id=\"cb14-31\"><a href=\"#cb14-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: num [1:2000, 1:75] 3 3 1 0 2 3 5 5 2 1 ...</span></span>\n<span id=\"cb14-32\"><a href=\"#cb14-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-33\"><a href=\"#cb14-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-34\"><a href=\"#cb14-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] &quot;ypred[1,1]&quot; &quot;ypred[2,1]&quot; &quot;ypred[3,1]&quot; &quot;ypred[4,1]&quot; ...</span></span>\n<span id=\"cb14-35\"><a href=\"#cb14-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: num [1:2000, 1:75] 3 4 2 5 7 8 7 2 7 10 ...</span></span>\n<span id=\"cb14-36\"><a href=\"#cb14-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-37\"><a href=\"#cb14-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-38\"><a href=\"#cb14-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] &quot;ypred[1,2]&quot; &quot;ypred[2,2]&quot; &quot;ypred[3,2]&quot; &quot;ypred[4,2]&quot; ...</span></span>\n<span id=\"cb14-39\"><a href=\"#cb14-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: num [1:2000, 1:75] 11 28 13 12 14 20 12 7 31 27 ...</span></span>\n<span id=\"cb14-40\"><a href=\"#cb14-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-41\"><a href=\"#cb14-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-42\"><a href=\"#cb14-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] &quot;ypred[1,3]&quot; &quot;ypred[2,3]&quot; &quot;ypred[3,3]&quot; &quot;ypred[4,3]&quot; ...</span></span>\n<span id=\"cb14-43\"><a href=\"#cb14-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ forecasts         :List of 3</span></span>\n<span id=\"cb14-44\"><a href=\"#cb14-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: num [1:2000, 1:25] 4 1 1 5 5 6 2 3 2 0 ...</span></span>\n<span id=\"cb14-45\"><a href=\"#cb14-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-46\"><a href=\"#cb14-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-47\"><a href=\"#cb14-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] &quot;ypred[76,1]&quot; &quot;ypred[77,1]&quot; &quot;ypred[78,1]&quot; &quot;ypred[79,1]&quot; ...</span></span>\n<span id=\"cb14-48\"><a href=\"#cb14-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: num [1:2000, 1:25] 26 33 21 34 12 28 33 16 23 39 ...</span></span>\n<span id=\"cb14-49\"><a href=\"#cb14-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-50\"><a href=\"#cb14-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-51\"><a href=\"#cb14-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] &quot;ypred[76,2]&quot; &quot;ypred[77,2]&quot; &quot;ypred[78,2]&quot; &quot;ypred[79,2]&quot; ...</span></span>\n<span id=\"cb14-52\"><a href=\"#cb14-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: num [1:2000, 1:25] 10 5 3 7 4 2 8 11 3 10 ...</span></span>\n<span id=\"cb14-53\"><a href=\"#cb14-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-54\"><a href=\"#cb14-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-55\"><a href=\"#cb14-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] &quot;ypred[76,3]&quot; &quot;ypred[77,3]&quot; &quot;ypred[78,3]&quot; &quot;ypred[79,3]&quot; ...</span></span>\n<span id=\"cb14-56\"><a href=\"#cb14-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;class&quot;)= chr &quot;mvgam_forecast&quot;</span></span></code></pre></div>\n<p>We can plot the forecasts for some series from each model using the\n<code>S3 plot</code> method for objects of this class:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod1, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod2, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a></span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod1, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod2, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Clearly the two models do not produce equivalent forecasts. We will\ncome back to scoring these forecasts in a moment.</p>\n</div>\n<div id=\"forecasting-with-newdata-in-mvgam\" class=\"section level2\">\n<h2>Forecasting with <code>newdata</code> in <code>mvgam()</code></h2>\n<p>The second way we can produce forecasts in <code>mvgam</code> is to\nfeed the testing data directly to the <code>mvgam()</code> function as\n<code>newdata</code>. This will include the testing data as missing\nobservations so that they are automatically predicted from the posterior\npredictive distribution using the <code>generated quantities</code>\nblock in <code>Stan</code>. As an example, we can refit\n<code>mod2</code> but include the testing data for automatic\nforecasts:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a>mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(y <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_knots =</span> <span class=\"fu\">list</span>(<span class=\"at\">season =</span> <span class=\"fu\">c</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span>)),</span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(<span class=\"at\">cor =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test,</span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Because the model already contains a forecast distribution, we do not\nneed to feed <code>newdata</code> to the <code>forecast()</code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a>fc_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod2)</span></code></pre></div>\n<p>The forecasts will be nearly identical to those calculated\npreviously:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod2, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting posterior forecast distributions using mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Plotting posterior forecast distributions using mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"scoring-forecast-distributions\" class=\"section level2\">\n<h2>Scoring forecast distributions</h2>\n<p>A primary purpose of the <code>mvgam_forecast</code> class is to\nreadily allow forecast evaluations for each series in the data, using a\nvariety of possible scoring functions. See\n<code>?mvgam::score.mvgam_forecast</code> to view the types of scores\nthat are available. A useful scoring metric is the Continuous Rank\nProbability Score (CRPS). A CRPS value is similar to what we might get\nif we calculated a weighted absolute error using the full forecast\ndistribution.</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>crps_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>)</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(crps_mod1)</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 4</span></span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_1  :&#39;data.frame&#39;:  25 obs. of  5 variables:</span></span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score         : num [1:25] 0.993 0.817 0.334 0.998 0.277 ...</span></span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 1 NA NA 0 0 0 ...</span></span>\n<span id=\"cb22-7\"><a href=\"#cb22-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb22-8\"><a href=\"#cb22-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-9\"><a href=\"#cb22-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; ...</span></span>\n<span id=\"cb22-10\"><a href=\"#cb22-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_2  :&#39;data.frame&#39;:  25 obs. of  5 variables:</span></span>\n<span id=\"cb22-11\"><a href=\"#cb22-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score         : num [1:25] 2.01 NA 6.55 14.69 17.43 ...</span></span>\n<span id=\"cb22-12\"><a href=\"#cb22-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 NA 1 1 1 0 0 0 0 0 ...</span></span>\n<span id=\"cb22-13\"><a href=\"#cb22-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb22-14\"><a href=\"#cb22-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-15\"><a href=\"#cb22-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; ...</span></span>\n<span id=\"cb22-16\"><a href=\"#cb22-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_3  :&#39;data.frame&#39;:  25 obs. of  5 variables:</span></span>\n<span id=\"cb22-17\"><a href=\"#cb22-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score         : num [1:25] 3.487 0.463 4.064 0.5 NA ...</span></span>\n<span id=\"cb22-18\"><a href=\"#cb22-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 0 1 0 1 NA 1 1 0 0 NA ...</span></span>\n<span id=\"cb22-19\"><a href=\"#cb22-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb22-20\"><a href=\"#cb22-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-21\"><a href=\"#cb22-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; ...</span></span>\n<span id=\"cb22-22\"><a href=\"#cb22-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ all_series:&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb22-23\"><a href=\"#cb22-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score       : num [1:25] 6.49 NA 10.95 16.18 NA ...</span></span>\n<span id=\"cb22-24\"><a href=\"#cb22-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-25\"><a href=\"#cb22-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type  : chr [1:25] &quot;sum_crps&quot; &quot;sum_crps&quot; &quot;sum_crps&quot; &quot;sum_crps&quot; ...</span></span>\n<span id=\"cb22-26\"><a href=\"#cb22-26\" tabindex=\"-1\"></a>crps_mod1<span class=\"sc\">$</span>series_1</span>\n<span id=\"cb22-27\"><a href=\"#cb22-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         score in_interval interval_width eval_horizon score_type</span></span>\n<span id=\"cb22-28\"><a href=\"#cb22-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   0.9932195           1            0.9            1       crps</span></span>\n<span id=\"cb22-29\"><a href=\"#cb22-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   0.8173380           1            0.9            2       crps</span></span>\n<span id=\"cb22-30\"><a href=\"#cb22-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.3338443           1            0.9            3       crps</span></span>\n<span id=\"cb22-31\"><a href=\"#cb22-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   0.9980710           1            0.9            4       crps</span></span>\n<span id=\"cb22-32\"><a href=\"#cb22-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   0.2773030           1            0.9            5       crps</span></span>\n<span id=\"cb22-33\"><a href=\"#cb22-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6          NA          NA            0.9            6       crps</span></span>\n<span id=\"cb22-34\"><a href=\"#cb22-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7          NA          NA            0.9            7       crps</span></span>\n<span id=\"cb22-35\"><a href=\"#cb22-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   6.1295615           0            0.9            8       crps</span></span>\n<span id=\"cb22-36\"><a href=\"#cb22-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   8.2855480           0            0.9            9       crps</span></span>\n<span id=\"cb22-37\"><a href=\"#cb22-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  7.4110365           0            0.9           10       crps</span></span>\n<span id=\"cb22-38\"><a href=\"#cb22-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 21.3898007           0            0.9           11       crps</span></span>\n<span id=\"cb22-39\"><a href=\"#cb22-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 35.2857677           0            0.9           12       crps</span></span>\n<span id=\"cb22-40\"><a href=\"#cb22-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 37.2882082           0            0.9           13       crps</span></span>\n<span id=\"cb22-41\"><a href=\"#cb22-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 36.4251945           0            0.9           14       crps</span></span>\n<span id=\"cb22-42\"><a href=\"#cb22-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 39.3858395           0            0.9           15       crps</span></span>\n<span id=\"cb22-43\"><a href=\"#cb22-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 42.3677532           0            0.9           16       crps</span></span>\n<span id=\"cb22-44\"><a href=\"#cb22-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 42.5461592           0            0.9           17       crps</span></span>\n<span id=\"cb22-45\"><a href=\"#cb22-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18 12.7316780           0            0.9           18       crps</span></span>\n<span id=\"cb22-46\"><a href=\"#cb22-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 13.7700235           0            0.9           19       crps</span></span>\n<span id=\"cb22-47\"><a href=\"#cb22-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  9.7282697           0            0.9           20       crps</span></span>\n<span id=\"cb22-48\"><a href=\"#cb22-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  4.7711443           0            0.9           21       crps</span></span>\n<span id=\"cb22-49\"><a href=\"#cb22-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  4.8054445           0            0.9           22       crps</span></span>\n<span id=\"cb22-50\"><a href=\"#cb22-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23  2.7825032           0            0.9           23       crps</span></span>\n<span id=\"cb22-51\"><a href=\"#cb22-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  0.8591737           1            0.9           24       crps</span></span>\n<span id=\"cb22-52\"><a href=\"#cb22-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  3.7808390           0            0.9           25       crps</span></span></code></pre></div>\n<p>The returned list contains a <code>data.frame</code> for each series\nin the data that shows the CRPS score for each evaluation in the testing\ndata, along with some other useful information about the fit of the\nforecast distribution. In particular, we are given a logical value (1s\nand 0s) telling us whether the true value was within a pre-specified\ncredible interval (i.e. the coverage of the forecast distribution). The\ndefault interval width is 0.9, so we would hope that the values in the\n<code>in_interval</code> column take a 1 approximately 90% of the time.\nThis value can be changed if you wish to compute different coverages,\nsay using a 60% interval:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a>crps_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>, <span class=\"at\">interval_width =</span> <span class=\"fl\">0.6</span>)</span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>crps_mod1<span class=\"sc\">$</span>series_1</span>\n<span id=\"cb23-3\"><a href=\"#cb23-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         score in_interval interval_width eval_horizon score_type</span></span>\n<span id=\"cb23-4\"><a href=\"#cb23-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   0.9932195           1            0.6            1       crps</span></span>\n<span id=\"cb23-5\"><a href=\"#cb23-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   0.8173380           1            0.6            2       crps</span></span>\n<span id=\"cb23-6\"><a href=\"#cb23-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.3338443           1            0.6            3       crps</span></span>\n<span id=\"cb23-7\"><a href=\"#cb23-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   0.9980710           1            0.6            4       crps</span></span>\n<span id=\"cb23-8\"><a href=\"#cb23-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   0.2773030           1            0.6            5       crps</span></span>\n<span id=\"cb23-9\"><a href=\"#cb23-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6          NA          NA            0.6            6       crps</span></span>\n<span id=\"cb23-10\"><a href=\"#cb23-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7          NA          NA            0.6            7       crps</span></span>\n<span id=\"cb23-11\"><a href=\"#cb23-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   6.1295615           0            0.6            8       crps</span></span>\n<span id=\"cb23-12\"><a href=\"#cb23-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   8.2855480           0            0.6            9       crps</span></span>\n<span id=\"cb23-13\"><a href=\"#cb23-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  7.4110365           0            0.6           10       crps</span></span>\n<span id=\"cb23-14\"><a href=\"#cb23-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 21.3898007           0            0.6           11       crps</span></span>\n<span id=\"cb23-15\"><a href=\"#cb23-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 35.2857677           0            0.6           12       crps</span></span>\n<span id=\"cb23-16\"><a href=\"#cb23-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 37.2882082           0            0.6           13       crps</span></span>\n<span id=\"cb23-17\"><a href=\"#cb23-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 36.4251945           0            0.6           14       crps</span></span>\n<span id=\"cb23-18\"><a href=\"#cb23-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 39.3858395           0            0.6           15       crps</span></span>\n<span id=\"cb23-19\"><a href=\"#cb23-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 42.3677532           0            0.6           16       crps</span></span>\n<span id=\"cb23-20\"><a href=\"#cb23-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 42.5461592           0            0.6           17       crps</span></span>\n<span id=\"cb23-21\"><a href=\"#cb23-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18 12.7316780           0            0.6           18       crps</span></span>\n<span id=\"cb23-22\"><a href=\"#cb23-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 13.7700235           0            0.6           19       crps</span></span>\n<span id=\"cb23-23\"><a href=\"#cb23-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  9.7282697           0            0.6           20       crps</span></span>\n<span id=\"cb23-24\"><a href=\"#cb23-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  4.7711443           0            0.6           21       crps</span></span>\n<span id=\"cb23-25\"><a href=\"#cb23-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  4.8054445           0            0.6           22       crps</span></span>\n<span id=\"cb23-26\"><a href=\"#cb23-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23  2.7825032           0            0.6           23       crps</span></span>\n<span id=\"cb23-27\"><a href=\"#cb23-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  0.8591737           0            0.6           24       crps</span></span>\n<span id=\"cb23-28\"><a href=\"#cb23-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  3.7808390           0            0.6           25       crps</span></span></code></pre></div>\n<p>We can also compare forecasts against out of sample observations\nusing the <a href=\"https://link.springer.com/article/10.1007/s11222-016-9696-4\" target=\"_blank\">Expected Log Predictive Density (ELPD; also known as the\nlog score)</a>. The ELPD is a strictly proper scoring rule that can be\napplied to any distributional forecast, but to compute it we need\npredictions on the link scale rather than on the outcome scale. This is\nwhere it is advantageous to change the type of prediction we can get\nusing the <code>forecast()</code> function:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a>link_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod1, <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a><span class=\"fu\">score</span>(link_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;elpd&quot;</span>)<span class=\"sc\">$</span>series_1</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         score eval_horizon score_type</span></span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   -2.155156            1       elpd</span></span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   -1.956860            2       elpd</span></span>\n<span id=\"cb24-6\"><a href=\"#cb24-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   -1.242909            3       elpd</span></span>\n<span id=\"cb24-7\"><a href=\"#cb24-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   -2.208022            4       elpd</span></span>\n<span id=\"cb24-8\"><a href=\"#cb24-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   -1.218081            5       elpd</span></span>\n<span id=\"cb24-9\"><a href=\"#cb24-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6          NA            6       elpd</span></span>\n<span id=\"cb24-10\"><a href=\"#cb24-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7          NA            7       elpd</span></span>\n<span id=\"cb24-11\"><a href=\"#cb24-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   -7.113590            8       elpd</span></span>\n<span id=\"cb24-12\"><a href=\"#cb24-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   -8.499192            9       elpd</span></span>\n<span id=\"cb24-13\"><a href=\"#cb24-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  -7.975085           10       elpd</span></span>\n<span id=\"cb24-14\"><a href=\"#cb24-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 -18.627673           11       elpd</span></span>\n<span id=\"cb24-15\"><a href=\"#cb24-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 -30.187736           12       elpd</span></span>\n<span id=\"cb24-16\"><a href=\"#cb24-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 -28.528770           13       elpd</span></span>\n<span id=\"cb24-17\"><a href=\"#cb24-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 -27.474431           14       elpd</span></span>\n<span id=\"cb24-18\"><a href=\"#cb24-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 -27.138400           15       elpd</span></span>\n<span id=\"cb24-19\"><a href=\"#cb24-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 -24.018949           16       elpd</span></span>\n<span id=\"cb24-20\"><a href=\"#cb24-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 -28.766709           17       elpd</span></span>\n<span id=\"cb24-21\"><a href=\"#cb24-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18  -9.455606           18       elpd</span></span>\n<span id=\"cb24-22\"><a href=\"#cb24-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 -10.169118           19       elpd</span></span>\n<span id=\"cb24-23\"><a href=\"#cb24-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  -7.741233           20       elpd</span></span>\n<span id=\"cb24-24\"><a href=\"#cb24-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  -6.998068           21       elpd</span></span>\n<span id=\"cb24-25\"><a href=\"#cb24-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  -7.030657           22       elpd</span></span>\n<span id=\"cb24-26\"><a href=\"#cb24-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23  -5.715523           23       elpd</span></span>\n<span id=\"cb24-27\"><a href=\"#cb24-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  -3.015423           24       elpd</span></span>\n<span id=\"cb24-28\"><a href=\"#cb24-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  -6.271717           25       elpd</span></span></code></pre></div>\n<p>Finally, when we have multiple time series it may also make sense to\nuse a multivariate proper scoring rule. <code>mvgam</code> offers two\nsuch options: the Energy score and the Variogram score. The first\npenalizes forecast distributions that are less well calibrated against\nthe truth, while the second penalizes forecasts that do not capture the\nobserved true correlation structure. Which score to use depends on your\ngoals, but both are very easy to compute:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a>energy_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod2, <span class=\"at\">score =</span> <span class=\"st\">&quot;energy&quot;</span>)</span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(energy_mod2)</span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 4</span></span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_1  :&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 1 NA NA 1 1 1 ...</span></span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb25-7\"><a href=\"#cb25-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-8\"><a href=\"#cb25-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_2  :&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-9\"><a href=\"#cb25-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 NA 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb25-10\"><a href=\"#cb25-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb25-11\"><a href=\"#cb25-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-12\"><a href=\"#cb25-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_3  :&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-13\"><a href=\"#cb25-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 NA 1 1 1 1 NA ...</span></span>\n<span id=\"cb25-14\"><a href=\"#cb25-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb25-15\"><a href=\"#cb25-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-16\"><a href=\"#cb25-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ all_series:&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-17\"><a href=\"#cb25-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score       : num [1:25] 4.74 NA 5.03 5.36 NA ...</span></span>\n<span id=\"cb25-18\"><a href=\"#cb25-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-19\"><a href=\"#cb25-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type  : chr [1:25] &quot;energy&quot; &quot;energy&quot; &quot;energy&quot; &quot;energy&quot; ...</span></span></code></pre></div>\n<p>The returned object still provides information on interval coverage\nfor each individual series, but there is only a single score per horizon\nnow (which is provided in the <code>all_series</code> slot):</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a>energy_mod2<span class=\"sc\">$</span>all_series</span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        score eval_horizon score_type</span></span>\n<span id=\"cb26-3\"><a href=\"#cb26-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   4.736450            1     energy</span></span>\n<span id=\"cb26-4\"><a href=\"#cb26-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2         NA            2     energy</span></span>\n<span id=\"cb26-5\"><a href=\"#cb26-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   5.025547            3     energy</span></span>\n<span id=\"cb26-6\"><a href=\"#cb26-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   5.363993            4     energy</span></span>\n<span id=\"cb26-7\"><a href=\"#cb26-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5         NA            5     energy</span></span>\n<span id=\"cb26-8\"><a href=\"#cb26-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6         NA            6     energy</span></span>\n<span id=\"cb26-9\"><a href=\"#cb26-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7         NA            7     energy</span></span>\n<span id=\"cb26-10\"><a href=\"#cb26-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   3.918395            8     energy</span></span>\n<span id=\"cb26-11\"><a href=\"#cb26-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   4.113319            9     energy</span></span>\n<span id=\"cb26-12\"><a href=\"#cb26-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10        NA           10     energy</span></span>\n<span id=\"cb26-13\"><a href=\"#cb26-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 13.149358           11     energy</span></span>\n<span id=\"cb26-14\"><a href=\"#cb26-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 22.547040           12     energy</span></span>\n<span id=\"cb26-15\"><a href=\"#cb26-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13        NA           13     energy</span></span>\n<span id=\"cb26-16\"><a href=\"#cb26-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 21.170257           14     energy</span></span>\n<span id=\"cb26-17\"><a href=\"#cb26-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 24.184433           15     energy</span></span>\n<span id=\"cb26-18\"><a href=\"#cb26-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 25.110374           16     energy</span></span>\n<span id=\"cb26-19\"><a href=\"#cb26-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 27.945911           17     energy</span></span>\n<span id=\"cb26-20\"><a href=\"#cb26-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18  6.180386           18     energy</span></span>\n<span id=\"cb26-21\"><a href=\"#cb26-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 10.674543           19     energy</span></span>\n<span id=\"cb26-22\"><a href=\"#cb26-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  4.093666           20     energy</span></span>\n<span id=\"cb26-23\"><a href=\"#cb26-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  2.870332           21     energy</span></span>\n<span id=\"cb26-24\"><a href=\"#cb26-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  3.443291           22     energy</span></span>\n<span id=\"cb26-25\"><a href=\"#cb26-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23        NA           23     energy</span></span>\n<span id=\"cb26-26\"><a href=\"#cb26-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  8.866093           24     energy</span></span>\n<span id=\"cb26-27\"><a href=\"#cb26-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  7.883124           25     energy</span></span></code></pre></div>\n<p>You can use your score(s) of choice to compare different models. For\nexample, we can compute and plot the difference in CRPS scores for each\nseries in data. Here, a negative value means the AR(1) model\n(<code>mod2</code>) is better, while a positive value means the spline\nmodel (<code>mod1</code>) is better.</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>crps_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a>crps_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod2, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>)</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a></span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> crps_mod2<span class=\"sc\">$</span>series_1<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>  crps_mod1<span class=\"sc\">$</span>series_1<span class=\"sc\">$</span>score</span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb27-8\"><a href=\"#cb27-8\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb27-9\"><a href=\"#cb27-9\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb27-10\"><a href=\"#cb27-10\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb27-11\"><a href=\"#cb27-11\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb27-12\"><a href=\"#cb27-12\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb27-13\"><a href=\"#cb27-13\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb27-14\"><a href=\"#cb27-14\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(CRPS[AR1] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> CRPS[spline])</span>\n<span id=\"cb27-15\"><a href=\"#cb27-15\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb27-16\"><a href=\"#cb27-16\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb27-17\"><a href=\"#cb27-17\" tabindex=\"-1\"></a>ar1_better <span class=\"ot\">&lt;-</span> <span class=\"fu\">length</span>(<span class=\"fu\">which</span>(diff_scores <span class=\"sc\">&lt;</span> <span class=\"dv\">0</span>))</span>\n<span id=\"cb27-18\"><a href=\"#cb27-18\" tabindex=\"-1\"></a><span class=\"fu\">title</span>(<span class=\"at\">main =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb27-19\"><a href=\"#cb27-19\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;AR(1) better in &quot;</span>,</span>\n<span id=\"cb27-20\"><a href=\"#cb27-20\" tabindex=\"-1\"></a>  ar1_better,</span>\n<span id=\"cb27-21\"><a href=\"#cb27-21\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; of &quot;</span>,</span>\n<span id=\"cb27-22\"><a href=\"#cb27-22\" tabindex=\"-1\"></a>  <span class=\"fu\">length</span>(diff_scores),</span>\n<span id=\"cb27-23\"><a href=\"#cb27-23\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; evaluations&quot;</span>,</span>\n<span id=\"cb27-24\"><a href=\"#cb27-24\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;</span><span class=\"sc\">\\n</span><span class=\"st\">Mean difference = &quot;</span>,</span>\n<span id=\"cb27-25\"><a href=\"#cb27-25\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">mean</span>(diff_scores, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb27-26\"><a href=\"#cb27-26\" tabindex=\"-1\"></a>))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a></span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a></span>\n<span id=\"cb28-3\"><a href=\"#cb28-3\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> crps_mod2<span class=\"sc\">$</span>series_2<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb28-4\"><a href=\"#cb28-4\" tabindex=\"-1\"></a>  crps_mod1<span class=\"sc\">$</span>series_2<span class=\"sc\">$</span>score</span>\n<span id=\"cb28-5\"><a href=\"#cb28-5\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb28-6\"><a href=\"#cb28-6\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb28-7\"><a href=\"#cb28-7\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb28-8\"><a href=\"#cb28-8\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb28-9\"><a href=\"#cb28-9\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb28-10\"><a href=\"#cb28-10\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb28-11\"><a href=\"#cb28-11\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb28-12\"><a href=\"#cb28-12\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb28-13\"><a href=\"#cb28-13\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(CRPS[AR1] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> CRPS[spline])</span>\n<span id=\"cb28-14\"><a href=\"#cb28-14\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb28-15\"><a href=\"#cb28-15\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb28-16\"><a href=\"#cb28-16\" tabindex=\"-1\"></a>ar1_better <span class=\"ot\">&lt;-</span> <span class=\"fu\">length</span>(<span class=\"fu\">which</span>(diff_scores <span class=\"sc\">&lt;</span> <span class=\"dv\">0</span>))</span>\n<span id=\"cb28-17\"><a href=\"#cb28-17\" tabindex=\"-1\"></a><span class=\"fu\">title</span>(<span class=\"at\">main =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb28-18\"><a href=\"#cb28-18\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;AR(1) better in &quot;</span>,</span>\n<span id=\"cb28-19\"><a href=\"#cb28-19\" tabindex=\"-1\"></a>  ar1_better,</span>\n<span id=\"cb28-20\"><a href=\"#cb28-20\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; of &quot;</span>,</span>\n<span id=\"cb28-21\"><a href=\"#cb28-21\" tabindex=\"-1\"></a>  <span class=\"fu\">length</span>(diff_scores),</span>\n<span id=\"cb28-22\"><a href=\"#cb28-22\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; evaluations&quot;</span>,</span>\n<span id=\"cb28-23\"><a href=\"#cb28-23\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;</span><span class=\"sc\">\\n</span><span class=\"st\">Mean difference = &quot;</span>,</span>\n<span id=\"cb28-24\"><a href=\"#cb28-24\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">mean</span>(diff_scores, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb28-25\"><a href=\"#cb28-25\" tabindex=\"-1\"></a>))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a></span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> crps_mod2<span class=\"sc\">$</span>series_3<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a>  crps_mod1<span class=\"sc\">$</span>series_3<span class=\"sc\">$</span>score</span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb29-5\"><a href=\"#cb29-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb29-6\"><a href=\"#cb29-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb29-7\"><a href=\"#cb29-7\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb29-8\"><a href=\"#cb29-8\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb29-9\"><a href=\"#cb29-9\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb29-10\"><a href=\"#cb29-10\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb29-11\"><a href=\"#cb29-11\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb29-12\"><a href=\"#cb29-12\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(CRPS[AR1] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> CRPS[spline])</span>\n<span id=\"cb29-13\"><a href=\"#cb29-13\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb29-14\"><a href=\"#cb29-14\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb29-15\"><a href=\"#cb29-15\" tabindex=\"-1\"></a>ar1_better <span class=\"ot\">&lt;-</span> <span class=\"fu\">length</span>(<span class=\"fu\">which</span>(diff_scores <span class=\"sc\">&lt;</span> <span class=\"dv\">0</span>))</span>\n<span id=\"cb29-16\"><a href=\"#cb29-16\" tabindex=\"-1\"></a><span class=\"fu\">title</span>(<span class=\"at\">main =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb29-17\"><a href=\"#cb29-17\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;AR(1) better in &quot;</span>,</span>\n<span id=\"cb29-18\"><a href=\"#cb29-18\" tabindex=\"-1\"></a>  ar1_better,</span>\n<span id=\"cb29-19\"><a href=\"#cb29-19\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; of &quot;</span>,</span>\n<span id=\"cb29-20\"><a href=\"#cb29-20\" tabindex=\"-1\"></a>  <span class=\"fu\">length</span>(diff_scores),</span>\n<span id=\"cb29-21\"><a href=\"#cb29-21\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; evaluations&quot;</span>,</span>\n<span id=\"cb29-22\"><a href=\"#cb29-22\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;</span><span class=\"sc\">\\n</span><span class=\"st\">Mean difference = &quot;</span>,</span>\n<span id=\"cb29-23\"><a href=\"#cb29-23\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">mean</span>(diff_scores, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb29-24\"><a href=\"#cb29-24\" tabindex=\"-1\"></a>))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The correlated AR(1) model consistently gives better forecasts, and\nthe difference between scores tends to grow as the forecast horizon\nincreases. This is not unexpected given the way that splines linearly\nextrapolate outside the range of training data</p>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nBayesian forecasting and proper scoring rules:</p>\n<p>Clark N.J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond\nsingle-species models: leveraging multispecies forecasts to navigate the\ndynamics of ecological predictability</a>. <em>PeerJ</em> 13:e18929\n(2025) <a href=\"https://doi.org/10.7717/peerj.18929\" class=\"uri\">https://doi.org/10.7717/peerj.18929</a></p>\n<p>Hyndman, Rob J., and George Athanasopoulos. <a href=\"https://otexts.com/fpp3/distaccuracy.html\">Forecasting: principles\nand practice</a>. <em>OTexts</em>, (2018).</p>\n<p>Gneiting, Tilmann, and Adrian E. Raftery. <a href=\"https://www.tandfonline.com/doi/abs/10.1198/016214506000001437\">Strictly\nproper scoring rules, prediction, and estimation</a> <em>Journal of the\nAmerican statistical Association</em> 102.477 (2007) 359-378.</p>\n<p>Simonis, Juniper L., et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecy.3431\">Evaluating\nprobabilistic ecological forecasts</a> <em>Ecology</em> 102.8 (2021)\ne03431.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "doc/mvgam_overview.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## ----Access time series data-----------------------------------------------------\ndata(\"portal_data\")\n\n\n## ----Inspect data format and structure-------------------------------------------\nhead(portal_data)\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(portal_data)\n\n\n## --------------------------------------------------------------------------------\ndata <- sim_mvgam(n_series = 4, T = 24)\nhead(data$data_train, 12)\n\n\n## ----Wrangle data for modelling--------------------------------------------------\nportal_data %>%\n  # Filter the data to only contain captures of the 'PP'\n  dplyr::filter(series == 'PP') %>%\n  droplevels() %>%\n  dplyr::mutate(count = captures) %>%\n  # Add a 'year' variable\n  dplyr::mutate(year = sort(rep(1:8, 12))[time]) %>%\n  # Select the variables of interest to keep in the model_data\n  dplyr::select(series, year, time, count, mintemp, ndvi_ma12) -> model_data\n\n\n## --------------------------------------------------------------------------------\nhead(model_data)\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(model_data)\n\n\n## ----Summarise variables---------------------------------------------------------\nsummary(model_data)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(data = model_data, series = 1, y = \"count\")\n\n\n## --------------------------------------------------------------------------------\nmodel_data %>%\n  # Create a 'year_fac' factor version of 'year'\n  dplyr::mutate(year_fac = factor(year)) -> model_data\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(model_data)\nlevels(model_data$year_fac)\n\n\n## ----model1, include=FALSE, results='hide'---------------------------------------\nmodel1 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model1 <- mvgam(\n#   count ~ s(year_fac, bs = \"re\") - 1,\n#   family = poisson(),\n#   data = model_data\n# )\n\n## --------------------------------------------------------------------------------\nget_mvgam_priors(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n\n\n## --------------------------------------------------------------------------------\nsummary(model1)\n\n\n## ----Extract coefficient posteriors----------------------------------------------\nbeta_post <- as.data.frame(model1, variable = \"betas\")\ndplyr::glimpse(beta_post)\n\n\n## --------------------------------------------------------------------------------\nstancode(model1)\n\n\n## ----Plot random effect estimates------------------------------------------------\nplot(model1, type = \"re\")\n\n\n## --------------------------------------------------------------------------------\nmcmc_plot(\n  object = model1,\n  variable = \"betas\",\n  type = \"areas\"\n)\n\n\n## --------------------------------------------------------------------------------\npp_check(object = model1)\n\n\n## ----Plot posterior hindcasts----------------------------------------------------\nplot(model1, type = \"forecast\")\n\n\n## ----Extract posterior hindcast--------------------------------------------------\nhc <- hindcast(model1)\nstr(hc)\n\n\n## ----Extract hindcasts on the linear predictor scale-----------------------------\nhc <- hindcast(model1, type = \"link\")\nrange(hc$hindcasts$PP)\n\n\n## ----Plot posterior residuals----------------------------------------------------\nplot(model1, type = \"residuals\")\n\n\n## --------------------------------------------------------------------------------\nmodel_data %>%\n  dplyr::filter(time <= 70) -> data_train\nmodel_data %>%\n  dplyr::filter(time > 70) -> data_test\n\n\n## ----include=FALSE, message=FALSE, warning=FALSE---------------------------------\nmodel1b <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model1b <- mvgam(\n#   count ~ s(year_fac, bs = \"re\") - 1,\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test\n# )\n\n## ----Plotting predictions against test data--------------------------------------\nplot(model1b, type = \"forecast\", newdata = data_test)\n\n\n## ----Extract posterior forecasts-------------------------------------------------\nfc <- forecast(model1b)\nstr(fc)\n\n\n## ----model2, include=FALSE, message=FALSE, warning=FALSE-------------------------\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 -\n    1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model2 <- mvgam(\n#   count ~ s(year_fac, bs = \"re\") +\n#     ndvi_ma12 - 1,\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test\n# )\n\n## ----class.output=\"scroll-300\"---------------------------------------------------\nsummary(model2)\n\n\n## ----Posterior quantiles of model coefficients-----------------------------------\ncoef(model2)\n\n\n## --------------------------------------------------------------------------------\nbeta_post <- as.data.frame(model2, variable = \"betas\")\ndplyr::glimpse(beta_post)\n\n\n## ----Histogram of NDVI effects---------------------------------------------------\nhist(\n  beta_post$ndvi_ma12,\n  xlim = c(\n    -1 * max(abs(beta_post$ndvi_ma12)),\n    max(abs(beta_post$ndvi))\n  ),\n  col = \"darkred\",\n  border = \"white\",\n  xlab = expression(beta[NDVI]),\n  ylab = \"\",\n  yaxt = \"n\",\n  main = \"\",\n  lwd = 2\n)\nabline(v = 0, lwd = 2.5)\n\n\n## ----warning=FALSE---------------------------------------------------------------\nconditional_effects(model2)\n\n\n## ----model3, include=FALSE, message=FALSE, warning=FALSE-------------------------\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model3 <- mvgam(\n#   count ~ s(time, bs = \"bs\", k = 15) +\n#     ndvi_ma12,\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test\n# )\n\n## --------------------------------------------------------------------------------\nsummary(model3)\n\n\n## ----warning=FALSE---------------------------------------------------------------\nconditional_effects(model3, type = \"link\")\n\n\n## ----class.output=\"scroll-300\"---------------------------------------------------\nstancode(model3)\n\n\n## --------------------------------------------------------------------------------\nplot(model3, type = \"forecast\", newdata = data_test)\n\n\n## ----Plot extrapolated temporal functions using newdata--------------------------\nplot_mvgam_smooth(\n  model3,\n  smooth = \"s(time)\",\n  # pass newdata to the plot function to generate\n  # predictions of the temporal smooth to the end of the\n  # testing period\n  newdata = data.frame(\n    time = 1:max(data_test$time),\n    ndvi_ma12 = 0\n  )\n)\nabline(v = max(data_train$time), lty = \"dashed\", lwd = 2)\n\n\n## ----model4, include=FALSE-------------------------------------------------------\nmodel4 <- mvgam(\n  count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR(),\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model4 <- mvgam(\n#   count ~ s(ndvi_ma12, k = 6),\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test,\n#   trend_model = AR()\n# )\n\n## ----Summarise the mvgam autocorrelated error model, class.output=\"scroll-300\"----\nsummary(model4)\n\n\n## --------------------------------------------------------------------------------\nplot(model4, type = \"forecast\", newdata = data_test)\n\n\n## --------------------------------------------------------------------------------\nplot(model4, type = \"trend\", newdata = data_test)\n\n\n## --------------------------------------------------------------------------------\nloo_compare(model3, model4)\n\n\n## --------------------------------------------------------------------------------\nfc_mod3 <- forecast(model3)\nfc_mod4 <- forecast(model4)\nscore_mod3 <- score(fc_mod3, score = \"drps\")\nscore_mod4 <- score(fc_mod4, score = \"drps\")\nsum(score_mod4$PP$score, na.rm = TRUE) -\n  sum(score_mod3$PP$score, na.rm = TRUE)\n"
  },
  {
    "path": "doc/mvgam_overview.Rmd",
    "content": "---\ntitle: \"Overview of the mvgam package\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Overview of the mvgam package}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to give a general overview of the `mvgam` package and its primary functions.\n\n## Dynamic GAMs\n`mvgam` is designed to propagate unobserved temporal processes to capture latent dynamics in the observed time series. This works in a state-space format, with the temporal *trend* evolving independently of the observation process. An introduction to the package and some worked examples are also shown in this seminar: [Ecological Forecasting with Dynamic Generalized Additive Models](https://www.youtube.com/watch?v=0zZopLlomsQ){target=\"_blank\"}. Briefly, assume $\\tilde{\\boldsymbol{y}}_{i,t}$ is the conditional expectation of response variable $\\boldsymbol{i}$ at time $\\boldsymbol{t}$. Assuming $\\boldsymbol{y_i}$ is drawn from an exponential distribution with an invertible link function, the linear predictor for a multivariate Dynamic GAM can be written as:\n\n$$for~i~in~1:N_{series}~...$$\n$$for~t~in~1:N_{timepoints}~...$$\n\n$$g^{-1}(\\tilde{\\boldsymbol{y}}_{i,t})=\\alpha_{i}+\\sum\\limits_{j=1}^J\\boldsymbol{s}_{i,j,t}\\boldsymbol{x}_{j,t}+\\boldsymbol{Z}\\boldsymbol{z}_{k,t}\\,,$$\nHere $\\alpha$ are the unknown intercepts, the $\\boldsymbol{s}$'s are unknown smooth functions of covariates ($\\boldsymbol{x}$'s), which can potentially vary among the response series, and $\\boldsymbol{z}$ are dynamic latent processes. Each smooth function $\\boldsymbol{s_j}$ is composed of basis expansions whose coefficients, which must be estimated, control the functional relationship between $\\boldsymbol{x}_{j}$ and $g^{-1}(\\tilde{\\boldsymbol{y}})$. The size of the basis expansion limits the smooth’s potential complexity. A larger set of basis functions allows greater flexibility. For more information on GAMs and how they can smooth through data, see [this blogpost on how to interpret nonlinear effects from Generalized Additive Models](https://ecogambler.netlify.app/blog/interpreting-gams/){target=\"_blank\"}. Latent processes are captured with $\\boldsymbol{Z}\\boldsymbol{z}_{i,t}$, where $\\boldsymbol{Z}$ is an $i~by~k$ matrix of loading coefficients (which can be fixed or a combination of fixed and freely estimated parameters) and $\\boldsymbol{z}_{k,t}$ are a set of $K$ latent factors that can also include their own GAM linear predictors (see the [State-Space models vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html)), the [N-mixtures vignette](https://nicholasjclark.github.io/mvgam/articles/nmixtures.html) and the example in [`jsdgam`](https://nicholasjclark.github.io/mvgam/reference/jsdgam.html) to get an idea of how flexible these processes can be.\n  \nSeveral advantages of GAMs are that they can model a diversity of response families, including discrete distributions (i.e. Poisson, Negative Binomial, Gamma) that accommodate common ecological features such as zero-inflation or overdispersion, and that they can be formulated to include hierarchical smoothing for multivariate responses. `mvgam` supports a number of different observation families, which are summarized below:\n\n## Supported observation families\n\n|Distribution      | Function        | Support                                           | Extra parameter(s)   |\n|:----------------:|:---------------:| :------------------------------------------------:|:--------------------:|\n|Gaussian (identity link)         | `gaussian()`    | Real values in $(-\\infty, \\infty)$                | $\\sigma$             |\n|Student's T (identity link)      | `student-t()`   | Heavy-tailed real values in $(-\\infty, \\infty)$   | $\\sigma$, $\\nu$      |\n|LogNormal (identity link)        | `lognormal()`   | Positive real values in $[0, \\infty)$             | $\\sigma$             |\n|Gamma (log link)             | `Gamma()`       | Positive real values in $[0, \\infty)$             | $\\alpha$             |\n|Beta (logit link)              | `betar()`       | Real values (proportional) in $[0,1]$             | $\\phi$               |\n|Bernoulli (logit link)         | `bernoulli()`   | Binary data in ${0,1}$                          | -                    |\n|Poisson (log link)           | `poisson()`     | Non-negative integers in $(0,1,2,...)$            | -                    |\n|Negative Binomial2 (log link)| `nb()`          | Non-negative integers in $(0,1,2,...)$            | $\\phi$               |\n|Binomial (logit link)           | `binomial()` | Non-negative integers in $(0,1,2,...)$            | -                    |\n|Beta-Binomial (logit link)      | `beta_binomial()` | Non-negative integers in $(0,1,2,...)$       | $\\phi$                   |\n|Poisson Binomial N-mixture (log link)| `nmix()`  | Non-negative integers in $(0,1,2,...)$            | -               |\n\nFor all supported observation families, any extra parameters that need to be estimated (i.e. the $\\sigma$ in a Gaussian model or the $\\phi$ in a Negative Binomial model) are by default estimated independently for each series. However, users can opt to force all series to share extra observation parameters using `share_obs_params = TRUE` in `mvgam()`. Note that default link functions cannot currently be changed.\n\n## Supported temporal dynamic processes\nAs stated above, the latent processes can take a wide variety of forms, some of which can be multivariate to allow the different observational variables to interact or be correlated. When using the `mvgam()` function, the user chooses between different process models with the `trend_model` argument. Available process models are described in detail below.\n\n### Correlated multivariate processes\nIf more than one observational unit (usually referred to as 'series') is included in `data` $(N_{series} > 1)$, use `trend_model = ZMVN()` to set up a model where the outcomes for different observational units may be correlated according to:\n\n\\begin{align*}\nz_{t} & \\sim \\text{MVNormal}(0, \\Sigma) \\end{align*}\n\nThe covariance matrix $\\Sigma$ will capture potentially correlated process errors. It is parameterised using a Cholesky factorization, which requires priors on the series-level variances $\\sigma$ and on the strength of correlations using `Stan`'s `lkj_corr_cholesky` distribution. Note that this `trend_model` does not assume that measurements occur over *time*, as users can specify what variable in the `data` represents the unit of analysis (i.e. outcomes could be counts of different *species* across different *sites* or *regions*, for example; see [`?ZMVN()](https://nicholasjclark.github.io/mvgam/reference/ZMVN.html) for guidelines).\n\n### Independent Random Walks\nUse `trend_model = 'RW'` or `trend_model = RW()` to set up a model where each series in `data` has independent latent temporal dynamics of the form:\n\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(z_{i,t-1}, \\sigma_i) \\end{align*}\n\nProcess error parameters $\\sigma$ are modeled independently for each series. If a moving average process is required, use `trend_model = RW(ma = TRUE)` to set up the following:\n\n\\begin{align*}\nz_{i,t} & = z_{i,t-1} + \\theta_i * error_{i,t-1} + error_{i,t} \\\\\nerror_{i,t} & \\sim \\text{Normal}(0, \\sigma_i) \\end{align*}\n\nMoving average coefficients $\\theta$ are independently estimated for each series and will be forced to be stationary by default $(abs(\\theta)<1)$. Only moving averages of order $q=1$ are currently allowed. \n\n### Multivariate Random Walks\nIf more than one series is included in `data` $(N_{series} > 1)$, a multivariate Random Walk can be set up using `trend_model = RW(cor = TRUE)`, resulting in the following:\n\n\\begin{align*}\nz_{t} & \\sim \\text{MVNormal}(z_{t-1}, \\Sigma) \\end{align*}\n\nWhere the latent process estimate $z_t$ now takes the form of a vector. The covariance matrix $\\Sigma$ will capture contemporaneously correlated process errors. It is parameterised using a Cholesky factorization, which requires priors on the series-level variances $\\sigma$ and on the strength of correlations using `Stan`'s `lkj_corr_cholesky` distribution.\n\nMoving average terms can also be included for multivariate random walks, in which case the moving average coefficients $\\theta$ will be parameterised as an $N_{series} * N_{series}$ matrix\n\n### Autoregressive processes\nAutoregressive models up to $p=3$, in which the autoregressive coefficients are estimated independently for each series, can be used by specifying `trend_model = 'AR1'`, `trend_model = 'AR2'`, `trend_model = 'AR3'`, or `trend_model = AR(p = 1, 2, or 3)`. For example, a univariate AR(1) model takes the form:\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(ar1_i * z_{i,t-1}, \\sigma_i) \\end{align*}\n\n\nAll options are the same as for Random Walks, but additional options will be available for placing priors on the autoregressive coefficients. By default, these coefficients will not be forced into stationarity, but users can impose this restriction by changing the upper and lower bounds on their priors. See `?get_mvgam_priors` for more details.\n\n### Vector Autoregressive processes\nA Vector Autoregression of order $p=1$ can be specified if $N_{series} > 1$ using `trend_model = 'VAR1'` or `trend_model = VAR()`. A VAR(1) model takes the form:\n\n\\begin{align*}\nz_{t} & \\sim \\text{Normal}(A * z_{t-1}, \\Sigma) \\end{align*}\n\nWhere $A$ is an $N_{series} * N_{series}$ matrix of autoregressive coefficients in which the diagonals capture lagged self-dependence (i.e. the effect of a process at time $t$ on its own estimate at time $t+1$), while off-diagonals capture lagged cross-dependence (i.e. the effect of a process at time $t$ on the process for another series at time $t+1$). By default, the covariance matrix $\\Sigma$ will assume no process error covariance by fixing the off-diagonals to $0$. To allow for correlated errors, use `trend_model = 'VAR1cor'` or `trend_model = VAR(cor = TRUE)`. A moving average of order $q=1$ can also be included using `trend_model = VAR(ma = TRUE, cor = TRUE)`.\n\nNote that for all VAR models, stationarity of the process is enforced with a structured prior distribution that is described in detail in [Heaps 2022](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648)\n  \nHeaps, Sarah E. \"[Enforcing stationarity through the prior in vector autoregressions.](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648)\" *Journal of Computational and Graphical Statistics* 32.1 (2023): 74-83.\n\n### Hierarchical processes\nSeveral of the above-mentioned `trend_model` options can be modified to account for grouping structures in `data` by setting up hierarchical latent processes. If an optional grouping variable (`gr`; which must be a `factor` in the supplied `data`) exists, users can model hierarchical residual correlation structures. where the residual correlations for a specific level of `gr` are modelled hierarchically:\n\n\\begin{align*}\n\\Omega_{group} & = \\alpha_{cor}\\Omega_{global} + (1 - \\alpha_{cor})\\Omega_{group, local} \\end{align*}\n\n\nwhere $\\Omega_{global}$ is a *global* correlation matrix, $\\Omega_{group, local}$ is a *local deviation* correlation matrix and $\\alpha_{cor}$ is a weighting parameter controlling how strongly the local correlation matrix $\\Omega_{group}$ (i.e. the derived correlation matrix that will be used for each level of the grouping factor `gr`) is shrunk towards the global correlation matrix $\\Omega_{global}$  (larger values of $\\alpha_{cor}$ indicate a greater degree of shrinkage, i.e. a greater degree of partial pooling). This option is valuable for many types of designs where the same observational units (i.e. *financial assets* or *species*, for example) are measured in different strata (i.e. *regions*, *countries* or *experimental units*, for example). Currently hierarchical correlations can be included for `AR()`, `VAR()` or `ZMVN()` `trend_model` options.\n\n### Gaussian Processes\nThe final option for modelling temporal dynamics is to use a Gaussian Process with squared exponential kernel. These are set up independently for each series (there is currently no multivariate GP option), using `trend_model = 'GP'`. The dynamics for each latent process are modelled as:\n\n\\begin{align*}\nz & \\sim \\text{MVNormal}(0, \\Sigma_{error}) \\\\\n\\Sigma_{error}[t_i, t_j] & = \\alpha^2 * exp(-0.5 * ((|t_i - t_j| / \\rho))^2) \\end{align*}\n\nThe latent dynamic process evolves from a complex, high-dimensional Multivariate Normal distribution which depends on $\\rho$ (often called the length scale parameter) to control how quickly the correlations between the model's errors decay as a function of time. For these models, covariance decays exponentially fast with the squared distance (in time) between the observations. The functions also depend on a parameter $\\alpha$, which controls the marginal variability of the temporal function at all points; in other words it controls how much the GP term contributes to the linear predictor. `mvgam` capitalizes on some advances that allow GPs to be approximated using Hilbert space basis functions, which [considerably speed up computation at little cost to accuracy or prediction performance](https://link.springer.com/article/10.1007/s11222-022-10167-2){target=\"_blank\"}.\n\n### Piecewise logistic and linear trends\nModeling growth for many types of time series is often similar to modeling population growth in natural ecosystems, where there series exhibits nonlinear growth that saturates at some particular carrying capacity. The logistic trend model available in {`mvgam`} allows for a time-varying capacity $C(t)$ as well as a non-constant growth rate. Changes in the base growth rate $k$ are incorporated by explicitly defining changepoints throughout the training period where the growth rate is allowed to vary. The changepoint vector $a$ is represented as a vector of `1`s and `0`s, and the rate of growth at time $t$ is represented as $k+a(t)^T\\delta$. Potential changepoints are selected uniformly across the training period, and the number of changepoints, as well as the flexibility of the potential rate changes at these changepoints, can be controlled using `trend_model = PW()`. The full piecewise logistic growth model is then:\n\n\\begin{align*}\nz_t & = \\frac{C_t}{1 + \\exp(-(k+a(t)^T\\delta)(t-(m+a(t)^T\\gamma)))}  \\end{align*}\n\nFor time series that do not appear to exhibit saturating growth, a piece-wise constant rate of growth can often provide a useful trend model. The piecewise linear trend is defined as:\n\n\\begin{align*}\nz_t & = (k+a(t)^T\\delta)t + (m+a(t)^T\\gamma)  \\end{align*}\n\nIn both trend models, $m$ is an offset parameter that controls the trend intercept. Because of this parameter, it is not recommended that you include an intercept in your observation formula because this will not be identifiable. You can read about the full description of piecewise linear and logistic trends [in this paper by Taylor and Letham](https://www.tandfonline.com/doi/abs/10.1080/00031305.2017.1380080){target=\"_blank\"}. \n\nSean J. Taylor and Benjamin Letham. \"[Forecasting at scale.](https://www.tandfonline.com/doi/full/10.1080/00031305.2017.1380080)\" *The American Statistician* 72.1 (2018): 37-45.\n\n### Continuous time AR(1) processes\nMost trend models in the `mvgam()` function expect time to be measured in regularly-spaced, discrete intervals (i.e. one measurement per week, or one per year for example). But some time series are taken at irregular intervals and we'd like to model autoregressive properties of these. The `trend_model = CAR()` can be useful to set up these models, which currently only support autoregressive processes of order `1`. The evolution of the latent dynamic process follows the form:\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(ar1_i^{distance} * z_{i,t-1}, \\sigma_i) \\end{align*}\n\nWhere $distance$ is a vector of non-negative measurements of the time differences between successive observations. These models are perhaps more widely known as Ornstein–Uhlenbeck processes. See the **Examples** section in `?CAR` for an illustration of how to set these models up. \n\n## Regression formulae\n`mvgam` supports an observation model regression formula, built off the `mgcv` package, as well as an optional process model regression formula. The formulae supplied to `mvgam()` are exactly like those supplied to `glm()` except that smooth terms, `s()`,\n`te()`, `ti()` and `t2()`, time-varying effects using `dynamic()`, monotonically increasing (using `s(x, bs = 'moi')`) or decreasing splines (using `s(x, bs = 'mod')`; see `?smooth.construct.moi.smooth.spec` for details), as well as Gaussian Process functions using `gp()`, can be added to the right hand side (and `.` is not supported in `mvgam` formulae). See `?mvgam_formulae` for more guidance.\n  \nFor setting up State-Space models, the optional process model formula can be used (see [the State-Space model vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html) and [the shared latent states vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html) for guidance on using trend formulae).\n\n## Example time series data\nThe 'portal_data' object contains time series of rodent captures from the Portal Project, [a long-term monitoring study based near the town of Portal, Arizona](https://portal.weecology.org/){target=\"_blank\"}. Researchers have been operating a standardized set of baited traps within 24 experimental plots at this site since the 1970's. Sampling follows the lunar monthly cycle, with observations occurring on average about 28 days apart. However, missing observations do occur due to difficulties accessing the site (weather events, COVID disruptions etc...). You can read about the full sampling protocol [in this preprint by Ernest et al on the Biorxiv](https://www.biorxiv.org/content/10.1101/332783v3.full){target=\"_blank\"}. \n```{r Access time series data}\ndata(\"portal_data\")\n```\n\nAs the data come pre-loaded with the `mvgam` package, you can read a little about it in the help page using `?portal_data`. Before working with data, it is important to inspect how the data are structured, first using `head()`:\n```{r Inspect data format and structure}\nhead(portal_data)\n```\n\nBut the `glimpse()` function in `dplyr` is also useful for understanding how variables are structured\n```{r}\ndplyr::glimpse(portal_data)\n```\n\nWe will focus analyses on the time series of captures for one specific rodent species, the Desert Pocket Mouse *Chaetodipus penicillatus*. This species is interesting in that it goes into a kind of \"hibernation\" during the colder months, leading to very low captures during the winter period\n\n## Manipulating data for modelling\n\nManipulating the data into a 'long' format is necessary for modelling in `mvgam`. By 'long' format, we mean that each `series x time` observation needs to have its own entry in the `dataframe` or `list` object that we wish to use as data for modelling. A simple example can be viewed by simulating data using the `sim_mvgam()` function. See `?sim_mvgam` for more details\n```{r}\ndata <- sim_mvgam(n_series = 4, T = 24)\nhead(data$data_train, 12)\n```\n\nNotice how we have four different time series in these simulated data, but we do not spread the outcome values into different columns. Rather, there is only a single column for the outcome variable, labelled `y` in these simulated data. We also must supply a variable labelled `time` to ensure the modelling software knows how to arrange the time series when building models. This setup still allows us to formulate multivariate time series models, as you can see in the [State-Space vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html). Below are the steps needed to shape our `portal_data` object into the correct form. First, we create a `time` variable, select the column representing counts of our target species (`PP`), and select appropriate variables that we can use as predictors\n```{r Wrangle data for modelling}\nportal_data %>%\n  # Filter the data to only contain captures of the 'PP' \n  dplyr::filter(series == 'PP') %>%\n  droplevels() %>%\n  dplyr::mutate(count = captures) %>%\n  # Add a 'year' variable\n  dplyr::mutate(year = sort(rep(1:8, 12))[time]) %>%\n  # Select the variables of interest to keep in the model_data\n  dplyr::select(series, year, time, count, mintemp, ndvi_ma12) -> model_data\n```\n\nThe data now contain six variables:  \n  `series`, a factor indexing which time series each observation belongs to  \n  `year`, the year of sampling  \n  `time`, the indicator of which time step each observation belongs to  \n  `count`, the response variable representing the number of captures of the species `PP` in each sampling observation  \n  `mintemp`, the monthly average minimum temperature at each time step  \n  `ndvi_ma12`, a 12-month moving average of the monthly Normalized Difference Vegetation Index at each time step  \n\nNow check the data structure again\n```{r}\nhead(model_data)\n```\n\n```{r}\ndplyr::glimpse(model_data)\n```\n\nYou can also summarize multiple variables, which is helpful to search for data ranges and identify missing values\n```{r Summarise variables}\nsummary(model_data)\n```\n\nWe have some `NA`s in our response variable `count`. These observations will generally be thrown out by most modelling packages in \\R. But as you will see when we work through the tutorials, `mvgam` keeps these in the data so that predictions can be automatically returned for the full dataset. The time series and some of its descriptive features can be plotted using `plot_mvgam_series()`:\n```{r}\nplot_mvgam_series(data = model_data, series = 1, y = \"count\")\n```\n\n## GLMs with temporal random effects\nOur first task will be to fit a Generalized Linear Model (GLM) that can adequately capture the features of our `count` observations (integer data, lower bound at zero, missing values) while also attempting to model temporal variation. We are almost ready to fit our first model, which will be a GLM with Poisson observations, a log link function and random (hierarchical) intercepts for `year`. This will allow us to capture our prior belief that, although each year is unique, having been sampled from the same population of effects, all years are connected and thus might contain valuable information about one another. This will be done by capitalizing on the partial pooling properties of hierarchical models. Hierarchical (also known as random) effects offer many advantages when modelling data with grouping structures (i.e. multiple species, locations, years etc...). The ability to incorporate these in time series models is a huge advantage over traditional models such as ARIMA or Exponential Smoothing. But before we fit the model, we will need to convert `year` to a factor so that we can use a random effect basis in `mvgam`. See `?smooth.terms` and\n`?smooth.construct.re.smooth.spec` for details about the `re` basis construction that is used by both `mvgam` and `mgcv`\n```{r}\nmodel_data %>%\n  # Create a 'year_fac' factor version of 'year'\n  dplyr::mutate(year_fac = factor(year)) -> model_data\n```\n\nPreview the dataset to ensure year is now a factor with a unique factor level for each year in the data\n```{r}\ndplyr::glimpse(model_data)\nlevels(model_data$year_fac)\n```\n\nWe are now ready for our first `mvgam` model. The syntax will be familiar to users who have previously built models with `mgcv`. But for a refresher, see `?formula.gam` and the examples in `?gam`. Random effects can be specified using the `s` wrapper with the `re` basis. Note that we can also suppress the primary intercept using the usual `R` formula syntax `- 1`. `mvgam` has a number of possible observation families that can be used, see `?mvgam_families` for more information. We will use `Stan` as the fitting engine, which deploys Hamiltonian Monte Carlo (HMC) for full Bayesian inference. By default, 4 HMC chains will be run using a warmup of 500 iterations and collecting 500 posterior samples from each chain. The package will also aim to use the `Cmdstan` backend when possible, so it is recommended that users have an up-to-date installation of `Cmdstan` and the associated `cmdstanr` interface on their machines (note that you can set the backend yourself using the `backend` argument: see `?mvgam` for details). Interested users should consult the [`Stan` user's guide](https://mc-stan.org/docs/stan-users-guide/index.html){target=\"_blank\"} for more information about the software and the enormous variety of models that can be tackled with HMC.\n```{r model1, include=FALSE, results='hide'}\nmodel1 <- mvgam(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel1 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n```\n\nThe model can be described mathematically for each timepoint $t$ as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = \\beta_{year[year_t]} \\\\\n\\beta_{year} & \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\end{align*}\n\nWhere the $\\beta_{year}$ effects are drawn from a *population* distribution that is parameterized by a common mean $(\\mu_{year})$ and variance $(\\sigma_{year})$. Priors on most of the model parameters can be interrogated and changed using similar functionality to the options available in `brms`. For example, the default priors on $(\\mu_{year})$ and $(\\sigma_{year})$ can be viewed using the following code:\n```{r}\nget_mvgam_priors(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n```\n\nSee examples in `?get_mvgam_priors` to find out different ways that priors can be altered.\nOnce the model has finished, the first step is to inspect the `summary()` to ensure no major diagnostic warnings have been produced and to quickly summarise posterior distributions for key parameters\n```{r}\nsummary(model1)\n```\n\nThe diagnostic messages at the bottom of the summary show that the HMC sampler did not encounter any problems or difficult posterior spaces. This is a good sign. Posterior distributions for model parameters can be extracted in any way that an object of class `brmsfit` can (see `?mvgam::mvgam_draws` for details). For example, we can extract the coefficients related to the GAM linear predictor (i.e. the $\\beta$'s) into a `data.frame` using:\n```{r Extract coefficient posteriors}\nbeta_post <- as.data.frame(model1, variable = \"betas\")\ndplyr::glimpse(beta_post)\n```\n\nWith any model fitted in `mvgam`, the underlying `Stan` code can be viewed using the `stancode()` function:\n```{r}\nstancode(model1)\n```\n\n### Plotting effects and residuals\n\nNow for interrogating the model. We can get some sense of the variation in yearly intercepts from the summary above, but it is easier to understand them using targeted plots. Plot posterior distributions of the temporal random effects using `plot.mvgam()` with `type = 're'`. See `?plot.mvgam` for more details about the types of plots that can be produced from fitted `mvgam` objects\n```{r Plot random effect estimates}\nplot(model1, type = \"re\")\n```\n\n### `bayesplot` support\nWe can also capitalize on most of the useful MCMC plotting functions from the `bayesplot` package to visualize posterior distributions and diagnostics (see `?mvgam::mcmc_plot.mvgam` for details):\n```{r}\nmcmc_plot(\n  object = model1,\n  variable = \"betas\",\n  type = \"areas\"\n)\n```\n\nWe can also use the wide range of posterior checking functions available in `bayesplot` (see `?mvgam::ppc_check.mvgam` for details):\n```{r}\npp_check(object = model1)\n```\n\nThere is clearly some variation in these yearly intercept estimates. But how do these translate into time-varying predictions? To understand this, we can plot posterior hindcasts from this model for the training period using `plot.mvgam()` with `type = 'forecast'`\n```{r Plot posterior hindcasts}\nplot(model1, type = \"forecast\")\n```\n\nIf you wish to extract these hindcasts for other downstream analyses, the `hindcast()` function can be used. This will return a list object of class `mvgam_forecast`. In the `hindcasts` slot, a matrix of posterior retrodictions will be returned for each series in the data (only one series in our example): \n```{r Extract posterior hindcast}\nhc <- hindcast(model1)\nstr(hc)\n```\n\nYou can also extract these hindcasts on the linear predictor scale, which in this case is the log scale (our Poisson GLM used a log link function). Sometimes this can be useful for asking more targeted questions about drivers of variation:\n```{r Extract hindcasts on the linear predictor scale}\nhc <- hindcast(model1, type = \"link\")\nrange(hc$hindcasts$PP)\n```\n\nIn any regression analysis, a key question is whether the residuals show any patterns that can be indicative of un-modelled sources of variation. For GLMs, we can use a modified residual called the [Dunn-Smyth, or randomized quantile, residual](https://www.jstor.org/stable/1390802){target=\"_blank\"}. Inspect Dunn-Smyth residuals from the model using `plot.mvgam()` with `type = 'residuals'`\n```{r Plot posterior residuals}\nplot(model1, type = \"residuals\")\n```\n\n## Automatic forecasting for new data\nThese temporal random effects do not have a sense of \"time\". Because of this, each yearly random intercept is not restricted in some way to be similar to the previous yearly intercept. This drawback becomes evident when we predict for a new year. To do this, we can repeat the exercise above but this time will split the data into training and testing sets before re-running the model. We can then supply the test set as `newdata`. For splitting, we will make use of the `filter()` function from `dplyr`\n```{r}\nmodel_data %>%\n  dplyr::filter(time <= 70) -> data_train\nmodel_data %>%\n  dplyr::filter(time > 70) -> data_test\n```\n\n```{r include=FALSE, message=FALSE, warning=FALSE}\nmodel1b <- mvgam(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel1b <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nWe can view the test data in the forecast plot to see that the predictions do not capture the temporal variation in the test set\n```{r Plotting predictions against test data}\nplot(model1b, type = \"forecast\", newdata = data_test)\n```\n\nAs with the `hindcast()` function, we can use the `forecast()` function to automatically extract the posterior distributions for these predictions. This also returns an object of class `mvgam_forecast`, but now it will contain both the hindcasts and forecasts for each series in the data:\n```{r Extract posterior forecasts}\nfc <- forecast(model1b)\nstr(fc)\n```\n\n## Adding predictors as \"fixed\" effects\nAny users familiar with GLMs will know that we nearly always wish to include predictor variables that may explain some of the variation in our observations. Predictors are easily incorporated into GLMs / GAMs. Here, we will update the model from above by including a parametric (fixed) effect of `ndvi_ma12` as a linear predictor:\n```{r model2, include=FALSE, message=FALSE, warning=FALSE}\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = \\beta_{year[year_t]} + \\beta_{ndvi} * \\boldsymbol{ndvi}_t \\\\\n\\beta_{year} & \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\\\\n\\beta_{ndvi} & \\sim \\text{Normal}(0, 1) \\end{align*}\n\nWhere the $\\beta_{year}$ effects are the same as before but we now have another predictor $(\\beta_{ndvi})$ that applies to the `ndvi_ma12` value at each timepoint $t$. Inspect the summary of this model\n\n```{r, class.output=\"scroll-300\"}\nsummary(model2)\n```\n\nRather than printing the summary each time, we can also quickly look at the posterior empirical quantiles for the fixed effect of `ndvi` (and other linear predictor coefficients) using `coef`: \n```{r Posterior quantiles of model coefficients}\ncoef(model2)\n```\n\nLook at the estimated effect of `ndvi` using using a histogram. This can be done by first extracting the posterior coefficients:\n```{r}\nbeta_post <- as.data.frame(model2, variable = \"betas\")\ndplyr::glimpse(beta_post)\n```\n\nThe posterior distribution for the effect of `ndvi_ma12` is stored in the `ndvi_ma12` column. A quick histogram confirms our inference that `log(counts)` respond positively to increases in `ndvi`:\n```{r Histogram of NDVI effects}\nhist(beta_post$ndvi_ma12,\n  xlim = c(\n    -1 * max(abs(beta_post$ndvi_ma12)),\n    max(abs(beta_post$ndvi))\n  ),\n  col = \"darkred\",\n  border = \"white\",\n  xlab = expression(beta[NDVI]),\n  ylab = \"\",\n  yaxt = \"n\",\n  main = \"\",\n  lwd = 2\n)\nabline(v = 0, lwd = 2.5)\n```\n\n### `marginaleffects` support\nGiven our model used a nonlinear link function (log link in this example), it can still be difficult to fully understand what relationship our model is estimating between a predictor and the response. Fortunately, the `marginaleffects` package makes this relatively straightforward. Objects of class `mvgam` can be used with `marginaleffects` to inspect contrasts, scenario-based predictions, conditional and marginal effects, all on the outcome scale. Like `brms`, `mvgam` has the simple `conditional_effects()` function to make quick and informative plots for main effects, which rely on `marginaleffects` support. This will likely be your go-to function for quickly understanding patterns from fitted `mvgam` models\n```{r warning=FALSE}\nconditional_effects(model2)\n```\n\n## Adding predictors as smooths\n\nSmooth functions, using penalized splines, are a major feature of `mvgam`. Nonlinear splines are commonly viewed as variations of random effects in which the coefficients that control the shape of the spline are drawn from a joint, penalized distribution. This strategy is very often used in ecological time series analysis to capture smooth temporal variation in the processes we seek to study. When we construct smoothing splines, the workhorse package `mgcv` will calculate a set of basis functions that will collectively control the shape and complexity of the resulting spline. It is often helpful to visualize these basis functions to get a better sense of how splines work. We'll create a set of 6 basis functions to represent possible variation in the effect of `time` on our outcome.In addition to constructing the basis functions, `mgcv` also creates a penalty matrix $S$, which contains **known** coefficients that work to constrain the wiggliness of the resulting smooth function. When fitting a GAM to data, we must estimate the smoothing parameters ($\\lambda$) that will penalize these matrices, resulting in constrained basis coefficients and smoother functions that are less likely to overfit the data. This is the key to fitting GAMs in a Bayesian framework, as we can jointly estimate the $\\lambda$'s using informative priors to prevent overfitting and expand the complexity of models we can tackle. To see this in practice, we can now fit a model that replaces the yearly random effects with a smooth function of `time`. We will need a reasonably complex function (large `k`) to try and accommodate the temporal variation in our observations. Following some [useful advice by Gavin Simpson](https://fromthebottomoftheheap.net/2020/06/03/extrapolating-with-gams/){target=\"_blank\"}, we will use a b-spline basis for the temporal smooth. Because we no longer have intercepts for each year, we also retain the primary intercept term in this model (there is no `-1` in the formula now):\n```{r model3, include=FALSE, message=FALSE, warning=FALSE}\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = f(\\boldsymbol{time})_t + \\beta_{ndvi} * \\boldsymbol{ndvi}_t  \\\\\nf(\\boldsymbol{time}) & = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} & \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\\\\n\\beta_{ndvi} & \\sim \\text{Normal}(0, 1) \\end{align*}\n\n\nWhere the smooth function $f_{time}$ is built by summing across a set of weighted basis functions. The basis functions $(b)$ are constructed using a thin plate regression basis in `mgcv`. The weights $(\\beta_{smooth})$ are drawn from a penalized multivariate normal distribution where the precision matrix $(\\Omega$) is multiplied by a smoothing penalty $(\\lambda)$. If $\\lambda$ becomes large, this acts to *squeeze* the covariances among the weights $(\\beta_{smooth})$, leading to a less wiggly spline. Note that sometimes there are multiple smoothing penalties that contribute to the covariance matrix, but I am only showing one here for simplicity. View the summary as before\n```{r}\nsummary(model3)\n```\n\nThe summary above now contains posterior estimates for the smoothing parameters as well as the basis coefficients for the nonlinear effect of `time`. We can visualize `conditional_effects` as before:\n```{r warning=FALSE}\nconditional_effects(model3, type = \"link\")\n```\n\nInspect the underlying `Stan` code to gain some idea of how the spline is being penalized:\n```{r, class.output=\"scroll-300\"}\nstancode(model3)\n```\n\nThe line below `// prior for s(time)...` shows how the spline basis coefficients are drawn from a zero-centred multivariate normal distribution. The precision matrix $S$ is penalized by two different smoothing parameters (the $\\lambda$'s) to enforce smoothness and reduce overfitting\n\n## Latent dynamics in `mvgam`\n\nForecasts from the above model are not ideal:\n```{r}\nplot(model3, type = \"forecast\", newdata = data_test)\n```\n\nWhy is this happening? The forecasts are driven almost entirely by variation in the temporal spline, which is extrapolating linearly *forever* beyond the edge of the training data. Any slight wiggles near the end of the training set will result in wildly different forecasts. To visualize this, we can plot the extrapolated temporal functions into the out-of-sample test set for the two models. Here are the extrapolated functions for the first model, with 15 basis functions:\n```{r Plot extrapolated temporal functions using newdata}\nplot_mvgam_smooth(\n  model3,\n  smooth = \"s(time)\",\n  # pass newdata to the plot function to generate\n  # predictions of the temporal smooth to the end of the\n  # testing period\n  newdata = data.frame(\n    time = 1:max(data_test$time),\n    ndvi_ma12 = 0\n  )\n)\nabline(v = max(data_train$time), lty = \"dashed\", lwd = 2)\n```\n\nThis model is not doing well. Clearly we need to somehow account for the strong temporal autocorrelation when modelling these data without using a smooth function of `time`. Now onto another prominent feature of `mvgam`: the ability to include (possibly latent) autocorrelated residuals in regression models. To do so, we use the `trend_model` argument (see `?mvgam_trends` for details of different dynamic trend models that are supported). This model will use a separate sub-model for latent residuals that evolve as an AR1 process (i.e. the error in the current time point is a function of the error in the previous time point, plus some stochastic noise). We also include a smooth function of `ndvi_ma12` in this model, rather than the parametric term that was used above, to showcase that `mvgam` can include combinations of smooths and dynamic components:\n```{r model4, include=FALSE}\nmodel4 <- mvgam(count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR(),\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel4 <- mvgam(\n  count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR()\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = f(\\boldsymbol{ndvi})_t + z_t \\\\\nz_t & \\sim \\text{Normal}(ar1 * z_{t-1}, \\sigma_{error}) \\\\\nar1 & \\sim \\text{Normal}(0, 1)[-1, 1] \\\\\n\\sigma_{error} & \\sim \\text{Exponential}(2) \\\\\nf(\\boldsymbol{ndvi}) & = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} & \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\end{align*}\n\nHere the term $z_t$ captures autocorrelated latent residuals, which are modelled using an AR1 process. You can also notice that this model is estimating autocorrelated errors for the full time period, even though some of these time points have missing observations. This is useful for getting more realistic estimates of the residual autocorrelation parameters. Summarise the model to see how it now returns posterior summaries for the latent AR1 process:\n```{r Summarise the mvgam autocorrelated error model, class.output=\"scroll-300\"}\nsummary(model4)\n```\n\nView posterior hindcasts / forecasts and compare against the out of sample test data\n```{r}\nplot(model4, type = \"forecast\", newdata = data_test)\n```\n\nThe trend is evolving as an AR1 process, which we can also view:\n```{r}\nplot(model4, type = \"trend\", newdata = data_test)\n```\n\nIn-sample model performance can be interrogated using leave-one-out cross-validation utilities from the `loo` package (a higher value is preferred for this metric):\n```{r}\nloo_compare(model3, model4)\n```\n\nThe higher estimated log predictive density (ELPD) value for the dynamic model suggests it provides a better fit to the in-sample data. \n\nThough it should be obvious that this model provides better forecasts, we can quantify forecast performance for models 3 and 4 using the `forecast` and `score` functions. Here we will compare models based on their Discrete Ranked Probability Scores (a lower value is preferred for this metric)\n```{r}\nfc_mod3 <- forecast(model3)\nfc_mod4 <- forecast(model4)\nscore_mod3 <- score(fc_mod3, score = \"drps\")\nscore_mod4 <- score(fc_mod4, score = \"drps\")\nsum(score_mod4$PP$score, na.rm = TRUE) - \n  sum(score_mod3$PP$score, na.rm = TRUE)\n```\n\nA strongly negative value here suggests the score for the dynamic model (model 4) is much smaller than the score for the model with a smooth function of time (model 3)\n\n## Further reading\nThe following papers and resources offer useful material about Dynamic GAMs and how they can be applied in practice:\n  \nClark, Nicholas J. and Wells, K. [Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series](https://doi.org/10.1111/2041-210X.13974). *Methods in Ecology and Evolution*. (2023): 14, 771-784.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nde Sousa, Heitor C., et al. [Severe fire regimes decrease resilience of ectothermic populations](https://doi.org/10.1111/1365-2656.14188). *Journal of Animal Ecology* (2024): 93(11), 1656-1669.  \n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant.](https://doi.org/10.1016/j.csda.2022.107659) *Computational Statistics & Data Analysis* (2023): 179, 107659.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.\n  \nZhu, L., et al. [Responses of a widespread pest insect to extreme high temperatures are stage-dependent and divergent among seasonal cohorts](https://doi.org/10.1111/1365-2435.14711). *Functional Ecology* (2025): 39, 165–180. https://doi.org/10.1111/1365-2435.14711\n  \n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "doc/mvgam_overview.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Overview of the mvgam package</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Overview of the mvgam package</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#dynamic-gams\" id=\"toc-dynamic-gams\">Dynamic GAMs</a></li>\n<li><a href=\"#supported-observation-families\" id=\"toc-supported-observation-families\">Supported observation\nfamilies</a></li>\n<li><a href=\"#supported-temporal-dynamic-processes\" id=\"toc-supported-temporal-dynamic-processes\">Supported temporal dynamic\nprocesses</a>\n<ul>\n<li><a href=\"#correlated-multivariate-processes\" id=\"toc-correlated-multivariate-processes\">Correlated multivariate\nprocesses</a></li>\n<li><a href=\"#independent-random-walks\" id=\"toc-independent-random-walks\">Independent Random Walks</a></li>\n<li><a href=\"#multivariate-random-walks\" id=\"toc-multivariate-random-walks\">Multivariate Random Walks</a></li>\n<li><a href=\"#autoregressive-processes\" id=\"toc-autoregressive-processes\">Autoregressive processes</a></li>\n<li><a href=\"#vector-autoregressive-processes\" id=\"toc-vector-autoregressive-processes\">Vector Autoregressive\nprocesses</a></li>\n<li><a href=\"#hierarchical-processes\" id=\"toc-hierarchical-processes\">Hierarchical processes</a></li>\n<li><a href=\"#gaussian-processes\" id=\"toc-gaussian-processes\">Gaussian\nProcesses</a></li>\n<li><a href=\"#piecewise-logistic-and-linear-trends\" id=\"toc-piecewise-logistic-and-linear-trends\">Piecewise logistic and\nlinear trends</a></li>\n<li><a href=\"#continuous-time-ar1-processes\" id=\"toc-continuous-time-ar1-processes\">Continuous time AR(1)\nprocesses</a></li>\n</ul></li>\n<li><a href=\"#regression-formulae\" id=\"toc-regression-formulae\">Regression formulae</a></li>\n<li><a href=\"#example-time-series-data\" id=\"toc-example-time-series-data\">Example time series data</a></li>\n<li><a href=\"#manipulating-data-for-modelling\" id=\"toc-manipulating-data-for-modelling\">Manipulating data for\nmodelling</a></li>\n<li><a href=\"#glms-with-temporal-random-effects\" id=\"toc-glms-with-temporal-random-effects\">GLMs with temporal random\neffects</a>\n<ul>\n<li><a href=\"#plotting-effects-and-residuals\" id=\"toc-plotting-effects-and-residuals\">Plotting effects and\nresiduals</a></li>\n<li><a href=\"#bayesplot-support\" id=\"toc-bayesplot-support\"><code>bayesplot</code> support</a></li>\n</ul></li>\n<li><a href=\"#automatic-forecasting-for-new-data\" id=\"toc-automatic-forecasting-for-new-data\">Automatic forecasting for\nnew data</a></li>\n<li><a href=\"#adding-predictors-as-fixed-effects\" id=\"toc-adding-predictors-as-fixed-effects\">Adding predictors as “fixed”\neffects</a>\n<ul>\n<li><a href=\"#marginaleffects-support\" id=\"toc-marginaleffects-support\"><code>marginaleffects</code>\nsupport</a></li>\n</ul></li>\n<li><a href=\"#adding-predictors-as-smooths\" id=\"toc-adding-predictors-as-smooths\">Adding predictors as\nsmooths</a></li>\n<li><a href=\"#latent-dynamics-in-mvgam\" id=\"toc-latent-dynamics-in-mvgam\">Latent dynamics in\n<code>mvgam</code></a></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to give a general overview of the\n<code>mvgam</code> package and its primary functions.</p>\n<div id=\"dynamic-gams\" class=\"section level2\">\n<h2>Dynamic GAMs</h2>\n<p><code>mvgam</code> is designed to propagate unobserved temporal\nprocesses to capture latent dynamics in the observed time series. This\nworks in a state-space format, with the temporal <em>trend</em> evolving\nindependently of the observation process. An introduction to the package\nand some worked examples are also shown in this seminar: <a href=\"https://www.youtube.com/watch?v=0zZopLlomsQ\" target=\"_blank\">Ecological Forecasting with Dynamic Generalized Additive\nModels</a>. Briefly, assume <span class=\"math inline\">\\(\\tilde{\\boldsymbol{y}}_{i,t}\\)</span> is the\nconditional expectation of response variable <span class=\"math inline\">\\(\\boldsymbol{i}\\)</span> at time <span class=\"math inline\">\\(\\boldsymbol{t}\\)</span>. Assuming <span class=\"math inline\">\\(\\boldsymbol{y_i}\\)</span> is drawn from an\nexponential distribution with an invertible link function, the linear\npredictor for a multivariate Dynamic GAM can be written as:</p>\n<p><span class=\"math display\">\\[for~i~in~1:N_{series}~...\\]</span> <span class=\"math display\">\\[for~t~in~1:N_{timepoints}~...\\]</span></p>\n<p><span class=\"math display\">\\[g^{-1}(\\tilde{\\boldsymbol{y}}_{i,t})=\\alpha_{i}+\\sum\\limits_{j=1}^J\\boldsymbol{s}_{i,j,t}\\boldsymbol{x}_{j,t}+\\boldsymbol{Z}\\boldsymbol{z}_{k,t}\\,,\\]</span>\nHere <span class=\"math inline\">\\(\\alpha\\)</span> are the unknown\nintercepts, the <span class=\"math inline\">\\(\\boldsymbol{s}\\)</span>’s\nare unknown smooth functions of covariates (<span class=\"math inline\">\\(\\boldsymbol{x}\\)</span>’s), which can potentially\nvary among the response series, and <span class=\"math inline\">\\(\\boldsymbol{z}\\)</span> are dynamic latent\nprocesses. Each smooth function <span class=\"math inline\">\\(\\boldsymbol{s_j}\\)</span> is composed of basis\nexpansions whose coefficients, which must be estimated, control the\nfunctional relationship between <span class=\"math inline\">\\(\\boldsymbol{x}_{j}\\)</span> and <span class=\"math inline\">\\(g^{-1}(\\tilde{\\boldsymbol{y}})\\)</span>. The size\nof the basis expansion limits the smooth’s potential complexity. A\nlarger set of basis functions allows greater flexibility. For more\ninformation on GAMs and how they can smooth through data, see <a href=\"https://ecogambler.netlify.app/blog/interpreting-gams/\" target=\"_blank\">this blogpost on how to interpret nonlinear effects from\nGeneralized Additive Models</a>. Latent processes are captured with\n<span class=\"math inline\">\\(\\boldsymbol{Z}\\boldsymbol{z}_{i,t}\\)</span>,\nwhere <span class=\"math inline\">\\(\\boldsymbol{Z}\\)</span> is an <span class=\"math inline\">\\(i~by~k\\)</span> matrix of loading coefficients\n(which can be fixed or a combination of fixed and freely estimated\nparameters) and <span class=\"math inline\">\\(\\boldsymbol{z}_{k,t}\\)</span> are a set of <span class=\"math inline\">\\(K\\)</span> latent factors that can also include\ntheir own GAM linear predictors (see the <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space\nmodels vignette</a>), the <a href=\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\">N-mixtures\nvignette</a> and the example in <a href=\"https://nicholasjclark.github.io/mvgam/reference/jsdgam.html\"><code>jsdgam</code></a>\nto get an idea of how flexible these processes can be.</p>\n<p>Several advantages of GAMs are that they can model a diversity of\nresponse families, including discrete distributions (i.e. Poisson,\nNegative Binomial, Gamma) that accommodate common ecological features\nsuch as zero-inflation or overdispersion, and that they can be\nformulated to include hierarchical smoothing for multivariate responses.\n<code>mvgam</code> supports a number of different observation families,\nwhich are summarized below:</p>\n</div>\n<div id=\"supported-observation-families\" class=\"section level2\">\n<h2>Supported observation families</h2>\n<table>\n<colgroup>\n<col width=\"16%\" />\n<col width=\"15%\" />\n<col width=\"46%\" />\n<col width=\"20%\" />\n</colgroup>\n<thead>\n<tr class=\"header\">\n<th align=\"center\">Distribution</th>\n<th align=\"center\">Function</th>\n<th align=\"center\">Support</th>\n<th align=\"center\">Extra parameter(s)</th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"odd\">\n<td align=\"center\">Gaussian (identity link)</td>\n<td align=\"center\"><code>gaussian()</code></td>\n<td align=\"center\">Real values in <span class=\"math inline\">\\((-\\infty,\n\\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Student’s T (identity link)</td>\n<td align=\"center\"><code>student-t()</code></td>\n<td align=\"center\">Heavy-tailed real values in <span class=\"math inline\">\\((-\\infty, \\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span>, <span class=\"math inline\">\\(\\nu\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">LogNormal (identity link)</td>\n<td align=\"center\"><code>lognormal()</code></td>\n<td align=\"center\">Positive real values in <span class=\"math inline\">\\([0, \\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Gamma (log link)</td>\n<td align=\"center\"><code>Gamma()</code></td>\n<td align=\"center\">Positive real values in <span class=\"math inline\">\\([0, \\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\alpha\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Beta (logit link)</td>\n<td align=\"center\"><code>betar()</code></td>\n<td align=\"center\">Real values (proportional) in <span class=\"math inline\">\\([0,1]\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Bernoulli (logit link)</td>\n<td align=\"center\"><code>bernoulli()</code></td>\n<td align=\"center\">Binary data in <span class=\"math inline\">\\({0,1}\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Poisson (log link)</td>\n<td align=\"center\"><code>poisson()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Negative Binomial2 (log link)</td>\n<td align=\"center\"><code>nb()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Binomial (logit link)</td>\n<td align=\"center\"><code>binomial()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Beta-Binomial (logit link)</td>\n<td align=\"center\"><code>beta_binomial()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Poisson Binomial N-mixture (log link)</td>\n<td align=\"center\"><code>nmix()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n</tbody>\n</table>\n<p>For all supported observation families, any extra parameters that\nneed to be estimated (i.e. the <span class=\"math inline\">\\(\\sigma\\)</span> in a Gaussian model or the <span class=\"math inline\">\\(\\phi\\)</span> in a Negative Binomial model) are by\ndefault estimated independently for each series. However, users can opt\nto force all series to share extra observation parameters using\n<code>share_obs_params = TRUE</code> in <code>mvgam()</code>. Note that\ndefault link functions cannot currently be changed.</p>\n</div>\n<div id=\"supported-temporal-dynamic-processes\" class=\"section level2\">\n<h2>Supported temporal dynamic processes</h2>\n<p>As stated above, the latent processes can take a wide variety of\nforms, some of which can be multivariate to allow the different\nobservational variables to interact or be correlated. When using the\n<code>mvgam()</code> function, the user chooses between different\nprocess models with the <code>trend_model</code> argument. Available\nprocess models are described in detail below.</p>\n<div id=\"correlated-multivariate-processes\" class=\"section level3\">\n<h3>Correlated multivariate processes</h3>\n<p>If more than one observational unit (usually referred to as ‘series’)\nis included in <code>data</code> <span class=\"math inline\">\\((N_{series}\n&gt; 1)\\)</span>, use <code>trend_model = ZMVN()</code> to set up a\nmodel where the outcomes for different observational units may be\ncorrelated according to:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{MVNormal}(0, \\Sigma) \\end{align*}\\]</span></p>\n<p>The covariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span>\nwill capture potentially correlated process errors. It is parameterised\nusing a Cholesky factorization, which requires priors on the\nseries-level variances <span class=\"math inline\">\\(\\sigma\\)</span> and\non the strength of correlations using <code>Stan</code>’s\n<code>lkj_corr_cholesky</code> distribution. Note that this\n<code>trend_model</code> does not assume that measurements occur over\n<em>time</em>, as users can specify what variable in the\n<code>data</code> represents the unit of analysis (i.e. outcomes could\nbe counts of different <em>species</em> across different <em>sites</em>\nor <em>regions</em>, for example; see <a href=\"https://nicholasjclark.github.io/mvgam/reference/ZMVN.html\">`?ZMVN()</a>\nfor guidelines).</p>\n</div>\n<div id=\"independent-random-walks\" class=\"section level3\">\n<h3>Independent Random Walks</h3>\n<p>Use <code>trend_model = &#39;RW&#39;</code> or\n<code>trend_model = RW()</code> to set up a model where each series in\n<code>data</code> has independent latent temporal dynamics of the\nform:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Process error parameters <span class=\"math inline\">\\(\\sigma\\)</span>\nare modeled independently for each series. If a moving average process\nis required, use <code>trend_model = RW(ma = TRUE)</code> to set up the\nfollowing:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; = z_{i,t-1} + \\theta_i * error_{i,t-1} + error_{i,t} \\\\\nerror_{i,t} &amp; \\sim \\text{Normal}(0, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Moving average coefficients <span class=\"math inline\">\\(\\theta\\)</span> are independently estimated for\neach series and will be forced to be stationary by default <span class=\"math inline\">\\((abs(\\theta)&lt;1)\\)</span>. Only moving averages\nof order <span class=\"math inline\">\\(q=1\\)</span> are currently\nallowed.</p>\n</div>\n<div id=\"multivariate-random-walks\" class=\"section level3\">\n<h3>Multivariate Random Walks</h3>\n<p>If more than one series is included in <code>data</code> <span class=\"math inline\">\\((N_{series} &gt; 1)\\)</span>, a multivariate\nRandom Walk can be set up using\n<code>trend_model = RW(cor = TRUE)</code>, resulting in the\nfollowing:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{MVNormal}(z_{t-1}, \\Sigma)\n\\end{align*}\\]</span></p>\n<p>Where the latent process estimate <span class=\"math inline\">\\(z_t\\)</span> now takes the form of a vector. The\ncovariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span> will\ncapture contemporaneously correlated process errors. It is parameterised\nusing a Cholesky factorization, which requires priors on the\nseries-level variances <span class=\"math inline\">\\(\\sigma\\)</span> and\non the strength of correlations using <code>Stan</code>’s\n<code>lkj_corr_cholesky</code> distribution.</p>\n<p>Moving average terms can also be included for multivariate random\nwalks, in which case the moving average coefficients <span class=\"math inline\">\\(\\theta\\)</span> will be parameterised as an <span class=\"math inline\">\\(N_{series} * N_{series}\\)</span> matrix</p>\n</div>\n<div id=\"autoregressive-processes\" class=\"section level3\">\n<h3>Autoregressive processes</h3>\n<p>Autoregressive models up to <span class=\"math inline\">\\(p=3\\)</span>,\nin which the autoregressive coefficients are estimated independently for\neach series, can be used by specifying <code>trend_model = &#39;AR1&#39;</code>,\n<code>trend_model = &#39;AR2&#39;</code>, <code>trend_model = &#39;AR3&#39;</code>, or\n<code>trend_model = AR(p = 1, 2, or 3)</code>. For example, a univariate\nAR(1) model takes the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(ar1_i * z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>All options are the same as for Random Walks, but additional options\nwill be available for placing priors on the autoregressive coefficients.\nBy default, these coefficients will not be forced into stationarity, but\nusers can impose this restriction by changing the upper and lower bounds\non their priors. See <code>?get_mvgam_priors</code> for more\ndetails.</p>\n</div>\n<div id=\"vector-autoregressive-processes\" class=\"section level3\">\n<h3>Vector Autoregressive processes</h3>\n<p>A Vector Autoregression of order <span class=\"math inline\">\\(p=1\\)</span> can be specified if <span class=\"math inline\">\\(N_{series} &gt; 1\\)</span> using\n<code>trend_model = &#39;VAR1&#39;</code> or <code>trend_model = VAR()</code>. A\nVAR(1) model takes the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{Normal}(A * z_{t-1}, \\Sigma)\n\\end{align*}\\]</span></p>\n<p>Where <span class=\"math inline\">\\(A\\)</span> is an <span class=\"math inline\">\\(N_{series} * N_{series}\\)</span> matrix of\nautoregressive coefficients in which the diagonals capture lagged\nself-dependence (i.e. the effect of a process at time <span class=\"math inline\">\\(t\\)</span> on its own estimate at time <span class=\"math inline\">\\(t+1\\)</span>), while off-diagonals capture lagged\ncross-dependence (i.e. the effect of a process at time <span class=\"math inline\">\\(t\\)</span> on the process for another series at\ntime <span class=\"math inline\">\\(t+1\\)</span>). By default, the\ncovariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span> will\nassume no process error covariance by fixing the off-diagonals to <span class=\"math inline\">\\(0\\)</span>. To allow for correlated errors, use\n<code>trend_model = &#39;VAR1cor&#39;</code> or\n<code>trend_model = VAR(cor = TRUE)</code>. A moving average of order\n<span class=\"math inline\">\\(q=1\\)</span> can also be included using\n<code>trend_model = VAR(ma = TRUE, cor = TRUE)</code>.</p>\n<p>Note that for all VAR models, stationarity of the process is enforced\nwith a structured prior distribution that is described in detail in <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Heaps\n2022</a></p>\n<p>Heaps, Sarah E. “<a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Enforcing\nstationarity through the prior in vector autoregressions.</a>”\n<em>Journal of Computational and Graphical Statistics</em> 32.1 (2023):\n74-83.</p>\n</div>\n<div id=\"hierarchical-processes\" class=\"section level3\">\n<h3>Hierarchical processes</h3>\n<p>Several of the above-mentioned <code>trend_model</code> options can\nbe modified to account for grouping structures in <code>data</code> by\nsetting up hierarchical latent processes. If an optional grouping\nvariable (<code>gr</code>; which must be a <code>factor</code> in the\nsupplied <code>data</code>) exists, users can model hierarchical\nresidual correlation structures. where the residual correlations for a\nspecific level of <code>gr</code> are modelled hierarchically:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\Omega_{group} &amp; = \\alpha_{cor}\\Omega_{global} + (1 -\n\\alpha_{cor})\\Omega_{group, local} \\end{align*}\\]</span></p>\n<p>where <span class=\"math inline\">\\(\\Omega_{global}\\)</span> is a\n<em>global</em> correlation matrix, <span class=\"math inline\">\\(\\Omega_{group, local}\\)</span> is a <em>local\ndeviation</em> correlation matrix and <span class=\"math inline\">\\(\\alpha_{cor}\\)</span> is a weighting parameter\ncontrolling how strongly the local correlation matrix <span class=\"math inline\">\\(\\Omega_{group}\\)</span> (i.e. the derived\ncorrelation matrix that will be used for each level of the grouping\nfactor <code>gr</code>) is shrunk towards the global correlation matrix\n<span class=\"math inline\">\\(\\Omega_{global}\\)</span> (larger values of\n<span class=\"math inline\">\\(\\alpha_{cor}\\)</span> indicate a greater\ndegree of shrinkage, i.e. a greater degree of partial pooling). This\noption is valuable for many types of designs where the same\nobservational units (i.e. <em>financial assets</em> or <em>species</em>,\nfor example) are measured in different strata (i.e. <em>regions</em>,\n<em>countries</em> or <em>experimental units</em>, for example).\nCurrently hierarchical correlations can be included for\n<code>AR()</code>, <code>VAR()</code> or <code>ZMVN()</code>\n<code>trend_model</code> options.</p>\n</div>\n<div id=\"gaussian-processes\" class=\"section level3\">\n<h3>Gaussian Processes</h3>\n<p>The final option for modelling temporal dynamics is to use a Gaussian\nProcess with squared exponential kernel. These are set up independently\nfor each series (there is currently no multivariate GP option), using\n<code>trend_model = &#39;GP&#39;</code>. The dynamics for each latent process\nare modelled as:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz &amp; \\sim \\text{MVNormal}(0, \\Sigma_{error}) \\\\\n\\Sigma_{error}[t_i, t_j] &amp; = \\alpha^2 * exp(-0.5 * ((|t_i - t_j| /\n\\rho))^2) \\end{align*}\\]</span></p>\n<p>The latent dynamic process evolves from a complex, high-dimensional\nMultivariate Normal distribution which depends on <span class=\"math inline\">\\(\\rho\\)</span> (often called the length scale\nparameter) to control how quickly the correlations between the model’s\nerrors decay as a function of time. For these models, covariance decays\nexponentially fast with the squared distance (in time) between the\nobservations. The functions also depend on a parameter <span class=\"math inline\">\\(\\alpha\\)</span>, which controls the marginal\nvariability of the temporal function at all points; in other words it\ncontrols how much the GP term contributes to the linear predictor.\n<code>mvgam</code> capitalizes on some advances that allow GPs to be\napproximated using Hilbert space basis functions, which <a href=\"https://link.springer.com/article/10.1007/s11222-022-10167-2\" target=\"_blank\">considerably speed up computation at little cost to\naccuracy or prediction performance</a>.</p>\n</div>\n<div id=\"piecewise-logistic-and-linear-trends\" class=\"section level3\">\n<h3>Piecewise logistic and linear trends</h3>\n<p>Modeling growth for many types of time series is often similar to\nmodeling population growth in natural ecosystems, where there series\nexhibits nonlinear growth that saturates at some particular carrying\ncapacity. The logistic trend model available in {<code>mvgam</code>}\nallows for a time-varying capacity <span class=\"math inline\">\\(C(t)\\)</span> as well as a non-constant growth\nrate. Changes in the base growth rate <span class=\"math inline\">\\(k\\)</span> are incorporated by explicitly defining\nchangepoints throughout the training period where the growth rate is\nallowed to vary. The changepoint vector <span class=\"math inline\">\\(a\\)</span> is represented as a vector of\n<code>1</code>s and <code>0</code>s, and the rate of growth at time\n<span class=\"math inline\">\\(t\\)</span> is represented as <span class=\"math inline\">\\(k+a(t)^T\\delta\\)</span>. Potential changepoints\nare selected uniformly across the training period, and the number of\nchangepoints, as well as the flexibility of the potential rate changes\nat these changepoints, can be controlled using\n<code>trend_model = PW()</code>. The full piecewise logistic growth\nmodel is then:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_t &amp; = \\frac{C_t}{1 +\n\\exp(-(k+a(t)^T\\delta)(t-(m+a(t)^T\\gamma)))}  \\end{align*}\\]</span></p>\n<p>For time series that do not appear to exhibit saturating growth, a\npiece-wise constant rate of growth can often provide a useful trend\nmodel. The piecewise linear trend is defined as:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_t &amp; = (k+a(t)^T\\delta)t +\n(m+a(t)^T\\gamma)  \\end{align*}\\]</span></p>\n<p>In both trend models, <span class=\"math inline\">\\(m\\)</span> is an\noffset parameter that controls the trend intercept. Because of this\nparameter, it is not recommended that you include an intercept in your\nobservation formula because this will not be identifiable. You can read\nabout the full description of piecewise linear and logistic trends <a href=\"https://www.tandfonline.com/doi/abs/10.1080/00031305.2017.1380080\" target=\"_blank\">in this paper by Taylor and Letham</a>.</p>\n<p>Sean J. Taylor and Benjamin Letham. “<a href=\"https://www.tandfonline.com/doi/full/10.1080/00031305.2017.1380080\">Forecasting\nat scale.</a>” <em>The American Statistician</em> 72.1 (2018):\n37-45.</p>\n</div>\n<div id=\"continuous-time-ar1-processes\" class=\"section level3\">\n<h3>Continuous time AR(1) processes</h3>\n<p>Most trend models in the <code>mvgam()</code> function expect time to\nbe measured in regularly-spaced, discrete intervals (i.e. one\nmeasurement per week, or one per year for example). But some time series\nare taken at irregular intervals and we’d like to model autoregressive\nproperties of these. The <code>trend_model = CAR()</code> can be useful\nto set up these models, which currently only support autoregressive\nprocesses of order <code>1</code>. The evolution of the latent dynamic\nprocess follows the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(ar1_i^{distance} * z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Where <span class=\"math inline\">\\(distance\\)</span> is a vector of\nnon-negative measurements of the time differences between successive\nobservations. These models are perhaps more widely known as\nOrnstein–Uhlenbeck processes. See the <strong>Examples</strong> section\nin <code>?CAR</code> for an illustration of how to set these models\nup.</p>\n</div>\n</div>\n<div id=\"regression-formulae\" class=\"section level2\">\n<h2>Regression formulae</h2>\n<p><code>mvgam</code> supports an observation model regression formula,\nbuilt off the <code>mgcv</code> package, as well as an optional process\nmodel regression formula. The formulae supplied to <code>mvgam()</code>\nare exactly like those supplied to <code>glm()</code> except that smooth\nterms, <code>s()</code>, <code>te()</code>, <code>ti()</code> and\n<code>t2()</code>, time-varying effects using <code>dynamic()</code>,\nmonotonically increasing (using <code>s(x, bs = &#39;moi&#39;)</code>) or\ndecreasing splines (using <code>s(x, bs = &#39;mod&#39;)</code>; see\n<code>?smooth.construct.moi.smooth.spec</code> for details), as well as\nGaussian Process functions using <code>gp()</code>, can be added to the\nright hand side (and <code>.</code> is not supported in\n<code>mvgam</code> formulae). See <code>?mvgam_formulae</code> for more\nguidance.</p>\n<p>For setting up State-Space models, the optional process model formula\ncan be used (see <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">the\nState-Space model vignette</a> and <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">the\nshared latent states vignette</a> for guidance on using trend\nformulae).</p>\n</div>\n<div id=\"example-time-series-data\" class=\"section level2\">\n<h2>Example time series data</h2>\n<p>The ‘portal_data’ object contains time series of rodent captures from\nthe Portal Project, <a href=\"https://portal.weecology.org/\" target=\"_blank\">a long-term monitoring study based near the town of\nPortal, Arizona</a>. Researchers have been operating a standardized set\nof baited traps within 24 experimental plots at this site since the\n1970’s. Sampling follows the lunar monthly cycle, with observations\noccurring on average about 28 days apart. However, missing observations\ndo occur due to difficulties accessing the site (weather events, COVID\ndisruptions etc…). You can read about the full sampling protocol <a href=\"https://www.biorxiv.org/content/10.1101/332783v3.full\" target=\"_blank\">in this preprint by Ernest et al on the Biorxiv</a>.</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">data</span>(<span class=\"st\">&quot;portal_data&quot;</span>)</span></code></pre></div>\n<p>As the data come pre-loaded with the <code>mvgam</code> package, you\ncan read a little about it in the help page using\n<code>?portal_data</code>. Before working with data, it is important to\ninspect how the data are structured, first using\n<code>head()</code>:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(portal_data)</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   time series captures  ndvi_ma12    mintemp</span></span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1    1     DM       20 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2    1     DO        2 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3    1     PB        0 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4    1     PP        0 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-7\"><a href=\"#cb2-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5    2     DM       NA -0.2373635 -1.3347160</span></span>\n<span id=\"cb2-8\"><a href=\"#cb2-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6    2     DO       NA -0.2373635 -1.3347160</span></span></code></pre></div>\n<p>But the <code>glimpse()</code> function in <code>dplyr</code> is also\nuseful for understanding how variables are structured</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(portal_data)</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 320</span></span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 5</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;int&gt; 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, …</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; DM, DO, PB, PP, DM, DO, PB, PP, DM, DO, PB, PP, DM, DO, PB, …</span></span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ captures  &lt;int&gt; 20, 2, 0, 0, NA, NA, NA, NA, 36, 5, 0, 0, 40, 3, 0, 1, 29, 3…</span></span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12 &lt;dbl&gt; -0.172144125, -0.172144125, -0.172144125, -0.172144125, -0.2…</span></span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ mintemp   &lt;dbl&gt; -0.79633807, -0.79633807, -0.79633807, -0.79633807, -1.33471…</span></span></code></pre></div>\n<p>We will focus analyses on the time series of captures for one\nspecific rodent species, the Desert Pocket Mouse <em>Chaetodipus\npenicillatus</em>. This species is interesting in that it goes into a\nkind of “hibernation” during the colder months, leading to very low\ncaptures during the winter period</p>\n</div>\n<div id=\"manipulating-data-for-modelling\" class=\"section level2\">\n<h2>Manipulating data for modelling</h2>\n<p>Manipulating the data into a ‘long’ format is necessary for modelling\nin <code>mvgam</code>. By ‘long’ format, we mean that each\n<code>series x time</code> observation needs to have its own entry in\nthe <code>dataframe</code> or <code>list</code> object that we wish to\nuse as data for modelling. A simple example can be viewed by simulating\ndata using the <code>sim_mvgam()</code> function. See\n<code>?sim_mvgam</code> for more details</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a>data <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(<span class=\"at\">n_series =</span> <span class=\"dv\">4</span>, <span class=\"at\">T =</span> <span class=\"dv\">24</span>)</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(data<span class=\"sc\">$</span>data_train, <span class=\"dv\">12</span>)</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    y season year   series time</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  1      1    1 series_1    1</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  0      1    1 series_2    1</span></span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3  1      1    1 series_3    1</span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4  3      1    1 series_4    1</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  1      2    1 series_1    2</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  1      2    1 series_2    2</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7  0      2    1 series_3    2</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8  5      2    1 series_4    2</span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9  0      3    1 series_1    3</span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 1      3    1 series_2    3</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 0      3    1 series_3    3</span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 3      3    1 series_4    3</span></span></code></pre></div>\n<p>Notice how we have four different time series in these simulated\ndata, but we do not spread the outcome values into different columns.\nRather, there is only a single column for the outcome variable, labelled\n<code>y</code> in these simulated data. We also must supply a variable\nlabelled <code>time</code> to ensure the modelling software knows how to\narrange the time series when building models. This setup still allows us\nto formulate multivariate time series models, as you can see in the <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space\nvignette</a>. Below are the steps needed to shape our\n<code>portal_data</code> object into the correct form. First, we create\na <code>time</code> variable, select the column representing counts of\nour target species (<code>PP</code>), and select appropriate variables\nthat we can use as predictors</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>portal_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  <span class=\"co\"># Filter the data to only contain captures of the &#39;PP&#39; </span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&#39;PP&#39;</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"fu\">droplevels</span>() <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">count =</span> captures) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a>  <span class=\"co\"># Add a &#39;year&#39; variable</span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">year =</span> <span class=\"fu\">sort</span>(<span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">8</span>, <span class=\"dv\">12</span>))[time]) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a>  <span class=\"co\"># Select the variables of interest to keep in the model_data</span></span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(series, year, time, count, mintemp, ndvi_ma12) <span class=\"ot\">-&gt;</span> model_data</span></code></pre></div>\n<p>The data now contain six variables:<br />\n<code>series</code>, a factor indexing which time series each\nobservation belongs to<br />\n<code>year</code>, the year of sampling<br />\n<code>time</code>, the indicator of which time step each observation\nbelongs to<br />\n<code>count</code>, the response variable representing the number of\ncaptures of the species <code>PP</code> in each sampling\nobservation<br />\n<code>mintemp</code>, the monthly average minimum temperature at each\ntime step<br />\n<code>ndvi_ma12</code>, a 12-month moving average of the monthly\nNormalized Difference Vegetation Index at each time step</p>\n<p>Now check the data structure again</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(model_data)</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   series year time count     mintemp   ndvi_ma12</span></span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1     PP    1    1     0 -0.79633807 -0.17214413</span></span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2     PP    1    2    NA -1.33471597 -0.23736348</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3     PP    1    3     0 -1.24166462 -0.21212064</span></span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4     PP    1    4     1 -1.08048145 -0.16043812</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5     PP    1    5     7 -0.42447625 -0.08267729</span></span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6     PP    1    6     7  0.06532892 -0.03692877</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(model_data)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 80</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 6</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, …</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year      &lt;int&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, …</span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;int&gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ count     &lt;int&gt; 0, NA, 0, 1, 7, 7, 8, 8, 4, NA, 0, 0, 0, 0, 0, 0, NA, 2, 4, …</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ mintemp   &lt;dbl&gt; -0.79633807, -1.33471597, -1.24166462, -1.08048145, -0.42447…</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12 &lt;dbl&gt; -0.172144125, -0.237363477, -0.212120638, -0.160438125, -0.0…</span></span></code></pre></div>\n<p>You can also summarize multiple variables, which is helpful to search\nfor data ranges and identify missing values</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model_data)</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  series       year           time           count           mintemp       </span></span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  PP:80   Min.   :1.00   Min.   : 1.00   Min.   : 0.000   Min.   :-2.0978  </span></span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          1st Qu.:2.00   1st Qu.:20.75   1st Qu.: 1.000   1st Qu.:-1.0808  </span></span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Median :4.00   Median :40.50   Median : 5.000   Median :-0.4091  </span></span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Mean   :3.85   Mean   :40.50   Mean   : 5.222   Mean   :-0.2151  </span></span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          3rd Qu.:5.25   3rd Qu.:60.25   3rd Qu.: 8.000   3rd Qu.: 0.6133  </span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Max.   :7.00   Max.   :80.00   Max.   :21.000   Max.   : 1.4530  </span></span>\n<span id=\"cb8-9\"><a href=\"#cb8-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                         NA&#39;s   :17                        </span></span>\n<span id=\"cb8-10\"><a href=\"#cb8-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    ndvi_ma12       </span></span>\n<span id=\"cb8-11\"><a href=\"#cb8-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Min.   :-0.66884  </span></span>\n<span id=\"cb8-12\"><a href=\"#cb8-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  1st Qu.:-0.20869  </span></span>\n<span id=\"cb8-13\"><a href=\"#cb8-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Median :-0.16517  </span></span>\n<span id=\"cb8-14\"><a href=\"#cb8-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Mean   :-0.09501  </span></span>\n<span id=\"cb8-15\"><a href=\"#cb8-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  3rd Qu.:-0.03440  </span></span>\n<span id=\"cb8-16\"><a href=\"#cb8-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Max.   : 0.74831  </span></span>\n<span id=\"cb8-17\"><a href=\"#cb8-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span></code></pre></div>\n<p>We have some <code>NA</code>s in our response variable\n<code>count</code>. These observations will generally be thrown out by\nmost modelling packages in . But as you will see when we work through\nthe tutorials, <code>mvgam</code> keeps these in the data so that\npredictions can be automatically returned for the full dataset. The time\nseries and some of its descriptive features can be plotted using\n<code>plot_mvgam_series()</code>:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(<span class=\"at\">data =</span> model_data, <span class=\"at\">series =</span> <span class=\"dv\">1</span>, <span class=\"at\">y =</span> <span class=\"st\">&quot;count&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"glms-with-temporal-random-effects\" class=\"section level2\">\n<h2>GLMs with temporal random effects</h2>\n<p>Our first task will be to fit a Generalized Linear Model (GLM) that\ncan adequately capture the features of our <code>count</code>\nobservations (integer data, lower bound at zero, missing values) while\nalso attempting to model temporal variation. We are almost ready to fit\nour first model, which will be a GLM with Poisson observations, a log\nlink function and random (hierarchical) intercepts for\n<code>year</code>. This will allow us to capture our prior belief that,\nalthough each year is unique, having been sampled from the same\npopulation of effects, all years are connected and thus might contain\nvaluable information about one another. This will be done by\ncapitalizing on the partial pooling properties of hierarchical models.\nHierarchical (also known as random) effects offer many advantages when\nmodelling data with grouping structures (i.e. multiple species,\nlocations, years etc…). The ability to incorporate these in time series\nmodels is a huge advantage over traditional models such as ARIMA or\nExponential Smoothing. But before we fit the model, we will need to\nconvert <code>year</code> to a factor so that we can use a random effect\nbasis in <code>mvgam</code>. See <code>?smooth.terms</code> and\n<code>?smooth.construct.re.smooth.spec</code> for details about the\n<code>re</code> basis construction that is used by both\n<code>mvgam</code> and <code>mgcv</code></p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>model_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  <span class=\"co\"># Create a &#39;year_fac&#39; factor version of &#39;year&#39;</span></span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">year_fac =</span> <span class=\"fu\">factor</span>(year)) <span class=\"ot\">-&gt;</span> model_data</span></code></pre></div>\n<p>Preview the dataset to ensure year is now a factor with a unique\nfactor level for each year in the data</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(model_data)</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 80</span></span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 7</span></span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, …</span></span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year      &lt;int&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, …</span></span>\n<span id=\"cb11-6\"><a href=\"#cb11-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;int&gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…</span></span>\n<span id=\"cb11-7\"><a href=\"#cb11-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ count     &lt;int&gt; 0, NA, 0, 1, 7, 7, 8, 8, 4, NA, 0, 0, 0, 0, 0, 0, NA, 2, 4, …</span></span>\n<span id=\"cb11-8\"><a href=\"#cb11-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ mintemp   &lt;dbl&gt; -0.79633807, -1.33471597, -1.24166462, -1.08048145, -0.42447…</span></span>\n<span id=\"cb11-9\"><a href=\"#cb11-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12 &lt;dbl&gt; -0.172144125, -0.237363477, -0.212120638, -0.160438125, -0.0…</span></span>\n<span id=\"cb11-10\"><a href=\"#cb11-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year_fac  &lt;fct&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, …</span></span>\n<span id=\"cb11-11\"><a href=\"#cb11-11\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(model_data<span class=\"sc\">$</span>year_fac)</span>\n<span id=\"cb11-12\"><a href=\"#cb11-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;1&quot; &quot;2&quot; &quot;3&quot; &quot;4&quot; &quot;5&quot; &quot;6&quot; &quot;7&quot;</span></span></code></pre></div>\n<p>We are now ready for our first <code>mvgam</code> model. The syntax\nwill be familiar to users who have previously built models with\n<code>mgcv</code>. But for a refresher, see <code>?formula.gam</code>\nand the examples in <code>?gam</code>. Random effects can be specified\nusing the <code>s</code> wrapper with the <code>re</code> basis. Note\nthat we can also suppress the primary intercept using the usual\n<code>R</code> formula syntax <code>- 1</code>. <code>mvgam</code> has a\nnumber of possible observation families that can be used, see\n<code>?mvgam_families</code> for more information. We will use\n<code>Stan</code> as the fitting engine, which deploys Hamiltonian Monte\nCarlo (HMC) for full Bayesian inference. By default, 4 HMC chains will\nbe run using a warmup of 500 iterations and collecting 500 posterior\nsamples from each chain. The package will also aim to use the\n<code>Cmdstan</code> backend when possible, so it is recommended that\nusers have an up-to-date installation of <code>Cmdstan</code> and the\nassociated <code>cmdstanr</code> interface on their machines (note that\nyou can set the backend yourself using the <code>backend</code>\nargument: see <code>?mvgam</code> for details). Interested users should\nconsult the <a href=\"https://mc-stan.org/docs/stan-users-guide/index.html\" target=\"_blank\"><code>Stan</code> user’s guide</a> for more information\nabout the software and the enormous variety of models that can be\ntackled with HMC.</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a>model1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data</span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically for each timepoint <span class=\"math inline\">\\(t\\)</span> as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = \\beta_{year[year_t]} \\\\\n\\beta_{year} &amp; \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year})\n\\end{align*}\\]</span></p>\n<p>Where the <span class=\"math inline\">\\(\\beta_{year}\\)</span> effects\nare drawn from a <em>population</em> distribution that is parameterized\nby a common mean <span class=\"math inline\">\\((\\mu_{year})\\)</span> and\nvariance <span class=\"math inline\">\\((\\sigma_{year})\\)</span>. Priors on\nmost of the model parameters can be interrogated and changed using\nsimilar functionality to the options available in <code>brms</code>. For\nexample, the default priors on <span class=\"math inline\">\\((\\mu_{year})\\)</span> and <span class=\"math inline\">\\((\\sigma_{year})\\)</span> can be viewed using the\nfollowing code:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data</span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb13-5\"><a href=\"#cb13-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      param_name param_length           param_info</span></span>\n<span id=\"cb13-6\"><a href=\"#cb13-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             vector[1] mu_raw;            1 s(year_fac) pop mean</span></span>\n<span id=\"cb13-7\"><a href=\"#cb13-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[1] sigma_raw;            1   s(year_fac) pop sd</span></span>\n<span id=\"cb13-8\"><a href=\"#cb13-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                  prior                 example_change</span></span>\n<span id=\"cb13-9\"><a href=\"#cb13-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1               mu_raw ~ std_normal();  mu_raw ~ normal(-0.88, 0.73);</span></span>\n<span id=\"cb13-10\"><a href=\"#cb13-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 sigma_raw ~ inv_gamma(1.418, 0.452); sigma_raw ~ exponential(0.15);</span></span>\n<span id=\"cb13-11\"><a href=\"#cb13-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb13-12\"><a href=\"#cb13-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb13-13\"><a href=\"#cb13-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<p>See examples in <code>?get_mvgam_priors</code> to find out different\nways that priors can be altered. Once the model has finished, the first\nstep is to inspect the <code>summary()</code> to ensure no major\ndiagnostic warnings have been produced and to quickly summarise\nposterior distributions for key parameters</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model1)</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb14-14\"><a href=\"#cb14-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-15\"><a href=\"#cb14-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb14-16\"><a href=\"#cb14-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb14-17\"><a href=\"#cb14-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-18\"><a href=\"#cb14-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb14-19\"><a href=\"#cb14-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb14-20\"><a href=\"#cb14-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-21\"><a href=\"#cb14-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb14-22\"><a href=\"#cb14-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb14-23\"><a href=\"#cb14-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb14-24\"><a href=\"#cb14-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb14-25\"><a href=\"#cb14-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-26\"><a href=\"#cb14-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb14-27\"><a href=\"#cb14-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb14-28\"><a href=\"#cb14-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).1 0.930 1.3   1.6    1  2517</span></span>\n<span id=\"cb14-29\"><a href=\"#cb14-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).2 0.870 1.2   1.5    1  2716</span></span>\n<span id=\"cb14-30\"><a href=\"#cb14-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).3 0.085 0.6   1.1    1  2154</span></span>\n<span id=\"cb14-31\"><a href=\"#cb14-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).4 2.000 2.3   2.5    1  2367</span></span>\n<span id=\"cb14-32\"><a href=\"#cb14-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).5 1.100 1.5   1.8    1  2517</span></span>\n<span id=\"cb14-33\"><a href=\"#cb14-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).6 1.500 1.8   2.1    1  2511</span></span>\n<span id=\"cb14-34\"><a href=\"#cb14-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).7 1.800 2.1   2.3    1  2228</span></span>\n<span id=\"cb14-35\"><a href=\"#cb14-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-36\"><a href=\"#cb14-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM group-level estimates:</span></span>\n<span id=\"cb14-37\"><a href=\"#cb14-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb14-38\"><a href=\"#cb14-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mean(s(year_fac)) 0.87 1.5   1.9 1.02   368</span></span>\n<span id=\"cb14-39\"><a href=\"#cb14-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sd(s(year_fac))   0.35 0.6   1.2 1.01   345</span></span>\n<span id=\"cb14-40\"><a href=\"#cb14-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-41\"><a href=\"#cb14-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb14-42\"><a href=\"#cb14-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value    </span></span>\n<span id=\"cb14-43\"><a href=\"#cb14-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac) 6.095      7  234.5  &lt;2e-16 ***</span></span>\n<span id=\"cb14-44\"><a href=\"#cb14-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb14-45\"><a href=\"#cb14-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb14-46\"><a href=\"#cb14-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-47\"><a href=\"#cb14-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb14-48\"><a href=\"#cb14-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb14-49\"><a href=\"#cb14-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb14-50\"><a href=\"#cb14-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb14-51\"><a href=\"#cb14-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb14-52\"><a href=\"#cb14-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-53\"><a href=\"#cb14-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb14-54\"><a href=\"#cb14-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb14-55\"><a href=\"#cb14-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb14-56\"><a href=\"#cb14-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-57\"><a href=\"#cb14-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The diagnostic messages at the bottom of the summary show that the\nHMC sampler did not encounter any problems or difficult posterior\nspaces. This is a good sign. Posterior distributions for model\nparameters can be extracted in any way that an object of class\n<code>brmsfit</code> can (see <code>?mvgam::mvgam_draws</code> for\ndetails). For example, we can extract the coefficients related to the\nGAM linear predictor (i.e. the <span class=\"math inline\">\\(\\beta\\)</span>’s) into a <code>data.frame</code>\nusing:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a>beta_post <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(model1, <span class=\"at\">variable =</span> <span class=\"st\">&quot;betas&quot;</span>)</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(beta_post)</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 2,000</span></span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 7</span></span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).1` &lt;dbl&gt; 1.42562, 1.13259, 1.60469, 1.05618, 1.30829, 1.36421, …</span></span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).2` &lt;dbl&gt; 1.360710, 1.224610, 1.352340, 1.080130, 1.495370, 1.24…</span></span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).3` &lt;dbl&gt; 0.726486, 0.540769, 0.706619, 0.477383, 0.872224, 0.77…</span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).4` &lt;dbl&gt; 2.30283, 2.09318, 2.36101, 2.18330, 2.24543, 2.51212, …</span></span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).5` &lt;dbl&gt; 1.338800, 0.903048, 1.296670, 1.423650, 1.654660, 1.51…</span></span>\n<span id=\"cb15-10\"><a href=\"#cb15-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).6` &lt;dbl&gt; 1.90255, 1.88174, 1.72255, 1.94652, 2.00091, 1.78989, …</span></span>\n<span id=\"cb15-11\"><a href=\"#cb15-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).7` &lt;dbl&gt; 2.26354, 2.15511, 2.05374, 2.10885, 2.23140, 2.23759, …</span></span></code></pre></div>\n<p>With any model fitted in <code>mvgam</code>, the underlying\n<code>Stan</code> code can be viewed using the <code>stancode()</code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(model1)</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb16-9\"><a href=\"#cb16-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb16-10\"><a href=\"#cb16-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb16-11\"><a href=\"#cb16-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb16-12\"><a href=\"#cb16-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb16-13\"><a href=\"#cb16-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb16-14\"><a href=\"#cb16-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-15\"><a href=\"#cb16-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb16-16\"><a href=\"#cb16-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb16-17\"><a href=\"#cb16-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb16-18\"><a href=\"#cb16-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-19\"><a href=\"#cb16-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect variances</span></span>\n<span id=\"cb16-20\"><a href=\"#cb16-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[1] sigma_raw;</span></span>\n<span id=\"cb16-21\"><a href=\"#cb16-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-22\"><a href=\"#cb16-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect means</span></span>\n<span id=\"cb16-23\"><a href=\"#cb16-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[1] mu_raw;</span></span>\n<span id=\"cb16-24\"><a href=\"#cb16-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-25\"><a href=\"#cb16-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb16-26\"><a href=\"#cb16-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb16-27\"><a href=\"#cb16-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb16-28\"><a href=\"#cb16-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : 7] = mu_raw[1] + b_raw[1 : 7] * sigma_raw[1];</span></span>\n<span id=\"cb16-29\"><a href=\"#cb16-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-30\"><a href=\"#cb16-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb16-31\"><a href=\"#cb16-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population variances</span></span>\n<span id=\"cb16-32\"><a href=\"#cb16-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma_raw ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb16-33\"><a href=\"#cb16-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-34\"><a href=\"#cb16-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population means</span></span>\n<span id=\"cb16-35\"><a href=\"#cb16-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   mu_raw ~ std_normal();</span></span>\n<span id=\"cb16-36\"><a href=\"#cb16-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-37\"><a href=\"#cb16-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior (non-centred) for s(year_fac)...</span></span>\n<span id=\"cb16-38\"><a href=\"#cb16-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1 : 7] ~ std_normal();</span></span>\n<span id=\"cb16-39\"><a href=\"#cb16-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb16-40\"><a href=\"#cb16-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb16-41\"><a href=\"#cb16-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b);</span></span>\n<span id=\"cb16-42\"><a href=\"#cb16-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb16-43\"><a href=\"#cb16-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-44\"><a href=\"#cb16-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb16-45\"><a href=\"#cb16-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb16-46\"><a href=\"#cb16-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb16-47\"><a href=\"#cb16-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb16-48\"><a href=\"#cb16-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-49\"><a href=\"#cb16-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb16-50\"><a href=\"#cb16-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb16-51\"><a href=\"#cb16-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb16-52\"><a href=\"#cb16-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span></span>\n<span id=\"cb16-53\"><a href=\"#cb16-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb16-54\"><a href=\"#cb16-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb16-55\"><a href=\"#cb16-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<div id=\"plotting-effects-and-residuals\" class=\"section level3\">\n<h3>Plotting effects and residuals</h3>\n<p>Now for interrogating the model. We can get some sense of the\nvariation in yearly intercepts from the summary above, but it is easier\nto understand them using targeted plots. Plot posterior distributions of\nthe temporal random effects using <code>plot.mvgam()</code> with\n<code>type = &#39;re&#39;</code>. See <code>?plot.mvgam</code> for more details\nabout the types of plots that can be produced from fitted\n<code>mvgam</code> objects</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;re&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"bayesplot-support\" class=\"section level3\">\n<h3><code>bayesplot</code> support</h3>\n<p>We can also capitalize on most of the useful MCMC plotting functions\nfrom the <code>bayesplot</code> package to visualize posterior\ndistributions and diagnostics (see <code>?mvgam::mcmc_plot.mvgam</code>\nfor details):</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"at\">object =</span> model1,</span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&quot;betas&quot;</span>,</span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;areas&quot;</span></span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can also use the wide range of posterior checking functions\navailable in <code>bayesplot</code> (see\n<code>?mvgam::ppc_check.mvgam</code> for details):</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">pp_check</span>(<span class=\"at\">object =</span> model1)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>There is clearly some variation in these yearly intercept estimates.\nBut how do these translate into time-varying predictions? To understand\nthis, we can plot posterior hindcasts from this model for the training\nperiod using <code>plot.mvgam()</code> with\n<code>type = &#39;forecast&#39;</code></p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>If you wish to extract these hindcasts for other downstream analyses,\nthe <code>hindcast()</code> function can be used. This will return a\nlist object of class <code>mvgam_forecast</code>. In the\n<code>hindcasts</code> slot, a matrix of posterior retrodictions will be\nreturned for each series in the data (only one series in our\nexample):</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>hc <span class=\"ot\">&lt;-</span> <span class=\"fu\">hindcast</span>(model1)</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(hc)</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 15</span></span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ call              :Class &#39;formula&#39;  language count ~ s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;.Environment&quot;)=&lt;environment: 0x0000018e48f5c728&gt; </span></span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family            : chr &quot;poisson&quot;</span></span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_model       : chr &quot;None&quot;</span></span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span id=\"cb21-11\"><a href=\"#cb21-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ fit_engine        : chr &quot;stan&quot;</span></span>\n<span id=\"cb21-12\"><a href=\"#cb21-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ type              : chr &quot;response&quot;</span></span>\n<span id=\"cb21-13\"><a href=\"#cb21-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_names      : chr &quot;PP&quot;</span></span>\n<span id=\"cb21-14\"><a href=\"#cb21-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_observations:List of 1</span></span>\n<span id=\"cb21-15\"><a href=\"#cb21-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:80] 0 NA 0 1 7 7 8 8 4 NA ...</span></span>\n<span id=\"cb21-16\"><a href=\"#cb21-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_times       :List of 1</span></span>\n<span id=\"cb21-17\"><a href=\"#cb21-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:80] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb21-18\"><a href=\"#cb21-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_observations : NULL</span></span>\n<span id=\"cb21-19\"><a href=\"#cb21-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_times        : NULL</span></span>\n<span id=\"cb21-20\"><a href=\"#cb21-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ hindcasts         :List of 1</span></span>\n<span id=\"cb21-21\"><a href=\"#cb21-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:80] 7 5 6 4 4 8 0 4 5 4 ...</span></span>\n<span id=\"cb21-22\"><a href=\"#cb21-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb21-23\"><a href=\"#cb21-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb21-24\"><a href=\"#cb21-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:80] &quot;ypred[1,1]&quot; &quot;ypred[2,1]&quot; &quot;ypred[3,1]&quot; &quot;ypred[4,1]&quot; ...</span></span>\n<span id=\"cb21-25\"><a href=\"#cb21-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ forecasts         : NULL</span></span>\n<span id=\"cb21-26\"><a href=\"#cb21-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;class&quot;)= chr &quot;mvgam_forecast&quot;</span></span></code></pre></div>\n<p>You can also extract these hindcasts on the linear predictor scale,\nwhich in this case is the log scale (our Poisson GLM used a log link\nfunction). Sometimes this can be useful for asking more targeted\nquestions about drivers of variation:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>hc <span class=\"ot\">&lt;-</span> <span class=\"fu\">hindcast</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a><span class=\"fu\">range</span>(hc<span class=\"sc\">$</span>hindcasts<span class=\"sc\">$</span>PP)</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] -0.306975  2.594950</span></span></code></pre></div>\n<p>In any regression analysis, a key question is whether the residuals\nshow any patterns that can be indicative of un-modelled sources of\nvariation. For GLMs, we can use a modified residual called the <a href=\"https://www.jstor.org/stable/1390802\" target=\"_blank\">Dunn-Smyth,\nor randomized quantile, residual</a>. Inspect Dunn-Smyth residuals from\nthe model using <code>plot.mvgam()</code> with\n<code>type = &#39;residuals&#39;</code></p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;residuals&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"automatic-forecasting-for-new-data\" class=\"section level2\">\n<h2>Automatic forecasting for new data</h2>\n<p>These temporal random effects do not have a sense of “time”. Because\nof this, each yearly random intercept is not restricted in some way to\nbe similar to the previous yearly intercept. This drawback becomes\nevident when we predict for a new year. To do this, we can repeat the\nexercise above but this time will split the data into training and\ntesting sets before re-running the model. We can then supply the test\nset as <code>newdata</code>. For splitting, we will make use of the\n<code>filter()</code> function from <code>dplyr</code></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a>model_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&lt;=</span> <span class=\"dv\">70</span>) <span class=\"ot\">-&gt;</span> data_train</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a>model_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&gt;</span> <span class=\"dv\">70</span>) <span class=\"ot\">-&gt;</span> data_test</span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a>model1b <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test</span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>We can view the test data in the forecast plot to see that the\npredictions do not capture the temporal variation in the test set</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1b, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>As with the <code>hindcast()</code> function, we can use the\n<code>forecast()</code> function to automatically extract the posterior\ndistributions for these predictions. This also returns an object of\nclass <code>mvgam_forecast</code>, but now it will contain both the\nhindcasts and forecasts for each series in the data:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>fc <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(model1b)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(fc)</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 16</span></span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ call              :Class &#39;formula&#39;  language count ~ s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;.Environment&quot;)=&lt;environment: 0x0000018e48f5c728&gt; </span></span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family            : chr &quot;poisson&quot;</span></span>\n<span id=\"cb27-8\"><a href=\"#cb27-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family_pars       : NULL</span></span>\n<span id=\"cb27-9\"><a href=\"#cb27-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_model       : chr &quot;None&quot;</span></span>\n<span id=\"cb27-10\"><a href=\"#cb27-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span id=\"cb27-11\"><a href=\"#cb27-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span id=\"cb27-12\"><a href=\"#cb27-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ fit_engine        : chr &quot;stan&quot;</span></span>\n<span id=\"cb27-13\"><a href=\"#cb27-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ type              : chr &quot;response&quot;</span></span>\n<span id=\"cb27-14\"><a href=\"#cb27-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_names      : Factor w/ 1 level &quot;PP&quot;: 1</span></span>\n<span id=\"cb27-15\"><a href=\"#cb27-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_observations:List of 1</span></span>\n<span id=\"cb27-16\"><a href=\"#cb27-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:70] 0 NA 0 1 7 7 8 8 4 NA ...</span></span>\n<span id=\"cb27-17\"><a href=\"#cb27-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_times       :List of 1</span></span>\n<span id=\"cb27-18\"><a href=\"#cb27-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:70] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb27-19\"><a href=\"#cb27-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_observations :List of 1</span></span>\n<span id=\"cb27-20\"><a href=\"#cb27-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:10] NA 4 11 8 5 2 5 8 14 14</span></span>\n<span id=\"cb27-21\"><a href=\"#cb27-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_times        :List of 1</span></span>\n<span id=\"cb27-22\"><a href=\"#cb27-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:10] 71 72 73 74 75 76 77 78 79 80</span></span>\n<span id=\"cb27-23\"><a href=\"#cb27-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ hindcasts         :List of 1</span></span>\n<span id=\"cb27-24\"><a href=\"#cb27-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:70] 3 2 4 2 4 1 1 2 3 4 ...</span></span>\n<span id=\"cb27-25\"><a href=\"#cb27-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb27-26\"><a href=\"#cb27-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb27-27\"><a href=\"#cb27-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:70] &quot;ypred[1,1]&quot; &quot;ypred[2,1]&quot; &quot;ypred[3,1]&quot; &quot;ypred[4,1]&quot; ...</span></span>\n<span id=\"cb27-28\"><a href=\"#cb27-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ forecasts         :List of 1</span></span>\n<span id=\"cb27-29\"><a href=\"#cb27-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:10] 6 7 6 1 5 4 2 5 7 6 ...</span></span>\n<span id=\"cb27-30\"><a href=\"#cb27-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb27-31\"><a href=\"#cb27-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb27-32\"><a href=\"#cb27-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:10] &quot;ypred[71,1]&quot; &quot;ypred[72,1]&quot; &quot;ypred[73,1]&quot; &quot;ypred[74,1]&quot; ...</span></span>\n<span id=\"cb27-33\"><a href=\"#cb27-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;class&quot;)= chr &quot;mvgam_forecast&quot;</span></span></code></pre></div>\n</div>\n<div id=\"adding-predictors-as-fixed-effects\" class=\"section level2\">\n<h2>Adding predictors as “fixed” effects</h2>\n<p>Any users familiar with GLMs will know that we nearly always wish to\ninclude predictor variables that may explain some of the variation in\nour observations. Predictors are easily incorporated into GLMs / GAMs.\nHere, we will update the model from above by including a parametric\n(fixed) effect of <code>ndvi_ma12</code> as a linear predictor:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a>model2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb28-3\"><a href=\"#cb28-3\" tabindex=\"-1\"></a>    ndvi_ma12 <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb28-4\"><a href=\"#cb28-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb28-5\"><a href=\"#cb28-5\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb28-6\"><a href=\"#cb28-6\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test</span>\n<span id=\"cb28-7\"><a href=\"#cb28-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = \\beta_{year[year_t]} + \\beta_{ndvi} *\n\\boldsymbol{ndvi}_t \\\\\n\\beta_{year} &amp; \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\\\\n\\beta_{ndvi} &amp; \\sim \\text{Normal}(0, 1) \\end{align*}\\]</span></p>\n<p>Where the <span class=\"math inline\">\\(\\beta_{year}\\)</span> effects\nare the same as before but we now have another predictor <span class=\"math inline\">\\((\\beta_{ndvi})\\)</span> that applies to the\n<code>ndvi_ma12</code> value at each timepoint <span class=\"math inline\">\\(t\\)</span>. Inspect the summary of this model</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model2)</span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ ndvi_ma12 + s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb29-5\"><a href=\"#cb29-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-6\"><a href=\"#cb29-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb29-7\"><a href=\"#cb29-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb29-8\"><a href=\"#cb29-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-9\"><a href=\"#cb29-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb29-10\"><a href=\"#cb29-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb29-11\"><a href=\"#cb29-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-12\"><a href=\"#cb29-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb29-13\"><a href=\"#cb29-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb29-14\"><a href=\"#cb29-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-15\"><a href=\"#cb29-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb29-16\"><a href=\"#cb29-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb29-17\"><a href=\"#cb29-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-18\"><a href=\"#cb29-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb29-19\"><a href=\"#cb29-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb29-20\"><a href=\"#cb29-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-21\"><a href=\"#cb29-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb29-22\"><a href=\"#cb29-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb29-23\"><a href=\"#cb29-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb29-24\"><a href=\"#cb29-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb29-25\"><a href=\"#cb29-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-26\"><a href=\"#cb29-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb29-27\"><a href=\"#cb29-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb29-28\"><a href=\"#cb29-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ndvi_ma12     -0.390 0.045   0.5    1  1595</span></span>\n<span id=\"cb29-29\"><a href=\"#cb29-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).1  0.900 1.300   1.6    1  2451</span></span>\n<span id=\"cb29-30\"><a href=\"#cb29-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).2  0.870 1.200   1.5    1  2633</span></span>\n<span id=\"cb29-31\"><a href=\"#cb29-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).3  0.083 0.590   1.0    1  2163</span></span>\n<span id=\"cb29-32\"><a href=\"#cb29-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).4  2.000 2.300   2.5    1  1831</span></span>\n<span id=\"cb29-33\"><a href=\"#cb29-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).5  1.100 1.500   1.8    1  2202</span></span>\n<span id=\"cb29-34\"><a href=\"#cb29-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).6  1.600 1.800   2.1    1  3045</span></span>\n<span id=\"cb29-35\"><a href=\"#cb29-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).7 -0.310 1.400   2.8    1  1313</span></span>\n<span id=\"cb29-36\"><a href=\"#cb29-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-37\"><a href=\"#cb29-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM group-level estimates:</span></span>\n<span id=\"cb29-38\"><a href=\"#cb29-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb29-39\"><a href=\"#cb29-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mean(s(year_fac)) 0.72 1.3   1.8 1.01   485</span></span>\n<span id=\"cb29-40\"><a href=\"#cb29-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sd(s(year_fac))   0.33 0.6   1.3 1.00   507</span></span>\n<span id=\"cb29-41\"><a href=\"#cb29-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-42\"><a href=\"#cb29-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb29-43\"><a href=\"#cb29-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value    </span></span>\n<span id=\"cb29-44\"><a href=\"#cb29-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac) 5.261      7  177.6  &lt;2e-16 ***</span></span>\n<span id=\"cb29-45\"><a href=\"#cb29-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb29-46\"><a href=\"#cb29-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb29-47\"><a href=\"#cb29-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-48\"><a href=\"#cb29-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb29-49\"><a href=\"#cb29-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb29-50\"><a href=\"#cb29-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb29-51\"><a href=\"#cb29-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb29-52\"><a href=\"#cb29-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb29-53\"><a href=\"#cb29-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-54\"><a href=\"#cb29-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb29-55\"><a href=\"#cb29-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb29-56\"><a href=\"#cb29-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb29-57\"><a href=\"#cb29-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-58\"><a href=\"#cb29-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Rather than printing the summary each time, we can also quickly look\nat the posterior empirical quantiles for the fixed effect of\n<code>ndvi</code> (and other linear predictor coefficients) using\n<code>coef</code>:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a><span class=\"fu\">coef</span>(model2)</span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      2.5%       50%     97.5% Rhat n_eff</span></span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ndvi_ma12     -0.39239295 0.0454631 0.5002432    1  1595</span></span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).1  0.90208663 1.2598350 1.5620722    1  2451</span></span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).2  0.87452045 1.2055800 1.5018923    1  2633</span></span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).3  0.08311501 0.5945600 1.0277267    1  2163</span></span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).4  2.01673475 2.2694600 2.4863652    1  1831</span></span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).5  1.06976925 1.4577300 1.7888065    1  2202</span></span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).6  1.57686075 1.8460300 2.1110565    1  3045</span></span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).7 -0.30962118 1.3544650 2.7908662    1  1313</span></span></code></pre></div>\n<p>Look at the estimated effect of <code>ndvi</code> using using a\nhistogram. This can be done by first extracting the posterior\ncoefficients:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb31-1\"><a href=\"#cb31-1\" tabindex=\"-1\"></a>beta_post <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(model2, <span class=\"at\">variable =</span> <span class=\"st\">&quot;betas&quot;</span>)</span>\n<span id=\"cb31-2\"><a href=\"#cb31-2\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(beta_post)</span>\n<span id=\"cb31-3\"><a href=\"#cb31-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 2,000</span></span>\n<span id=\"cb31-4\"><a href=\"#cb31-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 8</span></span>\n<span id=\"cb31-5\"><a href=\"#cb31-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12       &lt;dbl&gt; -0.59960500, 0.45922600, 0.55956400, 0.39627800, 0.178…</span></span>\n<span id=\"cb31-6\"><a href=\"#cb31-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).1` &lt;dbl&gt; 1.121480, 1.560650, 1.280340, 1.279720, 1.355980, 1.29…</span></span>\n<span id=\"cb31-7\"><a href=\"#cb31-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).2` &lt;dbl&gt; 1.10624, 1.37323, 1.15708, 1.02976, 1.20075, 1.17569, …</span></span>\n<span id=\"cb31-8\"><a href=\"#cb31-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).3` &lt;dbl&gt; 0.7412040, 0.8188330, 0.6476260, 0.4650750, 0.8031380,…</span></span>\n<span id=\"cb31-9\"><a href=\"#cb31-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).4` &lt;dbl&gt; 2.06531, 2.35775, 2.48328, 2.38348, 2.29324, 2.29980, …</span></span>\n<span id=\"cb31-10\"><a href=\"#cb31-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).5` &lt;dbl&gt; 1.80219, 1.27466, 1.17318, 1.19170, 1.29867, 1.46982, …</span></span>\n<span id=\"cb31-11\"><a href=\"#cb31-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).6` &lt;dbl&gt; 1.81798, 1.93282, 1.71232, 1.74702, 2.08540, 1.70745, …</span></span>\n<span id=\"cb31-12\"><a href=\"#cb31-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).7` &lt;dbl&gt; 1.530030, 2.455950, 1.508500, 1.704790, 2.151070, 1.56…</span></span></code></pre></div>\n<p>The posterior distribution for the effect of <code>ndvi_ma12</code>\nis stored in the <code>ndvi_ma12</code> column. A quick histogram\nconfirms our inference that <code>log(counts)</code> respond positively\nto increases in <code>ndvi</code>:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb32-1\"><a href=\"#cb32-1\" tabindex=\"-1\"></a><span class=\"fu\">hist</span>(beta_post<span class=\"sc\">$</span>ndvi_ma12,</span>\n<span id=\"cb32-2\"><a href=\"#cb32-2\" tabindex=\"-1\"></a>  <span class=\"at\">xlim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb32-3\"><a href=\"#cb32-3\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(beta_post<span class=\"sc\">$</span>ndvi_ma12)),</span>\n<span id=\"cb32-4\"><a href=\"#cb32-4\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(beta_post<span class=\"sc\">$</span>ndvi))</span>\n<span id=\"cb32-5\"><a href=\"#cb32-5\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb32-6\"><a href=\"#cb32-6\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb32-7\"><a href=\"#cb32-7\" tabindex=\"-1\"></a>  <span class=\"at\">border =</span> <span class=\"st\">&quot;white&quot;</span>,</span>\n<span id=\"cb32-8\"><a href=\"#cb32-8\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"fu\">expression</span>(beta[NDVI]),</span>\n<span id=\"cb32-9\"><a href=\"#cb32-9\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;&quot;</span>,</span>\n<span id=\"cb32-10\"><a href=\"#cb32-10\" tabindex=\"-1\"></a>  <span class=\"at\">yaxt =</span> <span class=\"st\">&quot;n&quot;</span>,</span>\n<span id=\"cb32-11\"><a href=\"#cb32-11\" tabindex=\"-1\"></a>  <span class=\"at\">main =</span> <span class=\"st\">&quot;&quot;</span>,</span>\n<span id=\"cb32-12\"><a href=\"#cb32-12\" tabindex=\"-1\"></a>  <span class=\"at\">lwd =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb32-13\"><a href=\"#cb32-13\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb32-14\"><a href=\"#cb32-14\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"dv\">0</span>, <span class=\"at\">lwd =</span> <span class=\"fl\">2.5</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"marginaleffects-support\" class=\"section level3\">\n<h3><code>marginaleffects</code> support</h3>\n<p>Given our model used a nonlinear link function (log link in this\nexample), it can still be difficult to fully understand what\nrelationship our model is estimating between a predictor and the\nresponse. Fortunately, the <code>marginaleffects</code> package makes\nthis relatively straightforward. Objects of class <code>mvgam</code> can\nbe used with <code>marginaleffects</code> to inspect contrasts,\nscenario-based predictions, conditional and marginal effects, all on the\noutcome scale. Like <code>brms</code>, <code>mvgam</code> has the simple\n<code>conditional_effects()</code> function to make quick and\ninformative plots for main effects, which rely on\n<code>marginaleffects</code> support. This will likely be your go-to\nfunction for quickly understanding patterns from fitted\n<code>mvgam</code> models</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb33-1\"><a href=\"#cb33-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(model2)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"adding-predictors-as-smooths\" class=\"section level2\">\n<h2>Adding predictors as smooths</h2>\n<p>Smooth functions, using penalized splines, are a major feature of\n<code>mvgam</code>. Nonlinear splines are commonly viewed as variations\nof random effects in which the coefficients that control the shape of\nthe spline are drawn from a joint, penalized distribution. This strategy\nis very often used in ecological time series analysis to capture smooth\ntemporal variation in the processes we seek to study. When we construct\nsmoothing splines, the workhorse package <code>mgcv</code> will\ncalculate a set of basis functions that will collectively control the\nshape and complexity of the resulting spline. It is often helpful to\nvisualize these basis functions to get a better sense of how splines\nwork. We’ll create a set of 6 basis functions to represent possible\nvariation in the effect of <code>time</code> on our outcome.In addition\nto constructing the basis functions, <code>mgcv</code> also creates a\npenalty matrix <span class=\"math inline\">\\(S\\)</span>, which contains\n<strong>known</strong> coefficients that work to constrain the\nwiggliness of the resulting smooth function. When fitting a GAM to data,\nwe must estimate the smoothing parameters (<span class=\"math inline\">\\(\\lambda\\)</span>) that will penalize these\nmatrices, resulting in constrained basis coefficients and smoother\nfunctions that are less likely to overfit the data. This is the key to\nfitting GAMs in a Bayesian framework, as we can jointly estimate the\n<span class=\"math inline\">\\(\\lambda\\)</span>’s using informative priors\nto prevent overfitting and expand the complexity of models we can\ntackle. To see this in practice, we can now fit a model that replaces\nthe yearly random effects with a smooth function of <code>time</code>.\nWe will need a reasonably complex function (large <code>k</code>) to try\nand accommodate the temporal variation in our observations. Following\nsome <a href=\"https://fromthebottomoftheheap.net/2020/06/03/extrapolating-with-gams/\" target=\"_blank\">useful advice by Gavin Simpson</a>, we will use a\nb-spline basis for the temporal smooth. Because we no longer have\nintercepts for each year, we also retain the primary intercept term in\nthis model (there is no <code>-1</code> in the formula now):</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb34-1\"><a href=\"#cb34-1\" tabindex=\"-1\"></a>model3 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb34-2\"><a href=\"#cb34-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(time, <span class=\"at\">bs =</span> <span class=\"st\">&quot;bs&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">15</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb34-3\"><a href=\"#cb34-3\" tabindex=\"-1\"></a>    ndvi_ma12,</span>\n<span id=\"cb34-4\"><a href=\"#cb34-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb34-5\"><a href=\"#cb34-5\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb34-6\"><a href=\"#cb34-6\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test</span>\n<span id=\"cb34-7\"><a href=\"#cb34-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = f(\\boldsymbol{time})_t + \\beta_{ndvi} *\n\\boldsymbol{ndvi}_t  \\\\\nf(\\boldsymbol{time}) &amp; = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} &amp; \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\\\\n\\beta_{ndvi} &amp; \\sim \\text{Normal}(0, 1) \\end{align*}\\]</span></p>\n<p>Where the smooth function <span class=\"math inline\">\\(f_{time}\\)</span> is built by summing across a set\nof weighted basis functions. The basis functions <span class=\"math inline\">\\((b)\\)</span> are constructed using a thin plate\nregression basis in <code>mgcv</code>. The weights <span class=\"math inline\">\\((\\beta_{smooth})\\)</span> are drawn from a\npenalized multivariate normal distribution where the precision matrix\n<span class=\"math inline\">\\((\\Omega\\)</span>) is multiplied by a\nsmoothing penalty <span class=\"math inline\">\\((\\lambda)\\)</span>. If\n<span class=\"math inline\">\\(\\lambda\\)</span> becomes large, this acts to\n<em>squeeze</em> the covariances among the weights <span class=\"math inline\">\\((\\beta_{smooth})\\)</span>, leading to a less\nwiggly spline. Note that sometimes there are multiple smoothing\npenalties that contribute to the covariance matrix, but I am only\nshowing one here for simplicity. View the summary as before</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb35-1\"><a href=\"#cb35-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model3)</span>\n<span id=\"cb35-2\"><a href=\"#cb35-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb35-3\"><a href=\"#cb35-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ s(time, bs = &quot;bs&quot;, k = 15) + ndvi_ma12</span></span>\n<span id=\"cb35-4\"><a href=\"#cb35-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb35-5\"><a href=\"#cb35-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-6\"><a href=\"#cb35-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb35-7\"><a href=\"#cb35-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb35-8\"><a href=\"#cb35-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-9\"><a href=\"#cb35-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb35-10\"><a href=\"#cb35-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb35-11\"><a href=\"#cb35-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-12\"><a href=\"#cb35-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb35-13\"><a href=\"#cb35-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb35-14\"><a href=\"#cb35-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-15\"><a href=\"#cb35-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb35-16\"><a href=\"#cb35-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb35-17\"><a href=\"#cb35-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-18\"><a href=\"#cb35-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb35-19\"><a href=\"#cb35-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb35-20\"><a href=\"#cb35-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-21\"><a href=\"#cb35-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb35-22\"><a href=\"#cb35-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb35-23\"><a href=\"#cb35-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb35-24\"><a href=\"#cb35-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb35-25\"><a href=\"#cb35-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-26\"><a href=\"#cb35-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb35-27\"><a href=\"#cb35-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb35-28\"><a href=\"#cb35-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)   0.82  1.10   1.3 1.00   853</span></span>\n<span id=\"cb35-29\"><a href=\"#cb35-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ndvi_ma12     0.37  1.90   3.5 1.00  1085</span></span>\n<span id=\"cb35-30\"><a href=\"#cb35-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).1    -9.80 -5.80  -2.6 1.00   348</span></span>\n<span id=\"cb35-31\"><a href=\"#cb35-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).2     1.20  3.40   6.0 1.00   387</span></span>\n<span id=\"cb35-32\"><a href=\"#cb35-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).3   -10.00 -6.20  -3.1 1.00   318</span></span>\n<span id=\"cb35-33\"><a href=\"#cb35-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).4    -1.60  0.78   3.3 1.00   265</span></span>\n<span id=\"cb35-34\"><a href=\"#cb35-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).5    -3.00 -0.42   2.0 1.00   246</span></span>\n<span id=\"cb35-35\"><a href=\"#cb35-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).6    -6.40 -3.80  -1.1 1.00   380</span></span>\n<span id=\"cb35-36\"><a href=\"#cb35-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).7    -1.90  0.56   3.0 1.00   225</span></span>\n<span id=\"cb35-37\"><a href=\"#cb35-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).8    -2.40 -0.12   2.1 1.01   222</span></span>\n<span id=\"cb35-38\"><a href=\"#cb35-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).9    -0.55  2.10   4.7 1.00   233</span></span>\n<span id=\"cb35-39\"><a href=\"#cb35-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).10   -5.70 -3.30  -1.0 1.00   294</span></span>\n<span id=\"cb35-40\"><a href=\"#cb35-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).11   -2.50  0.57   4.0 1.00   374</span></span>\n<span id=\"cb35-41\"><a href=\"#cb35-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).12   -6.80 -5.00  -3.2 1.00   491</span></span>\n<span id=\"cb35-42\"><a href=\"#cb35-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).13    1.90  5.00   8.5 1.00   235</span></span>\n<span id=\"cb35-43\"><a href=\"#cb35-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).14  -11.00 -3.10   4.0 1.00   241</span></span>\n<span id=\"cb35-44\"><a href=\"#cb35-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-45\"><a href=\"#cb35-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb35-46\"><a href=\"#cb35-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;           edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb35-47\"><a href=\"#cb35-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time) 11.76     14  102.7 7.98e-05 ***</span></span>\n<span id=\"cb35-48\"><a href=\"#cb35-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb35-49\"><a href=\"#cb35-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb35-50\"><a href=\"#cb35-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-51\"><a href=\"#cb35-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb35-52\"><a href=\"#cb35-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb35-53\"><a href=\"#cb35-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb35-54\"><a href=\"#cb35-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb35-55\"><a href=\"#cb35-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb35-56\"><a href=\"#cb35-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-57\"><a href=\"#cb35-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb35-58\"><a href=\"#cb35-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb35-59\"><a href=\"#cb35-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb35-60\"><a href=\"#cb35-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-61\"><a href=\"#cb35-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The summary above now contains posterior estimates for the smoothing\nparameters as well as the basis coefficients for the nonlinear effect of\n<code>time</code>. We can visualize <code>conditional_effects</code> as\nbefore:</p>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb36-1\"><a href=\"#cb36-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(model3, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAAAulBMVEUAAAAAADoAAGYAOpAAZrYzMzM6AAA6ADo6AGY6kNtNTU1NTW5NTY5NbqtNjshmAABmADpmtv9uTU1uTW5uTY5ubo5ubqtuq+SOTU2OTW6OTY6Obk2OyP+QOgCQkGaQtpCQ27aQ2/+rbk2rbm6rbo6ryKur5OSr5P+2ZgC225C2/9u2///Ijk3I///bkDrb/9vb///kq27k///q6ur/tmb/yI7/25D/29v/5Kv//7b//8j//9v//+T////nQO9JAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAQ2ElEQVR4nO3dC3sTxxWAYUEwFHELuZGLaUrSxrSAGzM2tYn1//9WpTW2JHt3Zy/nzDkz873PU0LabTs758tI3sTWYgUoWFgvAGUiLKggLKggLKggLKggLKgYHBYFYgzCggrCggrCgoq+Xk6Wy+XTDwMuBG7r6+X94cALgdt6ern8/WjYhcAdPb18/nH9UtgcWgdrhIUxeno5//Zo59QiLIwR6+XmfRZhYQzCgoqeXs6efVxd/pPHDZgi8hzrydGQC4HbePIOFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYSFCUL0CsLCeIGwoCAQFuSFQFiQFwgLCgJhQUEgLMgLgbAgLxAW5IVAWJAXCAvyQiAsyLvdFWFBwJ2sCAvztWRFWJittSvCwkztXREW5unoirAwR1dWhIU5ursiLEzX0xVhYbK+rggLE/VmRViYKNIVYWGSWFeEhQmiWREWJhjQFWFhrCFZERbGGtYVYWGUgVkRFkYZ3BVhYYThXREWBhuRFWFhsFFdERaGGZcVYWGYsV0RFgYYnRVhYYAJXREWoqZ0RViImJQVYSFiYleEhV5TuyIs9JicFWGhx4yuCAtd5mRFWOgyryvCQruZXREWWs3tirDQYnZWhIUWAl0RFu6Q6IqwcJtIV4SFfTJZERb2SXVFWNgl1hVhYUsuK8LClmRXhIUvRLMiLHwh3NXcsC5/Oxx2IVyTzmp2WCdLwiqAfFczwzr//hfCyp9CV/PCuvz9j6uXwoM1wsqURlYzwzp5xXus7Ol0NSus8x8+ElbmlLKaF9bJcuNV/EJ4pdYVjxtqppcVYdVMsyuevNdLtSvCqpVuVoRVK+2uCKtO6l0RVo30syKsGqXoirCqkyQrwqpOoq4IqzKpuiKsqiTLirCqkrArwqpHyqwIqx5puyKsSiTOirAqkbwrwqpC+q4IqwYGXRFW+SyyIqzy2XRFWKUz6oqwCmfVFWEVzSwrwiqaYVeEVTDLrgirWKZZEVaxjLsirDJZZ0VYZbKuKhBWiaybakRXSVi5sU7qSnSZhJUX66CuRRdKWFmx7ulGdKWElRHrmnZE10pY+bCOaVd0sYSVC+uU9kWXS1h5sA7ptuiCCSsL1h3dEV0xYeXAOqO7oksmrAxYV9QiumbCcs+6oVbRVROWd9YJtYsum7Ccsy6oQ3TdhOWbdUAd4jUQlmfW/XRYLDixsmYdUKvFOiteCrNmnVCbpqpAWBmzDajV4jorwsqXZUCtdqoKhJUrs3y67FUVCCtTNvF0WtzOirCyZNFOt5aqAmHlKHk6fVqrCoSVn7Td9Gs/rBrR+yAsV1JmE9NdVSCszCSLJqrnsGpEb4Ww/EjUzACRqgJhZSRFMIPEDqtG9HYIywn9YIYZUlUgrGwo5zLQoMOqEb0hwvJAtZbBBlcVCCsPeq0MN/ywakTvibDsabUywriqAmFlQCWUUUYeVo3obRGWMYVQRplSVSAs76QzGWtaVYGwnBONZLSJh1UjemuEZUgwktHmVBUIyzOpRKaYV1WYGdbZcvn0w5ALMYFIIJPMPKwa0dvr6eX8uw+rk+cDLsR4An1MJFBVmP9SuIlr0IUYRWK2U0gcVo3oHUZ6uTqxDtYIS47MbMeTqirMDev8mydHgy7EGGLTHUXssGpEbzLSy+efrssiLCGC0x1BtKog8Ljh/eHACzGI7HgHkj2sGtEb7enl7NlHTixh0vMdQr6qMPPEOlkueY8lSWHAMQqHVSN6rzx5T0ZlwP2UqgqE5YjWiDtpHVaN6O0SViJ6M26lWlUgLC9Uh3yXclWBsJzQHvMe7cOqEb1lwtKnP+atJFUFwvIgyaCvJKoqEJa9VJNOd1g1ovdNWLqSTTplVYGwjKUac9LDqhG9dcJSlGjIyasKhGUp0YgtsiIsQ2kGbJMVYZlJM16rrAjLSJrh2mVFWDaSjNYyK8IykWCu6Z8v3BLdBMKSlmCq1lUFwkpPfaTmh1Ujug+EJUp7nj6qCoSVmPI0vVQVCCsp3VG6Oawa0c0gLDGac/RVVSCsdDSn6K2qQFipKI7Q3WHViO4IYUnQG6DLqgJhJaE2PZ+HVSO6KYQ1l9rs/FYVCEuf0uAcH1aN6L4Q1ixKY3NeVRgZ1sWLl5s/nN5/F7kQV3Rm5v2wakT3hrCmU5lYDlWFUWEdL6496L8QDY1xZXFYNaLb03JixS+EUlYa/6s6ohvEm/dJ5CeVz2HViO7QXi+fHjYvhbzHihAfU2ZVhZFh/fW69d3V3QvrJj6k7KoKvMeSJz2h/A6rRnSf9k8swooQHk+mVYWx77Han2C1XFgp4eFkW1UY/VK44M17N9nJ5HtYNaK7xeOGgWTnkndVgbCkiA4l88OqEd0xXgoHEB1JAVWFSSfWxddvhl1YC9GBlJHVtJfC06/+HHZhFUTHUUpWE8PipfCG6DDKyWpaWG85sb4QHUVJWU17836P91gN0UGUlRWPG6aTnEIJzxduie4fYbWSnEF5VYXRYTX/ePLjAReWTXAABR5Wjege7vVyvPl68OJFa1n1hCW3+6VWFfgunfHk9r7cqgJhjSW28QUfVo3oTvJSuENq10uvKvDmfQSxPS+/qsDjhqHENryCw6oR3VHC4v36FNFN3evlr9ePO78HrNiwxPa6lsOqEd3WvV7ebprqKKvQsMR2uqaqAo8bIqS2uarDqhHd2prDktrk6qoKPMfqIbTD9R1Wjej27vdyWstzLKn9rbOqwOOGVlKbW+lh1Yhucm1hyW1txVUFwtont681H1aN6F739XL+zXJ5OOTCLMhtauVVDdvunl4+/3S0Ov/2KH6hf5L7WnNVI7a8p5ez5+tf3h/GL3ROcmdrPKym7Xqkl82ptVodrGUaluQOV1CV3Mb393L526thF7oku+cFV6Wx+b29fP7xpqvswpLd+mIPK7X97/+q8HD7JzmFJb37RValPIOeXva6yiYs8QGUdVglm0NPLyfLjay+KpQfRBlVGYyioCfv8vPI/LAynUYhYWnMJc+qrCdxLeuwFOeT2WFlPYm78g1Lc06ZVGU9gj6ZhqU5riwOK+sBRGUYlu7E/Fdlvf/D5BJWmpn5Paxsd3+CDMJKNjx/VZnt+Xy+w0o5RGdZWWy3JI9hWczRU1bpdlqRs7CMRukmqySbnISfsMyG6eQdu/b+JuYiLMt5eqhKcWvNGIdlPFHzw0plU10wCct2mDfMqhLcSrcShmU0xQ5Gh9XsXcyFelgW04uzqGriBmZKJ6z0Uxsj/WE1fi7Zkwwr8bQmSlzVnOHkTCispLOaIelhNXs4OZsfVrpBzZasKpnZZK2esBIdVjJjyV8tYaWoSmYihagiLP3DSmYYJakgLOWqZOZQnOLD0s1KZgglKjws1axkJlCoosNSzEpm9wtWcFh6WclsfdlKDUvtC0GZbS9fmWEpVSWz5XUoMCytw0pmw2tRWlhU5URZYfHGyo2CwuKw8qSYsKjKlzLCUjqsZLa4TiWEpVKVzPbWK/uwdA4rmc2tWeZhUZVXOYfFYeVYvmFRlWuZhsVh5V2WYVGVf/mFpXJYyWwmtnILi6oykVdYZJWNnMJSyEpmE3FXPmGRVVYyCUvhHbvM/qFDFmFxWOXHf1gajxdk9g49vIfF14GZch0Wz0Lz5Tgs/sZNzryGxd9lzpzPsPhH2LPnMCy+M6IE7sLi27jK4Cssvue0GJ7C4hvkC+ImLH6gVVl8hKX387JldgmjeQiLn+lYIPOwFH+4v8wOYRLbsFQ/MkJmgzCNZVj8EPaC2YVFVkXrD+v8uw/RC6dNnqwK1xvW2fKpTlhkVby+sN4/+ZfKiUVWFRj0UniwJhYWH8dVhcTvsbQ/klJwZzBL0rC0P+hUcF8wU7qw+PzcqqQKS//DvgU3BfMlCUv/sKIrbxI8eU9QFVm5ox1WisOKrhzSDStJVXTlkWZYZFUxvbASZUVXPmmFRVaVUwkrzTt2uvJMIaxkVZGVY9JhpTus6Mo12bASVkVWvgmGlfKwIivvxMJKWRVd+ScTVtLDiqxyIBFW2qrIKgvzw0qcFV3lwfxnN5BVmfIKS+aekUBOYcncMZLIJyyZ+0UiuYQlc7dIJpOwZG4W6eQRlsy9IqEcwpK5UySVQVgyN4q03Iclc5tIzXtYMneJ5HyHJXOPMOA6LJlbhAXHYcncIGy4DUvm9mDFa1gydwczPsOSuTcY8hiWzJ3BlMOwZG4MtvyFJXNfMOYtLJm7gjlnYcncFOy5CkvmluCBp7Bk7ggu+AlL5n7ghJuwZG4HXjgJS+Zm4IePsGTuBY54CEvmTuCKg7BkbgS+mIclcxvwxjgsmZuAP7ZhydwDHDINS+YW4JFhWDI3AJ/swpJZP5yyCktm9XDLKCyZxcMvk7Bklg7PLMKSWTlcMwhLZuHwLX1YMuuGc6nDklk13Esclsyi4V/asGTWjAwkDUtmychBwrBkFow8pAtLZr3IRLKwZJaLXCQKS2axyEeasGTWioykCEtmpchKX1iff1w++xi9kK7Qoiesy98OVyfPoxeSFVr0hPX55w+r8+8+xC6kK7ToCev8h4+rzz8drX93sDYpLIUFIw89YZ09uw6r90K6QotBJ1bvhWSFFnrvsYQXirz0flX4avpXhbKrRHZ0nmOJLhE5UnnyLrM05EwhLJmFIW/iYcksC7mTDktmVciebFgya0IBJMOSWRGKIBiWzIJQBrmwZNaDQkiFJbMaFEMoLJnFoBwiYcksBSWRCEtmJSjK/LCAFoQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFYQFFcPDMnJg9X/cytVqXC3mejWjw7JyYL2APa5W42oxt1dDWKO4Wo2rxRDWLK5W42ox2YWFPBEWVBAWVBAWVBAWVDgOa/fzCzafnehjLXufqmC9GPuN2V3N+TfLp9efkOM4rL3P4TxZmu7fdi37nw5qvJiV+cbsrmbzgV4nN8X7DWv3M6LOv//FdP+2a9n/5CrjxdhvzO5qmk+L+zn6oV7mdj7V7vL3P2xP/O1a9j9rz3gx9huzu5pcTqydz+E8eWX8VmK7lv1PBzVejP3G7K1m2Id6mXq/XD7fOyWM98/piWW/MXur+fZodfbU/0vh9sX7ZLnxysVaXL3Hst+Y3dUM/Khnc3ufw2n8F+Z2LfufDmq8mJX5xuyuJpcT68tL9tVfDdb7t12Lm+dYPjZmdzVny+WTmzcJjsNCzggLKggLKggLKggLKggLKggLKghriNP777787tOjN7GLL77eXHLxYrG4+W9ViLCGOB2TyNt7bzZdPVj/7qs/9dbkHGENMSKs9Um1Cet088uA461YhNXh06NfHy4WL69K+fv9/7x+vP43j+//e9vK1RWPP11dtvnDYn3N6YNtToSFOz49XL+OHd9/d/Hi8bqt+++O13/61+vHO61cXbG4vuzlprvNwba9hJdC3PHp4cumkeZVcF3MJpf1v/bCerm97H+bhK7+w5tLju/Ve2ARVpcmj/Uvm5Nq9elv79an1Wr9+92wHr3Z/eV0/VJ4bzes480rZLUIq8PtsFanX/133VZXWBcv7r3ZP7He1nxeEVan62Kal8LNLxdf/7rOqyus001/pzsn1nHND7FWhNVpexQ9aN68r4+gxYNVd1ibA+vhNqyavyBsEFaHmzyuHjdsjq3Fy+6w1tkt7v1j86Xh1b91fPWDE+t9l0VYUEFYUEFYYzWP2K8fLaALYUEFYUEFYUEFYUEFYUEFYUEFYUHF/wGS140DguE7HQAAAABJRU5ErkJggg==\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Inspect the underlying <code>Stan</code> code to gain some idea of\nhow the spline is being penalized:</p>\n<div class=\"sourceCode\" id=\"cb37\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb37-1\"><a href=\"#cb37-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(model3)</span>\n<span id=\"cb37-2\"><a href=\"#cb37-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb37-3\"><a href=\"#cb37-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb37-4\"><a href=\"#cb37-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb37-5\"><a href=\"#cb37-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb37-6\"><a href=\"#cb37-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span></span>\n<span id=\"cb37-7\"><a href=\"#cb37-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb37-8\"><a href=\"#cb37-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb37-9\"><a href=\"#cb37-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] zero; // prior locations for basis coefficients</span></span>\n<span id=\"cb37-10\"><a href=\"#cb37-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb37-11\"><a href=\"#cb37-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb37-12\"><a href=\"#cb37-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[14, 28] S1; // mgcv smooth penalty matrix S1</span></span>\n<span id=\"cb37-13\"><a href=\"#cb37-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb37-14\"><a href=\"#cb37-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb37-15\"><a href=\"#cb37-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb37-16\"><a href=\"#cb37-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb37-17\"><a href=\"#cb37-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-18\"><a href=\"#cb37-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb37-19\"><a href=\"#cb37-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb37-20\"><a href=\"#cb37-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb37-21\"><a href=\"#cb37-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-22\"><a href=\"#cb37-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb37-23\"><a href=\"#cb37-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp] lambda;</span></span>\n<span id=\"cb37-24\"><a href=\"#cb37-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-25\"><a href=\"#cb37-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb37-26\"><a href=\"#cb37-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb37-27\"><a href=\"#cb37-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb37-28\"><a href=\"#cb37-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span id=\"cb37-29\"><a href=\"#cb37-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-30\"><a href=\"#cb37-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb37-31\"><a href=\"#cb37-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)...</span></span>\n<span id=\"cb37-32\"><a href=\"#cb37-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, 1.4, 2.5);</span></span>\n<span id=\"cb37-33\"><a href=\"#cb37-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-34\"><a href=\"#cb37-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for ndvi_ma12...</span></span>\n<span id=\"cb37-35\"><a href=\"#cb37-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb37-36\"><a href=\"#cb37-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-37\"><a href=\"#cb37-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(time)...</span></span>\n<span id=\"cb37-38\"><a href=\"#cb37-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[3 : 16] ~ multi_normal_prec(zero[3 : 16],</span></span>\n<span id=\"cb37-39\"><a href=\"#cb37-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                     S1[1 : 14, 1 : 14] * lambda[1]</span></span>\n<span id=\"cb37-40\"><a href=\"#cb37-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                     + S1[1 : 14, 15 : 28] * lambda[2]);</span></span>\n<span id=\"cb37-41\"><a href=\"#cb37-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-42\"><a href=\"#cb37-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for smoothing parameters</span></span>\n<span id=\"cb37-43\"><a href=\"#cb37-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda ~ normal(5, 30);</span></span>\n<span id=\"cb37-44\"><a href=\"#cb37-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb37-45\"><a href=\"#cb37-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb37-46\"><a href=\"#cb37-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b);</span></span>\n<span id=\"cb37-47\"><a href=\"#cb37-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb37-48\"><a href=\"#cb37-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-49\"><a href=\"#cb37-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb37-50\"><a href=\"#cb37-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb37-51\"><a href=\"#cb37-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb37-52\"><a href=\"#cb37-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp] rho;</span></span>\n<span id=\"cb37-53\"><a href=\"#cb37-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb37-54\"><a href=\"#cb37-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   rho = log(lambda);</span></span>\n<span id=\"cb37-55\"><a href=\"#cb37-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-56\"><a href=\"#cb37-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb37-57\"><a href=\"#cb37-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb37-58\"><a href=\"#cb37-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb37-59\"><a href=\"#cb37-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span></span>\n<span id=\"cb37-60\"><a href=\"#cb37-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb37-61\"><a href=\"#cb37-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb37-62\"><a href=\"#cb37-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>The line below <code>// prior for s(time)...</code> shows how the\nspline basis coefficients are drawn from a zero-centred multivariate\nnormal distribution. The precision matrix <span class=\"math inline\">\\(S\\)</span> is penalized by two different smoothing\nparameters (the <span class=\"math inline\">\\(\\lambda\\)</span>’s) to\nenforce smoothness and reduce overfitting</p>\n</div>\n<div id=\"latent-dynamics-in-mvgam\" class=\"section level2\">\n<h2>Latent dynamics in <code>mvgam</code></h2>\n<p>Forecasts from the above model are not ideal:</p>\n<div class=\"sourceCode\" id=\"cb38\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb38-1\"><a href=\"#cb38-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model3, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAAAaVBMVEUAAAAAADoAAGYAOpAAZrY6AAA6ADo6AGY6kNtgYGBmAABmADpmtrZmtv+PJyeQOgCQZgCQ2/+iUFCzs7O2ZgC2/7a2//+5fHzHmZnbkDrb/7bb/9vb///cvLz/tmb/25D//7b//9v///+VJjsNAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAOJUlEQVR4nO3dbWPixhlGYWVtpwmt42xCNyFdwOb//8hqJEvWGs3o7bmZF871wXXXZsDoRBKDkKoLIFDFfgAoE2FBgrAgQViQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBQnCggRhQYKwIEFYkCAsSBAWJAgLEoQFCcKCBGFBgrAgQViQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBQnCggRhQYKwIEFYkCAsSBAWJAgLEoQFCcKCBGFBgrAgQViQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBQnCggRhQYKwIEFYkCAsSBAWJAgLEoQFCcKCBGFBgrAgQViQICxI2IZV0SlahAUJwoIEYUGCsCBBWJCwKaHqmQyH/LHGggRh3YMIy4Ww7gFhQYKwIEFYkCAsSBAWJAgLEoQFCcJCKQgLEoQFCcKCBGFBgrAgQViQIKx7wDwWJAgLEoQFCcKCBGFBgrAgQViQICxIJB/W20v7Qfov3zyjERZai0o4VM/tN6fql/HRCAutJSW8vfQ5HR6+j45GWCU5brjtkhJed8/dt6fxjSFhFeVWYbHGujO3Cuty+Olr+835iX2sO3CzsOqNYfuqcHx9RViFuV1Yk6MRVpJWLhfCQljyYTFBmqfUw2KCNFOJh8V0Q64SD4sJ0lwlHhZrrFwlHhYTpLlKPSwmSDOVfFiToxFWSQgLEkyQQoIJUkgw3QCJ+BOkXK+wSKyxIMEEKcKSn8digjRPyYc1ORphJYmwILFuuRyZIEVY6mExQZqpxMNiuiFXiYfFEaS5Sjws1li5SjwsJkjvyw1fFTJBek9uGNbkaIRVEMKCBGFBgrAgccN5rI8D+pjHKt/t1lhvL743CbvRCCtJqc9j1WU9hkcjrCQlH9blVD2HfkxYaUo/rKnRCCtJhAUJwoIEYUGCsCBBWJAgLCSEsKBwJCwoEBYkbMI6VFX43Zp5oxFWOUzCch+T8H1CYslohFUOi7DaD3Z5PtO1ZDTCKodFWK87F5bnU6hLRiOsJK1aLoZhdR8bXD8aYSWJsCBBWJAgLEhEDGvq8zczRyOsJEULywphpYmwIBExLN7SKVm8sHhLB5/xlg4keEsHEsxjQYKwIJFCWFyvsEAphNWPRljl4C0dTGHmHRKEBYk1y+VIWJhCWJAgLEgQFiRihvX2sv2oGcJKVMyw2jnSjQgrTXHXWISFAbN9rPPPW9/QIayS2G0KeUsHA7wqhARhQcIurPNTvSHcduQMYZXDLKxT1XygYtOHwAirHHbTDe0V4/ZbPqpDWGlKYYL0wKvC8sSdIGWNVayob0Kzj1WuuEc38KqwWBw2A4loYdV77q//3v5WIWElirAgEW9TeOBzhSWLOo/FGgsDR3beoUBYkLhtWG8v4f0wwirGTcPqp+XbWfqR0QirFLcMa/B5C8/pSgmrGLcM63XXv4/oOV0pYRWDNRamrVgudmG542YOVRU6aubQvUXtOyU8YaUpalj7L9/OT4/dYVnjus+I+eojrDTFDMtt5071qz6OIC1QzLDcocluU0dYBYodVr01DF/3hAnSPMXdx3r4Z/cYPukME6SZWr5cjpavCusVUXDfnemGXEUNaxoTpLlKPCzWWPfDdlM4dQQpE6R3wzCs/Yx5BiZI74VdWJyDFAOJhMVl5UpjF1b4TcL+l5ggvQ+G+1in6bM2MEF6Nyw3hZOfK2S6IVeJz2MxQZqrxMNijZWrxcvlaBnW9GmMmCDNVNSw5px4jQnSPMUMi1NFFixmWJzctmDJr7HchtLtivn2xAgrTanvY7m1WXORMN9VMwkrTYm/KmzmsfbNiu3EdEPRTMOa5MJ6n8tigrRstw3rsq+jOrDGugOWrwrfTxUZelX4unv43qyyTp4tJmEV4sZhuT38hu8IG8IqhFVY3XFWzpYDSQmrDEfBGmsTwiqDZVgmCCtNS5cLYWGWaGHVL/f+mT6CdMZohJUk1liQICxIxA3LHdcw46M6wdEIK0lRw2pnRn0HHc8cjbCSFDOs/kA/jiAtTxJh8aqwPDHD4ph39Ez3seZ8SmdyNMIqwdE0rPazXVs2hIRVCOOwDBBWEQgLEoQFCbuweBMaA6yxMM/C5UJYmCdaWP3p/NgUFinqGqt9+/kQPEHW5GiElaSYYfGWTsFihsWb0AVjjQWJZcvlaLuP9f4mNPtYBYoaVvvScMv6irBSFTcsA4RVAsKChGBT+PC/l00XlyOsEljvvP/09fDwnU/pwDYsd0I19wmdVZ/S4XqFJbENy02QNmExQXrvrNdYj01YTJDePfMJ0uc6LD6lU6IEJkg3TbwTVqKYIIXEouVytA3LdxWTZaMRVpJihtUdNrMJYaUp7hqLsIoVM6z2sl4bEVaa4m4K+TBFsaKusSwQVpoIC/HZhnWoN4Lb5xsIK39H07Dcoe7bjphpRyOs7JmG1c41bDqvbTsaYWXPNKx2dtRzPd4loxFW9hRhbXsH+kJYJSAsSBAWZluyXAgLs0UMi/NjlWzBcjmahmWFsNJEWJAgLEgQFiQICxKEBQnCQmyEBYUjYUEhUlhvL+HZecLKXZyw+jOGtGdYHhmNsDIXJazBZ1o9B5sSVu6ihPW66z9u4TnYlLByxxoLC8xfLpH2sboDtnwf6CGsNKUeVn/clu/jPISVptnL5RgprMnRCCtJhAWJ5MNigjRPqYfFBGmmEg+L6YZcJR4WE6S5Sjws1lilO8YJiwnS0sUKiwnSwkULa3I0wspacmFxvcIifO6KCVKYiBYWE6RlixUW0w25mrlcYoXFBGmu5i2Xq65YYyEs8bCYIM1V6mExQZqp5MOaHI2wkjRruVx3RVgISz6s/lJOB14V5iT1sFxO56fHC2FlJvGw2gvdv+7qXXfCKs5IVzeeIHVlEVZxIobVrrHc/z4SVnEihtVvAM9PnuMbCCtfMcPqj2p4eyGswox1xTwWNiMsSBAWlpteLqNdERbCCAsShAWJyeUy3hVhIYywIDG1XDxdERbCCAsShAWJieXi64qwsImvq783jElY8HZFWNjC2xVhYQN/V4SFDfxdERbWC3RFWFgt1BVhIcy/XIJdERbCFob1N2FhFu9yCWZFWJjgWy4TXREWwjzLZSIrwsKE8eUylRVhYcLYcpmo6i9ny11uuO3IaISVpJHl4q/qrw9b7nLDbUdGI6wkXS2XiTXVzcPikidFOLZlua9uP6rZmWo76r7UX//4448t93GbS54Mrt7UfNv+/8/fDv9hcLOVv+a5ReDGVz8bf8TX//D5D736WehOQ/cUGHjRw/z11+FdH5svzdfffmu++r+9rLXklqsvINCs5f50LoPrhH3+dvAPg99d+2vjtwjd+PPP/hx/xFf/8Pl3L59/FrrT0D2FBl72MOuw6lp+a4MJ/zVX36605Ib+S55MPI7R55iwpu7pbsLatsYafDv+d1z9NZt+bfrJ+3xjz7M5OdrVH3r1s9Cdhu4pMPCyh+nCmvnXhO5jiWX7WGsveTJ4gNWnXYHBt8N/GNxs5a95bhG48dXPxh/x9T98/kOvfha609A9BQZe9DB/3Mea89yM38cCy27JJU8wk20JhJWmCMuFsO4BYUGCsCBBWJAgLEgQFiQKCAuFIyxIxAnrlnfAwEkPTFgMLBmYsBhYMjBhMbBkYMJiYMnAhMXAkoEJi4ElAxMWA0sGJiwGlgzMm3uQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBQl1WOd/eU6wbDDoqaqqR8Nh91XVnlnuYDywG7s5pZj1Ix6Ot/edtGzTwKsfsTis153vzN3bBz3Vz+T5yW457etRT+680Ifql/ob07JOzbnq3OivO7uBh8/AyXs2vDUDdw90/SPWhnXynxJ+86CvO3e6yoPZ+OenZ3ea1cf3J9Ju4EtzJsR6sb+9uGXfn2/TYNSPZ6C9ByP9A3VPR/2Er3nE0rDOT7+YLp8fBl31505xz2RTmOHyd4M9/C4Ia/gMtPdgpH+g7blmfWecDVLvY9mH1Q16+PLfnfmu0MdS3xs+8PPPX/cfm0KzAAbPQHcPRroH2v431q4ZF8o4LLen3a6rrdQb2e4pPHiuvbGGO415u9jPT5XhuB/PwMc9GHl/oM0u57qdrJzDcovIeIPYrU9M993dSfGbxb5vQjB7Rj6egf4ejHQP9D7DapI6Vc+Tv75o6GZUy/WV20y1kwHtvsqqDcuo/hno78FI/0DvclN4koTVjLe37KqZFavcFFn7WO223v0z0N+D1cDdA+123lc8x/mG1f7RJ9vphmYtcDCO1VGssX58BhRrrFSnGy7KsJqvg8v7bNU8iW6pr3p1PUWxj/XjM6DYx0p2glQaVvN2g2UD+3Y86w1LO3az2N3Q1u+8dM+A6avC/oGm+pYO7hVhQYKwIEFYkCAsSBAWJAgLEoQFCcKCBGFBgrAgQViQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBQnCggRhQYKwIEFYC5yqzrPpmRJKRFgLWZ+Qq1SEtRBhzUNYC72HtXenFP7Prt4ont7PeHQwPqlS5ghroWFYX75d9tXD9+a06O5UgJJTtmWKsBYahtWdsPrw5VvblOQ0c3kirIWGYT2/n5+z7qk9T+eq08CWibAW8oR16OYhYj++VBDWQsE1FnqEtZAnrPdTY5NXh7AW8oTVnMHa8lqEuSOshXxhKS7LmjPCggRhQYKwIEFYkCAsSBAWJAgLEoQFCcKCBGFBgrAgQViQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBYn/AwXXxfXH+WhCAAAAAElFTkSuQmCC\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Why is this happening? The forecasts are driven almost entirely by\nvariation in the temporal spline, which is extrapolating linearly\n<em>forever</em> beyond the edge of the training data. Any slight\nwiggles near the end of the training set will result in wildly different\nforecasts. To visualize this, we can plot the extrapolated temporal\nfunctions into the out-of-sample test set for the two models. Here are\nthe extrapolated functions for the first model, with 15 basis\nfunctions:</p>\n<div class=\"sourceCode\" id=\"cb39\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb39-1\"><a href=\"#cb39-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(</span>\n<span id=\"cb39-2\"><a href=\"#cb39-2\" tabindex=\"-1\"></a>  model3,</span>\n<span id=\"cb39-3\"><a href=\"#cb39-3\" tabindex=\"-1\"></a>  <span class=\"at\">smooth =</span> <span class=\"st\">&quot;s(time)&quot;</span>,</span>\n<span id=\"cb39-4\"><a href=\"#cb39-4\" tabindex=\"-1\"></a>  <span class=\"co\"># pass newdata to the plot function to generate</span></span>\n<span id=\"cb39-5\"><a href=\"#cb39-5\" tabindex=\"-1\"></a>  <span class=\"co\"># predictions of the temporal smooth to the end of the</span></span>\n<span id=\"cb39-6\"><a href=\"#cb39-6\" tabindex=\"-1\"></a>  <span class=\"co\"># testing period</span></span>\n<span id=\"cb39-7\"><a href=\"#cb39-7\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb39-8\"><a href=\"#cb39-8\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">max</span>(data_test<span class=\"sc\">$</span>time),</span>\n<span id=\"cb39-9\"><a href=\"#cb39-9\" tabindex=\"-1\"></a>    <span class=\"at\">ndvi_ma12 =</span> <span class=\"dv\">0</span></span>\n<span id=\"cb39-10\"><a href=\"#cb39-10\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb39-11\"><a href=\"#cb39-11\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb39-12\"><a href=\"#cb39-12\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"fu\">max</span>(data_train<span class=\"sc\">$</span>time), <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This model is not doing well. Clearly we need to somehow account for\nthe strong temporal autocorrelation when modelling these data without\nusing a smooth function of <code>time</code>. Now onto another prominent\nfeature of <code>mvgam</code>: the ability to include (possibly latent)\nautocorrelated residuals in regression models. To do so, we use the\n<code>trend_model</code> argument (see <code>?mvgam_trends</code> for\ndetails of different dynamic trend models that are supported). This\nmodel will use a separate sub-model for latent residuals that evolve as\nan AR1 process (i.e. the error in the current time point is a function\nof the error in the previous time point, plus some stochastic noise). We\nalso include a smooth function of <code>ndvi_ma12</code> in this model,\nrather than the parametric term that was used above, to showcase that\n<code>mvgam</code> can include combinations of smooths and dynamic\ncomponents:</p>\n<div class=\"sourceCode\" id=\"cb40\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb40-1\"><a href=\"#cb40-1\" tabindex=\"-1\"></a>model4 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb40-2\"><a href=\"#cb40-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(ndvi_ma12, <span class=\"at\">k =</span> <span class=\"dv\">6</span>),</span>\n<span id=\"cb40-3\"><a href=\"#cb40-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb40-4\"><a href=\"#cb40-4\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb40-5\"><a href=\"#cb40-5\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test,</span>\n<span id=\"cb40-6\"><a href=\"#cb40-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>()</span>\n<span id=\"cb40-7\"><a href=\"#cb40-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = f(\\boldsymbol{ndvi})_t + z_t \\\\\nz_t &amp; \\sim \\text{Normal}(ar1 * z_{t-1}, \\sigma_{error}) \\\\\nar1 &amp; \\sim \\text{Normal}(0, 1)[-1, 1] \\\\\n\\sigma_{error} &amp; \\sim \\text{Exponential}(2) \\\\\nf(\\boldsymbol{ndvi}) &amp; = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} &amp; \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1})\n\\end{align*}\\]</span></p>\n<p>Here the term <span class=\"math inline\">\\(z_t\\)</span> captures\nautocorrelated latent residuals, which are modelled using an AR1\nprocess. You can also notice that this model is estimating\nautocorrelated errors for the full time period, even though some of\nthese time points have missing observations. This is useful for getting\nmore realistic estimates of the residual autocorrelation parameters.\nSummarise the model to see how it now returns posterior summaries for\nthe latent AR1 process:</p>\n<div class=\"sourceCode\" id=\"cb41\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb41-1\"><a href=\"#cb41-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model4)</span>\n<span id=\"cb41-2\"><a href=\"#cb41-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb41-3\"><a href=\"#cb41-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ s(ndvi_ma12, k = 6)</span></span>\n<span id=\"cb41-4\"><a href=\"#cb41-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb41-5\"><a href=\"#cb41-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-6\"><a href=\"#cb41-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb41-7\"><a href=\"#cb41-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb41-8\"><a href=\"#cb41-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-9\"><a href=\"#cb41-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb41-10\"><a href=\"#cb41-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb41-11\"><a href=\"#cb41-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-12\"><a href=\"#cb41-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb41-13\"><a href=\"#cb41-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb41-14\"><a href=\"#cb41-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-15\"><a href=\"#cb41-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb41-16\"><a href=\"#cb41-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb41-17\"><a href=\"#cb41-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-18\"><a href=\"#cb41-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb41-19\"><a href=\"#cb41-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb41-20\"><a href=\"#cb41-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-21\"><a href=\"#cb41-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb41-22\"><a href=\"#cb41-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb41-23\"><a href=\"#cb41-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb41-24\"><a href=\"#cb41-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb41-25\"><a href=\"#cb41-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-26\"><a href=\"#cb41-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb41-27\"><a href=\"#cb41-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                  2.5%     50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-28\"><a href=\"#cb41-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    -0.910  0.7700 1.700 1.04   121</span></span>\n<span id=\"cb41-29\"><a href=\"#cb41-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).1 -0.140  0.0047 0.190 1.00   830</span></span>\n<span id=\"cb41-30\"><a href=\"#cb41-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).2 -0.210 -0.0049 0.200 1.00   685</span></span>\n<span id=\"cb41-31\"><a href=\"#cb41-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).3 -0.085 -0.0014 0.069 1.00   810</span></span>\n<span id=\"cb41-32\"><a href=\"#cb41-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).4 -0.430  0.0250 0.600 1.00   750</span></span>\n<span id=\"cb41-33\"><a href=\"#cb41-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).5 -0.260  0.0640 0.490 1.00   921</span></span>\n<span id=\"cb41-34\"><a href=\"#cb41-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-35\"><a href=\"#cb41-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb41-36\"><a href=\"#cb41-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb41-37\"><a href=\"#cb41-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12) 1.285      5  0.357   0.999</span></span>\n<span id=\"cb41-38\"><a href=\"#cb41-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-39\"><a href=\"#cb41-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb41-40\"><a href=\"#cb41-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-41\"><a href=\"#cb41-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.58 0.81   1.1 1.01   345</span></span>\n<span id=\"cb41-42\"><a href=\"#cb41-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-43\"><a href=\"#cb41-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; precision parameter:</span></span>\n<span id=\"cb41-44\"><a href=\"#cb41-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-45\"><a href=\"#cb41-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; tau[1] 0.78 1.5     3    1   358</span></span>\n<span id=\"cb41-46\"><a href=\"#cb41-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-47\"><a href=\"#cb41-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb41-48\"><a href=\"#cb41-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-49\"><a href=\"#cb41-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.61 0.82  0.97 1.01   436</span></span>\n<span id=\"cb41-50\"><a href=\"#cb41-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-51\"><a href=\"#cb41-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb41-52\"><a href=\"#cb41-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb41-53\"><a href=\"#cb41-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb41-54\"><a href=\"#cb41-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb41-55\"><a href=\"#cb41-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb41-56\"><a href=\"#cb41-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-57\"><a href=\"#cb41-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb41-58\"><a href=\"#cb41-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb41-59\"><a href=\"#cb41-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb41-60\"><a href=\"#cb41-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-61\"><a href=\"#cb41-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>View posterior hindcasts / forecasts and compare against the out of\nsample test data</p>\n<div class=\"sourceCode\" id=\"cb42\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb42-1\"><a href=\"#cb42-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model4, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The trend is evolving as an AR1 process, which we can also view:</p>\n<div class=\"sourceCode\" id=\"cb43\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb43-1\"><a href=\"#cb43-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model4, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>In-sample model performance can be interrogated using leave-one-out\ncross-validation utilities from the <code>loo</code> package (a higher\nvalue is preferred for this metric):</p>\n<div class=\"sourceCode\" id=\"cb44\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb44-1\"><a href=\"#cb44-1\" tabindex=\"-1\"></a><span class=\"fu\">loo_compare</span>(model3, model4)</span>\n<span id=\"cb44-2\"><a href=\"#cb44-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        elpd_diff se_diff</span></span>\n<span id=\"cb44-3\"><a href=\"#cb44-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model3    0.0       0.0 </span></span>\n<span id=\"cb44-4\"><a href=\"#cb44-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model4 -891.7     153.7</span></span></code></pre></div>\n<p>The higher estimated log predictive density (ELPD) value for the\ndynamic model suggests it provides a better fit to the in-sample\ndata.</p>\n<p>Though it should be obvious that this model provides better\nforecasts, we can quantify forecast performance for models 3 and 4 using\nthe <code>forecast</code> and <code>score</code> functions. Here we will\ncompare models based on their Discrete Ranked Probability Scores (a\nlower value is preferred for this metric)</p>\n<div class=\"sourceCode\" id=\"cb45\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb45-1\"><a href=\"#cb45-1\" tabindex=\"-1\"></a>fc_mod3 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(model3)</span>\n<span id=\"cb45-2\"><a href=\"#cb45-2\" tabindex=\"-1\"></a>fc_mod4 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(model4)</span>\n<span id=\"cb45-3\"><a href=\"#cb45-3\" tabindex=\"-1\"></a>score_mod3 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod3, <span class=\"at\">score =</span> <span class=\"st\">&quot;drps&quot;</span>)</span>\n<span id=\"cb45-4\"><a href=\"#cb45-4\" tabindex=\"-1\"></a>score_mod4 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod4, <span class=\"at\">score =</span> <span class=\"st\">&quot;drps&quot;</span>)</span>\n<span id=\"cb45-5\"><a href=\"#cb45-5\" tabindex=\"-1\"></a><span class=\"fu\">sum</span>(score_mod4<span class=\"sc\">$</span>PP<span class=\"sc\">$</span>score, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">-</span> </span>\n<span id=\"cb45-6\"><a href=\"#cb45-6\" tabindex=\"-1\"></a>  <span class=\"fu\">sum</span>(score_mod3<span class=\"sc\">$</span>PP<span class=\"sc\">$</span>score, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb45-7\"><a href=\"#cb45-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] -619.4987</span></span></code></pre></div>\n<p>A strongly negative value here suggests the score for the dynamic\nmodel (model 4) is much smaller than the score for the model with a\nsmooth function of time (model 3)</p>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nDynamic GAMs and how they can be applied in practice:</p>\n<p>Clark, Nicholas J. and Wells, K. <a href=\"https://doi.org/10.1111/2041-210X.13974\">Dynamic Generalized\nAdditive Models (DGAMs) for forecasting discrete ecological time\nseries</a>. <em>Methods in Ecology and Evolution</em>. (2023): 14,\n771-784.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>de Sousa, Heitor C., et al. <a href=\"https://doi.org/10.1111/1365-2656.14188\">Severe fire regimes\ndecrease resilience of ectothermic populations</a>. <em>Journal of\nAnimal Ecology</em> (2024): 93(11), 1656-1669.</p>\n<p>Hannaford, Naomi E., et al. <a href=\"https://doi.org/10.1016/j.csda.2022.107659\">A sparse Bayesian\nhierarchical vector autoregressive model for microbial dynamics in a\nwastewater treatment plant.</a> <em>Computational Statistics &amp; Data\nAnalysis</em> (2023): 179, 107659.</p>\n<p>Karunarathna, K.A.N.K., et al. <a href=\"https://doi.org/10.1016/j.ecolmodel.2024.110648\">Modelling\nnonlinear responses of a desert rodent species to environmental change\nwith hierarchical dynamic generalized additive models</a>.\n<em>Ecological Modelling</em> (2024): 490, 110648.</p>\n<p>Zhu, L., et al. <a href=\"https://doi.org/10.1111/1365-2435.14711\">Responses of a widespread\npest insect to extreme high temperatures are stage-dependent and\ndivergent among seasonal cohorts</a>. <em>Functional Ecology</em>\n(2025): 39, 165–180. <a href=\"https://doi.org/10.1111/1365-2435.14711\" class=\"uri\">https://doi.org/10.1111/1365-2435.14711</a></p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "doc/nmixtures.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\nlibrary(dplyr)\n# A custom ggplot2 theme\ntheme_set(\n  theme_classic(base_size = 12, base_family = \"serif\") +\n    theme(\n      axis.line.x.bottom = element_line(\n        colour = \"black\",\n        size = 1\n      ),\n      axis.line.y.left = element_line(\n        colour = \"black\",\n        size = 1\n      )\n    )\n)\noptions(\n  ggplot2.discrete.colour = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  ),\n  ggplot2.discrete.fill = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  )\n)\n\n\n## --------------------------------------------------------------------------------\nset.seed(999)\n# Simulate observations for species 1, which shows a declining trend and 0.7 detection probability\ndata.frame(\n  site = 1,\n  # five replicates per year; six years\n  replicate = rep(1:5, 6),\n  time = sort(rep(1:6, 5)),\n  species = \"sp_1\",\n  # true abundance declines nonlinearly\n  truth = c(\n    rep(28, 5),\n    rep(26, 5),\n    rep(23, 5),\n    rep(16, 5),\n    rep(14, 5),\n    rep(14, 5)\n  ),\n  # observations are taken with detection prob = 0.7\n  obs = c(\n    rbinom(5, 28, 0.7),\n    rbinom(5, 26, 0.7),\n    rbinom(5, 23, 0.7),\n    rbinom(5, 15, 0.7),\n    rbinom(5, 14, 0.7),\n    rbinom(5, 14, 0.7)\n  )\n) %>%\n  # add 'series' information, which is an identifier of site, replicate and species\n  dplyr::mutate(\n    series = paste0(\n      \"site_\",\n      site,\n      \"_\",\n      species,\n      \"_rep_\",\n      replicate\n    ),\n    time = as.numeric(time),\n    # add a 'cap' variable that defines the maximum latent N to\n    # marginalize over when estimating latent abundance; in other words\n    # how large do we realistically think the true abundance could be?\n    cap = 100\n  ) %>%\n  dplyr::select(-replicate) -> testdat\n\n# Now add another species that has a different temporal trend and a smaller\n# detection probability (0.45 for this species)\ntestdat <- testdat %>%\n  dplyr::bind_rows(\n    data.frame(\n      site = 1,\n      replicate = rep(1:5, 6),\n      time = sort(rep(1:6, 5)),\n      species = \"sp_2\",\n      truth = c(\n        rep(4, 5),\n        rep(7, 5),\n        rep(15, 5),\n        rep(16, 5),\n        rep(19, 5),\n        rep(18, 5)\n      ),\n      obs = c(\n        rbinom(5, 4, 0.45),\n        rbinom(5, 7, 0.45),\n        rbinom(5, 15, 0.45),\n        rbinom(5, 16, 0.45),\n        rbinom(5, 19, 0.45),\n        rbinom(5, 18, 0.45)\n      )\n    ) %>%\n      dplyr::mutate(\n        series = paste0(\n          \"site_\",\n          site,\n          \"_\",\n          species,\n          \"_rep_\",\n          replicate\n        ),\n        time = as.numeric(time),\n        cap = 50\n      ) %>%\n      dplyr::select(-replicate)\n  )\n\n\n## --------------------------------------------------------------------------------\ntestdat$species <- factor(testdat$species, levels = unique(testdat$species))\ntestdat$series <- factor(testdat$series, levels = unique(testdat$series))\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(testdat)\nhead(testdat, 12)\n\n\n## --------------------------------------------------------------------------------\ntestdat %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\ntrend_map\n\n\n## ----include = FALSE, results='hide'---------------------------------------------\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n\n\n## ----eval = FALSE----------------------------------------------------------------\n# mod <- mvgam(\n#   # the observation formula sets up linear predictors for\n#   # detection probability on the logit scale\n#   formula = obs ~ species - 1,\n#\n#   # the trend_formula sets up the linear predictors for\n#   # the latent abundance processes on the log scale\n#   trend_formula = ~ s(time, by = trend, k = 4) + species,\n#\n#   # the trend_map takes care of the mapping\n#   trend_map = trend_map,\n#\n#   # nmix() family and data\n#   family = nmix(),\n#   data = testdat,\n#\n#   # priors can be set in the usual way\n#   priors = c(\n#     prior(std_normal(), class = b),\n#     prior(normal(1, 1.5), class = Intercept_trend)\n#   ),\n#   samples = 1000\n# )\n\n## --------------------------------------------------------------------------------\ncode(mod)\n\n\n## --------------------------------------------------------------------------------\nsummary(mod)\n\n\n## --------------------------------------------------------------------------------\nloo(mod)\n\n\n## --------------------------------------------------------------------------------\nplot(mod, type = \"smooths\", trend_effects = TRUE)\n\n\n## --------------------------------------------------------------------------------\nmarginaleffects::plot_predictions(\n  mod,\n  condition = \"species\",\n  type = \"detection\"\n) +\n  ylab(\"Pr(detection)\") +\n  ylim(c(0, 1)) +\n  theme_classic() +\n  theme(legend.position = \"none\")\n\n\n## --------------------------------------------------------------------------------\nhc <- hindcast(mod, type = \"latent_N\")\n\n# Function to plot latent abundance estimates vs truth\nplot_latentN <- function(hindcasts, data, species = \"sp_1\") {\n  all_series <- unique(\n    data %>%\n      dplyr::filter(species == !!species) %>%\n      dplyr::pull(series)\n  )\n\n  # Grab the first replicate that represents this series\n  # so we can get the true simulated values\n  series <- as.numeric(all_series[1])\n  truths <- data %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::filter(series == !!levels(data$series)[series]) %>%\n    dplyr::pull(truth)\n\n  # In case some replicates have missing observations,\n  # pull out predictions for ALL replicates and average over them\n  hcs <- do.call(\n    rbind,\n    lapply(all_series, function(x) {\n      ind <- which(names(hindcasts$hindcasts) %in% as.character(x))\n      hindcasts$hindcasts[[ind]]\n    })\n  )\n\n  # Calculate posterior empirical quantiles of predictions\n  pred_quantiles <- data.frame(t(apply(hcs, 2, function(x) {\n    quantile(\n      x,\n      probs = c(\n        0.05,\n        0.2,\n        0.3,\n        0.4,\n        0.5,\n        0.6,\n        0.7,\n        0.8,\n        0.95\n      )\n    )\n  })))\n  pred_quantiles$time <- 1:NROW(pred_quantiles)\n  pred_quantiles$truth <- truths\n\n  # Grab observations\n  data %>%\n    dplyr::filter(series %in% all_series) %>%\n    dplyr::select(time, obs) -> observations\n\n  # Plot\n  ggplot(pred_quantiles, aes(x = time, group = 1)) +\n    geom_ribbon(aes(ymin = X5., ymax = X95.), fill = \"#DCBCBC\") +\n    geom_ribbon(aes(ymin = X30., ymax = X70.), fill = \"#B97C7C\") +\n    geom_line(aes(x = time, y = truth), colour = \"black\", linewidth = 1) +\n    geom_point(\n      aes(x = time, y = truth),\n      shape = 21,\n      colour = \"white\",\n      fill = \"black\",\n      size = 2.5\n    ) +\n    geom_jitter(\n      data = observations,\n      aes(x = time, y = obs),\n      width = 0.06,\n      shape = 21,\n      fill = \"darkred\",\n      colour = \"white\",\n      size = 2.5\n    ) +\n    labs(\n      y = \"Latent abundance (N)\",\n      x = \"Time\",\n      title = species\n    )\n}\n\n\n## --------------------------------------------------------------------------------\nplot_latentN(hc, testdat, species = \"sp_1\")\nplot_latentN(hc, testdat, species = \"sp_2\")\n\n\n## --------------------------------------------------------------------------------\n# Date link\nload(url(\n  \"https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda\"\n))\ndata.one.sp <- dataNMixSim\n\n# Pull out observations for one species\ndata.one.sp$y <- data.one.sp$y[1, , ]\n\n# Abundance covariates that don't change across repeat sampling observations\nabund.cov <- dataNMixSim$abund.covs[, 1]\nabund.factor <- as.factor(dataNMixSim$abund.covs[, 2])\n\n# Detection covariates that can change across repeat sampling observations\n# Note that `NA`s are not allowed for covariates in mvgam, so we randomly\n# impute them here\ndet.cov <- dataNMixSim$det.covs$det.cov.1[,]\ndet.cov[is.na(det.cov)] <- rnorm(length(which(is.na(det.cov))))\ndet.cov2 <- dataNMixSim$det.covs$det.cov.2\ndet.cov2[is.na(det.cov2)] <- rnorm(length(which(is.na(det.cov2))))\n\n\n## --------------------------------------------------------------------------------\nmod_data <- do.call(\n  rbind,\n  lapply(1:NROW(data.one.sp$y), function(x) {\n    data.frame(\n      y = data.one.sp$y[x, ],\n      abund_cov = abund.cov[x],\n      abund_fac = abund.factor[x],\n      det_cov = det.cov[x, ],\n      det_cov2 = det.cov2[x, ],\n      replicate = 1:NCOL(data.one.sp$y),\n      site = paste0(\"site\", x)\n    )\n  })\n) %>%\n  dplyr::mutate(\n    species = \"sp_1\",\n    series = as.factor(paste0(site, \"_\", species, \"_\", replicate))\n  ) %>%\n  dplyr::mutate(\n    site = factor(site, levels = unique(site)),\n    species = factor(species, levels = unique(species)),\n    time = 1,\n    cap = max(data.one.sp$y, na.rm = TRUE) + 20\n  )\n\n\n## --------------------------------------------------------------------------------\nNROW(mod_data)\ndplyr::glimpse(mod_data)\nhead(mod_data)\n\n\n## --------------------------------------------------------------------------------\nmod_data %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\n\ntrend_map %>%\n  dplyr::arrange(trend) %>%\n  head(12)\n\n\n## ----include = FALSE, results='hide'---------------------------------------------\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 3) + s(det_cov2, k = 3),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 3) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(\n#   # effects of covariates on detection probability;\n#   # here we use penalized splines for both continuous covariates\n#   formula = y ~ s(det_cov, k = 4) + s(det_cov2, k = 4),\n#\n#   # effects of the covariates on latent abundance;\n#   # here we use a penalized spline for the continuous covariate and\n#   # hierarchical intercepts for the factor covariate\n#   trend_formula = ~ s(abund_cov, k = 4) +\n#     s(abund_fac, bs = \"re\"),\n#\n#   # link multiple observations to each site\n#   trend_map = trend_map,\n#\n#   # nmix() family and supplied data\n#   family = nmix(),\n#   data = mod_data,\n#\n#   # standard normal priors on key regression parameters\n#   priors = c(\n#     prior(std_normal(), class = \"b\"),\n#     prior(std_normal(), class = \"Intercept\"),\n#     prior(std_normal(), class = \"Intercept_trend\"),\n#     prior(std_normal(), class = \"sigma_raw_trend\")\n#   ),\n#\n#   # use Stan's variational inference for quicker results\n#   algorithm = \"meanfield\",\n#\n#   # no need to compute \"series-level\" residuals\n#   residuals = FALSE,\n#   samples = 1000\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nmarginaleffects::avg_predictions(mod, type = \"detection\")\n\n\n## --------------------------------------------------------------------------------\nabund_plots <- plot(\n  conditional_effects(\n    mod,\n    type = \"link\",\n    effects = c(\n      \"abund_cov\",\n      \"abund_fac\"\n    )\n  ),\n  plot = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\nabund_plots[[1]] +\n  ylab(\"Expected latent abundance\")\n\n\n## --------------------------------------------------------------------------------\nabund_plots[[2]] +\n  ylab(\"Expected latent abundance\")\n\n\n## --------------------------------------------------------------------------------\ndet_plots <- plot(\n  conditional_effects(\n    mod,\n    type = \"detection\",\n    effects = c(\n      \"det_cov\",\n      \"det_cov2\"\n    )\n  ),\n  plot = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\ndet_plots[[1]] +\n  ylab(\"Pr(detection)\")\ndet_plots[[2]] +\n  ylab(\"Pr(detection)\")\n\n\n## --------------------------------------------------------------------------------\nfivenum_round <- function(x) round(fivenum(x, na.rm = TRUE), 2)\n\nmarginaleffects::plot_predictions(\n  mod,\n  newdata = marginaleffects::datagrid(\n    det_cov = unique,\n    det_cov2 = fivenum_round\n  ),\n  by = c(\"det_cov\", \"det_cov2\"),\n  type = \"detection\"\n) +\n  theme_classic() +\n  ylab(\"Pr(detection)\")\n"
  },
  {
    "path": "doc/nmixtures.Rmd",
    "content": "---\ntitle: \"N-mixtures in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n  toc: yes\nvignette: >\n  %\\VignetteIndexEntry{N-mixtures in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\nlibrary(dplyr)\n# A custom ggplot2 theme\ntheme_set(theme_classic(base_size = 12, base_family = \"serif\") +\n  theme(\n    axis.line.x.bottom = element_line(\n      colour = \"black\",\n      size = 1\n    ),\n    axis.line.y.left = element_line(\n      colour = \"black\",\n      size = 1\n    )\n  ))\noptions(\n  ggplot2.discrete.colour = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  ),\n  ggplot2.discrete.fill = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  )\n)\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to fit and interrogate N-mixture models for population abundance counts made with imperfect detection.\n\n## N-mixture models\nAn N-mixture model is a fairly recent addition to the ecological modeller's toolkit that is designed to make inferences about variation in the abundance of species when observations are imperfect ([Royle 2004](https://onlinelibrary.wiley.com/doi/10.1111/j.0006-341X.2004.00142.x){target=\"_blank\"}). Briefly, assume $\\boldsymbol{Y_{i,r}}$ is the number of individuals recorded at site $i$ during replicate sampling observation $r$ (recorded as a non-negative integer). If multiple replicate surveys are done within a short enough period to satisfy the assumption that the population remained closed (i.e. there was no substantial change in true population size between replicate surveys), we can account for the fact that observations aren't perfect. This is done by assuming that these replicate observations are Binomial random variables that are parameterized by the true \"latent\" abundance $N$ and a detection probability $p$:\n\n\\begin{align*}\n\\boldsymbol{Y_{i,r}} & \\sim \\text{Binomial}(N_i, p_r) \\\\\nN_{i} & \\sim \\text{Poisson}(\\lambda_i)  \\end{align*}\n\nUsing a set of linear predictors, we can estimate effects of covariates $\\boldsymbol{X}$ on the expected latent abundance (with a log link for $\\lambda$) and, jointly, effects of possibly different covariates (call them $\\boldsymbol{Q}$) on detection probability (with a logit link for $p$):\n\n\\begin{align*}\nlog(\\lambda) & = \\beta \\boldsymbol{X} \\\\\nlogit(p) & = \\gamma \\boldsymbol{Q}\\end{align*}\n\n`mvgam` can handle this type of model because it is designed to propagate unobserved temporal processes that evolve independently of the observation process in a State-space format. This setup adapts well to N-mixture models because they can be thought of as State-space models in which the latent state is a discrete variable representing the \"true\" but unknown population size. This is very convenient because we can incorporate any of the package's diverse effect types (i.e. multidimensional splines, time-varying effects, monotonic effects, random effects etc...) into the linear predictors. All that is required for this to work is a marginalization trick that allows `Stan`'s sampling algorithms to handle discrete parameters (see more about how this method of \"integrating out\" discrete parameters works in [this nice blog post by Maxwell Joseph](https://mbjoseph.github.io/posts/2020-04-28-a-step-by-step-guide-to-marginalizing-over-discrete-parameters-for-ecologists-using-stan/){target=\"_blank\"}). \n  \nThe family `nmix()` is used to set up N-mixture models in `mvgam`, but we still need to do a little bit of data wrangling to ensure the data are set up in the correct format (this is especially true when we have more than one replicate survey per time period). The most important aspects are: (1) how we set up the observation `series` and `trend_map` arguments to ensure replicate surveys are mapped to the correct latent abundance model and (2) the inclusion of a `cap` variable that defines the maximum possible integer value to use for each observation when estimating latent abundance. The two examples below give a reasonable overview of how this can be done. \n\n## Example 1: a two-species system with nonlinear trends\nFirst we will use a simple simulation in which multiple replicate observations are taken at each timepoint for two different species. The simulation produces observations at a single site over six years, with five replicate surveys per year. Each species is simulated to have different nonlinear temporal trends and different detection probabilities. For now, detection probability is fixed (i.e. it does not change over time or in association with any covariates). Notice that we add the `cap` variable, which does not need to be static, to define the maximum possible value that we think the latent abundance could be for each timepoint. This simply needs to be large enough that we get a reasonable idea of which latent N values are most likely, without adding too much computational cost:\n\n```{r}\nset.seed(999)\n# Simulate observations for species 1, which shows a declining trend and 0.7 detection probability\ndata.frame(\n  site = 1,\n  # five replicates per year; six years\n  replicate = rep(1:5, 6),\n  time = sort(rep(1:6, 5)),\n  species = \"sp_1\",\n  # true abundance declines nonlinearly\n  truth = c(\n    rep(28, 5),\n    rep(26, 5),\n    rep(23, 5),\n    rep(16, 5),\n    rep(14, 5),\n    rep(14, 5)\n  ),\n  # observations are taken with detection prob = 0.7\n  obs = c(\n    rbinom(5, 28, 0.7),\n    rbinom(5, 26, 0.7),\n    rbinom(5, 23, 0.7),\n    rbinom(5, 15, 0.7),\n    rbinom(5, 14, 0.7),\n    rbinom(5, 14, 0.7)\n  )\n) %>%\n  # add 'series' information, which is an identifier of site, replicate and species\n  dplyr::mutate(\n    series = paste0(\n      \"site_\", site,\n      \"_\", species,\n      \"_rep_\", replicate\n    ),\n    time = as.numeric(time),\n    # add a 'cap' variable that defines the maximum latent N to\n    # marginalize over when estimating latent abundance; in other words\n    # how large do we realistically think the true abundance could be?\n    cap = 100\n  ) %>%\n  dplyr::select(-replicate) -> testdat\n\n# Now add another species that has a different temporal trend and a smaller\n# detection probability (0.45 for this species)\ntestdat <- testdat %>%\n  dplyr::bind_rows(data.frame(\n    site = 1,\n    replicate = rep(1:5, 6),\n    time = sort(rep(1:6, 5)),\n    species = \"sp_2\",\n    truth = c(\n      rep(4, 5),\n      rep(7, 5),\n      rep(15, 5),\n      rep(16, 5),\n      rep(19, 5),\n      rep(18, 5)\n    ),\n    obs = c(\n      rbinom(5, 4, 0.45),\n      rbinom(5, 7, 0.45),\n      rbinom(5, 15, 0.45),\n      rbinom(5, 16, 0.45),\n      rbinom(5, 19, 0.45),\n      rbinom(5, 18, 0.45)\n    )\n  ) %>%\n    dplyr::mutate(\n      series = paste0(\n        \"site_\", site,\n        \"_\", species,\n        \"_rep_\", replicate\n      ),\n      time = as.numeric(time),\n      cap = 50\n    ) %>%\n    dplyr::select(-replicate))\n```\n\nThis data format isn't too difficult to set up, but it does differ from the traditional multidimensional array setup that is commonly used for fitting N-mixture models in other software packages. Next we ensure that species and series IDs are included as factor variables, in case we'd like to allow certain effects to vary by species\n```{r}\ntestdat$species <- factor(testdat$species,\n  levels = unique(testdat$species)\n)\ntestdat$series <- factor(testdat$series,\n  levels = unique(testdat$series)\n)\n```\n\nPreview the dataset to get an idea of how it is structured:\n```{r}\ndplyr::glimpse(testdat)\nhead(testdat, 12)\n```\n\n### Setting up the `trend_map`\n\nFinally, we need to set up the `trend_map` object. This is crucial for allowing multiple observations to be linked to the same latent process model (see more information about this argument in the [Shared latent states vignette](https://nicholasjclark.github.io/mvgam/articles/shared_states.html){target=\"_blank\"}). In this case, the mapping operates by species and site to state that each set of replicate observations from the same time point should all share the exact same latent abundance model:\n```{r}\ntestdat %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\ntrend_map\n```\n\nNotice how all of the replicates for species 1 in site 1 share the same process (i.e. the same `trend`). This will ensure that all replicates are Binomial draws of the same latent N.\n\n### Modelling with the `nmix()` family\n\nNow we are ready to fit a model using `mvgam()`. This model will allow each species to have different detection probabilities and different temporal trends. We will use `Cmdstan` as the backend, which by default will use Hamiltonian Monte Carlo for full Bayesian inference\n\n```{r include = FALSE, results='hide'}\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n```\n\n```{r eval = FALSE}\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n```\n\nView the automatically-generated `Stan` code to get a sense of how the marginalization over latent N works\n```{r}\ncode(mod)\n```\n\nThe posterior summary of this model shows that it has converged nicely\n```{r}\nsummary(mod)\n```\n\n`loo()` functionality works just as it does for all `mvgam` models to aid in model comparison / selection (though note that Pareto K values often give warnings for mixture models so these may not be too helpful)\n```{r}\nloo(mod)\n```\n\nPlot the estimated smooths of time from each species' latent abundance process (on the log scale)\n```{r}\nplot(mod, type = \"smooths\", trend_effects = TRUE)\n```\n\n`marginaleffects` support allows for more useful prediction-based interrogations on different scales (though note that at the time of writing this Vignette, you must have the development version of `marginaleffects` installed for `nmix()` models to be supported; use `remotes::install_github('vincentarelbundock/marginaleffects')` to install). Objects that use family `nmix()` have a few additional prediction scales that can be used (i.e. `link`, `response`, `detection` or `latent_N`). For example, here are the estimated detection probabilities per species, which show that the model has done a nice job of estimating these parameters:\n```{r}\nmarginaleffects::plot_predictions(mod,\n  condition = \"species\",\n  type = \"detection\"\n) +\n  ylab(\"Pr(detection)\") +\n  ylim(c(0, 1)) +\n  theme_classic() +\n  theme(legend.position = \"none\")\n```\n\nA common goal in N-mixture modelling is to estimate the true latent abundance. The model has automatically generated predictions for the unknown latent abundance that are conditional on the observations. We can extract these and produce decent plots using a small function\n```{r}\nhc <- hindcast(mod, type = \"latent_N\")\n\n# Function to plot latent abundance estimates vs truth\nplot_latentN <- function(hindcasts, data, species = \"sp_1\") {\n  all_series <- unique(data %>%\n    dplyr::filter(species == !!species) %>%\n    dplyr::pull(series))\n\n  # Grab the first replicate that represents this series\n  # so we can get the true simulated values\n  series <- as.numeric(all_series[1])\n  truths <- data %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::filter(series == !!levels(data$series)[series]) %>%\n    dplyr::pull(truth)\n\n  # In case some replicates have missing observations,\n  # pull out predictions for ALL replicates and average over them\n  hcs <- do.call(rbind, lapply(all_series, function(x) {\n    ind <- which(names(hindcasts$hindcasts) %in% as.character(x))\n    hindcasts$hindcasts[[ind]]\n  }))\n\n  # Calculate posterior empirical quantiles of predictions\n  pred_quantiles <- data.frame(t(apply(hcs, 2, function(x) {\n    quantile(x, probs = c(\n      0.05, 0.2, 0.3, 0.4,\n      0.5, 0.6, 0.7, 0.8, 0.95\n    ))\n  })))\n  pred_quantiles$time <- 1:NROW(pred_quantiles)\n  pred_quantiles$truth <- truths\n\n  # Grab observations\n  data %>%\n    dplyr::filter(series %in% all_series) %>%\n    dplyr::select(time, obs) -> observations\n\n  # Plot\n  ggplot(pred_quantiles, aes(x = time, group = 1)) +\n    geom_ribbon(aes(ymin = X5., ymax = X95.), fill = \"#DCBCBC\") +\n    geom_ribbon(aes(ymin = X30., ymax = X70.), fill = \"#B97C7C\") +\n    geom_line(aes(x = time, y = truth),\n      colour = \"black\", linewidth = 1\n    ) +\n    geom_point(aes(x = time, y = truth),\n      shape = 21, colour = \"white\", fill = \"black\",\n      size = 2.5\n    ) +\n    geom_jitter(\n      data = observations, aes(x = time, y = obs),\n      width = 0.06,\n      shape = 21, fill = \"darkred\", colour = \"white\", size = 2.5\n    ) +\n    labs(\n      y = \"Latent abundance (N)\",\n      x = \"Time\",\n      title = species\n    )\n}\n```\n\nLatent abundance plots vs the simulated truths for each species are shown below. Here, the red points show the imperfect observations, the black line shows the true latent abundance, and the ribbons show credible intervals of our estimates:\n```{r}\nplot_latentN(hc, testdat, species = \"sp_1\")\nplot_latentN(hc, testdat, species = \"sp_2\")\n```\n\nWe can see that estimates for both species have correctly captured the true temporal variation and magnitudes in abundance\n\n## Example 2: a larger survey with possible nonlinear effects\n\nNow for another example with a larger dataset. We will use data from [Jeff Doser's simulation example from the wonderful `spAbundance` package](https://doserlab.com/files/spabundance-web/articles/nmixturemodels){target=\"_blank\"}. The simulated data include one continuous site-level covariate, one factor site-level covariate and two continuous sample-level covariates. This example will allow us to examine how we can include possibly nonlinear effects in the latent process and detection probability models.\n  \nDownload the data and grab observations / covariate measurements for one species\n```{r}\n# Date link\nload(url(\"https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda\"))\ndata.one.sp <- dataNMixSim\n\n# Pull out observations for one species\ndata.one.sp$y <- data.one.sp$y[1, , ]\n\n# Abundance covariates that don't change across repeat sampling observations\nabund.cov <- dataNMixSim$abund.covs[, 1]\nabund.factor <- as.factor(dataNMixSim$abund.covs[, 2])\n\n# Detection covariates that can change across repeat sampling observations\n# Note that `NA`s are not allowed for covariates in mvgam, so we randomly\n# impute them here\ndet.cov <- dataNMixSim$det.covs$det.cov.1[, ]\ndet.cov[is.na(det.cov)] <- rnorm(length(which(is.na(det.cov))))\ndet.cov2 <- dataNMixSim$det.covs$det.cov.2\ndet.cov2[is.na(det.cov2)] <- rnorm(length(which(is.na(det.cov2))))\n```\n\nNext we wrangle into the appropriate 'long' data format, adding indicators of `time` and `series` for working in `mvgam`. We also add the `cap` variable to represent the maximum latent N to marginalize over for each observation\n```{r}\nmod_data <- do.call(\n  rbind,\n  lapply(1:NROW(data.one.sp$y), function(x) {\n    data.frame(\n      y = data.one.sp$y[x, ],\n      abund_cov = abund.cov[x],\n      abund_fac = abund.factor[x],\n      det_cov = det.cov[x, ],\n      det_cov2 = det.cov2[x, ],\n      replicate = 1:NCOL(data.one.sp$y),\n      site = paste0(\"site\", x)\n    )\n  })\n) %>%\n  dplyr::mutate(\n    species = \"sp_1\",\n    series = as.factor(paste0(site, \"_\", species, \"_\", replicate))\n  ) %>%\n  dplyr::mutate(\n    site = factor(site, levels = unique(site)),\n    species = factor(species, levels = unique(species)),\n    time = 1,\n    cap = max(data.one.sp$y, na.rm = TRUE) + 20\n  )\n```\n\nThe data include observations for 225 sites with three replicates per site, though some observations are missing\n```{r}\nNROW(mod_data)\ndplyr::glimpse(mod_data)\nhead(mod_data)\n```\n\nThe final step for data preparation is of course the `trend_map`, which sets up the mapping between observation replicates and the latent abundance models. This is done in the same way as in the example above\n```{r}\nmod_data %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\n\ntrend_map %>%\n  dplyr::arrange(trend) %>%\n  head(12)\n```\n\nNow we are ready to fit a model using `mvgam()`. Here we will use penalized splines for each of the continuous covariate effects to detect possible nonlinear associations. We also showcase how `mvgam` can make use of the different approximation algorithms available in `Stan` by using the meanfield variational Bayes approximator (this reduces computation time from around 90 seconds to around 12 seconds for this example)\n```{r include = FALSE, results='hide'}\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 3) + s(det_cov2, k = 3),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 3) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 4) + s(det_cov2, k = 4),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 4) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n```\n\nInspect the model summary but don't bother looking at estimates for all individual spline coefficients. Notice how we no longer receive information on convergence because we did not use MCMC sampling for this model\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nAgain we can make use of `marginaleffects` support for interrogating the model through targeted predictions. First, we can inspect the estimated average detection probability\n```{r}\nmarginaleffects::avg_predictions(mod, type = \"detection\")\n```\n\nNext investigate estimated effects of covariates on latent abundance using the `conditional_effects()` function and specifying `type = 'link'`; this will return plots on the expectation scale\n```{r}\nabund_plots <- plot(\n  conditional_effects(mod,\n    type = \"link\",\n    effects = c(\n      \"abund_cov\",\n      \"abund_fac\"\n    )\n  ),\n  plot = FALSE\n)\n```\n\nThe effect of the continuous covariate on expected latent abundance\n```{r}\nabund_plots[[1]] +\n  ylab(\"Expected latent abundance\")\n```\n\nThe effect of the factor covariate on expected latent abundance, estimated as a hierarchical random effect\n```{r}\nabund_plots[[2]] +\n  ylab(\"Expected latent abundance\")\n```\n\nNow we can investigate estimated effects of covariates on detection probability using `type = 'detection'`\n```{r}\ndet_plots <- plot(\n  conditional_effects(mod,\n    type = \"detection\",\n    effects = c(\n      \"det_cov\",\n      \"det_cov2\"\n    )\n  ),\n  plot = FALSE\n)\n```\n\nThe covariate smooths were estimated to be somewhat nonlinear on the logit scale according to the model summary (based on their approximate significances). But inspecting conditional effects of each covariate on the probability scale is more intuitive and useful\n```{r}\ndet_plots[[1]] +\n  ylab(\"Pr(detection)\")\ndet_plots[[2]] +\n  ylab(\"Pr(detection)\")\n```\n\nMore targeted predictions are also easy with `marginaleffects` support. For example, we can ask: How does detection probability change as we change *both* detection covariates?\n```{r}\nfivenum_round <- function(x) round(fivenum(x, na.rm = TRUE), 2)\n\nmarginaleffects::plot_predictions(mod,\n  newdata = marginaleffects::datagrid(\n    det_cov = unique,\n    det_cov2 = fivenum_round\n  ),\n  by = c(\"det_cov\", \"det_cov2\"),\n  type = \"detection\"\n) +\n  theme_classic() +\n  ylab(\"Pr(detection)\")\n```\n\nThe model has found support for some important covariate effects, but of course we'd want to interrogate how well the model predicts and think about possible spatial effects to capture unmodelled variation in latent abundance (which can easily be incorporated into both linear predictors using spatial smooths).\n\n## Further reading\nThe following papers and resources offer useful material about N-mixture models for ecological population dynamics investigations:\n  \nGuélat, Jérôme, and Kéry, Marc. “[Effects of Spatial Autocorrelation and Imperfect Detection on Species Distribution Models.](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.12983)” *Methods in Ecology and Evolution* 9 (2018): 1614–25.\n  \nKéry, Marc, and Royle Andrew J. \"[Applied hierarchical modeling in ecology: Analysis of distribution, abundance and species richness in R and BUGS: Volume 2: Dynamic and advanced models](https://shop.elsevier.com/books/applied-hierarchical-modeling-in-ecology-analysis-of-distribution-abundance-and-species-richness-in-r-and-bugs/kery/978-0-12-809585-0)\". London, UK: Academic Press (2020).\n  \nRoyle, Andrew J. \"[N‐mixture models for estimating population size from spatially replicated counts.](https://onlinelibrary.wiley.com/doi/full/10.1111/j.0006-341X.2004.00142.x)\" *Biometrics* 60.1 (2004): 108-115.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "doc/nmixtures.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>N-mixtures in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">N-mixtures in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to fit and interrogate N-mixture models for\npopulation abundance counts made with imperfect detection.</p>\n<div id=\"n-mixture-models\" class=\"section level2\">\n<h2>N-mixture models</h2>\n<p>An N-mixture model is a fairly recent addition to the ecological\nmodeller’s toolkit that is designed to make inferences about variation\nin the abundance of species when observations are imperfect (<a href=\"https://onlinelibrary.wiley.com/doi/10.1111/j.0006-341X.2004.00142.x\" target=\"_blank\">Royle 2004</a>). Briefly, assume <span class=\"math inline\">\\(\\boldsymbol{Y_{i,r}}\\)</span> is the number of\nindividuals recorded at site <span class=\"math inline\">\\(i\\)</span>\nduring replicate sampling observation <span class=\"math inline\">\\(r\\)</span> (recorded as a non-negative integer).\nIf multiple replicate surveys are done within a short enough period to\nsatisfy the assumption that the population remained closed (i.e. there\nwas no substantial change in true population size between replicate\nsurveys), we can account for the fact that observations aren’t perfect.\nThis is done by assuming that these replicate observations are Binomial\nrandom variables that are parameterized by the true “latent” abundance\n<span class=\"math inline\">\\(N\\)</span> and a detection probability <span class=\"math inline\">\\(p\\)</span>:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{Y_{i,r}} &amp; \\sim \\text{Binomial}(N_i, p_r) \\\\\nN_{i} &amp; \\sim \\text{Poisson}(\\lambda_i)  \\end{align*}\\]</span></p>\n<p>Using a set of linear predictors, we can estimate effects of\ncovariates <span class=\"math inline\">\\(\\boldsymbol{X}\\)</span> on the\nexpected latent abundance (with a log link for <span class=\"math inline\">\\(\\lambda\\)</span>) and, jointly, effects of\npossibly different covariates (call them <span class=\"math inline\">\\(\\boldsymbol{Q}\\)</span>) on detection probability\n(with a logit link for <span class=\"math inline\">\\(p\\)</span>):</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nlog(\\lambda) &amp; = \\beta \\boldsymbol{X} \\\\\nlogit(p) &amp; = \\gamma \\boldsymbol{Q}\\end{align*}\\]</span></p>\n<p><code>mvgam</code> can handle this type of model because it is\ndesigned to propagate unobserved temporal processes that evolve\nindependently of the observation process in a State-space format. This\nsetup adapts well to N-mixture models because they can be thought of as\nState-space models in which the latent state is a discrete variable\nrepresenting the “true” but unknown population size. This is very\nconvenient because we can incorporate any of the package’s diverse\neffect types (i.e. multidimensional splines, time-varying effects,\nmonotonic effects, random effects etc…) into the linear predictors. All\nthat is required for this to work is a marginalization trick that allows\n<code>Stan</code>’s sampling algorithms to handle discrete parameters\n(see more about how this method of “integrating out” discrete parameters\nworks in <a href=\"https://mbjoseph.github.io/posts/2020-04-28-a-step-by-step-guide-to-marginalizing-over-discrete-parameters-for-ecologists-using-stan/\" target=\"_blank\">this nice blog post by Maxwell Joseph</a>).</p>\n<p>The family <code>nmix()</code> is used to set up N-mixture models in\n<code>mvgam</code>, but we still need to do a little bit of data\nwrangling to ensure the data are set up in the correct format (this is\nespecially true when we have more than one replicate survey per time\nperiod). The most important aspects are: (1) how we set up the\nobservation <code>series</code> and <code>trend_map</code> arguments to\nensure replicate surveys are mapped to the correct latent abundance\nmodel and (2) the inclusion of a <code>cap</code> variable that defines\nthe maximum possible integer value to use for each observation when\nestimating latent abundance. The two examples below give a reasonable\noverview of how this can be done.</p>\n</div>\n<div id=\"example-1-a-two-species-system-with-nonlinear-trends\" class=\"section level2\">\n<h2>Example 1: a two-species system with nonlinear trends</h2>\n<p>First we will use a simple simulation in which multiple replicate\nobservations are taken at each timepoint for two different species. The\nsimulation produces observations at a single site over six years, with\nfive replicate surveys per year. Each species is simulated to have\ndifferent nonlinear temporal trends and different detection\nprobabilities. For now, detection probability is fixed (i.e. it does not\nchange over time or in association with any covariates). Notice that we\nadd the <code>cap</code> variable, which does not need to be static, to\ndefine the maximum possible value that we think the latent abundance\ncould be for each timepoint. This simply needs to be large enough that\nwe get a reasonable idea of which latent N values are most likely,\nwithout adding too much computational cost:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">999</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a><span class=\"co\"># Simulate observations for species 1, which shows a declining trend and 0.7 detection probability</span></span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a><span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">site =</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"co\"># five replicates per year; six years</span></span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">replicate =</span> <span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">5</span>, <span class=\"dv\">6</span>),</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"fu\">sort</span>(<span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">6</span>, <span class=\"dv\">5</span>)),</span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>  <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>,</span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a>  <span class=\"co\"># true abundance declines nonlinearly</span></span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a>  <span class=\"at\">truth =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">28</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">26</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">23</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">16</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">14</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">14</span>, <span class=\"dv\">5</span>)</span>\n<span id=\"cb1-17\"><a href=\"#cb1-17\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb1-18\"><a href=\"#cb1-18\" tabindex=\"-1\"></a>  <span class=\"co\"># observations are taken with detection prob = 0.7</span></span>\n<span id=\"cb1-19\"><a href=\"#cb1-19\" tabindex=\"-1\"></a>  <span class=\"at\">obs =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-20\"><a href=\"#cb1-20\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">28</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-21\"><a href=\"#cb1-21\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">26</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-22\"><a href=\"#cb1-22\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">23</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-23\"><a href=\"#cb1-23\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">15</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-24\"><a href=\"#cb1-24\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">14</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-25\"><a href=\"#cb1-25\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">14</span>, <span class=\"fl\">0.7</span>)</span>\n<span id=\"cb1-26\"><a href=\"#cb1-26\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb1-27\"><a href=\"#cb1-27\" tabindex=\"-1\"></a>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-28\"><a href=\"#cb1-28\" tabindex=\"-1\"></a>  <span class=\"co\"># add &#39;series&#39; information, which is an identifier of site, replicate and species</span></span>\n<span id=\"cb1-29\"><a href=\"#cb1-29\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb1-30\"><a href=\"#cb1-30\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb1-31\"><a href=\"#cb1-31\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;site_&quot;</span>, site,</span>\n<span id=\"cb1-32\"><a href=\"#cb1-32\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;_&quot;</span>, species,</span>\n<span id=\"cb1-33\"><a href=\"#cb1-33\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;_rep_&quot;</span>, replicate</span>\n<span id=\"cb1-34\"><a href=\"#cb1-34\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb1-35\"><a href=\"#cb1-35\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"fu\">as.numeric</span>(time),</span>\n<span id=\"cb1-36\"><a href=\"#cb1-36\" tabindex=\"-1\"></a>    <span class=\"co\"># add a &#39;cap&#39; variable that defines the maximum latent N to</span></span>\n<span id=\"cb1-37\"><a href=\"#cb1-37\" tabindex=\"-1\"></a>    <span class=\"co\"># marginalize over when estimating latent abundance; in other words</span></span>\n<span id=\"cb1-38\"><a href=\"#cb1-38\" tabindex=\"-1\"></a>    <span class=\"co\"># how large do we realistically think the true abundance could be?</span></span>\n<span id=\"cb1-39\"><a href=\"#cb1-39\" tabindex=\"-1\"></a>    <span class=\"at\">cap =</span> <span class=\"dv\">100</span></span>\n<span id=\"cb1-40\"><a href=\"#cb1-40\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-41\"><a href=\"#cb1-41\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(<span class=\"sc\">-</span>replicate) <span class=\"ot\">-&gt;</span> testdat</span>\n<span id=\"cb1-42\"><a href=\"#cb1-42\" tabindex=\"-1\"></a></span>\n<span id=\"cb1-43\"><a href=\"#cb1-43\" tabindex=\"-1\"></a><span class=\"co\"># Now add another species that has a different temporal trend and a smaller</span></span>\n<span id=\"cb1-44\"><a href=\"#cb1-44\" tabindex=\"-1\"></a><span class=\"co\"># detection probability (0.45 for this species)</span></span>\n<span id=\"cb1-45\"><a href=\"#cb1-45\" tabindex=\"-1\"></a>testdat <span class=\"ot\">&lt;-</span> testdat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-46\"><a href=\"#cb1-46\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">bind_rows</span>(<span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb1-47\"><a href=\"#cb1-47\" tabindex=\"-1\"></a>    <span class=\"at\">site =</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb1-48\"><a href=\"#cb1-48\" tabindex=\"-1\"></a>    <span class=\"at\">replicate =</span> <span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">5</span>, <span class=\"dv\">6</span>),</span>\n<span id=\"cb1-49\"><a href=\"#cb1-49\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"fu\">sort</span>(<span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">6</span>, <span class=\"dv\">5</span>)),</span>\n<span id=\"cb1-50\"><a href=\"#cb1-50\" tabindex=\"-1\"></a>    <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_2&quot;</span>,</span>\n<span id=\"cb1-51\"><a href=\"#cb1-51\" tabindex=\"-1\"></a>    <span class=\"at\">truth =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-52\"><a href=\"#cb1-52\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">4</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-53\"><a href=\"#cb1-53\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">7</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-54\"><a href=\"#cb1-54\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">15</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-55\"><a href=\"#cb1-55\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">16</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-56\"><a href=\"#cb1-56\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">19</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-57\"><a href=\"#cb1-57\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">18</span>, <span class=\"dv\">5</span>)</span>\n<span id=\"cb1-58\"><a href=\"#cb1-58\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb1-59\"><a href=\"#cb1-59\" tabindex=\"-1\"></a>    <span class=\"at\">obs =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-60\"><a href=\"#cb1-60\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">4</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-61\"><a href=\"#cb1-61\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">7</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-62\"><a href=\"#cb1-62\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">15</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-63\"><a href=\"#cb1-63\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">16</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-64\"><a href=\"#cb1-64\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">19</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-65\"><a href=\"#cb1-65\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">18</span>, <span class=\"fl\">0.45</span>)</span>\n<span id=\"cb1-66\"><a href=\"#cb1-66\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb1-67\"><a href=\"#cb1-67\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-68\"><a href=\"#cb1-68\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb1-69\"><a href=\"#cb1-69\" tabindex=\"-1\"></a>      <span class=\"at\">series =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb1-70\"><a href=\"#cb1-70\" tabindex=\"-1\"></a>        <span class=\"st\">&quot;site_&quot;</span>, site,</span>\n<span id=\"cb1-71\"><a href=\"#cb1-71\" tabindex=\"-1\"></a>        <span class=\"st\">&quot;_&quot;</span>, species,</span>\n<span id=\"cb1-72\"><a href=\"#cb1-72\" tabindex=\"-1\"></a>        <span class=\"st\">&quot;_rep_&quot;</span>, replicate</span>\n<span id=\"cb1-73\"><a href=\"#cb1-73\" tabindex=\"-1\"></a>      ),</span>\n<span id=\"cb1-74\"><a href=\"#cb1-74\" tabindex=\"-1\"></a>      <span class=\"at\">time =</span> <span class=\"fu\">as.numeric</span>(time),</span>\n<span id=\"cb1-75\"><a href=\"#cb1-75\" tabindex=\"-1\"></a>      <span class=\"at\">cap =</span> <span class=\"dv\">50</span></span>\n<span id=\"cb1-76\"><a href=\"#cb1-76\" tabindex=\"-1\"></a>    ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-77\"><a href=\"#cb1-77\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(<span class=\"sc\">-</span>replicate))</span></code></pre></div>\n<p>This data format isn’t too difficult to set up, but it does differ\nfrom the traditional multidimensional array setup that is commonly used\nfor fitting N-mixture models in other software packages. Next we ensure\nthat species and series IDs are included as factor variables, in case\nwe’d like to allow certain effects to vary by species</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a>testdat<span class=\"sc\">$</span>species <span class=\"ot\">&lt;-</span> <span class=\"fu\">factor</span>(testdat<span class=\"sc\">$</span>species,</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a>  <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(testdat<span class=\"sc\">$</span>species)</span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a>testdat<span class=\"sc\">$</span>series <span class=\"ot\">&lt;-</span> <span class=\"fu\">factor</span>(testdat<span class=\"sc\">$</span>series,</span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a>  <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(testdat<span class=\"sc\">$</span>series)</span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Preview the dataset to get an idea of how it is structured:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(testdat)</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 60</span></span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 7</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ site    &lt;dbl&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time    &lt;dbl&gt; 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,…</span></span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ species &lt;fct&gt; sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp…</span></span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ truth   &lt;dbl&gt; 28, 28, 28, 28, 28, 26, 26, 26, 26, 26, 23, 23, 23, 23, 23, 16…</span></span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ obs     &lt;int&gt; 20, 19, 23, 17, 18, 21, 18, 21, 19, 18, 17, 16, 20, 11, 19, 9,…</span></span>\n<span id=\"cb3-9\"><a href=\"#cb3-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series  &lt;fct&gt; site_1_sp_1_rep_1, site_1_sp_1_rep_2, site_1_sp_1_rep_3, site_…</span></span>\n<span id=\"cb3-10\"><a href=\"#cb3-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ cap     &lt;dbl&gt; 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 10…</span></span>\n<span id=\"cb3-11\"><a href=\"#cb3-11\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(testdat, <span class=\"dv\">12</span>)</span>\n<span id=\"cb3-12\"><a href=\"#cb3-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    site time species truth obs            series cap</span></span>\n<span id=\"cb3-13\"><a href=\"#cb3-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1     1    1    sp_1    28  20 site_1_sp_1_rep_1 100</span></span>\n<span id=\"cb3-14\"><a href=\"#cb3-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2     1    1    sp_1    28  19 site_1_sp_1_rep_2 100</span></span>\n<span id=\"cb3-15\"><a href=\"#cb3-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3     1    1    sp_1    28  23 site_1_sp_1_rep_3 100</span></span>\n<span id=\"cb3-16\"><a href=\"#cb3-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4     1    1    sp_1    28  17 site_1_sp_1_rep_4 100</span></span>\n<span id=\"cb3-17\"><a href=\"#cb3-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5     1    1    sp_1    28  18 site_1_sp_1_rep_5 100</span></span>\n<span id=\"cb3-18\"><a href=\"#cb3-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6     1    2    sp_1    26  21 site_1_sp_1_rep_1 100</span></span>\n<span id=\"cb3-19\"><a href=\"#cb3-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7     1    2    sp_1    26  18 site_1_sp_1_rep_2 100</span></span>\n<span id=\"cb3-20\"><a href=\"#cb3-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8     1    2    sp_1    26  21 site_1_sp_1_rep_3 100</span></span>\n<span id=\"cb3-21\"><a href=\"#cb3-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9     1    2    sp_1    26  19 site_1_sp_1_rep_4 100</span></span>\n<span id=\"cb3-22\"><a href=\"#cb3-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10    1    2    sp_1    26  18 site_1_sp_1_rep_5 100</span></span>\n<span id=\"cb3-23\"><a href=\"#cb3-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11    1    3    sp_1    23  17 site_1_sp_1_rep_1 100</span></span>\n<span id=\"cb3-24\"><a href=\"#cb3-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12    1    3    sp_1    23  16 site_1_sp_1_rep_2 100</span></span></code></pre></div>\n<div id=\"setting-up-the-trend_map\" class=\"section level3\">\n<h3>Setting up the <code>trend_map</code></h3>\n<p>Finally, we need to set up the <code>trend_map</code> object. This is\ncrucial for allowing multiple observations to be linked to the same\nlatent process model (see more information about this argument in the <a href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\" target=\"_blank\">Shared latent states vignette</a>). In this case, the\nmapping operates by species and site to state that each set of replicate\nobservations from the same time point should all share the exact same\nlatent abundance model:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a>testdat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  <span class=\"co\"># each unique combination of site*species is a separate process</span></span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">trend =</span> <span class=\"fu\">as.numeric</span>(<span class=\"fu\">factor</span>(<span class=\"fu\">paste0</span>(site, species)))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(trend, series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">distinct</span>() <span class=\"ot\">-&gt;</span> trend_map</span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a>trend_map</span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    trend            series</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1      1 site_1_sp_1_rep_1</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2      1 site_1_sp_1_rep_2</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3      1 site_1_sp_1_rep_3</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4      1 site_1_sp_1_rep_4</span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5      1 site_1_sp_1_rep_5</span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6      2 site_1_sp_2_rep_1</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7      2 site_1_sp_2_rep_2</span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8      2 site_1_sp_2_rep_3</span></span>\n<span id=\"cb4-16\"><a href=\"#cb4-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9      2 site_1_sp_2_rep_4</span></span>\n<span id=\"cb4-17\"><a href=\"#cb4-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10     2 site_1_sp_2_rep_5</span></span></code></pre></div>\n<p>Notice how all of the replicates for species 1 in site 1 share the\nsame process (i.e. the same <code>trend</code>). This will ensure that\nall replicates are Binomial draws of the same latent N.</p>\n</div>\n<div id=\"modelling-with-the-nmix-family\" class=\"section level3\">\n<h3>Modelling with the <code>nmix()</code> family</h3>\n<p>Now we are ready to fit a model using <code>mvgam()</code>. This\nmodel will allow each species to have different detection probabilities\nand different temporal trends. We will use <code>Cmdstan</code> as the\nbackend, which by default will use Hamiltonian Monte Carlo for full\nBayesian inference</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  <span class=\"co\"># the observation formula sets up linear predictors for</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>  <span class=\"co\"># detection probability on the logit scale</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> obs <span class=\"sc\">~</span> species <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a>  <span class=\"co\"># the trend_formula sets up the linear predictors for</span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a>  <span class=\"co\"># the latent abundance processes on the log scale</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(time, <span class=\"at\">by =</span> trend, <span class=\"at\">k =</span> <span class=\"dv\">4</span>) <span class=\"sc\">+</span> species,</span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-10\"><a href=\"#cb5-10\" tabindex=\"-1\"></a>  <span class=\"co\"># the trend_map takes care of the mapping</span></span>\n<span id=\"cb5-11\"><a href=\"#cb5-11\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb5-12\"><a href=\"#cb5-12\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-13\"><a href=\"#cb5-13\" tabindex=\"-1\"></a>  <span class=\"co\"># nmix() family and data</span></span>\n<span id=\"cb5-14\"><a href=\"#cb5-14\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">nmix</span>(),</span>\n<span id=\"cb5-15\"><a href=\"#cb5-15\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> testdat,</span>\n<span id=\"cb5-16\"><a href=\"#cb5-16\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-17\"><a href=\"#cb5-17\" tabindex=\"-1\"></a>  <span class=\"co\"># priors can be set in the usual way</span></span>\n<span id=\"cb5-18\"><a href=\"#cb5-18\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb5-19\"><a href=\"#cb5-19\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> b),</span>\n<span id=\"cb5-20\"><a href=\"#cb5-20\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"dv\">1</span>, <span class=\"fl\">1.5</span>), <span class=\"at\">class =</span> Intercept_trend)</span>\n<span id=\"cb5-21\"><a href=\"#cb5-21\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb5-22\"><a href=\"#cb5-22\" tabindex=\"-1\"></a>  <span class=\"at\">samples =</span> <span class=\"dv\">1000</span></span>\n<span id=\"cb5-23\"><a href=\"#cb5-23\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>View the automatically-generated <code>Stan</code> code to get a\nsense of how the marginalization over latent N works</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">code</span>(mod)</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp_trend; // number of trend smoothing parameters</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_lv; // number of dynamic factors</span></span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_series, n_lv] Z; // matrix mapping series to latent states</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb6-11\"><a href=\"#cb6-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis_trend; // number of trend basis coefficients</span></span>\n<span id=\"cb6-12\"><a href=\"#cb6-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients</span></span>\n<span id=\"cb6-13\"><a href=\"#cb6-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb6-14\"><a href=\"#cb6-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix</span></span>\n<span id=\"cb6-15\"><a href=\"#cb6-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb6-16\"><a href=\"#cb6-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_lv] int ytimes_trend;</span></span>\n<span id=\"cb6-17\"><a href=\"#cb6-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb6-18\"><a href=\"#cb6-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[total_obs] int&lt;lower=0&gt; cap; // upper limits of latent abundances</span></span>\n<span id=\"cb6-19\"><a href=\"#cb6-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[total_obs] int ytimes_array; // sorted ytimes</span></span>\n<span id=\"cb6-20\"><a href=\"#cb6-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes_pred; // time-ordered matrix for prediction</span></span>\n<span id=\"cb6-21\"><a href=\"#cb6-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; K_groups; // number of unique replicated observations</span></span>\n<span id=\"cb6-22\"><a href=\"#cb6-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; K_reps; // maximum number of replicate observations</span></span>\n<span id=\"cb6-23\"><a href=\"#cb6-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; K_starts; // col of K_inds where each group starts</span></span>\n<span id=\"cb6-24\"><a href=\"#cb6-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; K_stops; // col of K_inds where each group ends</span></span>\n<span id=\"cb6-25\"><a href=\"#cb6-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups, K_reps] int&lt;lower=0&gt; K_inds; // indices of replicated observations</span></span>\n<span id=\"cb6-26\"><a href=\"#cb6-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[3, 6] S_trend1; // mgcv smooth penalty matrix S_trend1</span></span>\n<span id=\"cb6-27\"><a href=\"#cb6-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[3, 6] S_trend2; // mgcv smooth penalty matrix S_trend2</span></span>\n<span id=\"cb6-28\"><a href=\"#cb6-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[total_obs] int&lt;lower=0&gt; flat_ys; // flattened observations</span></span>\n<span id=\"cb6-29\"><a href=\"#cb6-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-30\"><a href=\"#cb6-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed data {</span></span>\n<span id=\"cb6-31\"><a href=\"#cb6-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X_ordered = X[ytimes_array,  : ];</span></span>\n<span id=\"cb6-32\"><a href=\"#cb6-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; Y_max;</span></span>\n<span id=\"cb6-33\"><a href=\"#cb6-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; N_max;</span></span>\n<span id=\"cb6-34\"><a href=\"#cb6-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (k in 1 : K_groups) {</span></span>\n<span id=\"cb6-35\"><a href=\"#cb6-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Y_max[k] = max(flat_ys[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span id=\"cb6-36\"><a href=\"#cb6-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     N_max[k] = max(cap[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span id=\"cb6-37\"><a href=\"#cb6-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-38\"><a href=\"#cb6-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-39\"><a href=\"#cb6-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb6-40\"><a href=\"#cb6-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb6-41\"><a href=\"#cb6-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb6-42\"><a href=\"#cb6-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_raw_trend;</span></span>\n<span id=\"cb6-43\"><a href=\"#cb6-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-44\"><a href=\"#cb6-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb6-45\"><a href=\"#cb6-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp_trend] lambda_trend;</span></span>\n<span id=\"cb6-46\"><a href=\"#cb6-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-47\"><a href=\"#cb6-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb6-48\"><a href=\"#cb6-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // detection probability</span></span>\n<span id=\"cb6-49\"><a href=\"#cb6-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] p;</span></span>\n<span id=\"cb6-50\"><a href=\"#cb6-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-51\"><a href=\"#cb6-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent states</span></span>\n<span id=\"cb6-52\"><a href=\"#cb6-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_lv] LV;</span></span>\n<span id=\"cb6-53\"><a href=\"#cb6-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-54\"><a href=\"#cb6-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent states and loading matrix</span></span>\n<span id=\"cb6-55\"><a href=\"#cb6-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n * n_lv] trend_mus;</span></span>\n<span id=\"cb6-56\"><a href=\"#cb6-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span id=\"cb6-57\"><a href=\"#cb6-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-58\"><a href=\"#cb6-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb6-59\"><a href=\"#cb6-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb6-60\"><a href=\"#cb6-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_trend;</span></span>\n<span id=\"cb6-61\"><a href=\"#cb6-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-62\"><a href=\"#cb6-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // observation model basis coefficients</span></span>\n<span id=\"cb6-63\"><a href=\"#cb6-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span id=\"cb6-64\"><a href=\"#cb6-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-65\"><a href=\"#cb6-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // process model basis coefficients</span></span>\n<span id=\"cb6-66\"><a href=\"#cb6-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend];</span></span>\n<span id=\"cb6-67\"><a href=\"#cb6-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-68\"><a href=\"#cb6-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // detection probability</span></span>\n<span id=\"cb6-69\"><a href=\"#cb6-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   p = X_ordered * b;</span></span>\n<span id=\"cb6-70\"><a href=\"#cb6-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-71\"><a href=\"#cb6-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent process linear predictors</span></span>\n<span id=\"cb6-72\"><a href=\"#cb6-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   trend_mus = X_trend * b_trend;</span></span>\n<span id=\"cb6-73\"><a href=\"#cb6-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (j in 1 : n_lv) {</span></span>\n<span id=\"cb6-74\"><a href=\"#cb6-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     LV[1 : n, j] = trend_mus[ytimes_trend[1 : n, j]];</span></span>\n<span id=\"cb6-75\"><a href=\"#cb6-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-76\"><a href=\"#cb6-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-77\"><a href=\"#cb6-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // derived latent states</span></span>\n<span id=\"cb6-78\"><a href=\"#cb6-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (i in 1 : n) {</span></span>\n<span id=\"cb6-79\"><a href=\"#cb6-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (s in 1 : n_series) {</span></span>\n<span id=\"cb6-80\"><a href=\"#cb6-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);</span></span>\n<span id=\"cb6-81\"><a href=\"#cb6-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb6-82\"><a href=\"#cb6-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-83\"><a href=\"#cb6-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-84\"><a href=\"#cb6-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb6-85\"><a href=\"#cb6-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for speciessp_1...</span></span>\n<span id=\"cb6-86\"><a href=\"#cb6-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ std_normal();</span></span>\n<span id=\"cb6-87\"><a href=\"#cb6-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-88\"><a href=\"#cb6-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for speciessp_2...</span></span>\n<span id=\"cb6-89\"><a href=\"#cb6-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2] ~ std_normal();</span></span>\n<span id=\"cb6-90\"><a href=\"#cb6-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-91\"><a href=\"#cb6-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // dynamic process models</span></span>\n<span id=\"cb6-92\"><a href=\"#cb6-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-93\"><a href=\"#cb6-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)_trend...</span></span>\n<span id=\"cb6-94\"><a href=\"#cb6-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[1] ~ normal(1, 1.5);</span></span>\n<span id=\"cb6-95\"><a href=\"#cb6-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-96\"><a href=\"#cb6-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for speciessp_2_trend...</span></span>\n<span id=\"cb6-97\"><a href=\"#cb6-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[2] ~ std_normal();</span></span>\n<span id=\"cb6-98\"><a href=\"#cb6-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-99\"><a href=\"#cb6-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(time):trendtrend1_trend...</span></span>\n<span id=\"cb6-100\"><a href=\"#cb6-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[3 : 5] ~ multi_normal_prec(zero_trend[3 : 5],</span></span>\n<span id=\"cb6-101\"><a href=\"#cb6-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          S_trend1[1 : 3, 1 : 3]</span></span>\n<span id=\"cb6-102\"><a href=\"#cb6-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          * lambda_trend[1]</span></span>\n<span id=\"cb6-103\"><a href=\"#cb6-103\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          + S_trend1[1 : 3, 4 : 6]</span></span>\n<span id=\"cb6-104\"><a href=\"#cb6-104\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                            * lambda_trend[2]);</span></span>\n<span id=\"cb6-105\"><a href=\"#cb6-105\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-106\"><a href=\"#cb6-106\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(time):trendtrend2_trend...</span></span>\n<span id=\"cb6-107\"><a href=\"#cb6-107\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[6 : 8] ~ multi_normal_prec(zero_trend[6 : 8],</span></span>\n<span id=\"cb6-108\"><a href=\"#cb6-108\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          S_trend2[1 : 3, 1 : 3]</span></span>\n<span id=\"cb6-109\"><a href=\"#cb6-109\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          * lambda_trend[3]</span></span>\n<span id=\"cb6-110\"><a href=\"#cb6-110\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          + S_trend2[1 : 3, 4 : 6]</span></span>\n<span id=\"cb6-111\"><a href=\"#cb6-111\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                            * lambda_trend[4]);</span></span>\n<span id=\"cb6-112\"><a href=\"#cb6-112\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda_trend ~ normal(5, 30);</span></span>\n<span id=\"cb6-113\"><a href=\"#cb6-113\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb6-114\"><a href=\"#cb6-114\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb6-115\"><a href=\"#cb6-115\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     array[total_obs] real flat_trends;</span></span>\n<span id=\"cb6-116\"><a href=\"#cb6-116\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     array[total_obs] real flat_ps;</span></span>\n<span id=\"cb6-117\"><a href=\"#cb6-117\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_trends = to_array_1d(trend);</span></span>\n<span id=\"cb6-118\"><a href=\"#cb6-118\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ps = to_array_1d(p);</span></span>\n<span id=\"cb6-119\"><a href=\"#cb6-119\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     </span></span>\n<span id=\"cb6-120\"><a href=\"#cb6-120\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // loop over replicate sampling window (each site*time*species combination)</span></span>\n<span id=\"cb6-121\"><a href=\"#cb6-121\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (k in 1 : K_groups) {</span></span>\n<span id=\"cb6-122\"><a href=\"#cb6-122\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // all log_lambdas are identical because they represent site*time</span></span>\n<span id=\"cb6-123\"><a href=\"#cb6-123\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // covariates; so just use the first measurement</span></span>\n<span id=\"cb6-124\"><a href=\"#cb6-124\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       real log_lambda = flat_trends[K_inds[k, 1]];</span></span>\n<span id=\"cb6-125\"><a href=\"#cb6-125\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-126\"><a href=\"#cb6-126\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // logit-scale detection probilities for the replicate observations</span></span>\n<span id=\"cb6-127\"><a href=\"#cb6-127\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       vector[size(K_inds[k, K_starts[k] : K_stops[k]])] logit_p = to_vector(flat_ps[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span id=\"cb6-128\"><a href=\"#cb6-128\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-129\"><a href=\"#cb6-129\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // K values and observed counts for these replicates</span></span>\n<span id=\"cb6-130\"><a href=\"#cb6-130\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       int K_max = N_max[k];</span></span>\n<span id=\"cb6-131\"><a href=\"#cb6-131\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       int K_min = Y_max[k];</span></span>\n<span id=\"cb6-132\"><a href=\"#cb6-132\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       array[size(K_inds[k, K_starts[k] : K_stops[k]])] int N_obs = flat_ys[K_inds[k, K_starts[k] : K_stops[k]]];</span></span>\n<span id=\"cb6-133\"><a href=\"#cb6-133\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       int possible_N = K_max - K_min;</span></span>\n<span id=\"cb6-134\"><a href=\"#cb6-134\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-135\"><a href=\"#cb6-135\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // marginalize over possible latent counts analytically</span></span>\n<span id=\"cb6-136\"><a href=\"#cb6-136\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       real ff = exp(log_lambda) * prod(1 - inv_logit(logit_p));</span></span>\n<span id=\"cb6-137\"><a href=\"#cb6-137\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       real prob_n = 1;</span></span>\n<span id=\"cb6-138\"><a href=\"#cb6-138\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       for (i in 1 : possible_N) {</span></span>\n<span id=\"cb6-139\"><a href=\"#cb6-139\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         real N = K_max - i + 1;</span></span>\n<span id=\"cb6-140\"><a href=\"#cb6-140\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         real k_obs = 1;</span></span>\n<span id=\"cb6-141\"><a href=\"#cb6-141\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         for (j in 1 : size(N_obs)) {</span></span>\n<span id=\"cb6-142\"><a href=\"#cb6-142\" tabindex=\"-1\"></a><span class=\"co\">#&gt;           k_obs *= N / (N - N_obs[j]);</span></span>\n<span id=\"cb6-143\"><a href=\"#cb6-143\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         }</span></span>\n<span id=\"cb6-144\"><a href=\"#cb6-144\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         prob_n = 1 + prob_n * ff * k_obs / N;</span></span>\n<span id=\"cb6-145\"><a href=\"#cb6-145\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       }</span></span>\n<span id=\"cb6-146\"><a href=\"#cb6-146\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-147\"><a href=\"#cb6-147\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // add log(pr_n) to prob(K_min)</span></span>\n<span id=\"cb6-148\"><a href=\"#cb6-148\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       target += poisson_log_lpmf(K_min | log_lambda)</span></span>\n<span id=\"cb6-149\"><a href=\"#cb6-149\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 + binomial_logit_lpmf(N_obs | K_min, logit_p) + log(prob_n);</span></span>\n<span id=\"cb6-150\"><a href=\"#cb6-150\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb6-151\"><a href=\"#cb6-151\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-152\"><a href=\"#cb6-152\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-153\"><a href=\"#cb6-153\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb6-154\"><a href=\"#cb6-154\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_lv] penalty = rep_vector(1e12, n_lv);</span></span>\n<span id=\"cb6-155\"><a href=\"#cb6-155\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] detprob = inv_logit(p);</span></span>\n<span id=\"cb6-156\"><a href=\"#cb6-156\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp_trend] rho_trend = log(lambda_trend);</span></span>\n<span id=\"cb6-157\"><a href=\"#cb6-157\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>The posterior summary of this model shows that it has converged\nnicely</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; obs ~ species - 1</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(time, by = trend, k = 4) + species</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; nmix</span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-16\"><a href=\"#cb7-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb7-17\"><a href=\"#cb7-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb7-18\"><a href=\"#cb7-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-19\"><a href=\"#cb7-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb7-20\"><a href=\"#cb7-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 </span></span>\n<span id=\"cb7-21\"><a href=\"#cb7-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-22\"><a href=\"#cb7-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb7-23\"><a href=\"#cb7-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 </span></span>\n<span id=\"cb7-24\"><a href=\"#cb7-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-25\"><a href=\"#cb7-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb7-26\"><a href=\"#cb7-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6 </span></span>\n<span id=\"cb7-27\"><a href=\"#cb7-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-28\"><a href=\"#cb7-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb7-29\"><a href=\"#cb7-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb7-30\"><a href=\"#cb7-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1500; warmup = 500; thin = 1 </span></span>\n<span id=\"cb7-31\"><a href=\"#cb7-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 4000</span></span>\n<span id=\"cb7-32\"><a href=\"#cb7-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-33\"><a href=\"#cb7-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-34\"><a href=\"#cb7-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-35\"><a href=\"#cb7-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; speciessp_1 -0.26 0.730  1.40    1  1622</span></span>\n<span id=\"cb7-36\"><a href=\"#cb7-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; speciessp_2 -1.10 0.015  0.89    1  2220</span></span>\n<span id=\"cb7-37\"><a href=\"#cb7-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-38\"><a href=\"#cb7-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-39\"><a href=\"#cb7-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               2.5%     50%  97.5% Rhat n_eff</span></span>\n<span id=\"cb7-40\"><a href=\"#cb7-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)_trend            2.700  3.0000  3.400    1  1451</span></span>\n<span id=\"cb7-41\"><a href=\"#cb7-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; speciessp_2_trend           -1.200 -0.6200  0.130    1  1641</span></span>\n<span id=\"cb7-42\"><a href=\"#cb7-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend1.1_trend -0.077  0.0140  0.190    1   964</span></span>\n<span id=\"cb7-43\"><a href=\"#cb7-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend1.2_trend -0.210  0.0078  0.300    1  1492</span></span>\n<span id=\"cb7-44\"><a href=\"#cb7-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend1.3_trend -0.460 -0.2600 -0.040    1  1941</span></span>\n<span id=\"cb7-45\"><a href=\"#cb7-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend2.1_trend -0.200 -0.0130  0.077    1  1281</span></span>\n<span id=\"cb7-46\"><a href=\"#cb7-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend2.2_trend -0.190  0.0280  0.480    1  1447</span></span>\n<span id=\"cb7-47\"><a href=\"#cb7-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend2.3_trend  0.064  0.3300  0.620    1  2858</span></span>\n<span id=\"cb7-48\"><a href=\"#cb7-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-49\"><a href=\"#cb7-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb7-50\"><a href=\"#cb7-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                        edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb7-51\"><a href=\"#cb7-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriestrend1 1.100      3  1.538   0.826</span></span>\n<span id=\"cb7-52\"><a href=\"#cb7-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriestrend2 1.092      3  2.701   0.697</span></span>\n<span id=\"cb7-53\"><a href=\"#cb7-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-54\"><a href=\"#cb7-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb7-55\"><a href=\"#cb7-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb7-56\"><a href=\"#cb7-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb7-57\"><a href=\"#cb7-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb7-58\"><a href=\"#cb7-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb7-59\"><a href=\"#cb7-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-60\"><a href=\"#cb7-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb7-61\"><a href=\"#cb7-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb7-62\"><a href=\"#cb7-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb7-63\"><a href=\"#cb7-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-64\"><a href=\"#cb7-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p><code>loo()</code> functionality works just as it does for all\n<code>mvgam</code> models to aid in model comparison / selection (though\nnote that Pareto K values often give warnings for mixture models so\nthese may not be too helpful)</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">loo</span>(mod)</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Computed from 4000 by 60 log-likelihood matrix.</span></span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Estimate   SE</span></span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; elpd_loo   -222.1 12.7</span></span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; p_loo        75.7 11.5</span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; looic       444.2 25.3</span></span>\n<span id=\"cb8-9\"><a href=\"#cb8-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ------</span></span>\n<span id=\"cb8-10\"><a href=\"#cb8-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; MCSE of elpd_loo is NA.</span></span>\n<span id=\"cb8-11\"><a href=\"#cb8-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; MCSE and ESS estimates assume MCMC draws (r_eff in [0.4, 1.1]).</span></span>\n<span id=\"cb8-12\"><a href=\"#cb8-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb8-13\"><a href=\"#cb8-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Pareto k diagnostic values:</span></span>\n<span id=\"cb8-14\"><a href=\"#cb8-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                          Count Pct.    Min. ESS</span></span>\n<span id=\"cb8-15\"><a href=\"#cb8-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (-Inf, 0.7]   (good)     30    50.0%   444     </span></span>\n<span id=\"cb8-16\"><a href=\"#cb8-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    (0.7, 1]   (bad)       3     5.0%   &lt;NA&gt;    </span></span>\n<span id=\"cb8-17\"><a href=\"#cb8-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    (1, Inf)   (very bad) 27    45.0%   &lt;NA&gt;    </span></span>\n<span id=\"cb8-18\"><a href=\"#cb8-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; See help(&#39;pareto-k-diagnostic&#39;) for details.</span></span></code></pre></div>\n<p>Plot the estimated smooths of time from each species’ latent\nabundance process (on the log scale)</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;smooths&quot;</span>, <span class=\"at\">trend_effects =</span> <span class=\"cn\">TRUE</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p><code>marginaleffects</code> support allows for more useful\nprediction-based interrogations on different scales (though note that at\nthe time of writing this Vignette, you must have the development version\nof <code>marginaleffects</code> installed for <code>nmix()</code> models\nto be supported; use\n<code>remotes::install_github(&#39;vincentarelbundock/marginaleffects&#39;)</code>\nto install). Objects that use family <code>nmix()</code> have a few\nadditional prediction scales that can be used (i.e. <code>link</code>,\n<code>response</code>, <code>detection</code> or <code>latent_N</code>).\nFor example, here are the estimated detection probabilities per species,\nwhich show that the model has done a nice job of estimating these\nparameters:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>marginaleffects<span class=\"sc\">::</span><span class=\"fu\">plot_predictions</span>(mod,</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  <span class=\"at\">condition =</span> <span class=\"st\">&quot;species&quot;</span>,</span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span></span>\n<span id=\"cb10-4\"><a href=\"#cb10-4\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span></span>\n<span id=\"cb10-5\"><a href=\"#cb10-5\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb10-6\"><a href=\"#cb10-6\" tabindex=\"-1\"></a>  <span class=\"fu\">ylim</span>(<span class=\"fu\">c</span>(<span class=\"dv\">0</span>, <span class=\"dv\">1</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb10-7\"><a href=\"#cb10-7\" tabindex=\"-1\"></a>  <span class=\"fu\">theme_classic</span>() <span class=\"sc\">+</span></span>\n<span id=\"cb10-8\"><a href=\"#cb10-8\" tabindex=\"-1\"></a>  <span class=\"fu\">theme</span>(<span class=\"at\">legend.position =</span> <span class=\"st\">&quot;none&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>A common goal in N-mixture modelling is to estimate the true latent\nabundance. The model has automatically generated predictions for the\nunknown latent abundance that are conditional on the observations. We\ncan extract these and produce decent plots using a small function</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a>hc <span class=\"ot\">&lt;-</span> <span class=\"fu\">hindcast</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;latent_N&quot;</span>)</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a><span class=\"co\"># Function to plot latent abundance estimates vs truth</span></span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a>plot_latentN <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(hindcasts, data, <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>) {</span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a>  all_series <span class=\"ot\">&lt;-</span> <span class=\"fu\">unique</span>(data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-6\"><a href=\"#cb11-6\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(species <span class=\"sc\">==</span> <span class=\"sc\">!!</span>species) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-7\"><a href=\"#cb11-7\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">pull</span>(series))</span>\n<span id=\"cb11-8\"><a href=\"#cb11-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-9\"><a href=\"#cb11-9\" tabindex=\"-1\"></a>  <span class=\"co\"># Grab the first replicate that represents this series</span></span>\n<span id=\"cb11-10\"><a href=\"#cb11-10\" tabindex=\"-1\"></a>  <span class=\"co\"># so we can get the true simulated values</span></span>\n<span id=\"cb11-11\"><a href=\"#cb11-11\" tabindex=\"-1\"></a>  series <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.numeric</span>(all_series[<span class=\"dv\">1</span>])</span>\n<span id=\"cb11-12\"><a href=\"#cb11-12\" tabindex=\"-1\"></a>  truths <span class=\"ot\">&lt;-</span> data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-13\"><a href=\"#cb11-13\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(time, series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-14\"><a href=\"#cb11-14\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"sc\">!!</span><span class=\"fu\">levels</span>(data<span class=\"sc\">$</span>series)[series]) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-15\"><a href=\"#cb11-15\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">pull</span>(truth)</span>\n<span id=\"cb11-16\"><a href=\"#cb11-16\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-17\"><a href=\"#cb11-17\" tabindex=\"-1\"></a>  <span class=\"co\"># In case some replicates have missing observations,</span></span>\n<span id=\"cb11-18\"><a href=\"#cb11-18\" tabindex=\"-1\"></a>  <span class=\"co\"># pull out predictions for ALL replicates and average over them</span></span>\n<span id=\"cb11-19\"><a href=\"#cb11-19\" tabindex=\"-1\"></a>  hcs <span class=\"ot\">&lt;-</span> <span class=\"fu\">do.call</span>(rbind, <span class=\"fu\">lapply</span>(all_series, <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb11-20\"><a href=\"#cb11-20\" tabindex=\"-1\"></a>    ind <span class=\"ot\">&lt;-</span> <span class=\"fu\">which</span>(<span class=\"fu\">names</span>(hindcasts<span class=\"sc\">$</span>hindcasts) <span class=\"sc\">%in%</span> <span class=\"fu\">as.character</span>(x))</span>\n<span id=\"cb11-21\"><a href=\"#cb11-21\" tabindex=\"-1\"></a>    hindcasts<span class=\"sc\">$</span>hindcasts[[ind]]</span>\n<span id=\"cb11-22\"><a href=\"#cb11-22\" tabindex=\"-1\"></a>  }))</span>\n<span id=\"cb11-23\"><a href=\"#cb11-23\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-24\"><a href=\"#cb11-24\" tabindex=\"-1\"></a>  <span class=\"co\"># Calculate posterior empirical quantiles of predictions</span></span>\n<span id=\"cb11-25\"><a href=\"#cb11-25\" tabindex=\"-1\"></a>  pred_quantiles <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(<span class=\"fu\">t</span>(<span class=\"fu\">apply</span>(hcs, <span class=\"dv\">2</span>, <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb11-26\"><a href=\"#cb11-26\" tabindex=\"-1\"></a>    <span class=\"fu\">quantile</span>(x, <span class=\"at\">probs =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb11-27\"><a href=\"#cb11-27\" tabindex=\"-1\"></a>      <span class=\"fl\">0.05</span>, <span class=\"fl\">0.2</span>, <span class=\"fl\">0.3</span>, <span class=\"fl\">0.4</span>,</span>\n<span id=\"cb11-28\"><a href=\"#cb11-28\" tabindex=\"-1\"></a>      <span class=\"fl\">0.5</span>, <span class=\"fl\">0.6</span>, <span class=\"fl\">0.7</span>, <span class=\"fl\">0.8</span>, <span class=\"fl\">0.95</span></span>\n<span id=\"cb11-29\"><a href=\"#cb11-29\" tabindex=\"-1\"></a>    ))</span>\n<span id=\"cb11-30\"><a href=\"#cb11-30\" tabindex=\"-1\"></a>  })))</span>\n<span id=\"cb11-31\"><a href=\"#cb11-31\" tabindex=\"-1\"></a>  pred_quantiles<span class=\"sc\">$</span>time <span class=\"ot\">&lt;-</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">NROW</span>(pred_quantiles)</span>\n<span id=\"cb11-32\"><a href=\"#cb11-32\" tabindex=\"-1\"></a>  pred_quantiles<span class=\"sc\">$</span>truth <span class=\"ot\">&lt;-</span> truths</span>\n<span id=\"cb11-33\"><a href=\"#cb11-33\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-34\"><a href=\"#cb11-34\" tabindex=\"-1\"></a>  <span class=\"co\"># Grab observations</span></span>\n<span id=\"cb11-35\"><a href=\"#cb11-35\" tabindex=\"-1\"></a>  data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-36\"><a href=\"#cb11-36\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">%in%</span> all_series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-37\"><a href=\"#cb11-37\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(time, obs) <span class=\"ot\">-&gt;</span> observations</span>\n<span id=\"cb11-38\"><a href=\"#cb11-38\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-39\"><a href=\"#cb11-39\" tabindex=\"-1\"></a>  <span class=\"co\"># Plot</span></span>\n<span id=\"cb11-40\"><a href=\"#cb11-40\" tabindex=\"-1\"></a>  <span class=\"fu\">ggplot</span>(pred_quantiles, <span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">group =</span> <span class=\"dv\">1</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb11-41\"><a href=\"#cb11-41\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_ribbon</span>(<span class=\"fu\">aes</span>(<span class=\"at\">ymin =</span> X5., <span class=\"at\">ymax =</span> X95.), <span class=\"at\">fill =</span> <span class=\"st\">&quot;#DCBCBC&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb11-42\"><a href=\"#cb11-42\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_ribbon</span>(<span class=\"fu\">aes</span>(<span class=\"at\">ymin =</span> X30., <span class=\"at\">ymax =</span> X70.), <span class=\"at\">fill =</span> <span class=\"st\">&quot;#B97C7C&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb11-43\"><a href=\"#cb11-43\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> truth),</span>\n<span id=\"cb11-44\"><a href=\"#cb11-44\" tabindex=\"-1\"></a>      <span class=\"at\">colour =</span> <span class=\"st\">&quot;black&quot;</span>, <span class=\"at\">linewidth =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb11-45\"><a href=\"#cb11-45\" tabindex=\"-1\"></a>    ) <span class=\"sc\">+</span></span>\n<span id=\"cb11-46\"><a href=\"#cb11-46\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_point</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> truth),</span>\n<span id=\"cb11-47\"><a href=\"#cb11-47\" tabindex=\"-1\"></a>      <span class=\"at\">shape =</span> <span class=\"dv\">21</span>, <span class=\"at\">colour =</span> <span class=\"st\">&quot;white&quot;</span>, <span class=\"at\">fill =</span> <span class=\"st\">&quot;black&quot;</span>,</span>\n<span id=\"cb11-48\"><a href=\"#cb11-48\" tabindex=\"-1\"></a>      <span class=\"at\">size =</span> <span class=\"fl\">2.5</span></span>\n<span id=\"cb11-49\"><a href=\"#cb11-49\" tabindex=\"-1\"></a>    ) <span class=\"sc\">+</span></span>\n<span id=\"cb11-50\"><a href=\"#cb11-50\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_jitter</span>(</span>\n<span id=\"cb11-51\"><a href=\"#cb11-51\" tabindex=\"-1\"></a>      <span class=\"at\">data =</span> observations, <span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> obs),</span>\n<span id=\"cb11-52\"><a href=\"#cb11-52\" tabindex=\"-1\"></a>      <span class=\"at\">width =</span> <span class=\"fl\">0.06</span>,</span>\n<span id=\"cb11-53\"><a href=\"#cb11-53\" tabindex=\"-1\"></a>      <span class=\"at\">shape =</span> <span class=\"dv\">21</span>, <span class=\"at\">fill =</span> <span class=\"st\">&quot;darkred&quot;</span>, <span class=\"at\">colour =</span> <span class=\"st\">&quot;white&quot;</span>, <span class=\"at\">size =</span> <span class=\"fl\">2.5</span></span>\n<span id=\"cb11-54\"><a href=\"#cb11-54\" tabindex=\"-1\"></a>    ) <span class=\"sc\">+</span></span>\n<span id=\"cb11-55\"><a href=\"#cb11-55\" tabindex=\"-1\"></a>    <span class=\"fu\">labs</span>(</span>\n<span id=\"cb11-56\"><a href=\"#cb11-56\" tabindex=\"-1\"></a>      <span class=\"at\">y =</span> <span class=\"st\">&quot;Latent abundance (N)&quot;</span>,</span>\n<span id=\"cb11-57\"><a href=\"#cb11-57\" tabindex=\"-1\"></a>      <span class=\"at\">x =</span> <span class=\"st\">&quot;Time&quot;</span>,</span>\n<span id=\"cb11-58\"><a href=\"#cb11-58\" tabindex=\"-1\"></a>      <span class=\"at\">title =</span> species</span>\n<span id=\"cb11-59\"><a href=\"#cb11-59\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb11-60\"><a href=\"#cb11-60\" tabindex=\"-1\"></a>}</span></code></pre></div>\n<p>Latent abundance plots vs the simulated truths for each species are\nshown below. Here, the red points show the imperfect observations, the\nblack line shows the true latent abundance, and the ribbons show\ncredible intervals of our estimates:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_latentN</span>(hc, testdat, <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_latentN</span>(hc, testdat, <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_2&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can see that estimates for both species have correctly captured\nthe true temporal variation and magnitudes in abundance</p>\n</div>\n</div>\n<div id=\"example-2-a-larger-survey-with-possible-nonlinear-effects\" class=\"section level2\">\n<h2>Example 2: a larger survey with possible nonlinear effects</h2>\n<p>Now for another example with a larger dataset. We will use data from\n<a href=\"https://doserlab.com/files/spabundance-web/articles/nmixturemodels\" target=\"_blank\">Jeff Doser’s simulation example from the wonderful\n<code>spAbundance</code> package</a>. The simulated data include one\ncontinuous site-level covariate, one factor site-level covariate and two\ncontinuous sample-level covariates. This example will allow us to\nexamine how we can include possibly nonlinear effects in the latent\nprocess and detection probability models.</p>\n<p>Download the data and grab observations / covariate measurements for\none species</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"co\"># Date link</span></span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a><span class=\"fu\">load</span>(<span class=\"fu\">url</span>(<span class=\"st\">&quot;https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda&quot;</span>))</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a>data.one.sp <span class=\"ot\">&lt;-</span> dataNMixSim</span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\"># Pull out observations for one species</span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a>data.one.sp<span class=\"sc\">$</span>y <span class=\"ot\">&lt;-</span> data.one.sp<span class=\"sc\">$</span>y[<span class=\"dv\">1</span>, , ]</span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a><span class=\"co\"># Abundance covariates that don&#39;t change across repeat sampling observations</span></span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a>abund.cov <span class=\"ot\">&lt;-</span> dataNMixSim<span class=\"sc\">$</span>abund.covs[, <span class=\"dv\">1</span>]</span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a>abund.factor <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.factor</span>(dataNMixSim<span class=\"sc\">$</span>abund.covs[, <span class=\"dv\">2</span>])</span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"co\"># Detection covariates that can change across repeat sampling observations</span></span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\"># Note that `NA`s are not allowed for covariates in mvgam, so we randomly</span></span>\n<span id=\"cb14-14\"><a href=\"#cb14-14\" tabindex=\"-1\"></a><span class=\"co\"># impute them here</span></span>\n<span id=\"cb14-15\"><a href=\"#cb14-15\" tabindex=\"-1\"></a>det.cov <span class=\"ot\">&lt;-</span> dataNMixSim<span class=\"sc\">$</span>det.covs<span class=\"sc\">$</span>det.cov<span class=\"fl\">.1</span>[, ]</span>\n<span id=\"cb14-16\"><a href=\"#cb14-16\" tabindex=\"-1\"></a>det.cov[<span class=\"fu\">is.na</span>(det.cov)] <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(<span class=\"fu\">length</span>(<span class=\"fu\">which</span>(<span class=\"fu\">is.na</span>(det.cov))))</span>\n<span id=\"cb14-17\"><a href=\"#cb14-17\" tabindex=\"-1\"></a>det.cov2 <span class=\"ot\">&lt;-</span> dataNMixSim<span class=\"sc\">$</span>det.covs<span class=\"sc\">$</span>det.cov<span class=\"fl\">.2</span></span>\n<span id=\"cb14-18\"><a href=\"#cb14-18\" tabindex=\"-1\"></a>det.cov2[<span class=\"fu\">is.na</span>(det.cov2)] <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(<span class=\"fu\">length</span>(<span class=\"fu\">which</span>(<span class=\"fu\">is.na</span>(det.cov2))))</span></code></pre></div>\n<p>Next we wrangle into the appropriate ‘long’ data format, adding\nindicators of <code>time</code> and <code>series</code> for working in\n<code>mvgam</code>. We also add the <code>cap</code> variable to\nrepresent the maximum latent N to marginalize over for each\nobservation</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a>mod_data <span class=\"ot\">&lt;-</span> <span class=\"fu\">do.call</span>(</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  rbind,</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  <span class=\"fu\">lapply</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">NROW</span>(data.one.sp<span class=\"sc\">$</span>y), <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>    <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a>      <span class=\"at\">y =</span> data.one.sp<span class=\"sc\">$</span>y[x, ],</span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a>      <span class=\"at\">abund_cov =</span> abund.cov[x],</span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a>      <span class=\"at\">abund_fac =</span> abund.factor[x],</span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a>      <span class=\"at\">det_cov =</span> det.cov[x, ],</span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a>      <span class=\"at\">det_cov2 =</span> det.cov2[x, ],</span>\n<span id=\"cb15-10\"><a href=\"#cb15-10\" tabindex=\"-1\"></a>      <span class=\"at\">replicate =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">NCOL</span>(data.one.sp<span class=\"sc\">$</span>y),</span>\n<span id=\"cb15-11\"><a href=\"#cb15-11\" tabindex=\"-1\"></a>      <span class=\"at\">site =</span> <span class=\"fu\">paste0</span>(<span class=\"st\">&quot;site&quot;</span>, x)</span>\n<span id=\"cb15-12\"><a href=\"#cb15-12\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb15-13\"><a href=\"#cb15-13\" tabindex=\"-1\"></a>  })</span>\n<span id=\"cb15-14\"><a href=\"#cb15-14\" tabindex=\"-1\"></a>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-15\"><a href=\"#cb15-15\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb15-16\"><a href=\"#cb15-16\" tabindex=\"-1\"></a>    <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>,</span>\n<span id=\"cb15-17\"><a href=\"#cb15-17\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">as.factor</span>(<span class=\"fu\">paste0</span>(site, <span class=\"st\">&quot;_&quot;</span>, species, <span class=\"st\">&quot;_&quot;</span>, replicate))</span>\n<span id=\"cb15-18\"><a href=\"#cb15-18\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-19\"><a href=\"#cb15-19\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb15-20\"><a href=\"#cb15-20\" tabindex=\"-1\"></a>    <span class=\"at\">site =</span> <span class=\"fu\">factor</span>(site, <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(site)),</span>\n<span id=\"cb15-21\"><a href=\"#cb15-21\" tabindex=\"-1\"></a>    <span class=\"at\">species =</span> <span class=\"fu\">factor</span>(species, <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(species)),</span>\n<span id=\"cb15-22\"><a href=\"#cb15-22\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb15-23\"><a href=\"#cb15-23\" tabindex=\"-1\"></a>    <span class=\"at\">cap =</span> <span class=\"fu\">max</span>(data.one.sp<span class=\"sc\">$</span>y, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">+</span> <span class=\"dv\">20</span></span>\n<span id=\"cb15-24\"><a href=\"#cb15-24\" tabindex=\"-1\"></a>  )</span></code></pre></div>\n<p>The data include observations for 225 sites with three replicates per\nsite, though some observations are missing</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">NROW</span>(mod_data)</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] 675</span></span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(mod_data)</span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 675</span></span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 11</span></span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ y         &lt;int&gt; 1, NA, NA, NA, 2, 2, NA, 1, NA, NA, 0, 1, 0, 0, 0, 0, NA, NA…</span></span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ abund_cov &lt;dbl&gt; -0.3734384, -0.3734384, -0.3734384, 0.7064305, 0.7064305, 0.…</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ abund_fac &lt;fct&gt; 3, 3, 3, 4, 4, 4, 9, 9, 9, 2, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, …</span></span>\n<span id=\"cb16-9\"><a href=\"#cb16-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ det_cov   &lt;dbl&gt; -1.28279990, 1.11996398, -1.26741746, -1.29426683, 0.1954808…</span></span>\n<span id=\"cb16-10\"><a href=\"#cb16-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ det_cov2  &lt;dbl&gt; 2.03047314, 1.61128100, 0.06661865, -0.94290689, 1.04555361,…</span></span>\n<span id=\"cb16-11\"><a href=\"#cb16-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ replicate &lt;int&gt; 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, …</span></span>\n<span id=\"cb16-12\"><a href=\"#cb16-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ site      &lt;fct&gt; site1, site1, site1, site2, site2, site2, site3, site3, site…</span></span>\n<span id=\"cb16-13\"><a href=\"#cb16-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ species   &lt;fct&gt; sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, …</span></span>\n<span id=\"cb16-14\"><a href=\"#cb16-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; site1_sp_1_1, site1_sp_1_2, site1_sp_1_3, site2_sp_1_1, site…</span></span>\n<span id=\"cb16-15\"><a href=\"#cb16-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;dbl&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …</span></span>\n<span id=\"cb16-16\"><a href=\"#cb16-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ cap       &lt;dbl&gt; 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, …</span></span>\n<span id=\"cb16-17\"><a href=\"#cb16-17\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(mod_data)</span>\n<span id=\"cb16-18\"><a href=\"#cb16-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    y  abund_cov abund_fac    det_cov    det_cov2 replicate  site species</span></span>\n<span id=\"cb16-19\"><a href=\"#cb16-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  1 -0.3734384         3 -1.2827999  2.03047314         1 site1    sp_1</span></span>\n<span id=\"cb16-20\"><a href=\"#cb16-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 NA -0.3734384         3  1.1199640  1.61128100         2 site1    sp_1</span></span>\n<span id=\"cb16-21\"><a href=\"#cb16-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 NA -0.3734384         3 -1.2674175  0.06661865         3 site1    sp_1</span></span>\n<span id=\"cb16-22\"><a href=\"#cb16-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 NA  0.7064305         4 -1.2942668 -0.94290689         1 site2    sp_1</span></span>\n<span id=\"cb16-23\"><a href=\"#cb16-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  2  0.7064305         4  0.1954809  1.04555361         2 site2    sp_1</span></span>\n<span id=\"cb16-24\"><a href=\"#cb16-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  2  0.7064305         4  0.9673034  1.91971178         3 site2    sp_1</span></span>\n<span id=\"cb16-25\"><a href=\"#cb16-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         series time cap</span></span>\n<span id=\"cb16-26\"><a href=\"#cb16-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 site1_sp_1_1    1  33</span></span>\n<span id=\"cb16-27\"><a href=\"#cb16-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 site1_sp_1_2    1  33</span></span>\n<span id=\"cb16-28\"><a href=\"#cb16-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 site1_sp_1_3    1  33</span></span>\n<span id=\"cb16-29\"><a href=\"#cb16-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 site2_sp_1_1    1  33</span></span>\n<span id=\"cb16-30\"><a href=\"#cb16-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5 site2_sp_1_2    1  33</span></span>\n<span id=\"cb16-31\"><a href=\"#cb16-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6 site2_sp_1_3    1  33</span></span></code></pre></div>\n<p>The final step for data preparation is of course the\n<code>trend_map</code>, which sets up the mapping between observation\nreplicates and the latent abundance models. This is done in the same way\nas in the example above</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a>mod_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a>  <span class=\"co\"># each unique combination of site*species is a separate process</span></span>\n<span id=\"cb17-3\"><a href=\"#cb17-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">trend =</span> <span class=\"fu\">as.numeric</span>(<span class=\"fu\">factor</span>(<span class=\"fu\">paste0</span>(site, species)))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-4\"><a href=\"#cb17-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(trend, series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-5\"><a href=\"#cb17-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">distinct</span>() <span class=\"ot\">-&gt;</span> trend_map</span>\n<span id=\"cb17-6\"><a href=\"#cb17-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb17-7\"><a href=\"#cb17-7\" tabindex=\"-1\"></a>trend_map <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-8\"><a href=\"#cb17-8\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(trend) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-9\"><a href=\"#cb17-9\" tabindex=\"-1\"></a>  <span class=\"fu\">head</span>(<span class=\"dv\">12</span>)</span>\n<span id=\"cb17-10\"><a href=\"#cb17-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    trend         series</span></span>\n<span id=\"cb17-11\"><a href=\"#cb17-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1      1 site100_sp_1_1</span></span>\n<span id=\"cb17-12\"><a href=\"#cb17-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2      1 site100_sp_1_2</span></span>\n<span id=\"cb17-13\"><a href=\"#cb17-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3      1 site100_sp_1_3</span></span>\n<span id=\"cb17-14\"><a href=\"#cb17-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4      2 site101_sp_1_1</span></span>\n<span id=\"cb17-15\"><a href=\"#cb17-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5      2 site101_sp_1_2</span></span>\n<span id=\"cb17-16\"><a href=\"#cb17-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6      2 site101_sp_1_3</span></span>\n<span id=\"cb17-17\"><a href=\"#cb17-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7      3 site102_sp_1_1</span></span>\n<span id=\"cb17-18\"><a href=\"#cb17-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8      3 site102_sp_1_2</span></span>\n<span id=\"cb17-19\"><a href=\"#cb17-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9      3 site102_sp_1_3</span></span>\n<span id=\"cb17-20\"><a href=\"#cb17-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10     4 site103_sp_1_1</span></span>\n<span id=\"cb17-21\"><a href=\"#cb17-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11     4 site103_sp_1_2</span></span>\n<span id=\"cb17-22\"><a href=\"#cb17-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12     4 site103_sp_1_3</span></span></code></pre></div>\n<p>Now we are ready to fit a model using <code>mvgam()</code>. Here we\nwill use penalized splines for each of the continuous covariate effects\nto detect possible nonlinear associations. We also showcase how\n<code>mvgam</code> can make use of the different approximation\nalgorithms available in <code>Stan</code> by using the meanfield\nvariational Bayes approximator (this reduces computation time from\naround 90 seconds to around 12 seconds for this example)</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"co\"># effects of covariates on detection probability;</span></span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"co\"># here we use penalized splines for both continuous covariates</span></span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> y <span class=\"sc\">~</span> <span class=\"fu\">s</span>(det_cov, <span class=\"at\">k =</span> <span class=\"dv\">4</span>) <span class=\"sc\">+</span> <span class=\"fu\">s</span>(det_cov2, <span class=\"at\">k =</span> <span class=\"dv\">4</span>),</span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a>  <span class=\"co\"># effects of the covariates on latent abundance;</span></span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a>  <span class=\"co\"># here we use a penalized spline for the continuous covariate and</span></span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a>  <span class=\"co\"># hierarchical intercepts for the factor covariate</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(abund_cov, <span class=\"at\">k =</span> <span class=\"dv\">4</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb18-10\"><a href=\"#cb18-10\" tabindex=\"-1\"></a>    <span class=\"fu\">s</span>(abund_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>),</span>\n<span id=\"cb18-11\"><a href=\"#cb18-11\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-12\"><a href=\"#cb18-12\" tabindex=\"-1\"></a>  <span class=\"co\"># link multiple observations to each site</span></span>\n<span id=\"cb18-13\"><a href=\"#cb18-13\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb18-14\"><a href=\"#cb18-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-15\"><a href=\"#cb18-15\" tabindex=\"-1\"></a>  <span class=\"co\"># nmix() family and supplied data</span></span>\n<span id=\"cb18-16\"><a href=\"#cb18-16\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">nmix</span>(),</span>\n<span id=\"cb18-17\"><a href=\"#cb18-17\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> mod_data,</span>\n<span id=\"cb18-18\"><a href=\"#cb18-18\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-19\"><a href=\"#cb18-19\" tabindex=\"-1\"></a>  <span class=\"co\"># standard normal priors on key regression parameters</span></span>\n<span id=\"cb18-20\"><a href=\"#cb18-20\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb18-21\"><a href=\"#cb18-21\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;b&quot;</span>),</span>\n<span id=\"cb18-22\"><a href=\"#cb18-22\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;Intercept&quot;</span>),</span>\n<span id=\"cb18-23\"><a href=\"#cb18-23\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;Intercept_trend&quot;</span>),</span>\n<span id=\"cb18-24\"><a href=\"#cb18-24\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;sigma_raw_trend&quot;</span>)</span>\n<span id=\"cb18-25\"><a href=\"#cb18-25\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb18-26\"><a href=\"#cb18-26\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-27\"><a href=\"#cb18-27\" tabindex=\"-1\"></a>  <span class=\"co\"># use Stan&#39;s variational inference for quicker results</span></span>\n<span id=\"cb18-28\"><a href=\"#cb18-28\" tabindex=\"-1\"></a>  <span class=\"at\">algorithm =</span> <span class=\"st\">&quot;meanfield&quot;</span>,</span>\n<span id=\"cb18-29\"><a href=\"#cb18-29\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-30\"><a href=\"#cb18-30\" tabindex=\"-1\"></a>  <span class=\"co\"># no need to compute &quot;series-level&quot; residuals</span></span>\n<span id=\"cb18-31\"><a href=\"#cb18-31\" tabindex=\"-1\"></a>  <span class=\"at\">residuals =</span> <span class=\"cn\">FALSE</span>,</span>\n<span id=\"cb18-32\"><a href=\"#cb18-32\" tabindex=\"-1\"></a>  <span class=\"at\">samples =</span> <span class=\"dv\">1000</span></span>\n<span id=\"cb18-33\"><a href=\"#cb18-33\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Inspect the model summary but don’t bother looking at estimates for\nall individual spline coefficients. Notice how we no longer receive\ninformation on convergence because we did not use MCMC sampling for this\nmodel</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ s(det_cov, k = 3) + s(det_cov2, k = 3)</span></span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(abund_cov, k = 3) + s(abund_fac, bs = &quot;re&quot;)</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; nmix</span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 225 </span></span>\n<span id=\"cb19-21\"><a href=\"#cb19-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-22\"><a href=\"#cb19-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb19-23\"><a href=\"#cb19-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 675 </span></span>\n<span id=\"cb19-24\"><a href=\"#cb19-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-25\"><a href=\"#cb19-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb19-26\"><a href=\"#cb19-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb19-27\"><a href=\"#cb19-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-28\"><a href=\"#cb19-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb19-29\"><a href=\"#cb19-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb19-30\"><a href=\"#cb19-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 chains, each with iter = 1000; warmup = ; thin = 1 </span></span>\n<span id=\"cb19-31\"><a href=\"#cb19-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 1000</span></span>\n<span id=\"cb19-32\"><a href=\"#cb19-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-33\"><a href=\"#cb19-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb19-34\"><a href=\"#cb19-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n.eff</span></span>\n<span id=\"cb19-35\"><a href=\"#cb19-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept) 0.076 0.37  0.67  NaN   NaN</span></span>\n<span id=\"cb19-36\"><a href=\"#cb19-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-37\"><a href=\"#cb19-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM observation smooths:</span></span>\n<span id=\"cb19-38\"><a href=\"#cb19-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb19-39\"><a href=\"#cb19-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(det_cov)  1.041      2  176.9 0.000177 ***</span></span>\n<span id=\"cb19-40\"><a href=\"#cb19-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(det_cov2) 1.011      2  548.1  &lt; 2e-16 ***</span></span>\n<span id=\"cb19-41\"><a href=\"#cb19-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb19-42\"><a href=\"#cb19-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb19-43\"><a href=\"#cb19-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-44\"><a href=\"#cb19-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span id=\"cb19-45\"><a href=\"#cb19-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      2.5%  50% 97.5% Rhat n.eff</span></span>\n<span id=\"cb19-46\"><a href=\"#cb19-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)_trend -0.0083 0.14  0.29  NaN   NaN</span></span>\n<span id=\"cb19-47\"><a href=\"#cb19-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-48\"><a href=\"#cb19-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model group-level estimates:</span></span>\n<span id=\"cb19-49\"><a href=\"#cb19-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                           2.5%   50%  97.5% Rhat n.eff</span></span>\n<span id=\"cb19-50\"><a href=\"#cb19-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mean(s(abund_fac))_trend -0.44 -0.26 -0.076  NaN   NaN</span></span>\n<span id=\"cb19-51\"><a href=\"#cb19-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sd(s(abund_fac))_trend    0.29  0.42  0.620  NaN   NaN</span></span>\n<span id=\"cb19-52\"><a href=\"#cb19-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-53\"><a href=\"#cb19-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb19-54\"><a href=\"#cb19-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value  </span></span>\n<span id=\"cb19-55\"><a href=\"#cb19-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(abund_cov) 1.42      2  1.622  0.2656  </span></span>\n<span id=\"cb19-56\"><a href=\"#cb19-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(abund_fac) 8.85     10 14.771  0.0918 .</span></span>\n<span id=\"cb19-57\"><a href=\"#cb19-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb19-58\"><a href=\"#cb19-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb19-59\"><a href=\"#cb19-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-60\"><a href=\"#cb19-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Posterior approximation used: no diagnostics to compute</span></span>\n<span id=\"cb19-61\"><a href=\"#cb19-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-62\"><a href=\"#cb19-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Again we can make use of <code>marginaleffects</code> support for\ninterrogating the model through targeted predictions. First, we can\ninspect the estimated average detection probability</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a>marginaleffects<span class=\"sc\">::</span><span class=\"fu\">avg_predictions</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span>)</span>\n<span id=\"cb20-2\"><a href=\"#cb20-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb20-3\"><a href=\"#cb20-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Estimate 2.5 % 97.5 %</span></span>\n<span id=\"cb20-4\"><a href=\"#cb20-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     0.575 0.515  0.636</span></span>\n<span id=\"cb20-5\"><a href=\"#cb20-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb20-6\"><a href=\"#cb20-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Type: detection</span></span></code></pre></div>\n<p>Next investigate estimated effects of covariates on latent abundance\nusing the <code>conditional_effects()</code> function and specifying\n<code>type = &#39;link&#39;</code>; this will return plots on the expectation\nscale</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>abund_plots <span class=\"ot\">&lt;-</span> <span class=\"fu\">plot</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  <span class=\"fu\">conditional_effects</span>(mod,</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>    <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>,</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>    <span class=\"at\">effects =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;abund_cov&quot;</span>,</span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;abund_fac&quot;</span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a>  <span class=\"at\">plot =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The effect of the continuous covariate on expected latent\nabundance</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>abund_plots[[<span class=\"dv\">1</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Expected latent abundance&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAAAt1BMVEUAAAAAADoAAGYAOpAAZrYzMzM6AAA6ADo6AGY6kNtNTU1NTW5NTY5NbqtNjshmAABmADpmZrZmtrZmtv9uTU1uTW5uTY5ubqtuq+SOTU2OTW6OTY6OyP+QOgCQOmaQkGaQtpCQ27aQ2/+rbk2ryKur5P+2ZgC2Zma2///Ijk3I///bkDrb2//b/7bb/9vb///kq27k///q6ur/tmb/yI7/25D/29v/5Kv//7b//8j//9v//+T////5ZKZKAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAPX0lEQVR4nO3dC3vcxBWA4TVxAjYX0xooUKeAIS7BpYF1XDtm///v6kq7vqxX0tGMzpkzo/nep8QkEV7NzNeVLO/KixVgYOG9A5gnwoIJwoIJwoIJwoIJwoKJ0WFRIEIQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFkwQFiIsxS0IC+GWhAUDS8KCgSVhwcCSsGBgSVgwsCQsGFgSFgwsCQsGloQFA0vCgoElYcHAkrBgYElY0LdcEhb0Pe+KsKBhryvCgoL9rggLk3VkRViYjrBgobMrwsJE3V0RFqbp6YqwMElfV4SFKXq7IixM0N8VYSHeQFeEhWhDXREWYg12RViINNwVYSESYcGC0BVhIYrUFWEhhtgVYSGC3BVhIdyIrggLwcZ0RVgINaorwkKgcV0RFsKM7IqwEGRsV4SFIIQFC6O7IiwEGN8VYWG8gK4IC6OFdEVYGCuoK8LCSGFdERbGCeyKsDBKaFeEhTGCuyIsjBDeFWFBFtEVYUEU0xVhQRLVFWFBENcVYWFYZFeEhUGxXREWhkR3RVgYEN8VYaHfhK4IC72mdEVY6DOpK8JCj2ldERa6TeyKsNBpaleEhS6TuyIsdJjeFWFhn0JXhIU9Gl0RFp5T6Yqw8IxOV4SFXUpdERZ2aHVFWHhKrSvCwhN6XREWHil2RVh4oNkVYeGealeEhS3drggLG8pdERZa2l0RFhrqXREWVhZdERZMuiIsmHRFWDDpirCqZ9MVYdXOqCvCqpxVV4RVN7OuCKtmdlkRVs0suyKsaplmRVi1Ms6KsOpknhVh1ShBVoRVnyRZEVZ1EnVFWHVJlRVhVSVdVoRVk5RdEVY1kmZFWLVInBVh1SF5VsFhXS4Wp5cv3skbIhsOVQWHdfHi95PTu9eH4obIhU9WgWHdnpyu/7e6+uhXYUPkwasqwpo1x6xCD4WXzaHw9uRI3BDuXLMKPnm/Wqx1dkVYWXHOissN8+Rd1ZKw5si7qZa4lzu93L0+WvVcbSCsXHgntSHu5u51rKYprmNlzbuoLXE/n11uaD5wuSFf3j09EPeUsErindMjcVd3r2M1SXEdK1veNT0h7ivXsYrh3dIOcW+53FAK75R2ibtLWGXwDuk5cYd3erl+1RwKF5y8Z8e7oz3iHj/tpe/a6N6GSMw7o33iLndcbpA3RFLeEXURd3r3GYuwMuTdUCdxr3d66b402rEhkvEuqIe437uHwgUn75nxDqiPuONcbsiZdz79xF0nrGx5tzNI3HuuY+XJOxyJOIDdrwqP1l8Y9lx0IKxkvKMZQxzE8+tYF0erq863QhNWKt7NjCKO4nlYl4e8HsuXdzLjiMN4/tLkdVUPN2+4+er4+KxzQ1jxDmYscSB7b6a4WBycb3734fs3q5uv33RtCCPevYwmjmSgl/dfrH95eyZvCCXetQQQxyL00jxrrVYv1wjLnHcsIcTBPPRy//2cnetYf/387d6GsOGdShhxOF1vpni4jvXhu2+7N4Q271BCiQMaevvXzVdn3RtCl3clEcQxDYS10xVhWfFOJI44rIH3Ff5x3Djr2hBKvPuIJo6s432F3S8jJSx93nVMII6Nl8248W5jEnF0hOXEu4yJxPHxeiwX3l1MJo6Q9xU68K5CgThG3leYnncUGsRB8r7C5LybUCGOkvcVpuadhA5xmLyvMC3vILSIA+VyQ1LePagRR0pYKXnnoEccKofChLxrUCSOdb+X2y/Px22IMN4tqBJH29EL7yvU5F2AEXHcXWFxKNTivfx2xKF39HLBM5YG76W3JQ6/4+T9gHOsqbyX3Z44BVxuUOa94omI80BYerwXOyVxMnhpshbvpU5LnA5+SJMO74VOTZwQfqycBu9lTk+cEsKaznuRPYiTsv96LG4VGcZ7iX2I0zJ8U5CuDfGU9wJ7ESeGyw0TeK+uI3FuCCua99q6EmeH9xXG8V5Yb+IEcZ/3CN6rmgFxjrjPeyDvFc2EOE/c5z2A92pmRJyrofu8929YJe+1zIo4WwP3eR/YsD7eC5kbccK43DCG9zLmR5wywhJ5r2GWxFkjrGHeC5grceIIa4D36mVMnDvC6uG9cpkT54/XY+3wXq9iiDNJWE94r1ZBxLl87OXy4fVYnXcinX1Y3ktVFnE6uQdpy3udiiPOKCfvVBVDnFRej+W9RGUSp7Xy+7x7r0+xxJmt+hzLe3UKJs5tvfd5916asonTW+V93r1XZQbEOa7j5rbeyzA/4pTP/nKD9wrMlDjvswvLe8YrIa7Dbi+Xi8Vp90veCwnLe76rIa7E7pspXvx+ctpzNauAsLwnuybiYjy7jtVcyir01Q3eU10XcTnKCst7OnFPXKrdW0U2h8I8bxXpPZHYJS5Yx81tO7tyDMt7DtFBXLW8Lzd4Tx/6iEuX40uTvScNMnERswvLe8YwiriOeb3m3Xu6MJa4lPm8Hst7qhBCXM4sTt69ZwnBwnqxfc2791xAUVBYdvcg9Z4GaAsKy+QepN4zABPBYYXfg3TowfwGDltBYcXdg7TvEV3Gi0TCwoq6B6n3EOEhLKyoDb2HCA+EBRPje4n+sXLeQ4SH8WFFb+g9RHggLJggLJggLJggLJggLJgY3wuXGxBgfFiNyyap0JfNeA8RHoLCinszhfcQ4YGwYCIorPtDYdhb7L2HCA9hYW3eYt/9Vh3CwhOBYcVs6D1EeCAsmAjsJeZWkd5DhIewsKJuFek9RHgICivujn7eQ4QHwoKJoLDibhXpPUR4CAsr6laR3kOEh8CwYjb0HiI8BPXC9woxFmHBREBYsbeK9B4iPASEFXurSO8hIr2FfGrOyTuCtMe0mLvN9P0oe8LCpqlWWFgXh21dnGNhz5OoGkFh8VUhOj2LqkFYmKYjqkZQWLzmHU8teqJqhIXF9wqxMdRUKzCsmA1TjRVpiE21CAvjjWuqFdgLr3mvVUBTrbCweM17lQKbagWFxUuT6xMTVYOw0Cs2qkZQWLzmvRLbl0dN+RRhYXEda+6mF7UVGFbMhgp7iRSUktogLLQ0o2oE9nLJbYxmSPWpaissLL4JPTdap1R7gsLiZTOzYtVUi7DqZBpVIyis1VXzw1U5FBbOPKpGUFiDP0OAsEqQJKpGUFhxGyYZB0Rm5+mdgnq5+w9hlSlpU62gsLZnV3f/4uS9IOmjagSFtbpavHi3/oWvCovhElUjLKzN6TvvhC6Dz1PVVmBYq+tXPS9uIKycpD1R7xIW1t3rxWF7OCSsPN1fDfLej+CT980FUs6xspNNUPfCwvrb5uO/CSsneRW1FRRW3IbeQ5y3HKNqjO+l/Q50+/1nvgmdiSyfqrYIq0yZnVHtI6ziZN9Ui7BKUkZTLcIqREFNtQgre7ldoRqHsLKVz1X0GCFhDbx8lLAUFR3UvfFhRW/oPcSSzKCoLcLKxXyaahFWBmbWVIuwfM2xqRZheZnDGfoAwnIw76Q2CCutGppqEVYaZV/tjEBYxmoL6h5h2amzqC3CMlF1Uy3CUlbpkW/PxLBuvvmNsFrVnZ0LpoX1/viz6sMiqE6Twnr76S9VP2NRVL9JYT0cCl+uVRQWhz2ZTliDG3oPURFBjUZY41BUIMIaxlEvEmH1IKhpCGsfRSmYGNaYDb2HOBqHPUWEteSwZ6H2sCjKSK1hcdgzVlVYi0feuzJ7dYRFTcnNPiyK8jHnsGjK0UzDoilvMwuLc/NczCEsvtjLULlhUVPWSguLnApRTFjkVJYCwqKoEmUcFse8kuUYFkHNQGZhUdRcZBIWh7258Q6LoGbKLyyKmrX0YXHUq0KqsLhiXpkEYZFTjRKE5T1EeCAsmCAsmCAsmCAsmCAsmCAsmCAsmCAsmCAsmCAsmCAsmCAsmCAsmCCs2gjLmOhhCGtOxi7lAL3HIqxZGLuKMeIekLAKNnbtPBBWcXQW3hph5UxnjV0QVi501jMbhOVKZxFzRFhedNYvW4TlQGfp8kZYxnSWqTyEZUFnbYpGWHp0VmQmCCuOzuzPGGEF0JnyOhCWSGeia0NYQ3TmuEqE1UNneutFWDt0JhWE9UhnPrFFWCRlovKwdCYR+2oLS2fWIKojLJ25QoA5h6UzQ4gy07B0JgfxZheWzrRgqqLD0pkCWCgwLJ2Bw1ZZYemMGQmUEpbOaJFMAWHpDBRp5R2WzhjhIMewdEYGV5mFpTMo+MsnLJ3xIBNZhKUzFOTEOSydQSA/LmHp7Dpyljosnb1G9hKGpbPDKEOasHT2FQUxD0tnN1Eam7B09g0FUw9LZ7dQOs2wdPYIs6AUls7OYD6mhwV0ICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYICyYGB9WuJcR/008Hi2LRwsOK8JLw8/No2X+aITFo5k8GmHxaCaPxjk5TBAWTBAWTBAWTBAWTBiGdfPV8fGZ3afff7xvfkv0SB++O/78z0SP1Ug3Mr1Vswvrw/dvVjdfvzH7/M+9P/4s0fT/9fPZ6o8v0jxWI93IFFfNLqz3zdS/PTP7/M+8/fSXVP+//vDP31I+iSQcmeKq2Z5jNf0nk2ytb/7x50xHtqEyNtOw/vr5W8tP/0yy6X//+azD0lk1m7DeHh9/0Zzjpulq82g8Y+lQWjXTrwrP7D551+PN9Bwr9VeFZyqfxy6s1F2lm/7mWJHyq8KUYamtml1Yfxw3zsw+/x6uYylQWzWuvMMEYcEEYcEEYcEEYcEEYcEEYcEEYQmuPz7v/8urj35NtydlISwBYcUhLAFhxSGsPtevFovF0TqsHxaLF+82ga1/uf74x/VfnK5WtyeLgx+ehHX3erE4fPh49/po/e+X9YZHWD1uT07bMK5fvXh39/rwMaz175s/vz05Wm/zGE6zTfPfNB+bfy7Xm23qqhNh9fjfu9U2pNPtM9X5zu/bo+CTZ6T7Q2b75+tfmt8PHkZnjrB6Xa0PhQfn15/82j59PR4KNx+bZ6RV+5fbrbeNXbV//vF582zVblMpwupxe3LQPuXEhrX+l/9WfCQkrD5tIFcH58+Duv94f8i73/7hULjusf3z2y9//KTaU3fC6tUEcv3q4Pz+5L05Wb97/Rja7cnh3sn7039Wq4v2i8RaEVafi/UZ1k/NIfCHzWWE5vLD3798CEu43LBqztFOnXY9B4QFE4QFE4Q1TXt9vr0u4b0nmSEsmCAsmCAsmCAsmCAsmCAsmCAsmPg/NGeoH5EVhFEAAAAASUVORK5CYII=\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The effect of the factor covariate on expected latent abundance,\nestimated as a hierarchical random effect</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a>abund_plots[[<span class=\"dv\">2</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Expected latent abundance&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Now we can investigate estimated effects of covariates on detection\nprobability using <code>type = &#39;detection&#39;</code></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a>det_plots <span class=\"ot\">&lt;-</span> <span class=\"fu\">plot</span>(</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a>  <span class=\"fu\">conditional_effects</span>(mod,</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a>    <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span>,</span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a>    <span class=\"at\">effects =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;det_cov&quot;</span>,</span>\n<span id=\"cb24-6\"><a href=\"#cb24-6\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;det_cov2&quot;</span></span>\n<span id=\"cb24-7\"><a href=\"#cb24-7\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb24-8\"><a href=\"#cb24-8\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb24-9\"><a href=\"#cb24-9\" tabindex=\"-1\"></a>  <span class=\"at\">plot =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb24-10\"><a href=\"#cb24-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The covariate smooths were estimated to be somewhat nonlinear on the\nlogit scale according to the model summary (based on their approximate\nsignificances). But inspecting conditional effects of each covariate on\nthe probability scale is more intuitive and useful</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a>det_plots[[<span class=\"dv\">1</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a>det_plots[[<span class=\"dv\">2</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>More targeted predictions are also easy with\n<code>marginaleffects</code> support. For example, we can ask: How does\ndetection probability change as we change <em>both</em> detection\ncovariates?</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>fivenum_round <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(x) <span class=\"fu\">round</span>(<span class=\"fu\">fivenum</span>(x, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a></span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a>marginaleffects<span class=\"sc\">::</span><span class=\"fu\">plot_predictions</span>(mod,</span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> marginaleffects<span class=\"sc\">::</span><span class=\"fu\">datagrid</span>(</span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>    <span class=\"at\">det_cov =</span> unique,</span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a>    <span class=\"at\">det_cov2 =</span> fivenum_round</span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb27-8\"><a href=\"#cb27-8\" tabindex=\"-1\"></a>  <span class=\"at\">by =</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;det_cov&quot;</span>, <span class=\"st\">&quot;det_cov2&quot;</span>),</span>\n<span id=\"cb27-9\"><a href=\"#cb27-9\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span></span>\n<span id=\"cb27-10\"><a href=\"#cb27-10\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span></span>\n<span id=\"cb27-11\"><a href=\"#cb27-11\" tabindex=\"-1\"></a>  <span class=\"fu\">theme_classic</span>() <span class=\"sc\">+</span></span>\n<span id=\"cb27-12\"><a href=\"#cb27-12\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The model has found support for some important covariate effects, but\nof course we’d want to interrogate how well the model predicts and think\nabout possible spatial effects to capture unmodelled variation in latent\nabundance (which can easily be incorporated into both linear predictors\nusing spatial smooths).</p>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nN-mixture models for ecological population dynamics investigations:</p>\n<p>Guélat, Jérôme, and Kéry, Marc. “<a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.12983\">Effects\nof Spatial Autocorrelation and Imperfect Detection on Species\nDistribution Models.</a>” <em>Methods in Ecology and Evolution</em> 9\n(2018): 1614–25.</p>\n<p>Kéry, Marc, and Royle Andrew J. “<a href=\"https://shop.elsevier.com/books/applied-hierarchical-modeling-in-ecology-analysis-of-distribution-abundance-and-species-richness-in-r-and-bugs/kery/978-0-12-809585-0\">Applied\nhierarchical modeling in ecology: Analysis of distribution, abundance\nand species richness in R and BUGS: Volume 2: Dynamic and advanced\nmodels</a>”. London, UK: Academic Press (2020).</p>\n<p>Royle, Andrew J. “<a href=\"https://onlinelibrary.wiley.com/doi/full/10.1111/j.0006-341X.2004.00142.x\">N‐mixture\nmodels for estimating population size from spatially replicated\ncounts.</a>” <em>Biometrics</em> 60.1 (2004): 108-115.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "doc/shared_states.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nset.seed(122)\nsimdat <- sim_mvgam(\n  trend_model = AR(),\n  prop_trend = 0.6,\n  mu = c(0, 1, 2),\n  family = poisson()\n)\ntrend_map <- data.frame(\n  series = unique(simdat$data_train$series),\n  trend = c(1, 1, 2)\n)\ntrend_map\n\n\n## --------------------------------------------------------------------------------\nall.equal(levels(trend_map$series), levels(simdat$data_train$series))\n\n\n## --------------------------------------------------------------------------------\nfake_mod <- mvgam(\n  y ~\n    # observation model formula, which has a\n    # different intercept per series\n    series - 1,\n\n  # process model formula, which has a shared seasonal smooth\n  # (each latent process model shares the SAME smooth)\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n\n  # AR1 dynamics (each latent process model has DIFFERENT)\n  # dynamics; processes are estimated using the noncentred\n  # parameterisation for improved efficiency\n  trend_model = AR(),\n  noncentred = TRUE,\n\n  # supplied trend_map\n  trend_map = trend_map,\n\n  # data and observation family\n  family = poisson(),\n  data = simdat$data_train,\n  run_model = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\nstancode(fake_mod)\n\n\n## --------------------------------------------------------------------------------\nfake_mod$model_data$Z\n\n\n## ----full_mod, include = FALSE, results='hide'-----------------------------------\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# full_mod <- mvgam(\n#   y ~ series - 1,\n#   trend_formula = ~ s(season, bs = \"cc\", k = 6),\n#   trend_model = AR(),\n#   noncentred = TRUE,\n#   trend_map = trend_map,\n#   family = poisson(),\n#   data = simdat$data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(full_mod)\n\n\n## --------------------------------------------------------------------------------\nplot(full_mod, type = \"trend\", series = 1)\nplot(full_mod, type = \"trend\", series = 2)\nplot(full_mod, type = \"trend\", series = 3)\n\n\n## --------------------------------------------------------------------------------\nset.seed(123)\n# simulate a nonlinear relationship using the mgcv function gamSim\nsignal_dat <- mgcv::gamSim(n = 100, eg = 1, scale = 1)\n\n# productivity is one of the variables in the simulated data\nproductivity <- signal_dat$x2\n\n# simulate the true signal, which already has a nonlinear relationship\n# with productivity; we will add in a fairly strong AR1 process to\n# contribute to the signal\ntrue_signal <- as.vector(\n  scale(signal_dat$y) +\n    arima.sim(100, model = list(ar = 0.8, sd = 0.1))\n)\n\n\n## --------------------------------------------------------------------------------\nplot(\n  true_signal,\n  type = \"l\",\n  bty = \"l\",\n  lwd = 2,\n  ylab = \"True signal\",\n  xlab = \"Time\"\n)\n\n\n## --------------------------------------------------------------------------------\n# Function to simulate a monotonic response to a covariate\nsim_monotonic <- function(x, a = 2.2, b = 2) {\n  out <- exp(a * x) / (6 + exp(b * x)) * -1\n  return(2.5 * as.vector(scale(out)))\n}\n\n# Simulated temperature covariate\ntemperature <- runif(100, -2, 2)\n\n# Simulate the three series\nsim_series <- function(n_series = 3, true_signal) {\n  temp_effects <- mgcv::gamSim(n = 100, eg = 7, scale = 0.05)\n  alphas <- rnorm(n_series, sd = 2)\n\n  do.call(\n    rbind,\n    lapply(seq_len(n_series), function(series) {\n      data.frame(\n        observed = rnorm(\n          length(true_signal),\n          mean = alphas[series] +\n            sim_monotonic(temperature, runif(1, 2.2, 3), runif(1, 2.2, 3)) +\n            true_signal,\n          sd = runif(1, 1, 2)\n        ),\n        series = paste0(\"sensor_\", series),\n        time = 1:length(true_signal),\n        temperature = temperature,\n        productivity = productivity,\n        true_signal = true_signal\n      )\n    })\n  )\n}\nmodel_dat <- sim_series(true_signal = true_signal) %>%\n  dplyr::mutate(series = factor(series))\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(\n  data = model_dat,\n  y = \"observed\",\n  series = \"all\"\n)\n\n\n## --------------------------------------------------------------------------------\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_1\"),\n  pch = 16,\n  bty = \"l\",\n  ylab = \"Sensor 1\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_2\"),\n  pch = 16,\n  bty = \"l\",\n  ylab = \"Sensor 2\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_3\"),\n  pch = 16,\n  bty = \"l\",\n  ylab = \"Sensor 3\",\n  xlab = \"Temperature\"\n)\n\n\n## ----sensor_mod, include = FALSE, results='hide'---------------------------------\nmod <- mvgam(\n  # formula for observations, allowing for different\n  # intercepts and smooth effects of temperature\n  formula = observed ~ series +\n    s(temperature, k = 10) +\n    s(series, temperature, bs = \"sz\", k = 8),\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n  trend_formula = ~ s(productivity, k = 8) - 1,\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n  trend_model = AR(),\n  noncentred = TRUE,\n  # trend_map forces all sensors to track the same\n  # latent signal\n  trend_map = data.frame(\n    series = unique(model_dat$series),\n    trend = c(1, 1, 1)\n  ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  burnin = 600,\n  control = list(adapt_delta = 0.95),\n  data = model_dat,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(\n#   formula =\n#   # formula for observations, allowing for different\n#   # intercepts and hierarchical smooth effects of temperature\n#     observed ~ series +\n#       s(temperature, k = 10) +\n#       s(series, temperature, bs = \"sz\", k = 8),\n#   trend_formula =\n#   # formula for the latent signal, which can depend\n#   # nonlinearly on productivity\n#     ~ s(productivity, k = 8) - 1,\n#   trend_model =\n#   # in addition to productivity effects, the signal is\n#   # assumed to exhibit temporal autocorrelation\n#     AR(),\n#   noncentred = TRUE,\n#   trend_map =\n#   # trend_map forces all sensors to track the same\n#   # latent signal\n#     data.frame(\n#       series = unique(model_dat$series),\n#       trend = c(1, 1, 1)\n#     ),\n#\n#   # informative priors on process error\n#   # and observation error will help with convergence\n#   priors = c(\n#     prior(normal(2, 0.5), class = sigma),\n#     prior(normal(1, 0.5), class = sigma_obs)\n#   ),\n#\n#   # Gaussian observations\n#   family = gaussian(),\n#   data = model_dat,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nconditional_effects(mod, type = \"link\")\n\n\n## --------------------------------------------------------------------------------\nplot_predictions(\n  mod,\n  condition = c(\"temperature\", \"series\", \"series\"),\n  points = 0.5\n) +\n  theme(legend.position = \"none\")\n\n\n## --------------------------------------------------------------------------------\nplot(mod, type = \"trend\") +\n  ggplot2::geom_point(\n    data = data.frame(time = 1:100, y = true_signal),\n    mapping = ggplot2::aes(x = time, y = y)\n  )\n"
  },
  {
    "path": "doc/shared_states.Rmd",
    "content": "---\ntitle: \"Shared latent states in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Shared latent states in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThis vignette gives an example of how `mvgam` can be used to estimate models where multiple observed time series share the same latent process model. For full details on the basic `mvgam` functionality, please see [the introductory vignette](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html).\n\n## The `trend_map` argument\nThe `trend_map` argument in the `mvgam()` function is an optional `data.frame` that can be used to specify which series should depend on which latent process models (called \"trends\" in `mvgam`). This can be particularly useful if we wish to force multiple observed time series to depend on the same latent trend process, but with different observation processes. If this argument is supplied, a latent factor model is set up by setting `use_lv = TRUE` and using the supplied `trend_map` to set up the shared trends. Users familiar with the `MARSS` family of packages will recognize this as a way of specifying the $Z$ matrix. This `data.frame` needs to have column names `series` and `trend`, with integer values in the `trend` column to state which trend each series should depend on. The `series` column should have a single unique entry for each time series in the data, with names that perfectly match the factor levels of the `series` variable in `data`). For example, if we were to simulate a collection of three integer-valued time series (using `sim_mvgam`), the following `trend_map` would force the first two series to share the same latent trend process:\n```{r}\nset.seed(122)\nsimdat <- sim_mvgam(\n  trend_model = AR(),\n  prop_trend = 0.6,\n  mu = c(0, 1, 2),\n  family = poisson()\n)\ntrend_map <- data.frame(\n  series = unique(simdat$data_train$series),\n  trend = c(1, 1, 2)\n)\ntrend_map\n```\n\nWe can see that the factor levels in `trend_map` match those in the data:\n```{r}\nall.equal(levels(trend_map$series), \n          levels(simdat$data_train$series))\n```\n\n### Checking `trend_map` with `run_model = FALSE`\nSupplying this `trend_map` to the `mvgam` function for a simple model, but setting `run_model = FALSE`, allows us to inspect the constructed `Stan` code and the data objects that would be used to condition the model. Here we will set up a model in which each series has a different observation process (with only a different intercept per series in this case), and the two latent dynamic process models evolve as independent AR1 processes that also contain a shared nonlinear smooth function to capture repeated seasonality. This model is not too complicated but it does show how we can learn shared and independent effects for collections of time series in the `mvgam` framework:\n```{r}\nfake_mod <- mvgam(\n  y ~\n    # observation model formula, which has a\n    # different intercept per series\n    series - 1,\n\n  # process model formula, which has a shared seasonal smooth\n  # (each latent process model shares the SAME smooth)\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n\n  # AR1 dynamics (each latent process model has DIFFERENT)\n  # dynamics; processes are estimated using the noncentred\n  # parameterisation for improved efficiency\n  trend_model = AR(),\n  noncentred = TRUE,\n\n  # supplied trend_map\n  trend_map = trend_map,\n\n  # data and observation family\n  family = poisson(),\n  data = simdat$data_train,\n  run_model = FALSE\n)\n```\n\nInspecting the `Stan` code shows how this model is a dynamic factor model in which the loadings are constructed to reflect the supplied `trend_map`:\n```{r}\nstancode(fake_mod)\n```\n\nNotice the line that states \"lv_coefs = Z;\". This uses the supplied $Z$ matrix to construct the loading coefficients. The supplied matrix now looks exactly like what you'd use if you were to create a similar model in the `MARSS` package:\n```{r}\nfake_mod$model_data$Z\n```\n\n### Fitting and inspecting the model\nThough this model doesn't perfectly match the data-generating process (which allowed each series to have different underlying dynamics), we can still fit it to show what the resulting inferences look like:\n```{r full_mod, include = FALSE, results='hide'}\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\nThe summary of this model is informative as it shows that only two latent process models have been estimated, even though we have three observed time series. The model converges well\n```{r}\nsummary(full_mod)\n```\n\nBoth series 1 and 2 share the exact same latent process estimates, while the estimates for series 3 are different:\n```{r}\nplot(full_mod, type = \"trend\", series = 1)\nplot(full_mod, type = \"trend\", series = 2)\nplot(full_mod, type = \"trend\", series = 3)\n```\n\nHowever, forecasts for series' 1 and 2 will differ because they have different intercepts in the observation model\n\n## Example: signal detection\nNow we will explore a more complicated example. Here we simulate a true hidden signal that we are trying to track. This signal depends nonlinearly on some covariate (called `productivity`, which represents a measure of how productive the landscape is). The signal also demonstrates a fairly large amount of temporal autocorrelation:\n```{r}\nset.seed(123)\n# simulate a nonlinear relationship using the mgcv function gamSim\nsignal_dat <- mgcv::gamSim(n = 100, eg = 1, scale = 1)\n\n# productivity is one of the variables in the simulated data\nproductivity <- signal_dat$x2\n\n# simulate the true signal, which already has a nonlinear relationship\n# with productivity; we will add in a fairly strong AR1 process to\n# contribute to the signal\ntrue_signal <- as.vector(scale(signal_dat$y) +\n  arima.sim(100, model = list(ar = 0.8, sd = 0.1)))\n```\n\nPlot the signal to inspect it's evolution over time\n```{r}\nplot(\n  true_signal,\n  type = \"l\",\n  bty = \"l\", lwd = 2,\n  ylab = \"True signal\",\n  xlab = \"Time\"\n)\n```\n\nNext we simulate three sensors that are trying to track the same hidden signal. All of these sensors have different observation errors that can depend nonlinearly on a second external covariate, called `temperature` in this example. Again this makes use of `gamSim`\n```{r}\n# Function to simulate a monotonic response to a covariate\nsim_monotonic <- function(x, a = 2.2, b = 2) {\n  out <- exp(a * x) / (6 + exp(b * x)) * -1\n  return(2.5 * as.vector(scale(out)))\n}\n\n# Simulated temperature covariate\ntemperature <- runif(100, -2, 2)\n\n# Simulate the three series\nsim_series <- function(n_series = 3, true_signal) {\n  temp_effects <- mgcv::gamSim(n = 100, eg = 7, scale = 0.05)\n  alphas <- rnorm(n_series, sd = 2)\n\n  do.call(rbind, lapply(seq_len(n_series), function(series) {\n    data.frame(\n      observed = rnorm(length(true_signal),\n        mean = alphas[series] +\n          sim_monotonic(temperature, \n                            runif(1, 2.2, 3),\n                            runif(1, 2.2, 3)) +\n          true_signal,\n        sd = runif(1, 1, 2)\n      ),\n      series = paste0(\"sensor_\", series),\n      time = 1:length(true_signal),\n      temperature = temperature,\n      productivity = productivity,\n      true_signal = true_signal\n    )\n  }))\n}\nmodel_dat <- sim_series(true_signal = true_signal) %>%\n  dplyr::mutate(series = factor(series))\n```\n\nPlot the sensor observations\n```{r}\nplot_mvgam_series(\n  data = model_dat, y = \"observed\",\n  series = \"all\"\n)\n```\n\nAnd now plot the observed relationships between the three sensors and the `temperature` covariate\n```{r}\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_1\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 1\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_2\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 2\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_3\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 3\",\n  xlab = \"Temperature\"\n)\n```\n\n### The shared signal model\nNow we can formulate and fit a model that allows each sensor's observation error to depend nonlinearly on `temperature` while allowing the true signal to depend nonlinearly on `productivity`. By fixing all of the values in the `trend` column to `1` in the `trend_map`, we are assuming that all observation sensors are tracking the same latent signal. We use informative priors on the two variance components (process error and observation error), which reflect our prior belief that the observation error is smaller overall than the true process error\n```{r sensor_mod, include = FALSE, results='hide'}\nmod <- mvgam(\n  formula =\n  # formula for observations, allowing for different\n  # intercepts and smooth effects of temperature\n    observed ~ series +\n      s(temperature, k = 10) +\n      s(series, temperature, bs = \"sz\", k = 8),\n  trend_formula =\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n    ~ s(productivity, k = 8) - 1,\n  trend_model =\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n    AR(),\n  noncentred = TRUE,\n  trend_map =\n  # trend_map forces all sensors to track the same\n  # latent signal\n    data.frame(\n      series = unique(model_dat$series),\n      trend = c(1, 1, 1)\n    ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  burnin = 600,\n  control = list(adapt_delta = 0.95),\n  data = model_dat,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(\n  formula =\n  # formula for observations, allowing for different\n  # intercepts and hierarchical smooth effects of temperature\n    observed ~ series +\n      s(temperature, k = 10) +\n      s(series, temperature, bs = \"sz\", k = 8),\n  trend_formula =\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n    ~ s(productivity, k = 8) - 1,\n  trend_model =\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n    AR(),\n  noncentred = TRUE,\n  trend_map =\n  # trend_map forces all sensors to track the same\n  # latent signal\n    data.frame(\n      series = unique(model_dat$series),\n      trend = c(1, 1, 1)\n    ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  data = model_dat,\n  silent = 2\n)\n```\n\nView a reduced version of the model summary because there will be many spline coefficients in this model\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\n### Inspecting effects on both process and observation models\nDon't pay much attention to the approximate *p*-values of the smooth terms. The calculation for these values is incredibly sensitive to the estimates for the smoothing parameters so I don't tend to find them to be very meaningful. What are meaningful, however, are prediction-based plots of the smooth functions. All main effects can be quickly plotted with `conditional_effects`:\n```{r}\nconditional_effects(mod, type = \"link\")\n```\n\n`conditional_effects` is simply a wrapper to the more flexible `plot_predictions` function from the `marginaleffects` package. We can get more useful plots of these effects using this function for further customisation:\n```{r}\nplot_predictions(\n  mod,\n  condition = c(\"temperature\", \"series\", \"series\"),\n  points = 0.5\n) +\n  theme(legend.position = \"none\")\n```\n\nWe have successfully estimated effects, some of them nonlinear, that impact the hidden process AND the observations. All in a single joint model. But there can always be challenges with these models, particularly when estimating both process and observation error at the same time.\n\n### Recovering the hidden signal\nA final but very key question is whether we can successfully recover the true hidden signal. The `trend` slot in the returned model parameters has the estimates for this signal, which we can easily plot using the `mvgam` S3 method for `plot`. We can also overlay the true values for the hidden signal, which shows that our model has done a good job of recovering it:\n```{r}\nplot(mod, \n     type = \"trend\") +\n  ggplot2::geom_point(data = data.frame(time = 1:100,\n                                        y = true_signal),\n                      mapping = ggplot2::aes(x = time,\n                                             y = y))\n```\n\n## Further reading\nThe following papers and resources offer a lot of useful material about other types of State-Space models and how they can be applied in practice:\n  \nAuger‐Méthé, Marie, et al. [\"A guide to state–space modeling of ecological time series.](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470)\" *Ecological Monographs* 91.4 (2021): e01470.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929  \n  \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. \"[MARSS: multivariate autoregressive state-space models for analyzing time-series data.](https://journal.r-project.org/articles/RJ-2012-002/)\" *R Journal*. 4.1 (2012): 11.\n  \nWard, Eric J., et al. \"[Inferring spatial structure from time‐series data: using multivariate state‐space models to detect metapopulation structure of California sea lions in the Gulf of California, Mexico.](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x)\" *Journal of Applied Ecology* 47.1 (2010): 47-56.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "doc/shared_states.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Shared latent states in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Shared latent states in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#the-trend_map-argument\" id=\"toc-the-trend_map-argument\">The <code>trend_map</code> argument</a>\n<ul>\n<li><a href=\"#checking-trend_map-with-run_model-false\" id=\"toc-checking-trend_map-with-run_model-false\">Checking\n<code>trend_map</code> with <code>run_model = FALSE</code></a></li>\n<li><a href=\"#fitting-and-inspecting-the-model\" id=\"toc-fitting-and-inspecting-the-model\">Fitting and inspecting the\nmodel</a></li>\n</ul></li>\n<li><a href=\"#example-signal-detection\" id=\"toc-example-signal-detection\">Example: signal detection</a>\n<ul>\n<li><a href=\"#the-shared-signal-model\" id=\"toc-the-shared-signal-model\">The shared signal model</a></li>\n<li><a href=\"#inspecting-effects-on-both-process-and-observation-models\" id=\"toc-inspecting-effects-on-both-process-and-observation-models\">Inspecting\neffects on both process and observation models</a></li>\n<li><a href=\"#recovering-the-hidden-signal\" id=\"toc-recovering-the-hidden-signal\">Recovering the hidden\nsignal</a></li>\n</ul></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>This vignette gives an example of how <code>mvgam</code> can be used\nto estimate models where multiple observed time series share the same\nlatent process model. For full details on the basic <code>mvgam</code>\nfunctionality, please see <a href=\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\">the\nintroductory vignette</a>.</p>\n<div id=\"the-trend_map-argument\" class=\"section level2\">\n<h2>The <code>trend_map</code> argument</h2>\n<p>The <code>trend_map</code> argument in the <code>mvgam()</code>\nfunction is an optional <code>data.frame</code> that can be used to\nspecify which series should depend on which latent process models\n(called “trends” in <code>mvgam</code>). This can be particularly useful\nif we wish to force multiple observed time series to depend on the same\nlatent trend process, but with different observation processes. If this\nargument is supplied, a latent factor model is set up by setting\n<code>use_lv = TRUE</code> and using the supplied <code>trend_map</code>\nto set up the shared trends. Users familiar with the <code>MARSS</code>\nfamily of packages will recognize this as a way of specifying the <span class=\"math inline\">\\(Z\\)</span> matrix. This <code>data.frame</code>\nneeds to have column names <code>series</code> and <code>trend</code>,\nwith integer values in the <code>trend</code> column to state which\ntrend each series should depend on. The <code>series</code> column\nshould have a single unique entry for each time series in the data, with\nnames that perfectly match the factor levels of the <code>series</code>\nvariable in <code>data</code>). For example, if we were to simulate a\ncollection of three integer-valued time series (using\n<code>sim_mvgam</code>), the following <code>trend_map</code> would\nforce the first two series to share the same latent trend process:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">122</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>simdat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(</span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">prop_trend =</span> <span class=\"fl\">0.6</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"at\">mu =</span> <span class=\"fu\">c</span>(<span class=\"dv\">0</span>, <span class=\"dv\">1</span>, <span class=\"dv\">2</span>),</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>trend_map <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">unique</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series),</span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend =</span> <span class=\"fu\">c</span>(<span class=\"dv\">1</span>, <span class=\"dv\">1</span>, <span class=\"dv\">2</span>)</span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" tabindex=\"-1\"></a>trend_map</span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     series trend</span></span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 series_1     1</span></span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 series_2     1</span></span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 series_3     2</span></span></code></pre></div>\n<p>We can see that the factor levels in <code>trend_map</code> match\nthose in the data:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">all.equal</span>(<span class=\"fu\">levels</span>(trend_map<span class=\"sc\">$</span>series), </span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a>          <span class=\"fu\">levels</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series))</span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] TRUE</span></span></code></pre></div>\n<div id=\"checking-trend_map-with-run_model-false\" class=\"section level3\">\n<h3>Checking <code>trend_map</code> with\n<code>run_model = FALSE</code></h3>\n<p>Supplying this <code>trend_map</code> to the <code>mvgam</code>\nfunction for a simple model, but setting <code>run_model = FALSE</code>,\nallows us to inspect the constructed <code>Stan</code> code and the data\nobjects that would be used to condition the model. Here we will set up a\nmodel in which each series has a different observation process (with\nonly a different intercept per series in this case), and the two latent\ndynamic process models evolve as independent AR1 processes that also\ncontain a shared nonlinear smooth function to capture repeated\nseasonality. This model is not too complicated but it does show how we\ncan learn shared and independent effects for collections of time series\nin the <code>mvgam</code> framework:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>fake_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span></span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a>    <span class=\"co\"># observation model formula, which has a</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a>    <span class=\"co\"># different intercept per series</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a>    series <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which has a shared seasonal smooth</span></span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a>  <span class=\"co\"># (each latent process model shares the SAME smooth)</span></span>\n<span id=\"cb3-9\"><a href=\"#cb3-9\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">6</span>),</span>\n<span id=\"cb3-10\"><a href=\"#cb3-10\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-11\"><a href=\"#cb3-11\" tabindex=\"-1\"></a>  <span class=\"co\"># AR1 dynamics (each latent process model has DIFFERENT)</span></span>\n<span id=\"cb3-12\"><a href=\"#cb3-12\" tabindex=\"-1\"></a>  <span class=\"co\"># dynamics; processes are estimated using the noncentred</span></span>\n<span id=\"cb3-13\"><a href=\"#cb3-13\" tabindex=\"-1\"></a>  <span class=\"co\"># parameterisation for improved efficiency</span></span>\n<span id=\"cb3-14\"><a href=\"#cb3-14\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb3-15\"><a href=\"#cb3-15\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb3-16\"><a href=\"#cb3-16\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-17\"><a href=\"#cb3-17\" tabindex=\"-1\"></a>  <span class=\"co\"># supplied trend_map</span></span>\n<span id=\"cb3-18\"><a href=\"#cb3-18\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb3-19\"><a href=\"#cb3-19\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-20\"><a href=\"#cb3-20\" tabindex=\"-1\"></a>  <span class=\"co\"># data and observation family</span></span>\n<span id=\"cb3-21\"><a href=\"#cb3-21\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb3-22\"><a href=\"#cb3-22\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb3-23\"><a href=\"#cb3-23\" tabindex=\"-1\"></a>  <span class=\"at\">run_model =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb3-24\"><a href=\"#cb3-24\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Inspecting the <code>Stan</code> code shows how this model is a\ndynamic factor model in which the loadings are constructed to reflect\nthe supplied <code>trend_map</code>:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(fake_mod)</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp_trend; // number of trend smoothing parameters</span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_lv; // number of dynamic factors</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_series, n_lv] Z; // matrix mapping series to latent states</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis_trend; // number of trend basis coefficients</span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients</span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix</span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb4-16\"><a href=\"#cb4-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_lv] int ytimes_trend;</span></span>\n<span id=\"cb4-17\"><a href=\"#cb4-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb4-18\"><a href=\"#cb4-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[4, 4] S_trend1; // mgcv smooth penalty matrix S_trend1</span></span>\n<span id=\"cb4-19\"><a href=\"#cb4-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb4-20\"><a href=\"#cb4-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb4-21\"><a href=\"#cb4-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb4-22\"><a href=\"#cb4-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-23\"><a href=\"#cb4-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed data {</span></span>\n<span id=\"cb4-24\"><a href=\"#cb4-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-25\"><a href=\"#cb4-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-26\"><a href=\"#cb4-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb4-27\"><a href=\"#cb4-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb4-28\"><a href=\"#cb4-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb4-29\"><a href=\"#cb4-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_raw_trend;</span></span>\n<span id=\"cb4-30\"><a href=\"#cb4-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-31\"><a href=\"#cb4-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent state SD terms</span></span>\n<span id=\"cb4-32\"><a href=\"#cb4-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_lv] sigma;</span></span>\n<span id=\"cb4-33\"><a href=\"#cb4-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-34\"><a href=\"#cb4-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent state AR1 terms</span></span>\n<span id=\"cb4-35\"><a href=\"#cb4-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=-1, upper=1&gt;[n_lv] ar1;</span></span>\n<span id=\"cb4-36\"><a href=\"#cb4-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-37\"><a href=\"#cb4-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw latent states</span></span>\n<span id=\"cb4-38\"><a href=\"#cb4-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_lv] LV_raw;</span></span>\n<span id=\"cb4-39\"><a href=\"#cb4-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-40\"><a href=\"#cb4-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb4-41\"><a href=\"#cb4-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp_trend] lambda_trend;</span></span>\n<span id=\"cb4-42\"><a href=\"#cb4-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-43\"><a href=\"#cb4-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb4-44\"><a href=\"#cb4-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw latent states</span></span>\n<span id=\"cb4-45\"><a href=\"#cb4-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n * n_lv] trend_mus;</span></span>\n<span id=\"cb4-46\"><a href=\"#cb4-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span id=\"cb4-47\"><a href=\"#cb4-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-48\"><a href=\"#cb4-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb4-49\"><a href=\"#cb4-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb4-50\"><a href=\"#cb4-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-51\"><a href=\"#cb4-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent states</span></span>\n<span id=\"cb4-52\"><a href=\"#cb4-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_lv] LV;</span></span>\n<span id=\"cb4-53\"><a href=\"#cb4-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_trend;</span></span>\n<span id=\"cb4-54\"><a href=\"#cb4-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-55\"><a href=\"#cb4-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // observation model basis coefficients</span></span>\n<span id=\"cb4-56\"><a href=\"#cb4-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span id=\"cb4-57\"><a href=\"#cb4-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-58\"><a href=\"#cb4-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // process model basis coefficients</span></span>\n<span id=\"cb4-59\"><a href=\"#cb4-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend];</span></span>\n<span id=\"cb4-60\"><a href=\"#cb4-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-61\"><a href=\"#cb4-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent process linear predictors</span></span>\n<span id=\"cb4-62\"><a href=\"#cb4-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   trend_mus = X_trend * b_trend;</span></span>\n<span id=\"cb4-63\"><a href=\"#cb4-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   LV = LV_raw .* rep_matrix(sigma&#39;, rows(LV_raw));</span></span>\n<span id=\"cb4-64\"><a href=\"#cb4-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (j in 1 : n_lv) {</span></span>\n<span id=\"cb4-65\"><a href=\"#cb4-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     LV[1, j] += trend_mus[ytimes_trend[1, j]];</span></span>\n<span id=\"cb4-66\"><a href=\"#cb4-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (i in 2 : n) {</span></span>\n<span id=\"cb4-67\"><a href=\"#cb4-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       LV[i, j] += trend_mus[ytimes_trend[i, j]]</span></span>\n<span id=\"cb4-68\"><a href=\"#cb4-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]);</span></span>\n<span id=\"cb4-69\"><a href=\"#cb4-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb4-70\"><a href=\"#cb4-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-71\"><a href=\"#cb4-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-72\"><a href=\"#cb4-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // derived latent states</span></span>\n<span id=\"cb4-73\"><a href=\"#cb4-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (i in 1 : n) {</span></span>\n<span id=\"cb4-74\"><a href=\"#cb4-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (s in 1 : n_series) {</span></span>\n<span id=\"cb4-75\"><a href=\"#cb4-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);</span></span>\n<span id=\"cb4-76\"><a href=\"#cb4-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb4-77\"><a href=\"#cb4-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-78\"><a href=\"#cb4-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-79\"><a href=\"#cb4-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb4-80\"><a href=\"#cb4-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for seriesseries_1...</span></span>\n<span id=\"cb4-81\"><a href=\"#cb4-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-82\"><a href=\"#cb4-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-83\"><a href=\"#cb4-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for seriesseries_2...</span></span>\n<span id=\"cb4-84\"><a href=\"#cb4-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-85\"><a href=\"#cb4-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-86\"><a href=\"#cb4-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for seriesseries_3...</span></span>\n<span id=\"cb4-87\"><a href=\"#cb4-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[3] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-88\"><a href=\"#cb4-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-89\"><a href=\"#cb4-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for AR parameters</span></span>\n<span id=\"cb4-90\"><a href=\"#cb4-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ar1 ~ std_normal();</span></span>\n<span id=\"cb4-91\"><a href=\"#cb4-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-92\"><a href=\"#cb4-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for latent state SD parameters</span></span>\n<span id=\"cb4-93\"><a href=\"#cb4-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb4-94\"><a href=\"#cb4-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   to_vector(LV_raw) ~ std_normal();</span></span>\n<span id=\"cb4-95\"><a href=\"#cb4-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-96\"><a href=\"#cb4-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // dynamic process models</span></span>\n<span id=\"cb4-97\"><a href=\"#cb4-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-98\"><a href=\"#cb4-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)_trend...</span></span>\n<span id=\"cb4-99\"><a href=\"#cb4-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[1] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-100\"><a href=\"#cb4-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-101\"><a href=\"#cb4-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(season)_trend...</span></span>\n<span id=\"cb4-102\"><a href=\"#cb4-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[2 : 5] ~ multi_normal_prec(zero_trend[2 : 5],</span></span>\n<span id=\"cb4-103\"><a href=\"#cb4-103\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          S_trend1[1 : 4, 1 : 4]</span></span>\n<span id=\"cb4-104\"><a href=\"#cb4-104\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          * lambda_trend[1]);</span></span>\n<span id=\"cb4-105\"><a href=\"#cb4-105\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda_trend ~ normal(5, 30);</span></span>\n<span id=\"cb4-106\"><a href=\"#cb4-106\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb4-107\"><a href=\"#cb4-107\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb4-108\"><a href=\"#cb4-108\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     vector[n_nonmissing] flat_trends;</span></span>\n<span id=\"cb4-109\"><a href=\"#cb4-109\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_trends = to_vector(trend)[obs_ind];</span></span>\n<span id=\"cb4-110\"><a href=\"#cb4-110\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span></span>\n<span id=\"cb4-111\"><a href=\"#cb4-111\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               append_row(b, 1.0));</span></span>\n<span id=\"cb4-112\"><a href=\"#cb4-112\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-113\"><a href=\"#cb4-113\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-114\"><a href=\"#cb4-114\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb4-115\"><a href=\"#cb4-115\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb4-116\"><a href=\"#cb4-116\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb4-117\"><a href=\"#cb4-117\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp_trend] rho_trend;</span></span>\n<span id=\"cb4-118\"><a href=\"#cb4-118\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_lv] penalty;</span></span>\n<span id=\"cb4-119\"><a href=\"#cb4-119\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb4-120\"><a href=\"#cb4-120\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   penalty = 1.0 / (sigma .* sigma);</span></span>\n<span id=\"cb4-121\"><a href=\"#cb4-121\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   rho_trend = log(lambda_trend);</span></span>\n<span id=\"cb4-122\"><a href=\"#cb4-122\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-123\"><a href=\"#cb4-123\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_series, n_lv] lv_coefs = Z;</span></span>\n<span id=\"cb4-124\"><a href=\"#cb4-124\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb4-125\"><a href=\"#cb4-125\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb4-126\"><a href=\"#cb4-126\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb4-127\"><a href=\"#cb4-127\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span></span>\n<span id=\"cb4-128\"><a href=\"#cb4-128\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb4-129\"><a href=\"#cb4-129\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-130\"><a href=\"#cb4-130\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>Notice the line that states “lv_coefs = Z;”. This uses the supplied\n<span class=\"math inline\">\\(Z\\)</span> matrix to construct the loading\ncoefficients. The supplied matrix now looks exactly like what you’d use\nif you were to create a similar model in the <code>MARSS</code>\npackage:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>fake_mod<span class=\"sc\">$</span>model_data<span class=\"sc\">$</span>Z</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;      [,1] [,2]</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1,]    1    0</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [2,]    1    0</span></span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [3,]    0    1</span></span></code></pre></div>\n</div>\n<div id=\"fitting-and-inspecting-the-model\" class=\"section level3\">\n<h3>Fitting and inspecting the model</h3>\n<p>Though this model doesn’t perfectly match the data-generating process\n(which allowed each series to have different underlying dynamics), we\ncan still fit it to show what the resulting inferences look like:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a>full_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> series <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">6</span>),</span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary of this model is informative as it shows that only two\nlatent process models have been estimated, even though we have three\nobserved time series. The model converges well</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(full_mod)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ series - 1</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(season, bs = &quot;cc&quot;, k = 6)</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-16\"><a href=\"#cb7-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb7-17\"><a href=\"#cb7-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb7-18\"><a href=\"#cb7-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-19\"><a href=\"#cb7-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb7-20\"><a href=\"#cb7-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 </span></span>\n<span id=\"cb7-21\"><a href=\"#cb7-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-22\"><a href=\"#cb7-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb7-23\"><a href=\"#cb7-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb7-24\"><a href=\"#cb7-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-25\"><a href=\"#cb7-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb7-26\"><a href=\"#cb7-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 75 </span></span>\n<span id=\"cb7-27\"><a href=\"#cb7-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-28\"><a href=\"#cb7-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb7-29\"><a href=\"#cb7-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb7-30\"><a href=\"#cb7-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb7-31\"><a href=\"#cb7-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb7-32\"><a href=\"#cb7-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-33\"><a href=\"#cb7-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-34\"><a href=\"#cb7-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-35\"><a href=\"#cb7-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_1 -2.70 -0.63   1.4 1.01   700</span></span>\n<span id=\"cb7-36\"><a href=\"#cb7-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_2 -1.70  0.31   2.3 1.01   702</span></span>\n<span id=\"cb7-37\"><a href=\"#cb7-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_3 -0.76  1.30   3.3 1.01   703</span></span>\n<span id=\"cb7-38\"><a href=\"#cb7-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-39\"><a href=\"#cb7-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb7-40\"><a href=\"#cb7-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-41\"><a href=\"#cb7-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.37 0.53  0.71    1   701</span></span>\n<span id=\"cb7-42\"><a href=\"#cb7-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[2] 0.49 0.61  0.78    1   693</span></span>\n<span id=\"cb7-43\"><a href=\"#cb7-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-44\"><a href=\"#cb7-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb7-45\"><a href=\"#cb7-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         2.5%    50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-46\"><a href=\"#cb7-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] -0.59 -0.240  0.17 1.00   462</span></span>\n<span id=\"cb7-47\"><a href=\"#cb7-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[2] -0.25  0.048  0.35 1.01   349</span></span>\n<span id=\"cb7-48\"><a href=\"#cb7-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-49\"><a href=\"#cb7-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-50\"><a href=\"#cb7-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                     2.5%    50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-51\"><a href=\"#cb7-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)_trend -1.300  0.730 2.800 1.01   694</span></span>\n<span id=\"cb7-52\"><a href=\"#cb7-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).1_trend -0.310 -0.061 0.190 1.00   947</span></span>\n<span id=\"cb7-53\"><a href=\"#cb7-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).2_trend -0.062  0.230 0.510 1.00   753</span></span>\n<span id=\"cb7-54\"><a href=\"#cb7-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).3_trend -0.480 -0.200 0.097 1.00   620</span></span>\n<span id=\"cb7-55\"><a href=\"#cb7-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).4_trend  0.350  0.690 0.960 1.00   584</span></span>\n<span id=\"cb7-56\"><a href=\"#cb7-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-57\"><a href=\"#cb7-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb7-58\"><a href=\"#cb7-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb7-59\"><a href=\"#cb7-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season) 2.324      4   24.2 8.27e-05 ***</span></span>\n<span id=\"cb7-60\"><a href=\"#cb7-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb7-61\"><a href=\"#cb7-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb7-62\"><a href=\"#cb7-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-63\"><a href=\"#cb7-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb7-64\"><a href=\"#cb7-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb7-65\"><a href=\"#cb7-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb7-66\"><a href=\"#cb7-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb7-67\"><a href=\"#cb7-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb7-68\"><a href=\"#cb7-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-69\"><a href=\"#cb7-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb7-70\"><a href=\"#cb7-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb7-71\"><a href=\"#cb7-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb7-72\"><a href=\"#cb7-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-73\"><a href=\"#cb7-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Both series 1 and 2 share the exact same latent process estimates,\nwhile the estimates for series 3 are different:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(full_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(full_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAAAt1BMVEUAAAAAADoAAGYAOpAAZrYzMzM6AAA6ADo6AGY6kNtNTU1NTW5NTY5NbqtNjshmAABmAGZmtv9uTU1uTW5uTY5ubo5ubqtuq+SOTU2OTW6OTY6Obk2ObquOyP+PJyeQOgCQtpCQ2/+iUFCrbk2rbm6rjk2r5OSr5P+2ZgC2//+5fHzHmZnIjk3I///bkDrb/7bb///cvLzkq27k////tmb/yI7/25D/5Kv//7b//8j//9v//+T///9FoeiMAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAgAElEQVR4nO3dbaPjtnUg4EliJ/XsJlmnbZy0a7mmu7UDJNPSdjyxrf//u/ZKJIDzChyAoEjdAT7YV1fgwQHwCAQpXc2b6yij7FDeHJ3AKK+zDFij7FIGrFF2KWVYP3/1+QPyGOWVlTKsb98OWKNUlyKs9//67wPWKNWlBOvn//yv5VT48UsZG7JRrKVk5dvPwB5rwBrFWgpW3v/xuwFrlIZSsPLt21v5zFZ5lFFiqbrdMGCNYi0D1ii7lCorA9Yo1jJgjbJLGbBG2aUMWKPsUgasUXYpA9You5QBa5RdyoA1yi5lwBpllzJgjbJLGbBG2aUMWKPsUgasUXYpA9You5QBa5RdyoD1yDIfncDjyoD1yDJgdag8Ci/zhyNrwHpkGbA6VB6Fl2eB1SHNAeuRZX4SWQPWk5UBq0PlUXiZn0RWhywHrEeWAatD5VF4GbA6VB6Fl/lJZHXIcsB6ZBmwOlQehZf5SWQNWE9WngjW1iwHrEeWAatD5VF4mZ9E1oCFynNM2LPA2pjlgPXIMmB1qPz48iQTdn5ZPZJ8VbCeY8KeBda2LAesB5YBq0flx5dnmbBnyXNTjNcF6+Qz9mSwNqU5YD2wDFg9Kj++nH7GBqwelR9fTj9lzwZrS54D1gPLbrA6BxywcBmweoUbsFA5/VlmL1i9Aw5YuAxY3eINWLA8D6zuEHrHG7BgOf0V106wdoA6YMGyaTAeAXLA6lH58WXA6hZvwAJl22g8L6w9oG7Pc8AKR/dNRm5jwOpQ+eHlQ4bVP+CAFcu20XhaWDtJHbBiOT2sLhOmRO0YcMAiZdtwDFgk4oAVyocJa69N24AVy4DVN+SAtZZt4zFg0ZAD1lo2wtIP6jVrc5cZk2P2igdjboo7YMWD9efUB9VtDFjbKz+8bBqPAYvHHLCW8iHC6i/1OmDRMm8ZkAFLiDlg3UtHWPjwAauhDFjxYPgIP3XVnqpuY8DaXvnhZa4cEaJnwGIxP0RYQo8/QFj9pV4HLP6r3WDp26+qck5Y7MgBi/yGlLoQRM+sP1WZqJJhexQlYnuMTNANcZ8UltDhx8DKBS61OWB1qbxr2QMW4qM/k4OVb7R6woqVagGIw5ZNc8BisMqzQg+Ww1fByjY6z74vrFoBUrUBCxapw+eAlWl1PgUsWm/AgsUEq7jjoQfL4SthZZ8+FpZYccCCpQ8sogfBUh7kYJWavcHyxuTWI0rPN8HK7C151A8Lltjj08DSKhwNS6w6YMFihFW8RtMiwgczeyqbVV9YFVeZNbDUE31LWKUMWELEHWF5U27FtnCDpoByXX5k1SDq5VXDKlz8Pxmsjbtssa5w5CuA1Zq4fFxnWDP8eZbraQmozx8IS678WmDhLFszPyesYrMLLG9ITcrwXLDK6T8U1vxoWLnYHJY43OeFVdFXVhn9mtf0hbCG9J8QlnJYJSz87FlhoRT1BosRlYGRjjTAsqT/SFhSFxpk1cDSYxthzeozmfbVCr5K1llhmbJ/XlilcTbAIpd+0iLVBEvZlzwRrNx7T7bsHwhL7EI9LK3HvWHNUo6PhEVq9YWFeseq5mAZs3/tsNTgvWGVGw2wfB9Y5p6KlWehc6lqBpZ1zh4HS+6CLUvDURKqXGz0pKDnbLDKHS7GYrXFI+cZ3W9Tmi1mvzeszPbENiQ8YLbD5uFGTwp6NsFSrtENsHIXFIUOaz2V6i7VxSPn+RlgpRx4QmLqxYwLHRYHUI1DDuaPaBQ9ZLnROcDymbwGLEuBSfCExDHZAgteJJfGm80aeCgMfeYqivdGr7ENlrKRyHdUrnuvLh86z6eHBVMTspTGpJixOpDzE8DyHWGZe6pUfqkuH3l77L36AZ9iW2vZDxbuspClNCRPC6vc6Jxg+UxeSori/Jt6qlTWYN0fPw0svQv4t8WM9YGc8UVyabxZu+AxeDSLzxh6K9aogoUDsaDWjip11SPvj18NLDB8FUHpM/WwhDXqKsPSNopab8Ua3pVh5bDnGswNnTgsypH3x/BG7muAVcw4M5BzN1jgQBpFj1hudCawtJ0ajQge5RrMDZ04LMqR98c6rGJbobwuWKKsXCQSljTSH5brBcvcUa2yduTtoffqubDYVijHwRJ+X0o5N5DzuWDxOrMCi84bjQge5NrLjZxUWTvy9vDUsIp94L8uppwbyFmFlbs7QOKSVuywDI3OMiw2bzQkeJBtUB85cVC0Q2+PvFfPhaW2YnkmWNmBnMm1TH7A8VO4JjiQBlEDGhqd77DcgLWxcrEL7NfFlLMDOT8Alh7R0Ogswpr5vNGQ6UFheK3jlj309ug1wZrLsPIDOe8AiwbRIxoanSVYtKaQkx2WPbnMMbdHHsvSBy5TzgOrmHJ+CGdykZwb6UfAYnXmBZZjsOgFDY14lV5zuC3ca0NyerL3cCeGVe4C/X0x5dxwZGFl9kQkci51Vq/QW6EOg0VrSjnBhrUWHwZLbYOV08AqplyoOjfBYrsqPTF2VKG3Qh0Ki9UED8WGlQZ9FpbSH+WQJd5rhKXlXKg5s9svuYj4KVxTT0sNaOnGvMKKsk4MC71D8AphiWd3eQSX8e0BK5OWGjDfjViHwBI6LOU018KaWcPlgioTWNIZmA8pKQ+Hxa6m1T5e+Zc5qjWPhVXsyFoJw5I6LOU0C+2i41mnrVMhHLIEfPWw1N0q6919PMyyyDPoYSYtLZ6hKwCW0yGIOR0By50VVrkL5T7WwvKtsHDFTFpaPL0vuAMlWHJOJVi8z9bk+CFrxFcOCz7I1+wAi9wCEGMoAfWukN48Kyyh3ezs38pTwyLrgS5LTy8+MsDSAupdwR3wKyxXCUtoFv5S6LI5O3JECIjeIRDbLQoYsKyw+FvShs42wdKzkFqU+mzOjhwRImqw5BbEcnZY7K6OMoAzuJYpy8JPLKMZHup5KfH0nsCa8xPAihGdssmSWxDLPrCKXTBteMGDQs12WHESHwHLhaKcumhOuWChiF02Z4cPiSEdWbJ4sCKBE8OCj/I1ryeGNcMEp42whMHrCCuFpLB4u0UCR8Eq1yhvZfnFvCpLz+uKYM1FWOzz6rme4KZLsFhOuWChyD22pye02RvWN2/e/PIvL////v7fQuV8KXXh4bCyjd3/H2BlaoJ61r7OBNZkhFUOthalx/b0hDY9f4eABSsSSFa++dX/XL9/8+npYBXuLaXKrweWngVr8/yw/vH7T+///eiEsEo1r3FvXC/ruhGWpYGY4LTKkvdEtKlssKVot1js6QlNCrB4hqVCYF1/+uKj7bAKXShVMQ8zHsDdYKGn6EdJLA3EBDVYdEwKsEBqWofN6QlNprsiBJYQXy34VHi9AXtTD4u0U+hCqQoN0gDLIgt/3C58+g48hSviB8a+pqrzyWGB0hnW9ZtffHn7309fHA3LUIP1L4xHKyzfCMuc47zCmh4Ky5AeL+HqlW2yeHy99LndMGAVc5yLsODDYqyQTWGTZUiPl3hbpD+sf/wfcdF6JCzbGMAmESyDLLx1ehisyQCrHCtkk4dlCcmLBIvRL5VOsKpvRRdr2MYANpmuZfrC8hlY9hznPWB5FVbFqs9KvC3yZLByN6bEThRqhto9YcHDM7AqcpyzsMpjIjYbOisHbD0TgvttA9ZMYZVlibDWpzIPwI0sW46x7gprEu6Q7gPLmB8pj4H1/g9v335+Qlh8q+PT5zMfA0sLyEozLOXddJTN3VV/WPy2SF9YP/756+v7f/768bCKvcf9m3eF5fkD0YHSZszwcrmssh4CS86m2IgKi+axBdbff/fyn79+nq28dMHuytBnMyx4X5vAKsnym2DJEeXnwqDkYUkB9VixRb9+LE+oqSaab+QhsG7ltmpdrx+/lPPAoh9Bu/9qqlqyMrDoAzss8cmYYG9YvhaWlJ4Ca+KXhTSPBliw/PzVZ8XK82Gw0DVX1ZJFrwNBff1BEZYma15hrbIEB1JAMZQVlpig8Dv+m+6w/vH7T9lbhT/+6TO5sgZLGCA+OMUahQodYa2PXCdY0tMCLL5kSQHFUBQWFaAHlNIzw5o3wPrmo+u7X/7l3UfgV+//8LlSeVdYpRDC26PwIvkQWHqzIcFqWNIJzgpLS7DYRn9YLwvWT1/gz2MhV1lYVW9ybK3gTbDyY028PArWpTcsdo9cLVJ+0hrm4o1c1w3WP37/CYL17dtbsVwVVr3JsbUCfiVRWLYlazdYooZ5gTXVwNJDwRbZrcyq/KQ1rDusn7745PtffHk7IRoqHw2L3RNOF8m2JcsIi8TZDVYpw3XHdRXPhBZY3ksJirAmERbtkh3W9Ydfv/kofOCvEZZhvAywSgUPxy6wPPxZY8aSUs+Fc4R16QvLNcBSb6Ysv1phyW9qxh7VwGqunNoqdG7NKnSqNBhamAIsy7mQju+DYE1HwYKu5J7G37mwE8zs3U4Oq1EWHQ7wTpx5yeoOSz7VoAQ7wJoJLNcEK9ufPWC9e/Pm03eNp0LD256ewWqj9dywLuKt92KK22BhVzZYUzdY3/zqv5c7Dg+E1SCLH0dhGWRlYKEj6USoU2iENbXC8hQWdFWCRVzJnQu/i/fbesG63274tOXvCkNbxYFas0K9zR+kjhL7bT0suEY5Otw+/uxeHyzPewq6WIL18ttHwiq+EcO70B+WeftOT35gbvrDmhGsyyZY6Om1t1PpDmkrLN7b9ZAqWNd3t1Ph7R7pLrCELuwPS41OYLmesIQla46wliXL0GsSqS8sD39NqoK3njrBun7/5qWoroqwygMl9jZ/mDpI9NcdYaU/qTPDEtYDUDiscq/tsEQBenYxsJiuh2899YLVWjmNnnmctH6Vi3yYhzeMDefCOlhePErKygLr0gDLPxTWdCpYhnHy7Bd7w9Ki04VIh+U6w5pqYMFL1RgpPu2MsLire3UTLDbOlbCWz2LdS+vm3TBMIqxKWRqstOM0wPJlWGHoGSwxZB7WvYYFFjr3EVj3nwVY8tKiJhdzlNP18K2nDrAs5RSwlkPYQMIP/hrOhW2wfBaWy/foJUF3Ilg+jSQ69CVoeoegD6yfvvh0N1jCiHeG5XrCCufCOljZZfIm3wVZPWEpmyGS3JGw1q/I6gQLu3kMLOlcqEaxw3IJlnozOlTsCQu2xaJuhuULsC79ToWZtwm3wEIvE7FCZkzksHwgGay8LBzitvN3cFnKwJKnMEzzXrB41ApYCBF1xWFN8B2CPitWz817G6yisTIs05LF9uTpHiOB5XrBcjdYboWl3SFF9xfSxSmHhVxN+TukCRGXlYXFwYbDqmC1V871pgpWcfECw0GegLf1kCwlDjn5pTGMsDzgIh1F88o3aoIFjtwHFpMlwEq3254eFhhNdXTIENGBBHdfpq2wwsF1sFCrQo19YE3h7l0ZFrkPU4A19YS16fNYcm9UWdJvNQb0GPdwWF44imSGFkqhxgLLHQ0Ly2Ij6Rks1mw9rG2fxxI782hYxnOhJ7DcOWHBfd9mWM4Jshwdyj1gbf3YjNCZOliKAn6I4/MLPvhrWLJ6w2ITJ1SBsLSPN+RgObywLC1OBlhg0JisLKzL88NKw6eNDjqiMyyvwIrTAWDJ22QGS6iywnLk1judt/SjK8ACC5YBVnJVhpXeIehzKtz4eSyhN6S4LCxNATvAGWGpG2kDLAfbcjHB7rDYvKUfweKnwZqaYCVZ6GUTmu0Pa+PnsYTeZGHBl046RBseIyxhyZJj9YZFpo1XMcCCRwqwPK4ZYa0CwhPiwEFXj4fVWlmcOcEVhYVkAWJiscASz4ViLBiiAGtKsLQPa+KZy8NyEJbXYPkqWJc1RbG/HJZ8og+9B+8Q0JUwTsHZYSVZRVgojhGWflNpJQIeTWBZysKSTjp1sMB7OjZYbPAYrIms/jQodvVoWNL3Y3WE5QRYsYvxCB6LRnR8OAAs05KF1x6//BV1nEQ3xUOdCRaZOrFRERapyWClnDKwLmVYxBU9z+Np6Q9L+H6s3WE5WovHohElWD69E2GH5TAsl4Pl2VH63BVguT6wHIYFF/9ccnBg0gOQJnyHgG6y4gxUwRK+H6snLNwF1C0FlvhaqYKlbKTzsJyb4qFNsMRzoQSL9tgMa20wukKwSNPdYd0OqYVFvx+rFZbgqi8suocGsPiSJaVnhzUVYcFJssJyZli+CGt6IKz1kCpY274fiw81d1ULiy/C4TB+8l9Bmc6FO8ASpg03fYMVaq2wWBXwGGxBA9yesBz8LU5zQu8Q9IC17fuxWGckWE6ApcviY67DgndfiudCDivtU9dLRAzL5WDFio2wPExLg+U0WJcCLDD4IMMEayrD4hvjSljNlQ2wYn9oijosMuZmWOVzIYV1m+qLBMtRWOnqUYDFPryKOnDfWEFYQh0Ma80irjkKrKkIK7iasH0Z1j3YhwqLvYeRYEnnQp6eK8Nysa0pCytmxe6fbYDli7CcDoulJ8AKvXPYjo+w4scwSIKHwlJdVcPyLKDTYannQglWCuGzsKYIy3eENUkOamGlBToIyMJCw+LQSMJLBgQLr2engIWHOAeLyNoOq7hktcJyJVgT6xGB5RtgxW7DDSo8E4Z3H1thgfPv88AipSssuM9PsAznwkQEwJrgsjQxWD4eRa9HQ1agVd6de4LtsOjgmWHBMSOyGCy/wnIBIt1kNcLq9werOViepKjCAg/h0+sYibCkJSsPK6xR4V2RDbDQvFXBAq+eMI1WWJcES969p6mYiCwGy+8Fq98frLbDciVYYYwysIQlayZRTLBcXIcSLPb2WUoLzZsKy2dhwUlO+58srEmARfJDrsD+PYzk0mZoKQsrHFcFq9sfrKahsMECQ+I8Gj0PX0sp6sS2OmVYHhV6sRfeFQnLUoQ1UViXAqzJAGtaf87BcvB2GocVZr4eFpIFe0dhuV6wuv3BajssJ8KirsCGmsBSz4W01MJyCiyQ2N6wJgorvYQMsJIrGVYamf6w2isLsGRX6daRHRa44QNGIwdr6gBrirCWqyQ7rAk3SmF5M6ypA6w4bAAWlGWEFTN8MCyyOTbBgneqwU4CDjOFBUdjMyz0Jk4eFniKwILk8bwxNRQWlwUGwBNYToYVl+YiLOgKwIojiQbGxR1HzJOuBpVW3jV+5r0VFr2hKMOirnKwjOfC+9xeMKwL0JNSw7DihzUzC5YBlgOw0MWFDVZsMSxYDBaS7xyBNdGRhJtcAIueC5thvbvtrlr+SgfDwgpgmSgsfHXusrCE15kGq7hkUVj3N3LhsmSDBXMzw/IIVpo3H2H5MqyQ2tqgvAQqC9bDYa23Gxo+j2WENXFYaO6NsMLgeLjkb4HldFgT+MNNKyxxk9UGK0x6GLwMLOkGhgZrQkMpwArnwsNhsTcRzLDg5K8/GWDx9xrAJ8rpubANFnhfI4yuI7BQbnTabLAcghUONMGaKKxQ7LDiA9CTSYSFMqyFteFUyGDJrqIGn2ClaYjDIroisC5ZWKUlKxEJ90fTa95NCNaFw3LSbVs7LA/ukNpgxVelCMupsKTkOKzJDiseVwerffP+AFgojgEW+HqQHCzfDVbYScubLBlWrMhgOREWPCXBVw+DBZZUIIjKmsBXf4Tc1tQysG7HV8JqrYxgEQbQQxZWGpbimZBenL3UnsA7EXTJaoB1obAcg0Vyi6ffSdxk6bDCCsNgrUl0hBUTFHeQJljr8XYr6zeCHAXLVcG6wIUjTlsDrLSrilfsDsKaCKy0F5tJbpMBljx7CFac5JihC/HRSglgJQEUFkgOLuNxXOJL9MSw6Ltnsqv1FjZKMUw+GJY4epIrM6x0LmyDNYW2lsXQAusCexTbtcHyIqypARa6zkSwyJKVYDmWWrzuDM/h1cAOa9lfNb5XCGFRB22wfDssy5LlQIh1w5qFNTFYxJULFSEsNMcIFtwhl2C5tOGCu/wJwnIWWCBBaT2OsMCOtwesLR+bYbAUV/DtOQILjkqKIsCaVFgeNZWD5eywLuAj5QAWCRdrsi7FOYZvD3JYPsFyIMX4zpIOy8mw0pqaRiSNCnjZlGBNMF4brPbKPWE5ERYOlIeFbmXpsMCdq9uPQUx4Toc1ZWBpS9YCK871BNONsFwdLHjhO4EVG8MCAxJ0rSmCkRRghSuSs8CiDrArEZa0ZIUgIizwR+UIlrpk1cEKQuKqEGFNIqwws2DeLLBInc2w2O6dwoKjgmBNZ4blKSzsBsLyKMUmWKnDJlh8ibHAmipggQ+fy7DuCcbhscK6BFjhY+0MVugy32Sl7JCotGTFl6gJFri5dhZYsBhhxZ4xWGGM8J+8YVjFcyGFdRu+MixngIWWER2WU2FNcYfDYF22wZrQ642/bFJm4EhwojwWFulNNayJwIrXSBosfPsRwpqssFyANcVlKcK6rDveZX7RWonM0xWhGpYPY0JgxVuZy5sN8W7DVIIF0sMrVdq/PwRW+Fxy6+0G+u5UDSwwJCVYy2hcwpkhNJyBJW2y8NojwVo2WQIs/tEnCosvWQBW6FkZFriEYLBchBXHRYMFX4xBkwArjXMeVjjQDutW1jeh1ZsOXWC5AIveB14OSrDgIEFXYLIZLI/rxTlugzW1wEILiYt3qTrB8vKZ0AALa5rSCAE7DsHyGJZvhrXlYzM+nv4zsEKWc9yb0osoBRZyRWF5DRZbPMiIYVirGMdhhS2sQ5t85KoBVjyJpbxWWOymR7gU3gALnv9IqsmOY7DCVcaJYAmuJvzB8kuSBeDAXlBYbDh8kEVhwSXLCeV+eLzYM8OCm3wCCy4DiDOBNRNYoMcuB+siwko9QrAcSu+eFHmBq7AmBovKr4e15fNYTbDCbZS0BRVgpa0TGhcFlrBkmWA5BMvVwpr2gRXXIQZrqoN1ycOa0ihbYL2kUgdr+QcE9Pd1irDIy4S7orCCrDws6orC8llYkiwrrCW5HKzQHNm46LAWWUlMCdZkgOXjOYvCosmBDCmsBBTcqmCwlvNMLazWyvGiGvaGwwIa0skDTMO0MMCunGOwbrXIHhp98DfWVs+FEySyTgqGBU6IDNaUhSVssmpgTTqsyaX3FLfASkMfXj1xkLOw7k8vBz0Sli/AujwelnoulGAtD1c96NUchn6qgEWWLAprdTBhWHEAXBkW6BocTnIVrMFK63E632ZgxbNBiFRn5YdfN97Hijc6MrDilkGCNaVDOCxE5ThYToIVW7PDmgkscLGvwZowLJeFhWSFg4XJyMGKt426wMr8E5jVsJir8KENAVYYoTws/GpjWx10Xy/W186FJViuBZbDGRpgRQgYlotTGGFdwt0R6aJQh+UaYLkMrKkJVvvnscLoZWBdNFhTNawpTjZ0NUmwtCVLgTWF852LK6wMC64IYJonqdE2WLGtMizfAusCX6I7w2r/4jV0/a3ASq8NvKjGaUjDIrkSYaX5BetXDazlXvuSFoG1zuW0PuXi/2DDsa0aWOHzFLzHQUuEtY5YYN4Ii7kCLxsFVnxTbe262wIrc2u0ChZkgDhMS5ZkIMKWJA8LR8rBIudCCdaKZ4Hl8rBS/TIsdJcDTvL6kfcEy2mwLgwWWD+d88LdBh0WSG55RoOVhmgPWO3fj2WAFfsjwLrAPgNYUEQZFmofTbIFlgd68rCmhDi1RGAhWSFDCov3WIE1AVjrBINXDJly0CaFBYbxktbjIqxJaKUKVntlBguIuoC3bkRYE4Y15WGFj5LUwGKy1tG6gNtTeOFK25qJ1ndwgiksccm6142fplreMyewHIA1mWE5AMvhNlOCE4IFxzHAQudC+Kkvusk6AhaUFXoDSzKkwEoFwAIisMIsrPK5sAArvs7zsGBuYW4qYE2kztKmDOuyXPqkpY3Aks+FUH0cBQBrqoPl2mG9e/Pm08wXkdbAIqJqYTkCa0KVncNbnV1ghXN0EVbsGG6Uw5qtsGKTBlihy5WwpkpYDi+LdbC+uf0r9pm7WTZY8fUuFAUWMhZhpcGwwUI3aNHqUYTlVFisfrqYBLmlRhRY7kBYyBVcsvDLRoc1bYS1/jF0w8dmtsEixrbDKi5ZcDOeYE3pos8AC0RDeslLpRXWBVwOrvHNsGJAERa6wtBhzSBsgDUdAAvvnbfBcgwWd4VvvW+CNUmwlOUjwkKuKCxhkjEsz2GFJi9wsgms+MfvqVdegeUoLIczBjUhrGkPWNd3t1Nhy+exIKw18zpY8aKRwmIbg/i7cEYCsMRzYQ9YjsEi0wTPtzZYzMEa2QSLLVg6rMkGK74sGKy0yWqHtXweq+H7sayw1llLFz3IyxQ+WBP/NQ4OK/0uIhVgQVkCrEmFBe5DoyPhUwfAWjKphBWz4SOAKkJYy6s1ZglvZG2C1VoZ9RC80KiroCGeXDCsS7jAh/dY4UhcGCxXhCWlsmZRgAVhr0+BTb4jbaDfsE1WFlZ4LaUBMMPyZVhswWKw8ItJgBUCNsLa8l5hGywC5jIpsARX6M4d/lOFGlhTARYY0RpYUydYLsGK39bmyrDSqu+kBSvJwrAmBst3gbXl0w1xhjOwHIeFrlAuRVhgNOANFg7Lg/ErwlrPqQRWOhNTWBP6sGZoohFWmPawDmVgLfsftHeH/YV3DmEyOLkKWDOG5Zphtf8jTQSWPJsiLHirOg2hJ50Hlapg0f2OBCveuACfPK6AFTPTYK0XIzqsSxYWeLkt7ePTE+gwfJcD5pKBBbzEvJ0F1qP+kabYSdQb7kqABVaVcP3DXlXYVXg+1oQLQhUsl2B5AAvChrBA7llY0iaLwVrvN1zApWdE1AYLdK4IC5zoY2NTGVbai1TBaq/MYCkLVhbWBcMCB2JXDJYTYOXPhfvDoudCBdaF/rVzGIDw21gFwmJbrLkDrHCwCGsCsO4/VVlp/4PVcE6KWSsLlgQr3qqOe44CLLdOdorgVFjKkmWGFbpFYcWWhbk0wAq33uPrKQ7OmhvYKWyFhU+NKqx4sCMvAJLgesizwJri+9UCrDReGqxlXztDWSZYU7wlKsByVbDorNlgTWZYrgoWGFsZVnzZ7NgXibkAABxwSURBVA8rfblt/ZvQ6M6JDMvh1ARY5PXGLFBYcDrTeAjnwjKs9G5A1INhpXuXGVix/+smK11rKLAuCix0CUFhOQAruCrB4q4SLI/mC326Z8Ybuq0rlq1yBpY4l+nFQVJM50IES7DQAkuWtaxREqxVTzgXlmChnD14ZS2y4qW/CCut0WDeICxyb8shWE6DBSmdA1Z7ZZx6xlW8suWwyKhAbKiCC5NNYJGvfsvBinjusKYiLPIUO12LsBItFRbtsQhrSheO99cDnOoSLMKMyqqANT0rLDYqBBY9E5ZhZc6FqxBfhOUILJf2YjDxdGIiPUKwPIQFPt5AYEVeANaUhTXnYClbLNC7aEeC5U8OKz1XghWemeA2hZ8Ju8GadFguTp4MC/GJNXGXwlMcFnOQheXKsIRNFoWVdoFPA2tCKYOZpK8TARZbsjbBEs6FNljeDGvZmiEZJVh4whisqQYW37vj795MEAislF/snQVWon8sLPAi5KUEC7+9APpLzoQCrJnA0pcsCdYMYIWDs7BANDjNG2Atu6t7Bsthfh0xCZZzYMEiX+oKthNoKjySVQ8LxLJb2fTltrvAuk8l2OBSWG47LHeJt6fC3XD4lxI5WCgaXD9EWGTvjmCFOgDWOghh0sPpdAofx2ew5E0WgYUWcmQNwJponuke69QE61aav9yWwFI3jEVYMfspDjCGBYdjd1h46NNROJ4Ei52WzLCcAGtqg4WQxfywLA8WpXVksrDCcVWwNtx5h9vzelhpSDisdK8nucrDEmQVYXkVVgikwroQWHjJqoTlBFih4wlWwJJccVgT22KRYZFg3QNTWO5YWLFJEyxyrlRhxQ4jWD6uImZY9J5YNaxJhxUmPncu5LBolaBpCju99YQf+70RlvdkXAAscNNfggXW0iZY7V9ua4eVbi+jX0ZXcadBYEFXAFb4Dbn9KJwLyd9lpzMchJX0xNH3qTEjLA97tBeslJoQMI1hOhN6WJCrCGudth1gNX+5LZh01BtaPIIFr1ASrKUCXqvWiSTDAdqRYdGzEnDVDdZFhkVvnpZgTUVY4X4u2WJJAVthTQIssMnaAKu1MoalLliewEodTAsSgYV2WhKsqQiL3IBdI7XD8gQWdWWBNScHrgDLdYHlcZFgXU4NK70CLbBiBxMsx2DFf3CWvs7SpPIFoQqWM8NaH3SEFc80IqywZK2Dl4eVxjLmF6aCuBJ3kGGQ94DV+qUggEUGluewQg8JrAkMDngt8bkOhymwyEaawgq3RDOwPGgsfYtQgiWcCfEmax0MA6ywuEz4bO2msOaEv5uFsJCAOJhWWKh3cWQ4rJRhG6zWLwUBE18LC8pyCiz6lycUFp+3NlgewfIyrBm1DGzTaYOydFhOg+WKsOCCVQtLeNmEkfEaLLR1roLV/t0NkRIYSsmVAAucrhAsMDbimXC5txRGg82bp8E5rBnDmiMseOx98nRYl2ZYPnaZrgfTVIC1jm8GFtxHSFssDiuNjKd5ngaWsmCB14YMKwwLgcW27gKsSYOlLVkKLFcPK8TbCmsqwPIiLCxAgDXZYIE7iVlY8bAqWO1fChI6gHtjgxWnoQCLuKJbHTxveMnSYcVbonOEFc6LBFb468OusGiPESww5wxWTK0VlscjmYXlIKz1kDpYzV8KEqY+Ayt0Ie7GMSwH7lfEdZdY0GHhPwGog7UMlwLLJ1jwKHSqYa747l2BxXoswnIx/vrudwkWWAO1LVYtrHvADbBaKwdMBljhlgnq1u3XeFSYKwkWWDjIeJTOhc6XYXkAy4uw8N9LkFlDc2yG5QksH4amDZaU3ONhbXiv8LLe40svUdFVmBQEy2NYToZFQtEzEoWVX7KcAyEu62DGcw2BNSuwwPuPOqywNZdgEQcBFrs2lWH5HCyw6juaXMrRBMufBZa4YIHuKLDAsORh+T1hJT1FWPB97SZYpMq6PegI61KAFUfSI1h0GLfC2vR3hcABh4W7UwELgngsrLDJEmEttyVAl9ncSbCEU4wOC7Tl0r8avcASLwplWGJy9bBcnxXLVtkKi3WnDRYNyGHNpORktcKK84A/hrOmlTZ2TI0NllthhTWwDpZIVYflq2DRWauC1V4Z388Uzg1ZWERWuGyMVwMCrHk7rLkIy8fTzfKUg3uxCwq3wKLvfsM5ljbF9KWkwIq9roMlvNsE6BNYLo2MBgtdytdZaf6HMOmbCO2wfAmW7wnLp/uedbBItDjNZlgzO10qsDyE5YDAPKy0BQRTARJM1hAst8C6kldAiOfaYP30xSc/ffFp22feMSx1+TXBCoMCRBBXKyyXgzXD4DZYPp7vAKw0uk2wgho2YQos3wiLb7L4mRC+3kRYbh9YN1LffHL9Xv14gwFW/kpEgZWGxBdgkeGwwPIqrBnDmiGsuQ2WtmRZYcVJTpu2frDwsAiwnAbLRVjhsGpY7z5q+8x7mmL6MmGwJny2ZrAchJWWaPLSK8OacXAZlsOwoh4Ky+uwYmZCoxRWmjETrHiCu4dnsEhvKSyk3gDL5WBNG2Bdv7mr0j+Qlfs81gW8O5WF5UiKcBpABQSLuAKwQqtlWGjD5k2w4nSYYMmNqrBIlfhi6wHLIVjIFZGVehcHmeaZzoXNsF42Wddv3vziS1NlEZb4uTciywoLcCCuEoNLaNYCC5T9YM15WNeUHHRQAQss922wkCzYu7WlHWA1Vwaw8guWAgtcVOuw2HCk8ZNhsTmWYcVLbBFWGl0jrLkSlk8OCKyZw8JX/TlYIDlPK0uw0sg8I6w5D8tLsJy8YIX5LcOSZHlIRIQ147Z0WGniFc7LiS7AusZaIZMIK72yJpdg+QTL52GB7p4M1ob7WN1g+Xh7ygYr3ibaAMuXYM0Yls/CkpasDrDmBMtlYcWbB2gq5LrADoYFVtZ4WTi1wpI+7f7jn97+9jsLrHWCs7BmFZZPh/B7VyVYFw2Wfi6EZ1M7LB9h0TebKmBdESzPYK13NhCsOHgIlvgqihA6wZphvA23G0j5+avPr9/+rggLv+1phQWXZA5LWGREWPexfgQs52jLKc1OsMKRE0hxEyzZVSss17xiMVg//tvfru//5W91sHRXBBYZjPiTGVaSdTws0qoO64oiarB8V1jywNTDim1UwRJujb7/43fXH//89ctPH7+UEqzimTDAglc9cTDSTwVYoMPTKou+KV+SlWYNwfLxfBcORaNrhEVklWCt1yuTFZb0FjSSVQsLydoFFt+8//23ARarLMLKnQnRnLDbRSVYJBDZ6jg+dmZYToY1Y1hehpWSU2EtsgCsa5wv2uMiLKdeFIq7dyk5WBf1bu3KPKOLjHDO3gLrdn+UlLRi5WHR99NzsMD9PzAc8YjYiR1hpcYhrBnqOQ8sDy9iASwFiwkWXY+zsOKSBe5cVMESNu/WPZYBFtLgyMIgw4Ii2mDROeaw3AGwFll0jXYqLF8Py+GZ6Adr/W0VLGHz/vNXn5muCunbnhWwZlpRhMVckfnNwmKyusEC2YlTnLbmVbBgWxyWsgpxWGnkjoV1/eGf2K1R230sBktxlS7EbLDgnrIMC7wn3wsWiCPAQsnJc5yDhaqAi3kIawaw5mZYysAQOxFWSrIPrPZ/CDOM3oGwZhmWfC40wZoLsFA4PHcCLM9gkTrrmLxGWO2VHb3+1lxJsKgsF97FgSR6wwIhGmB5Gq4Iy3WDpd1tkAL2gAVkPQksaUQ0WEIkAZZ6LizBEvTMHJZXYOG0+Byne2VtsGJ4D8+Zck9ho1lYpHcejowCyzXBun/VzKZTYQ4W1aDCmgks72g8GqoAS5SFYXkzLFgvB4uflpZNoB2WF2H5eEYywxKSC9XRobErcwaWb4BlKRZYgivcna6w3ONg+TZYQQ1csPaBRTWryYXa6Ei4uoEs5x6w2v/E3oEpzi2/MiwwIoEL0EShktFAsKznQhWWRycZMvQKLP7qaYLl9oOlTAXuHUD4rLAcSnGmsLxL31bAYdHRaIEFZ+2EsDxMcWaw1PHdCiu2xGCFgE2wtnx3Q4JV7E28ELPC8g7CoqHCHSU7LBiHwJrbYUmNmmGFRToNQCWsq9AoyE6eCjqUaYQzsGKLdlhbvruhF6xZhiW6ihsDCEu/R0pKfM45CgsciRurgMV27xZYYADwTg+duaWLQh2WmJw0RHGQZ3zx2gNWe+U0wU2wZtCpNCpplERXcX4fAmtWYUmZPSEsODLdYS23HNQtlhlWrjNbYAmhHDnTFEatDhZprA2W3x/WNQ9L7pCW7rwDrG8+uv07Te/a9lgdYKFZUzGgUI4uCNlBY6EOgiXt3itg0QZ7wppnCmtOAdv3WLe/p2i8KnSWMyGAJXQMzVrR1ZGwyLlGTG4LLL8RFlr15Q4p2c6zDsu3w7p9F3crLHcYLJeFJclCIYyw/D6w6LxRWDNsmN5OupfrXrDIubAZ1k9ffPL9L768nRCPgYVnrQaWA1uD3KhthCW3LPcWz7EOi83b/SGBFX8EtyVSoZ0+HazbZ94/un7T8I80rZdnlhP7GWHBiJWwtNzaYYVrfxgp/lgJS0suk+087wCruTKGle2M944PDZw3H2sUXMEz0hZY5KzzWFhzmrcQJgfLC7BYpwksuT9atizN9ckjYVkWrHjRw2GhCu2wuKxDYJFNVjUsaWiOh4UatVm533a/79sbNu+ngIVHQx42DssbYcH5TbD05Gywwv+3wkKdjhDssFK2LM1jYbH3OHI9MMNCIsRYscl5K6x4YZVJnDWcT84IC/SY5MQaXmCRBnmnAdUPB9Ysw5rprFFYaigGy3IuhCGaYZWSA7CcDCvVzMDCQ8NgCX1+pbAKvbHBWoPsBAuFaIQlx5MapZvAMiyvw5LPhBlYWn+UbFmac5J1AljZLuAUhdHz22AxWTvA0uJJ7aqwQLU9YGVzk1MlaeIlyx8By2+FhfrYGVYGQhdY2d6mFzuZMA0Wu4TIwpK6/DphlYfaCgt2WA91blhpkjksXMUjaJth+fPAip8gfXpYxXPhMjZrCDMsNWCmtxFWLsHesBLVE8CyFAusYm9oilIfk87TweLv9+anToYlnLp0WLTD0gQLjVqyw4dosFZZx8Dydli+AhbfypKaD4AVXrczqrcvLC0a3cPKPQawssmRQ9bqPM0AK1Vvt1JVmcIq9KAjLC/CKslaxmZ5YsACPUIxr2eCVe5NEdbsPRi8Eizp9mMVLHqK480UYOU6uxOslJoe0JQdOYQGfXWwYJBcwCiLzhuVJbiisPBNS1g2wQob6bkPLHUPrXW3kB06hAU9BSz4LkehC9Ww8jXrYKWxQdHDpzCFVh4NK3MJYYQ1m7ODR/CgV/AsDtZupapyPaxCH6tgCfMmfUKZFnTyu+qwrnlYpWYMsOi8dYRVyg4cIQTFS9Yrg1W4aZkq45SyKSxjA6NfO8CS27TDgg+VnHeAxbMW8jwalqk3RljwYb7maWCJjW6AJb2FsAmWlCD7nTSMh8Lyu8Eq1GyDdc3AugoVFVhCRZ5jT1ioZj7g88NKt2ZNsApVaJAmWEVZ1bBm+JQMS5e1D6xCQOZKStAEi81Ju5Wqyq8c1lU8bE9YM09jfUZ7Y0Vo1ASL/0ocRaGvjVaqKov3ibRSrmIIAiqutVlOhXJFd66uKiwc60pgzWpNlGTpDu7DYAmM+G+EsB8qLKmrhWOvOViY0qNhzfvAEkfl5LBq7xiWYRWC8BOSkFQ+Qm9YWqsiLOlcCB7CTuJ6VbBYj3nFVwSr7MYMC86vkFQ+Qg9YJKDYqhUWfBgi8mDqh1d4QCMs4Tc86rPAKlboAKsg60phIT6ongqLBpRbFTPkVeBDnkZ4BsIqBJTzu7JfkibkQfxAYF07wooDxcNLzwBYLKDc6lo3l5wdFqyZ662a34CVK/1gzTKsK/hRgSUElJtthZWJhVuUmlUXLHJbjh8p53kULPletFwssAohTLDysq46LPiABIpH8QzVVg2w5hpYrEUl4IBVXaEDrPh83GJVwVIiis2KCfI6UkD2ux6w9Lt0POrrgiWtB7TvqbsPgIWeygSUm+0EK1xrmGEp6dENpA0WmRNNQiz9YbHxYeVhsHKy4tMfICzc05PDUt73JDmrg0hHJf/8dX9YV/izbI4HVFo1wcqkuD4MHeYtSq2+Nlh8fOjYWGAVno893h0WCZSJmmn1BLCUutKhStUzwyKX6vrElxcsG6yMrJQ3jkgekTiZoJlWDbDkTxhugqVlx/pzzdUEu/dcLVaOgJXu/2kTb4Y1fziwrgVYbA1UkoN1pSPVITwWFh8elAxKkXdK7IMYKB64G6wrHECpZSmg3GpfWFKLQsSdYOFx0Us/WOVPLVwlWOI0VcCS34njw6LGSLCkE8RVeEaPpzTaBotUq4WlZgcqS0eqI4juJMujDUpnWKXOoUGUumUptMOnhzVLCdIqeobhYQrFWiyNozIu0pFqWA+e/iBgiQvCtRQcP4sqg0NpGD1mttV2WDDFFIq3WBhHZVykI9WwXo6klNcAS5y3az46eRI9BEfSMHrIbKMGWIYUUyjeYiGgPC7ikYWwyjCz0hFW4bYmrIhzzB2lj5Kxw7YY6CE4lIbRQ2Yb7QDrugWWMi7ikYWw2jjT8mBY6+DgHHNH6aNk7HA5G/YQHErD6CGzjdphoU0VrHbdEdY1V7ccSixdYWW6hjh0gXWVf6vkJgeRkjsvrGsMJfZYDihWVXpnCSsPMi8HwtJSLxX5MDXpXBApuTIsKWSh0Y6w1B7LAcWqSu/kuuVQUukJS8yA5COmmBmSzCgZO5wLUsqVRtFDFhrdAZaxo3JdsXemuFIoqewO66ruE/OHlwfJ2OFcFHIwa4FG0UMWGn0ErMwwygMjH5kPK0aSyiNgKTXzh5cHydKcGhw/KT7qDMuYl5Ji/LEFljIw8pH5sHIooZwCFhxNdXTYYZbmtOSyJ+p0JA2iRyy02QBLaHmNpHVYjqiOzYClhLU0pyW3Nyxa5YywlCPzYYuhQjkZrOJpUW1UzzoXhxysR5KOyjXfUmOpROuDR7cfPnhY5ZrSb0uw9Eb1rHNxpIeZKGpEQ6OWtAywMv0VI+bHRjg0H7Ycai3ngAUmWB0dFtQ6eLlA0sNMFDWioVFrXmKK/AhjRwtjww8thC2HWsujYSld4ONqGCBrjzORpIeZIGpAQ5uWtPaBlRkafmghrCHWUo6DJfxWCaWFtPY4E0p6mAmiBjQ0aklLgnVNDwr9DU+Uk8vkkn3y+WCleZOG2zIzmbQzsaSHmSBqREOjlrS2w5ICZ4aG55J98gSw1BhKjfgbabgtM5NJOxNLepgJokY0NKrVoPPG6qcHhf5K1QpDw7PNPvnMsCq2oNbRy8QS5jADS49oaFSpweaN1QcPTN3dE5Yh1FpOBEuNlZ+ZcpczsYQ5bIFlaVSpwRcEWp2lW+jugEV+r8bSIppHTw9Gjs1E4vUKjRfrhN/SOrQ6S7eyu7mqpsCVsZZyHlh6LC2iefgywfgkPhQWqQgORPV4zFx3SdPZquyQfDhTrHt5LbCyeWeC6ZMoBFEDWhoVK5CK4ECx4ab+ZquyQ/LhTLHuZSdYeoxiFa5Aq28evUwsfRKFIFpAU6N6QFKHVR+wLAkUq8AohYjWHmfS4w8zQbSApkaFCqwmeChVHLAs12iGWL1gZSaZP8zE0OKZWhaekuuw6lK7mSa7w7I2i8phsErPL3XyEc2jp6fHH2ZiaPFMTfNneDTwUKpYXu6F9PJVTZFrg93KgEUfZmIo8WxNW7ITc6qHZd992iKfB1YuSNU45yMeBqtiTTBUGrAeDys/L68NlpzTiWDZYt3LmWHBB6VmC5l3gaXFM7VcUUevvh+s/LQMWMYEyRPooR5CiWdruaLOgMUa7g+LXyPJzRYyz8LC9fQYSjxb05bs5JwyNUsBKyxkaw9YtgTJE6hiJoYSz9a0JTslJ71mMWIlLGOCltIHVsP1d7GCAZZ9/PTsNsMqtLwLrFKbjbCsCVrK42HlqVwprOxLqQGW8Ax6mIkhxtsBVuaEvCuscjxrsOtxsErPm16/TTdYeAj0MFNTbPj1wDLEswa7DlingEUX8UNgWeJZg11PCYv24tywTC0cB6ucnqmcA1YhyoBVqjJgsZb3gWVotdBmtjH0MFNTbNnUQjWsfEVzo91glSeNlieAlZnsAatQccDiscDjcquFJvONoYf2w6wN94dlz89Q01ZeJSxDq5bKagj00H5YR1h0TAYs3LCtMx1hdVjxGw+uaXjA2lD5A4Vlr1tVpRcsU3qm8gywsrc8UyxTRj1gNR5mb9YICz7cEquyorEcBavmAq329Wto1VRZCdF2VEWrA9aWynZXNli2jA6F1bHuPrAs9axlwKotzbBq6g5YzZU/OFhVlS1XNNZQnSsay4BVW7oOv9LEK4BVe5XTHZYhzIDVVCXUMw+NrZ61HAWr4s7OgNVUJdQbsDI1N1ZoaVWNsOFYaxMD1obKx8Dafov5LLDMoaw1bdXM5WBYljBdYW2+E/gAWIZJOT+syoBHwCqnWHsx//ywrGkMWNmqxQpVnfjAYG3Mpbl8eLC671O7lwFrS+WOq3Tt4H04sA58EX2IsM5eXgWsujJgPaQMWBsqD1h66dehDxOWMc6AtSHSk4zNgPWQMmBtqdwP1qsrHWF1i7RvOQTWh1cGrC2Vn6XPT12eZZAHrCcrzzLIA9aTlWcZ5BKs9394+/ZzY+Vn6fNTl2cZ5IKVH//89fX9P39tqzzKA8orgfX33738569hyRqwRrEWg5XbqnW9fvxSBqxRrKVs5eevPrNXHmWUpWSs/PXt25cT4Y9/+sxSeZRRUClfFX6eHgxYo1hLwQpyNWCNYi4FK9++vZVxVThKbel5532UUWIZsEbZpQxYo+xSBqxRdikD1ii7lAFrlF3KgDXKLmXAGmWXMmCNsksZsEbZpQxYo+xSBqxRdil1sFj5mP/qiHKONM6RxcFpNMHi5eNth/cq50jjHFmcJI0Bq185RxYnSWPA6lfOkcVJ0hj78VF2KQPWKLuUAWuUXcqANcouZcAaZZeyBdaPf3r72++6ZdJW1m/DOTyVn786QRY/f/X2f319fBr3sgHWbSy//V2/VFrK+m04x6fy7Qvvw7P46+fXv//2u8PTuJcNsH78t79d3//L3/rl0lDWb8M5PJX3//rvnx8+ILf2r+eYl02w3v/xu/WbaI4tLzkcncrP//lfL8vE0Vm8/+P/u50Kj05jKRtgvay6J+jA/dtwjk7l289u55+js7h9H8KLqqPTWMrTr1j3b8M5OJWX5n8+xYr13RmW76U8+R5r/daSg1NZvuHis6MH5Mf/exd1dBpL2XRV+NnhVx/rt+Ecn8ptxTo8i79+viyeRw/GrTz5fazwbTiHp3KK+1gv7f/vvx2fxr2MO++j7FIGrFF2KQPWKLuUAWuUXcqANcouZcAaZZcyYI2ySxmwKspPX6x/lfnRD7/58uhkTl4GrMoySNnKgFVZBixbGbAqywLr5b8//OY/fv3mzSc/vPzn0+Us+cu/HJ3cicqAVVkSrF//6n+u797c/vPLv/z0xUfX67uXn0dZy4BVWQCsl4Vq+c9vvvz+tlr94/efHp3decqAVVnAqfDL9dHLf94tV4ufHJ3decqAVVkUWOMsSMqAVVlkWN//Ylwr4jJgVRYZ1k9fvCxZQxcoA1ZlkWHdbzcMV6AMWKPsUgasUXYpA9You5QBa5RdyoA1yi5lwBpllzJgjbJLGbBG2aUMWKPsUgasUXYp/x+6KnW76MjLgwAAAABJRU5ErkJggg==\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(full_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>However, forecasts for series’ 1 and 2 will differ because they have\ndifferent intercepts in the observation model</p>\n</div>\n</div>\n<div id=\"example-signal-detection\" class=\"section level2\">\n<h2>Example: signal detection</h2>\n<p>Now we will explore a more complicated example. Here we simulate a\ntrue hidden signal that we are trying to track. This signal depends\nnonlinearly on some covariate (called <code>productivity</code>, which\nrepresents a measure of how productive the landscape is). The signal\nalso demonstrates a fairly large amount of temporal autocorrelation:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">123</span>)</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a><span class=\"co\"># simulate a nonlinear relationship using the mgcv function gamSim</span></span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a>signal_dat <span class=\"ot\">&lt;-</span> mgcv<span class=\"sc\">::</span><span class=\"fu\">gamSim</span>(<span class=\"at\">n =</span> <span class=\"dv\">100</span>, <span class=\"at\">eg =</span> <span class=\"dv\">1</span>, <span class=\"at\">scale =</span> <span class=\"dv\">1</span>)</span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Gu &amp; Wahba 4 term additive model</span></span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-6\"><a href=\"#cb11-6\" tabindex=\"-1\"></a><span class=\"co\"># productivity is one of the variables in the simulated data</span></span>\n<span id=\"cb11-7\"><a href=\"#cb11-7\" tabindex=\"-1\"></a>productivity <span class=\"ot\">&lt;-</span> signal_dat<span class=\"sc\">$</span>x2</span>\n<span id=\"cb11-8\"><a href=\"#cb11-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-9\"><a href=\"#cb11-9\" tabindex=\"-1\"></a><span class=\"co\"># simulate the true signal, which already has a nonlinear relationship</span></span>\n<span id=\"cb11-10\"><a href=\"#cb11-10\" tabindex=\"-1\"></a><span class=\"co\"># with productivity; we will add in a fairly strong AR1 process to</span></span>\n<span id=\"cb11-11\"><a href=\"#cb11-11\" tabindex=\"-1\"></a><span class=\"co\"># contribute to the signal</span></span>\n<span id=\"cb11-12\"><a href=\"#cb11-12\" tabindex=\"-1\"></a>true_signal <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(signal_dat<span class=\"sc\">$</span>y) <span class=\"sc\">+</span></span>\n<span id=\"cb11-13\"><a href=\"#cb11-13\" tabindex=\"-1\"></a>  <span class=\"fu\">arima.sim</span>(<span class=\"dv\">100</span>, <span class=\"at\">model =</span> <span class=\"fu\">list</span>(<span class=\"at\">ar =</span> <span class=\"fl\">0.8</span>, <span class=\"at\">sd =</span> <span class=\"fl\">0.1</span>)))</span></code></pre></div>\n<p>Plot the signal to inspect it’s evolution over time</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a>  true_signal,</span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>,</span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;True signal&quot;</span>,</span>\n<span id=\"cb12-6\"><a href=\"#cb12-6\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Time&quot;</span></span>\n<span id=\"cb12-7\"><a href=\"#cb12-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Next we simulate three sensors that are trying to track the same\nhidden signal. All of these sensors have different observation errors\nthat can depend nonlinearly on a second external covariate, called\n<code>temperature</code> in this example. Again this makes use of\n<code>gamSim</code></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"co\"># Function to simulate a monotonic response to a covariate</span></span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>sim_monotonic <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(x, <span class=\"at\">a =</span> <span class=\"fl\">2.2</span>, <span class=\"at\">b =</span> <span class=\"dv\">2</span>) {</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a>  out <span class=\"ot\">&lt;-</span> <span class=\"fu\">exp</span>(a <span class=\"sc\">*</span> x) <span class=\"sc\">/</span> (<span class=\"dv\">6</span> <span class=\"sc\">+</span> <span class=\"fu\">exp</span>(b <span class=\"sc\">*</span> x)) <span class=\"sc\">*</span> <span class=\"sc\">-</span><span class=\"dv\">1</span></span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a>  <span class=\"fu\">return</span>(<span class=\"fl\">2.5</span> <span class=\"sc\">*</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(out)))</span>\n<span id=\"cb13-5\"><a href=\"#cb13-5\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb13-6\"><a href=\"#cb13-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb13-7\"><a href=\"#cb13-7\" tabindex=\"-1\"></a><span class=\"co\"># Simulated temperature covariate</span></span>\n<span id=\"cb13-8\"><a href=\"#cb13-8\" tabindex=\"-1\"></a>temperature <span class=\"ot\">&lt;-</span> <span class=\"fu\">runif</span>(<span class=\"dv\">100</span>, <span class=\"sc\">-</span><span class=\"dv\">2</span>, <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-9\"><a href=\"#cb13-9\" tabindex=\"-1\"></a></span>\n<span id=\"cb13-10\"><a href=\"#cb13-10\" tabindex=\"-1\"></a><span class=\"co\"># Simulate the three series</span></span>\n<span id=\"cb13-11\"><a href=\"#cb13-11\" tabindex=\"-1\"></a>sim_series <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(<span class=\"at\">n_series =</span> <span class=\"dv\">3</span>, true_signal) {</span>\n<span id=\"cb13-12\"><a href=\"#cb13-12\" tabindex=\"-1\"></a>  temp_effects <span class=\"ot\">&lt;-</span> mgcv<span class=\"sc\">::</span><span class=\"fu\">gamSim</span>(<span class=\"at\">n =</span> <span class=\"dv\">100</span>, <span class=\"at\">eg =</span> <span class=\"dv\">7</span>, <span class=\"at\">scale =</span> <span class=\"fl\">0.05</span>)</span>\n<span id=\"cb13-13\"><a href=\"#cb13-13\" tabindex=\"-1\"></a>  alphas <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(n_series, <span class=\"at\">sd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-14\"><a href=\"#cb13-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb13-15\"><a href=\"#cb13-15\" tabindex=\"-1\"></a>  <span class=\"fu\">do.call</span>(rbind, <span class=\"fu\">lapply</span>(<span class=\"fu\">seq_len</span>(n_series), <span class=\"cf\">function</span>(series) {</span>\n<span id=\"cb13-16\"><a href=\"#cb13-16\" tabindex=\"-1\"></a>    <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb13-17\"><a href=\"#cb13-17\" tabindex=\"-1\"></a>      <span class=\"at\">observed =</span> <span class=\"fu\">rnorm</span>(<span class=\"fu\">length</span>(true_signal),</span>\n<span id=\"cb13-18\"><a href=\"#cb13-18\" tabindex=\"-1\"></a>        <span class=\"at\">mean =</span> alphas[series] <span class=\"sc\">+</span></span>\n<span id=\"cb13-19\"><a href=\"#cb13-19\" tabindex=\"-1\"></a>          <span class=\"fu\">sim_monotonic</span>(temperature, </span>\n<span id=\"cb13-20\"><a href=\"#cb13-20\" tabindex=\"-1\"></a>                            <span class=\"fu\">runif</span>(<span class=\"dv\">1</span>, <span class=\"fl\">2.2</span>, <span class=\"dv\">3</span>),</span>\n<span id=\"cb13-21\"><a href=\"#cb13-21\" tabindex=\"-1\"></a>                            <span class=\"fu\">runif</span>(<span class=\"dv\">1</span>, <span class=\"fl\">2.2</span>, <span class=\"dv\">3</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb13-22\"><a href=\"#cb13-22\" tabindex=\"-1\"></a>          true_signal,</span>\n<span id=\"cb13-23\"><a href=\"#cb13-23\" tabindex=\"-1\"></a>        <span class=\"at\">sd =</span> <span class=\"fu\">runif</span>(<span class=\"dv\">1</span>, <span class=\"dv\">1</span>, <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-24\"><a href=\"#cb13-24\" tabindex=\"-1\"></a>      ),</span>\n<span id=\"cb13-25\"><a href=\"#cb13-25\" tabindex=\"-1\"></a>      <span class=\"at\">series =</span> <span class=\"fu\">paste0</span>(<span class=\"st\">&quot;sensor_&quot;</span>, series),</span>\n<span id=\"cb13-26\"><a href=\"#cb13-26\" tabindex=\"-1\"></a>      <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">length</span>(true_signal),</span>\n<span id=\"cb13-27\"><a href=\"#cb13-27\" tabindex=\"-1\"></a>      <span class=\"at\">temperature =</span> temperature,</span>\n<span id=\"cb13-28\"><a href=\"#cb13-28\" tabindex=\"-1\"></a>      <span class=\"at\">productivity =</span> productivity,</span>\n<span id=\"cb13-29\"><a href=\"#cb13-29\" tabindex=\"-1\"></a>      <span class=\"at\">true_signal =</span> true_signal</span>\n<span id=\"cb13-30\"><a href=\"#cb13-30\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb13-31\"><a href=\"#cb13-31\" tabindex=\"-1\"></a>  }))</span>\n<span id=\"cb13-32\"><a href=\"#cb13-32\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb13-33\"><a href=\"#cb13-33\" tabindex=\"-1\"></a>model_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_series</span>(<span class=\"at\">true_signal =</span> true_signal) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb13-34\"><a href=\"#cb13-34\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">factor</span>(series))</span>\n<span id=\"cb13-35\"><a href=\"#cb13-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Gu &amp; Wahba 4 term additive model, correlated predictors</span></span></code></pre></div>\n<p>Plot the sensor observations</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat, <span class=\"at\">y =</span> <span class=\"st\">&quot;observed&quot;</span>,</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>And now plot the observed relationships between the three sensors and\nthe <code>temperature</code> covariate</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  observed <span class=\"sc\">~</span> temperature,</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;sensor_1&quot;</span>),</span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Sensor 1&quot;</span>,</span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Temperature&quot;</span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a>  observed <span class=\"sc\">~</span> temperature,</span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;sensor_2&quot;</span>),</span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Sensor 2&quot;</span>,</span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Temperature&quot;</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a>  observed <span class=\"sc\">~</span> temperature,</span>\n<span id=\"cb17-3\"><a href=\"#cb17-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-4\"><a href=\"#cb17-4\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;sensor_3&quot;</span>),</span>\n<span id=\"cb17-5\"><a href=\"#cb17-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb17-6\"><a href=\"#cb17-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Sensor 3&quot;</span>,</span>\n<span id=\"cb17-7\"><a href=\"#cb17-7\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Temperature&quot;</span></span>\n<span id=\"cb17-8\"><a href=\"#cb17-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"the-shared-signal-model\" class=\"section level3\">\n<h3>The shared signal model</h3>\n<p>Now we can formulate and fit a model that allows each sensor’s\nobservation error to depend nonlinearly on <code>temperature</code>\nwhile allowing the true signal to depend nonlinearly on\n<code>productivity</code>. By fixing all of the values in the\n<code>trend</code> column to <code>1</code> in the\n<code>trend_map</code>, we are assuming that all observation sensors are\ntracking the same latent signal. We use informative priors on the two\nvariance components (process error and observation error), which reflect\nour prior belief that the observation error is smaller overall than the\ntrue process error</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span></span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"co\"># formula for observations, allowing for different</span></span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"co\"># intercepts and hierarchical smooth effects of temperature</span></span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>    observed <span class=\"sc\">~</span> series <span class=\"sc\">+</span></span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a>      <span class=\"fu\">s</span>(temperature, <span class=\"at\">k =</span> <span class=\"dv\">10</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a>      <span class=\"fu\">s</span>(series, temperature, <span class=\"at\">bs =</span> <span class=\"st\">&quot;sz&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>),</span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a>  <span class=\"co\"># formula for the latent signal, which can depend</span></span>\n<span id=\"cb18-10\"><a href=\"#cb18-10\" tabindex=\"-1\"></a>  <span class=\"co\"># nonlinearly on productivity</span></span>\n<span id=\"cb18-11\"><a href=\"#cb18-11\" tabindex=\"-1\"></a>    <span class=\"sc\">~</span> <span class=\"fu\">s</span>(productivity, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb18-12\"><a href=\"#cb18-12\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span></span>\n<span id=\"cb18-13\"><a href=\"#cb18-13\" tabindex=\"-1\"></a>  <span class=\"co\"># in addition to productivity effects, the signal is</span></span>\n<span id=\"cb18-14\"><a href=\"#cb18-14\" tabindex=\"-1\"></a>  <span class=\"co\"># assumed to exhibit temporal autocorrelation</span></span>\n<span id=\"cb18-15\"><a href=\"#cb18-15\" tabindex=\"-1\"></a>    <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb18-16\"><a href=\"#cb18-16\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb18-17\"><a href=\"#cb18-17\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span></span>\n<span id=\"cb18-18\"><a href=\"#cb18-18\" tabindex=\"-1\"></a>  <span class=\"co\"># trend_map forces all sensors to track the same</span></span>\n<span id=\"cb18-19\"><a href=\"#cb18-19\" tabindex=\"-1\"></a>  <span class=\"co\"># latent signal</span></span>\n<span id=\"cb18-20\"><a href=\"#cb18-20\" tabindex=\"-1\"></a>    <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb18-21\"><a href=\"#cb18-21\" tabindex=\"-1\"></a>      <span class=\"at\">series =</span> <span class=\"fu\">unique</span>(model_dat<span class=\"sc\">$</span>series),</span>\n<span id=\"cb18-22\"><a href=\"#cb18-22\" tabindex=\"-1\"></a>      <span class=\"at\">trend =</span> <span class=\"fu\">c</span>(<span class=\"dv\">1</span>, <span class=\"dv\">1</span>, <span class=\"dv\">1</span>)</span>\n<span id=\"cb18-23\"><a href=\"#cb18-23\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb18-24\"><a href=\"#cb18-24\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-25\"><a href=\"#cb18-25\" tabindex=\"-1\"></a>  <span class=\"co\"># informative priors on process error</span></span>\n<span id=\"cb18-26\"><a href=\"#cb18-26\" tabindex=\"-1\"></a>  <span class=\"co\"># and observation error will help with convergence</span></span>\n<span id=\"cb18-27\"><a href=\"#cb18-27\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb18-28\"><a href=\"#cb18-28\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"dv\">2</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> sigma),</span>\n<span id=\"cb18-29\"><a href=\"#cb18-29\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"dv\">1</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> sigma_obs)</span>\n<span id=\"cb18-30\"><a href=\"#cb18-30\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb18-31\"><a href=\"#cb18-31\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-32\"><a href=\"#cb18-32\" tabindex=\"-1\"></a>  <span class=\"co\"># Gaussian observations</span></span>\n<span id=\"cb18-33\"><a href=\"#cb18-33\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb18-34\"><a href=\"#cb18-34\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat,</span>\n<span id=\"cb18-35\"><a href=\"#cb18-35\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb18-36\"><a href=\"#cb18-36\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>View a reduced version of the model summary because there will be\nmany spline coefficients in this model</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; observed ~ series + s(temperature, k = 10) + s(series, temperature, </span></span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     bs = &quot;sz&quot;, k = 8)</span></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(productivity, k = 8) - 1</span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb19-21\"><a href=\"#cb19-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb19-22\"><a href=\"#cb19-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-23\"><a href=\"#cb19-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb19-24\"><a href=\"#cb19-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb19-25\"><a href=\"#cb19-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-26\"><a href=\"#cb19-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb19-27\"><a href=\"#cb19-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 100 </span></span>\n<span id=\"cb19-28\"><a href=\"#cb19-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-29\"><a href=\"#cb19-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb19-30\"><a href=\"#cb19-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb19-31\"><a href=\"#cb19-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1100; warmup = 600; thin = 1 </span></span>\n<span id=\"cb19-32\"><a href=\"#cb19-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb19-33\"><a href=\"#cb19-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-34\"><a href=\"#cb19-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb19-35\"><a href=\"#cb19-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-36\"><a href=\"#cb19-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1]  1.3 1.5   1.8    1  1791</span></span>\n<span id=\"cb19-37\"><a href=\"#cb19-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[2]  1.2 1.4   1.6    1  2040</span></span>\n<span id=\"cb19-38\"><a href=\"#cb19-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[3]  1.3 1.5   1.8    1  1607</span></span>\n<span id=\"cb19-39\"><a href=\"#cb19-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-40\"><a href=\"#cb19-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb19-41\"><a href=\"#cb19-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-42\"><a href=\"#cb19-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)     0.11  1.20  4.10 1.01   464</span></span>\n<span id=\"cb19-43\"><a href=\"#cb19-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriessensor_2 -2.40 -1.60 -0.65 1.00   831</span></span>\n<span id=\"cb19-44\"><a href=\"#cb19-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriessensor_3 -0.59  0.49  1.60 1.00  1316</span></span>\n<span id=\"cb19-45\"><a href=\"#cb19-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-46\"><a href=\"#cb19-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM observation smooths:</span></span>\n<span id=\"cb19-47\"><a href=\"#cb19-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                         edf Ref.df   Chi.sq p-value    </span></span>\n<span id=\"cb19-48\"><a href=\"#cb19-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(temperature)        5.335      9 1446.722  &lt;2e-16 ***</span></span>\n<span id=\"cb19-49\"><a href=\"#cb19-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(series,temperature) 2.545     16    1.042       1    </span></span>\n<span id=\"cb19-50\"><a href=\"#cb19-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb19-51\"><a href=\"#cb19-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb19-52\"><a href=\"#cb19-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-53\"><a href=\"#cb19-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb19-54\"><a href=\"#cb19-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-55\"><a href=\"#cb19-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.89 1.2   1.5    1   576</span></span>\n<span id=\"cb19-56\"><a href=\"#cb19-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-57\"><a href=\"#cb19-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb19-58\"><a href=\"#cb19-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-59\"><a href=\"#cb19-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.56 0.77  0.97 1.01   378</span></span>\n<span id=\"cb19-60\"><a href=\"#cb19-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-61\"><a href=\"#cb19-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb19-62\"><a href=\"#cb19-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb19-63\"><a href=\"#cb19-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(productivity) 1.865      7  41.97   0.228</span></span>\n<span id=\"cb19-64\"><a href=\"#cb19-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-65\"><a href=\"#cb19-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb19-66\"><a href=\"#cb19-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb19-67\"><a href=\"#cb19-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb19-68\"><a href=\"#cb19-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb19-69\"><a href=\"#cb19-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb19-70\"><a href=\"#cb19-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-71\"><a href=\"#cb19-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb19-72\"><a href=\"#cb19-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb19-73\"><a href=\"#cb19-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb19-74\"><a href=\"#cb19-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-75\"><a href=\"#cb19-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n</div>\n<div id=\"inspecting-effects-on-both-process-and-observation-models\" class=\"section level3\">\n<h3>Inspecting effects on both process and observation models</h3>\n<p>Don’t pay much attention to the approximate <em>p</em>-values of the\nsmooth terms. The calculation for these values is incredibly sensitive\nto the estimates for the smoothing parameters so I don’t tend to find\nthem to be very meaningful. What are meaningful, however, are\nprediction-based plots of the smooth functions. All main effects can be\nquickly plotted with <code>conditional_effects</code>:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p><code>conditional_effects</code> is simply a wrapper to the more\nflexible <code>plot_predictions</code> function from the\n<code>marginaleffects</code> package. We can get more useful plots of\nthese effects using this function for further customisation:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_predictions</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  mod,</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>  <span class=\"at\">condition =</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;temperature&quot;</span>, <span class=\"st\">&quot;series&quot;</span>, <span class=\"st\">&quot;series&quot;</span>),</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>  <span class=\"at\">points =</span> <span class=\"fl\">0.5</span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span></span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>  <span class=\"fu\">theme</span>(<span class=\"at\">legend.position =</span> <span class=\"st\">&quot;none&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We have successfully estimated effects, some of them nonlinear, that\nimpact the hidden process AND the observations. All in a single joint\nmodel. But there can always be challenges with these models,\nparticularly when estimating both process and observation error at the\nsame time.</p>\n</div>\n<div id=\"recovering-the-hidden-signal\" class=\"section level3\">\n<h3>Recovering the hidden signal</h3>\n<p>A final but very key question is whether we can successfully recover\nthe true hidden signal. The <code>trend</code> slot in the returned\nmodel parameters has the estimates for this signal, which we can easily\nplot using the <code>mvgam</code> S3 method for <code>plot</code>. We\ncan also overlay the true values for the hidden signal, which shows that\nour model has done a good job of recovering it:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod, </span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>     <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a>  ggplot2<span class=\"sc\">::</span><span class=\"fu\">geom_point</span>(<span class=\"at\">data =</span> <span class=\"fu\">data.frame</span>(<span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">100</span>,</span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a>                                        <span class=\"at\">y =</span> true_signal),</span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a>                      <span class=\"at\">mapping =</span> ggplot2<span class=\"sc\">::</span><span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time,</span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a>                                             <span class=\"at\">y =</span> y))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer a lot of useful material\nabout other types of State-Space models and how they can be applied in\npractice:</p>\n<p>Auger‐Méthé, Marie, et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470\">“A\nguide to state–space modeling of ecological time series.</a>”\n<em>Ecological Monographs</em> 91.4 (2021): e01470.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. “<a href=\"https://journal.r-project.org/articles/RJ-2012-002/\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata.</a>” <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Ward, Eric J., et al. “<a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x\">Inferring\nspatial structure from time‐series data: using multivariate state‐space\nmodels to detect metapopulation structure of California sea lions in the\nGulf of California, Mexico.</a>” <em>Journal of Applied Ecology</em>\n47.1 (2010): 47-56.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please reach out if you are\ninterested (n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "doc/time_varying_effects.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nset.seed(1111)\nN <- 200\nbeta_temp <- mvgam:::sim_gp(rnorm(1), alpha_gp = 0.75, rho_gp = 10, h = N) + 0.5\n\n\n## ----fig.alt = \"Simulating time-varying effects in mvgam and R\"------------------\nplot(\n  beta_temp,\n  type = \"l\",\n  lwd = 3,\n  bty = \"l\",\n  xlab = \"Time\",\n  ylab = \"Coefficient\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n\n\n## --------------------------------------------------------------------------------\ntemp <- rnorm(N, sd = 1)\n\n\n## ----fig.alt = \"Simulating time-varying effects in mvgam and R\"------------------\nout <- rnorm(N, mean = 4 + beta_temp * temp, sd = 0.25)\ntime <- seq_along(temp)\nplot(\n  out,\n  type = \"l\",\n  lwd = 3,\n  bty = \"l\",\n  xlab = \"Time\",\n  ylab = \"Outcome\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n\n\n## --------------------------------------------------------------------------------\ndata <- data.frame(out, temp, time)\ndata_train <- data[1:190, ]\ndata_test <- data[191:200, ]\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod <- mvgam(\n  out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n#   family = gaussian(),\n#   data = data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n\n\n## --------------------------------------------------------------------------------\nrequire(marginaleffects)\nrange_round <- function(x) {\n  round(range(x, na.rm = TRUE), 2)\n}\nplot_predictions(\n  mod,\n  newdata = datagrid(\n    time = unique,\n    temp = range_round\n  ),\n  by = c(\"time\", \"temp\", \"temp\"),\n  type = \"link\"\n)\n\n\n## --------------------------------------------------------------------------------\nfc <- forecast(mod, newdata = data_test)\nplot(fc)\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod <- mvgam(\n  out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(out ~ dynamic(temp, k = 40),\n#   family = gaussian(),\n#   data = data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n\n\n## --------------------------------------------------------------------------------\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda\"))\ndplyr::glimpse(SalmonSurvCUI)\n\n\n## --------------------------------------------------------------------------------\nSalmonSurvCUI %>%\n  # create a time variable\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  # create a series variable\n  dplyr::mutate(series = as.factor(\"salmon\")) %>%\n  # z-score the covariate CUI.apr\n  dplyr::mutate(CUI.apr = as.vector(scale(CUI.apr))) %>%\n  # convert logit-transformed survival back to proportional\n  dplyr::mutate(survival = plogis(logit.s)) -> model_data\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(model_data)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(data = model_data, y = \"survival\")\n\n\n## ----include = FALSE-------------------------------------------------------------\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n\n\n## ----eval = FALSE----------------------------------------------------------------\n# mod0 <- mvgam(\n#   formula = survival ~ 1,\n#   trend_model = AR(),\n#   noncentred = TRUE,\n#   priors = prior(normal(-3.5, 0.5), class = Intercept),\n#   family = betar(),\n#   data = model_data,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod0)\n\n\n## --------------------------------------------------------------------------------\nplot(mod0, type = \"trend\")\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  control = list(adapt_delta = 0.99),\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod1 <- mvgam(\n#   formula = survival ~ 1,\n#   trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n#   trend_model = AR(),\n#   noncentred = TRUE,\n#   priors = prior(normal(-3.5, 0.5), class = Intercept),\n#   family = betar(),\n#   data = model_data,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod1, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot(mod1, type = \"trend\")\n\n\n## --------------------------------------------------------------------------------\nplot(mod1, type = \"forecast\")\n\n\n## --------------------------------------------------------------------------------\n# Extract estimates of the process error 'sigma' for each model\nmod0_sigma <- as.data.frame(mod0, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod0\")\nmod1_sigma <- as.data.frame(mod1, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod1\")\nsigmas <- rbind(mod0_sigma, mod1_sigma)\n\n# Plot using ggplot2\nrequire(ggplot2)\nggplot(sigmas, aes(y = `sigma[1]`, fill = model)) +\n  geom_density(alpha = 0.3, colour = NA) +\n  coord_flip()\n\n\n## --------------------------------------------------------------------------------\nplot(mod1, type = \"smooths\", trend_effects = TRUE)\n\n\n## --------------------------------------------------------------------------------\nloo_compare(mod0, mod1)\n\n\n## ----include=FALSE---------------------------------------------------------------\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# lfo_mod0 <- lfo_cv(mod0, min_t = 30)\n# lfo_mod1 <- lfo_cv(mod1, min_t = 30)\n\n## --------------------------------------------------------------------------------\nsum(lfo_mod0$elpds)\nsum(lfo_mod1$elpds)\n\n\n## ----fig.alt = \"Comparing forecast skill for dynamic beta regression models in mvgam and R\"----\nplot(\n  x = 1:length(lfo_mod0$elpds) + 30,\n  y = lfo_mod0$elpds - lfo_mod1$elpds,\n  ylab = \"ELPDmod0 - ELPDmod1\",\n  xlab = \"Evaluation time point\",\n  pch = 16,\n  col = \"darkred\",\n  bty = \"l\"\n)\nabline(h = 0, lty = \"dashed\")\n"
  },
  {
    "path": "doc/time_varying_effects.Rmd",
    "content": "---\ntitle: \"Time-varying effects in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Time-varying effects in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to estimate and forecast regression coefficients that vary through time.\n\n## Time-varying effects\nDynamic fixed-effect coefficients (often referred to as dynamic linear models) can be readily incorporated into GAMs / DGAMs. In `mvgam`, the `dynamic()` formula wrapper offers a convenient interface to set these up. The plan is to incorporate a range of dynamic options (such as random walk, AR1 etc...) but for the moment only low-rank Gaussian Process (GP) smooths are allowed (making use either of the `gp` basis in `mgcv` of of Hilbert space approximate GPs). These are advantageous over splines or random walk effects for several reasons. First, GPs will force the time-varying effect to be smooth. This often makes sense in reality, where we would not expect a regression coefficient to change rapidly from one time point to the next. Second, GPs provide information on the 'global' dynamics of a time-varying effect through their length-scale parameters. This means we can use them to provide accurate forecasts of how an effect is expected to change in the future, something that we couldn't do well if we used splines to estimate the effect. An example below illustrates.\n\n### Simulating time-varying effects\nSimulate a time-varying coefficient using a squared exponential Gaussian Process function with length scale $\\rho$=10. We will do this using an internal function from `mvgam` (the `sim_gp` function):\n```{r}\nset.seed(1111)\nN <- 200\nbeta_temp <- mvgam:::sim_gp(rnorm(1),\n  alpha_gp = 0.75,\n  rho_gp = 10,\n  h = N\n) + 0.5\n```\n\nA plot of the time-varying coefficient shows that it changes smoothly through time:\n```{r, fig.alt = \"Simulating time-varying effects in mvgam and R\"}\nplot(beta_temp,\n  type = \"l\", lwd = 3,\n  bty = \"l\", xlab = \"Time\", ylab = \"Coefficient\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n```\n\nNext we need to simulate the values of the covariate, which we will call `temp` (to represent $temperature$). In this case we just use a standard normal distribution to simulate this covariate:\n```{r}\ntemp <- rnorm(N, sd = 1)\n```\n\nFinally, simulate the outcome variable, which is a Gaussian observation process (with observation error) over the time-varying effect of $temperature$\n```{r, fig.alt = \"Simulating time-varying effects in mvgam and R\"}\nout <- rnorm(N,\n  mean = 4 + beta_temp * temp,\n  sd = 0.25\n)\ntime <- seq_along(temp)\nplot(out,\n  type = \"l\", lwd = 3,\n  bty = \"l\", xlab = \"Time\", ylab = \"Outcome\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n```\n\nGather the data into a `data.frame` for fitting models, and split the data into training and testing folds.\n```{r}\ndata <- data.frame(out, temp, time)\ndata_train <- data[1:190, ]\ndata_test <- data[191:200, ]\n```\n\n### The `dynamic()` function\nTime-varying coefficients can be fairly easily set up using the `s()` or `gp()` wrapper functions in `mvgam` formulae by fitting a nonlinear effect of `time` and using the covariate of interest as the numeric `by` variable (see `?mgcv::s` or `?brms::gp` for more details). The `dynamic()` formula wrapper offers a way to automate this process, and will eventually allow for a broader variety of time-varying effects (such as random walk or AR processes). Depending on the arguments that are specified to `dynamic`, it will either set up a low-rank GP smooth function using `s()` with `bs = 'gp'` and a fixed value of the length scale parameter $\\rho$, or it will set up a Hilbert space approximate GP using the `gp()` function with `c=5/4` so that $\\rho$ is estimated (see `?dynamic` for more details). In this first example we will use the `s()` option, and will mis-specify the $\\rho$ parameter here as, in practice, it is never known. This call to `dynamic()` will set up the following smooth: `s(time, by = temp, bs = \"gp\", m = c(-2, 8, 2), k = 40)`\n```{r, include=FALSE}\nmod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\n```{r, eval=FALSE}\nmod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\nInspect the model summary, which shows how the `dynamic()` wrapper was used to construct a low-rank Gaussian Process smooth function:\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nBecause this model used a spline with a `gp` basis, it's smooths can be visualised just like any other `gam`. We can plot the estimates for the in-sample and out-of-sample periods to see how the Gaussian Process function produces sensible smooth forecasts. Here we supply the full dataset to the `newdata` argument in `plot_mvgam_smooth()` to inspect posterior forecasts of the time-varying smooth function. Overlay the true simulated function to see that the model has adequately estimated it's dynamics in both the training and testing data partitions\n```{r}\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n```\n\nWe can also use `plot_predictions()` from the `marginaleffects` package to visualise the time-varying coefficient for what the effect would be estimated to be at different values of $temperature$:\n```{r}\nrequire(marginaleffects)\nrange_round <- function(x) {\n  round(range(x, na.rm = TRUE), 2)\n}\nplot_predictions(mod,\n  newdata = datagrid(\n    time = unique,\n    temp = range_round\n  ),\n  by = c(\"time\", \"temp\", \"temp\"),\n  type = \"link\"\n)\n```\n\nThis results in sensible forecasts of the observations as well\n```{r}\nfc <- forecast(mod, newdata = data_test)\nplot(fc)\n```\n\nThe syntax is very similar if we wish to estimate the parameters of the underlying Gaussian Process, this time using a Hilbert space approximation. We simply omit the `rho` argument in `dynamic()` to make this happen. This will set up a call similar to `gp(time, by = 'temp', c = 5/4, k = 40)`.\n```{r include=FALSE}\nmod <- mvgam(out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\nThis model summary now contains estimates for the marginal deviation and length scale parameters of the underlying Gaussian Process function:\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nEffects for `gp()` terms can also be plotted as smooths:\n```{r}\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n```\n\n## Salmon survival example\nHere we will use openly available data on marine survival of Chinook salmon to illustrate how time-varying effects can be used to improve ecological time series models. [Scheuerell and Williams (2005)](https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1365-2419.2005.00346.x) used a dynamic linear model to examine the relationship between marine survival of Chinook salmon and an index of ocean upwelling strength along the west coast of the USA. The authors hypothesized that stronger upwelling in April should create better growing conditions for phytoplankton, which would then translate into more zooplankton and provide better foraging opportunities for juvenile salmon entering the ocean. The data on survival is measured as a proportional variable over 42 years (1964–2005) and is available in the `MARSS` package:\n```{r}\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda\"))\ndplyr::glimpse(SalmonSurvCUI)\n```\n\nFirst we need to prepare the data for modelling. The variable `CUI.apr` will be standardized to make it easier for the sampler to estimate underlying GP parameters for the time-varying effect. We also need to convert the survival back to a proportion, as in its current form it has been logit-transformed (this is because most time series packages cannot handle proportional data). As usual, we also need to create a `time` indicator and a `series` indicator for working in `mvgam`:\n```{r}\nSalmonSurvCUI %>%\n  # create a time variable\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  # create a series variable\n  dplyr::mutate(series = as.factor(\"salmon\")) %>%\n  # z-score the covariate CUI.apr\n  dplyr::mutate(CUI.apr = as.vector(scale(CUI.apr))) %>%\n  # convert logit-transformed survival back to proportional\n  dplyr::mutate(survival = plogis(logit.s)) -> model_data\n```\n\nInspect the data\n```{r}\ndplyr::glimpse(model_data)\n```\n\nPlot features of the outcome variable, which shows that it is a proportional variable with particular restrictions that we want to model:\n```{r}\nplot_mvgam_series(data = model_data, y = \"survival\")\n```\n\n\n### A State-Space Beta regression\n`mvgam` can easily handle data that are bounded at 0 and 1 with a Beta observation model (using the `mgcv` function `betar()`, see `?mgcv::betar` for details).  First we will fit a simple State-Space model that uses an AR1 dynamic process model with no predictors and a Beta observation model:\n```{r include = FALSE}\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\n```{r eval = FALSE}\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\nThe summary of this model shows good behaviour of the Hamiltonian Monte Carlo sampler and provides useful summaries on the Beta observation model parameters:\n```{r}\nsummary(mod0)\n```\n\nA plot of the underlying dynamic component shows how it has easily handled the temporal evolution of the time series:\n```{r}\nplot(mod0, type = \"trend\")\n```\n\n### Including time-varying upwelling effects\nNow we can increase the complexity of our model by constructing and fitting a State-Space model with a time-varying effect of the coastal upwelling index in addition to the autoregressive dynamics. We again use a Beta observation model to capture the restrictions of our proportional observations, but this time will include a `dynamic()` effect of `CUI.apr` in the latent process model. We do not specify the $\\rho$ parameter, instead opting to estimate it using a Hilbert space approximate GP:\n```{r include=FALSE}\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  control = list(adapt_delta = 0.99),\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\nThe summary for this model now includes estimates for the time-varying GP parameters:\n```{r}\nsummary(mod1, include_betas = FALSE)\n```\n\nThe estimates for the underlying dynamic process, and for the hindcasts, haven't changed much:\n```{r}\nplot(mod1, type = \"trend\")\n```\n\n```{r}\nplot(mod1, type = \"forecast\")\n```\n\nBut the process error parameter $\\sigma$ is slightly smaller for this model than for the first model:\n```{r}\n# Extract estimates of the process error 'sigma' for each model\nmod0_sigma <- as.data.frame(mod0, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod0\")\nmod1_sigma <- as.data.frame(mod1, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod1\")\nsigmas <- rbind(mod0_sigma, mod1_sigma)\n\n# Plot using ggplot2\nrequire(ggplot2)\nggplot(sigmas, aes(y = `sigma[1]`, fill = model)) +\n  geom_density(alpha = 0.3, colour = NA) +\n  coord_flip()\n```\n\nWhy does the process error not need to be as flexible in the second model? Because the estimates of this dynamic process are now informed partly by the time-varying effect of upwelling, which we can visualise on the link scale using `plot()`:\n```{r}\nplot(mod1, type = \"smooths\", trend_effects = TRUE)\n```\n\n### Comparing model predictive performances\nA key question when fitting multiple time series models is whether one of them provides better predictions than the other. There are several options in `mvgam` for exploring this quantitatively. First, we can compare models based on in-sample approximate leave-one-out cross-validation as implemented in the popular `loo` package:\n```{r}\nloo_compare(mod0, mod1)\n```\n\nThe second model has the larger Expected Log Predictive Density (ELPD), meaning that it is slightly favoured over the simpler model that did not include the time-varying upwelling effect. However, the two models certainly do not differ by much. But this metric only compares in-sample performance, and we are hoping to use our models to produce reasonable forecasts. Luckily, `mvgam` also has routines for comparing models using approximate leave-future-out cross-validation. Here we refit both models to a reduced training set (starting at time point 30) and produce approximate 1-step ahead forecasts. These forecasts are used to estimate forecast ELPD before expanding the training set one time point at a time. We use Pareto-smoothed importance sampling to reweight posterior predictions, acting as a kind of particle filter so that we don't need to refit the model too often (you can read more about how this process works in Bürkner et al. 2020).\n```{r include=FALSE}\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n```\n\n```{r eval=FALSE}\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n```\n\nThe model with the time-varying upwelling effect tends to provides better 1-step ahead forecasts, with a higher total forecast ELPD\n```{r}\nsum(lfo_mod0$elpds)\nsum(lfo_mod1$elpds)\n```\n\nWe can also plot the ELPDs for each model as a contrast. Here, values less than zero suggest the time-varying predictor model (Mod1) gives better 1-step ahead forecasts:\n```{r, fig.alt = \"Comparing forecast skill for dynamic beta regression models in mvgam and R\"}\nplot(\n  x = 1:length(lfo_mod0$elpds) + 30,\n  y = lfo_mod0$elpds - lfo_mod1$elpds,\n  ylab = \"ELPDmod0 - ELPDmod1\",\n  xlab = \"Evaluation time point\",\n  pch = 16,\n  col = \"darkred\",\n  bty = \"l\"\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nA useful exercise to further expand this model would be to think about what kinds of predictors might impact measurement error, which could easily be implemented into the observation formula in `mvgam()`. But for now, we will leave the model as-is.\n\n## Further reading\nThe following papers and resources offer a lot of useful material about dynamic linear models and how they can be applied / evaluated in practice:\n\nBürkner, PC, Gabry, J and Vehtari, A [Approximate leave-future-out cross-validation for Bayesian time series models](https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262). *Journal of Statistical Computation and Simulation*. 90:14 (2020) 2499-2523.\n  \nHerrero, Asier, et al. [From the individual to the landscape and back: time‐varying effects of climate and herbivory on tree sapling growth at distribution limits](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/1365-2745.12527). *Journal of Ecology* 104.2 (2016): 430-442.\n    \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. \"[MARSS: multivariate autoregressive state-space models for analyzing time-series data.](https://journal.r-project.org/articles/RJ-2012-002/)\" *R Journal*. 4.1 (2012): 11.\n  \nScheuerell, Mark D., and John G. Williams. [Forecasting climate induced changes in the survival of Snake River Spring/Summer Chinook Salmon (*Oncorhynchus Tshawytscha*)](https://onlinelibrary.wiley.com/doi/10.1111/j.1365-2419.2005.00346.x) *Fisheries Oceanography*  14 (2005): 448–57.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "doc/time_varying_effects.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Time-varying effects in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Time-varying effects in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#time-varying-effects\" id=\"toc-time-varying-effects\">Time-varying effects</a>\n<ul>\n<li><a href=\"#simulating-time-varying-effects\" id=\"toc-simulating-time-varying-effects\">Simulating time-varying\neffects</a></li>\n<li><a href=\"#the-dynamic-function\" id=\"toc-the-dynamic-function\">The\n<code>dynamic()</code> function</a></li>\n</ul></li>\n<li><a href=\"#salmon-survival-example\" id=\"toc-salmon-survival-example\">Salmon survival example</a>\n<ul>\n<li><a href=\"#a-state-space-beta-regression\" id=\"toc-a-state-space-beta-regression\">A State-Space Beta\nregression</a></li>\n<li><a href=\"#including-time-varying-upwelling-effects\" id=\"toc-including-time-varying-upwelling-effects\">Including time-varying\nupwelling effects</a></li>\n<li><a href=\"#comparing-model-predictive-performances\" id=\"toc-comparing-model-predictive-performances\">Comparing model\npredictive performances</a></li>\n</ul></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to estimate and forecast regression coefficients\nthat vary through time.</p>\n<div id=\"time-varying-effects\" class=\"section level2\">\n<h2>Time-varying effects</h2>\n<p>Dynamic fixed-effect coefficients (often referred to as dynamic\nlinear models) can be readily incorporated into GAMs / DGAMs. In\n<code>mvgam</code>, the <code>dynamic()</code> formula wrapper offers a\nconvenient interface to set these up. The plan is to incorporate a range\nof dynamic options (such as random walk, AR1 etc…) but for the moment\nonly low-rank Gaussian Process (GP) smooths are allowed (making use\neither of the <code>gp</code> basis in <code>mgcv</code> of of Hilbert\nspace approximate GPs). These are advantageous over splines or random\nwalk effects for several reasons. First, GPs will force the time-varying\neffect to be smooth. This often makes sense in reality, where we would\nnot expect a regression coefficient to change rapidly from one time\npoint to the next. Second, GPs provide information on the ‘global’\ndynamics of a time-varying effect through their length-scale parameters.\nThis means we can use them to provide accurate forecasts of how an\neffect is expected to change in the future, something that we couldn’t\ndo well if we used splines to estimate the effect. An example below\nillustrates.</p>\n<div id=\"simulating-time-varying-effects\" class=\"section level3\">\n<h3>Simulating time-varying effects</h3>\n<p>Simulate a time-varying coefficient using a squared exponential\nGaussian Process function with length scale <span class=\"math inline\">\\(\\rho\\)</span>=10. We will do this using an\ninternal function from <code>mvgam</code> (the <code>sim_gp</code>\nfunction):</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">1111</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>N <span class=\"ot\">&lt;-</span> <span class=\"dv\">200</span></span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>beta_temp <span class=\"ot\">&lt;-</span> mvgam<span class=\"sc\">:::</span><span class=\"fu\">sim_gp</span>(<span class=\"fu\">rnorm</span>(<span class=\"dv\">1</span>),</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">alpha_gp =</span> <span class=\"fl\">0.75</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"at\">rho_gp =</span> <span class=\"dv\">10</span>,</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">h =</span> N</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span> <span class=\"fl\">0.5</span></span></code></pre></div>\n<p>A plot of the time-varying coefficient shows that it changes smoothly\nthrough time:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(beta_temp,</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">3</span>,</span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Time&quot;</span>, <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Coefficient&quot;</span>,</span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span></span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a><span class=\"fu\">box</span>(<span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Simulating time-varying effects in mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Simulating time-varying effects in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Next we need to simulate the values of the covariate, which we will\ncall <code>temp</code> (to represent <span class=\"math inline\">\\(temperature\\)</span>). In this case we just use a\nstandard normal distribution to simulate this covariate:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>temp <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(N, <span class=\"at\">sd =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p>Finally, simulate the outcome variable, which is a Gaussian\nobservation process (with observation error) over the time-varying\neffect of <span class=\"math inline\">\\(temperature\\)</span></p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a>out <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(N,</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  <span class=\"at\">mean =</span> <span class=\"dv\">4</span> <span class=\"sc\">+</span> beta_temp <span class=\"sc\">*</span> temp,</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  <span class=\"at\">sd =</span> <span class=\"fl\">0.25</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>time <span class=\"ot\">&lt;-</span> <span class=\"fu\">seq_along</span>(temp)</span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(out,</span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">3</span>,</span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Time&quot;</span>, <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Outcome&quot;</span>,</span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"fu\">box</span>(<span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Simulating time-varying effects in mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Simulating time-varying effects in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Gather the data into a <code>data.frame</code> for fitting models,\nand split the data into training and testing folds.</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>data <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(out, temp, time)</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>data_train <span class=\"ot\">&lt;-</span> data[<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">190</span>, ]</span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>data_test <span class=\"ot\">&lt;-</span> data[<span class=\"dv\">191</span><span class=\"sc\">:</span><span class=\"dv\">200</span>, ]</span></code></pre></div>\n</div>\n<div id=\"the-dynamic-function\" class=\"section level3\">\n<h3>The <code>dynamic()</code> function</h3>\n<p>Time-varying coefficients can be fairly easily set up using the\n<code>s()</code> or <code>gp()</code> wrapper functions in\n<code>mvgam</code> formulae by fitting a nonlinear effect of\n<code>time</code> and using the covariate of interest as the numeric\n<code>by</code> variable (see <code>?mgcv::s</code> or\n<code>?brms::gp</code> for more details). The <code>dynamic()</code>\nformula wrapper offers a way to automate this process, and will\neventually allow for a broader variety of time-varying effects (such as\nrandom walk or AR processes). Depending on the arguments that are\nspecified to <code>dynamic</code>, it will either set up a low-rank GP\nsmooth function using <code>s()</code> with <code>bs = &#39;gp&#39;</code> and a\nfixed value of the length scale parameter <span class=\"math inline\">\\(\\rho\\)</span>, or it will set up a Hilbert space\napproximate GP using the <code>gp()</code> function with\n<code>c=5/4</code> so that <span class=\"math inline\">\\(\\rho\\)</span> is\nestimated (see <code>?dynamic</code> for more details). In this first\nexample we will use the <code>s()</code> option, and will mis-specify\nthe <span class=\"math inline\">\\(\\rho\\)</span> parameter here as, in\npractice, it is never known. This call to <code>dynamic()</code> will\nset up the following smooth:\n<code>s(time, by = temp, bs = &quot;gp&quot;, m = c(-2, 8, 2), k = 40)</code></p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(out <span class=\"sc\">~</span> <span class=\"fu\">dynamic</span>(temp, <span class=\"at\">rho =</span> <span class=\"dv\">8</span>, <span class=\"at\">stationary =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">k =</span> <span class=\"dv\">40</span>),</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Inspect the model summary, which shows how the <code>dynamic()</code>\nwrapper was used to construct a low-rank Gaussian Process smooth\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; out ~ s(time, by = temp, bs = &quot;gp&quot;, m = c(-2, 8, 2), k = 40)</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb7-16\"><a href=\"#cb7-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb7-17\"><a href=\"#cb7-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-18\"><a href=\"#cb7-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb7-19\"><a href=\"#cb7-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 190 </span></span>\n<span id=\"cb7-20\"><a href=\"#cb7-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-21\"><a href=\"#cb7-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb7-22\"><a href=\"#cb7-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb7-23\"><a href=\"#cb7-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb7-24\"><a href=\"#cb7-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb7-25\"><a href=\"#cb7-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-26\"><a href=\"#cb7-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb7-27\"><a href=\"#cb7-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-28\"><a href=\"#cb7-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1] 0.23 0.25  0.28    1  2113</span></span>\n<span id=\"cb7-29\"><a href=\"#cb7-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-30\"><a href=\"#cb7-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb7-31\"><a href=\"#cb7-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-32\"><a href=\"#cb7-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    4   4   4.1    1  3264</span></span>\n<span id=\"cb7-33\"><a href=\"#cb7-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-34\"><a href=\"#cb7-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb7-35\"><a href=\"#cb7-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                edf Ref.df Chi.sq p-value    </span></span>\n<span id=\"cb7-36\"><a href=\"#cb7-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):temp 16.35     40  168.2  &lt;2e-16 ***</span></span>\n<span id=\"cb7-37\"><a href=\"#cb7-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb7-38\"><a href=\"#cb7-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb7-39\"><a href=\"#cb7-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-40\"><a href=\"#cb7-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb7-41\"><a href=\"#cb7-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb7-42\"><a href=\"#cb7-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb7-43\"><a href=\"#cb7-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb7-44\"><a href=\"#cb7-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb7-45\"><a href=\"#cb7-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-46\"><a href=\"#cb7-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb7-47\"><a href=\"#cb7-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb7-48\"><a href=\"#cb7-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb7-49\"><a href=\"#cb7-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-50\"><a href=\"#cb7-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Because this model used a spline with a <code>gp</code> basis, it’s\nsmooths can be visualised just like any other <code>gam</code>. We can\nplot the estimates for the in-sample and out-of-sample periods to see\nhow the Gaussian Process function produces sensible smooth forecasts.\nHere we supply the full dataset to the <code>newdata</code> argument in\n<code>plot_mvgam_smooth()</code> to inspect posterior forecasts of the\ntime-varying smooth function. Overlay the true simulated function to see\nthat the model has adequately estimated it’s dynamics in both the\ntraining and testing data partitions</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(mod, <span class=\"at\">smooth =</span> <span class=\"dv\">1</span>, <span class=\"at\">newdata =</span> data)</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"dv\">190</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"fl\">2.5</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>)</span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can also use <code>plot_predictions()</code> from the\n<code>marginaleffects</code> package to visualise the time-varying\ncoefficient for what the effect would be estimated to be at different\nvalues of <span class=\"math inline\">\\(temperature\\)</span>:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">require</span>(marginaleffects)</span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a>range_round <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">range</span>(x, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb9-5\"><a href=\"#cb9-5\" tabindex=\"-1\"></a><span class=\"fu\">plot_predictions</span>(mod,</span>\n<span id=\"cb9-6\"><a href=\"#cb9-6\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> <span class=\"fu\">datagrid</span>(</span>\n<span id=\"cb9-7\"><a href=\"#cb9-7\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> unique,</span>\n<span id=\"cb9-8\"><a href=\"#cb9-8\" tabindex=\"-1\"></a>    <span class=\"at\">temp =</span> range_round</span>\n<span id=\"cb9-9\"><a href=\"#cb9-9\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb9-10\"><a href=\"#cb9-10\" tabindex=\"-1\"></a>  <span class=\"at\">by =</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;time&quot;</span>, <span class=\"st\">&quot;temp&quot;</span>, <span class=\"st\">&quot;temp&quot;</span>),</span>\n<span id=\"cb9-11\"><a href=\"#cb9-11\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span></span>\n<span id=\"cb9-12\"><a href=\"#cb9-12\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This results in sensible forecasts of the observations as well</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>fc <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod, <span class=\"at\">newdata =</span> data_test)</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The syntax is very similar if we wish to estimate the parameters of\nthe underlying Gaussian Process, this time using a Hilbert space\napproximation. We simply omit the <code>rho</code> argument in\n<code>dynamic()</code> to make this happen. This will set up a call\nsimilar to <code>gp(time, by = &#39;temp&#39;, c = 5/4, k = 40)</code>.</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(out <span class=\"sc\">~</span> <span class=\"fu\">dynamic</span>(temp, <span class=\"at\">k =</span> <span class=\"dv\">40</span>),</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>This model summary now contains estimates for the marginal deviation\nand length scale parameters of the underlying Gaussian Process\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; out ~ gp(time, by = temp, c = 5/4, k = 40, scale = TRUE)</span></span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-6\"><a href=\"#cb12-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb12-7\"><a href=\"#cb12-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb12-8\"><a href=\"#cb12-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-9\"><a href=\"#cb12-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb12-10\"><a href=\"#cb12-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb12-11\"><a href=\"#cb12-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-12\"><a href=\"#cb12-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb12-13\"><a href=\"#cb12-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb12-14\"><a href=\"#cb12-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-15\"><a href=\"#cb12-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb12-16\"><a href=\"#cb12-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb12-17\"><a href=\"#cb12-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-18\"><a href=\"#cb12-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb12-19\"><a href=\"#cb12-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 190 </span></span>\n<span id=\"cb12-20\"><a href=\"#cb12-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-21\"><a href=\"#cb12-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb12-22\"><a href=\"#cb12-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb12-23\"><a href=\"#cb12-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb12-24\"><a href=\"#cb12-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb12-25\"><a href=\"#cb12-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-26\"><a href=\"#cb12-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb12-27\"><a href=\"#cb12-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb12-28\"><a href=\"#cb12-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1] 0.24 0.26  0.29    1  2547</span></span>\n<span id=\"cb12-29\"><a href=\"#cb12-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-30\"><a href=\"#cb12-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb12-31\"><a href=\"#cb12-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb12-32\"><a href=\"#cb12-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    4   4   4.1    1  2704</span></span>\n<span id=\"cb12-33\"><a href=\"#cb12-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-34\"><a href=\"#cb12-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM gp term marginal deviation (alpha) and length scale (rho) estimates:</span></span>\n<span id=\"cb12-35\"><a href=\"#cb12-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb12-36\"><a href=\"#cb12-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; alpha_gp(time):temp 0.630 0.880 1.400    1   734</span></span>\n<span id=\"cb12-37\"><a href=\"#cb12-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; rho_gp(time):temp   0.024 0.051 0.068    1   611</span></span>\n<span id=\"cb12-38\"><a href=\"#cb12-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-39\"><a href=\"#cb12-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb12-40\"><a href=\"#cb12-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb12-41\"><a href=\"#cb12-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb12-42\"><a href=\"#cb12-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb12-43\"><a href=\"#cb12-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb12-44\"><a href=\"#cb12-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-45\"><a href=\"#cb12-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb12-46\"><a href=\"#cb12-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb12-47\"><a href=\"#cb12-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb12-48\"><a href=\"#cb12-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-49\"><a href=\"#cb12-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Effects for <code>gp()</code> terms can also be plotted as\nsmooths:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(mod, <span class=\"at\">smooth =</span> <span class=\"dv\">1</span>, <span class=\"at\">newdata =</span> data)</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"dv\">190</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"fl\">2.5</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>)</span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"salmon-survival-example\" class=\"section level2\">\n<h2>Salmon survival example</h2>\n<p>Here we will use openly available data on marine survival of Chinook\nsalmon to illustrate how time-varying effects can be used to improve\necological time series models. <a href=\"https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1365-2419.2005.00346.x\">Scheuerell\nand Williams (2005)</a> used a dynamic linear model to examine the\nrelationship between marine survival of Chinook salmon and an index of\nocean upwelling strength along the west coast of the USA. The authors\nhypothesized that stronger upwelling in April should create better\ngrowing conditions for phytoplankton, which would then translate into\nmore zooplankton and provide better foraging opportunities for juvenile\nsalmon entering the ocean. The data on survival is measured as a\nproportional variable over 42 years (1964–2005) and is available in the\n<code>MARSS</code> package:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">load</span>(<span class=\"fu\">url</span>(<span class=\"st\">&quot;https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda&quot;</span>))</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(SalmonSurvCUI)</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 42</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 3</span></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year    &lt;int&gt; 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 19…</span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ logit.s &lt;dbl&gt; -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82,…</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ CUI.apr &lt;int&gt; 57, 5, 43, 11, 47, -21, 25, -2, -1, 43, 2, 35, 0, 1, -1, 6, -7…</span></span></code></pre></div>\n<p>First we need to prepare the data for modelling. The variable\n<code>CUI.apr</code> will be standardized to make it easier for the\nsampler to estimate underlying GP parameters for the time-varying\neffect. We also need to convert the survival back to a proportion, as in\nits current form it has been logit-transformed (this is because most\ntime series packages cannot handle proportional data). As usual, we also\nneed to create a <code>time</code> indicator and a <code>series</code>\nindicator for working in <code>mvgam</code>:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a>SalmonSurvCUI <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  <span class=\"co\"># create a time variable</span></span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">time =</span> dplyr<span class=\"sc\">::</span><span class=\"fu\">row_number</span>()) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>  <span class=\"co\"># create a series variable</span></span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">as.factor</span>(<span class=\"st\">&quot;salmon&quot;</span>)) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a>  <span class=\"co\"># z-score the covariate CUI.apr</span></span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">CUI.apr =</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(CUI.apr))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a>  <span class=\"co\"># convert logit-transformed survival back to proportional</span></span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">survival =</span> <span class=\"fu\">plogis</span>(logit.s)) <span class=\"ot\">-&gt;</span> model_data</span></code></pre></div>\n<p>Inspect the data</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(model_data)</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 42</span></span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 6</span></span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year     &lt;int&gt; 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1…</span></span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ logit.s  &lt;dbl&gt; -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82…</span></span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ CUI.apr  &lt;dbl&gt; 2.37949804, 0.03330223, 1.74782994, 0.30401713, 1.92830654, -…</span></span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time     &lt;int&gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18…</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series   &lt;fct&gt; salmon, salmon, salmon, salmon, salmon, salmon, salmon, salmo…</span></span>\n<span id=\"cb16-9\"><a href=\"#cb16-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ survival &lt;dbl&gt; 0.030472033, 0.034891409, 0.027119717, 0.046088827, 0.0263393…</span></span></code></pre></div>\n<p>Plot features of the outcome variable, which shows that it is a\nproportional variable with particular restrictions that we want to\nmodel:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(<span class=\"at\">data =</span> model_data, <span class=\"at\">y =</span> <span class=\"st\">&quot;survival&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"a-state-space-beta-regression\" class=\"section level3\">\n<h3>A State-Space Beta regression</h3>\n<p><code>mvgam</code> can easily handle data that are bounded at 0 and 1\nwith a Beta observation model (using the <code>mgcv</code> function\n<code>betar()</code>, see <code>?mgcv::betar</code> for details). First\nwe will fit a simple State-Space model that uses an AR1 dynamic process\nmodel with no predictors and a Beta observation model:</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a>mod0 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> survival <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"sc\">-</span><span class=\"fl\">3.5</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> Intercept),</span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data,</span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary of this model shows good behaviour of the Hamiltonian\nMonte Carlo sampler and provides useful summaries on the Beta\nobservation model parameters:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod0)</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; survival ~ 1</span></span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; beta</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; logit</span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 42 </span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-21\"><a href=\"#cb19-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb19-22\"><a href=\"#cb19-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb19-23\"><a href=\"#cb19-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb19-24\"><a href=\"#cb19-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb19-25\"><a href=\"#cb19-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-26\"><a href=\"#cb19-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation precision parameter estimates:</span></span>\n<span id=\"cb19-27\"><a href=\"#cb19-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-28\"><a href=\"#cb19-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; phi[1]   82 220   560 1.01   173</span></span>\n<span id=\"cb19-29\"><a href=\"#cb19-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-30\"><a href=\"#cb19-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb19-31\"><a href=\"#cb19-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-32\"><a href=\"#cb19-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept) -4.6 -4.3    -4    1   524</span></span>\n<span id=\"cb19-33\"><a href=\"#cb19-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-34\"><a href=\"#cb19-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb19-35\"><a href=\"#cb19-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-36\"><a href=\"#cb19-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.11 0.4  0.65 1.01   160</span></span>\n<span id=\"cb19-37\"><a href=\"#cb19-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-38\"><a href=\"#cb19-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; precision parameter:</span></span>\n<span id=\"cb19-39\"><a href=\"#cb19-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-40\"><a href=\"#cb19-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; tau[1]  2.4 6.4    77 1.01   273</span></span>\n<span id=\"cb19-41\"><a href=\"#cb19-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-42\"><a href=\"#cb19-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb19-43\"><a href=\"#cb19-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-44\"><a href=\"#cb19-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] -0.32 0.68  0.98 1.01   310</span></span>\n<span id=\"cb19-45\"><a href=\"#cb19-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-46\"><a href=\"#cb19-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb19-47\"><a href=\"#cb19-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb19-48\"><a href=\"#cb19-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb19-49\"><a href=\"#cb19-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb19-50\"><a href=\"#cb19-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb19-51\"><a href=\"#cb19-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-52\"><a href=\"#cb19-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb19-53\"><a href=\"#cb19-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb19-54\"><a href=\"#cb19-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb19-55\"><a href=\"#cb19-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-56\"><a href=\"#cb19-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>A plot of the underlying dynamic component shows how it has easily\nhandled the temporal evolution of the time series:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod0, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"including-time-varying-upwelling-effects\" class=\"section level3\">\n<h3>Including time-varying upwelling effects</h3>\n<p>Now we can increase the complexity of our model by constructing and\nfitting a State-Space model with a time-varying effect of the coastal\nupwelling index in addition to the autoregressive dynamics. We again use\na Beta observation model to capture the restrictions of our proportional\nobservations, but this time will include a <code>dynamic()</code> effect\nof <code>CUI.apr</code> in the latent process model. We do not specify\nthe <span class=\"math inline\">\\(\\rho\\)</span> parameter, instead opting\nto estimate it using a Hilbert space approximate GP:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> survival <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">dynamic</span>(CUI.apr, <span class=\"at\">k =</span> <span class=\"dv\">25</span>, <span class=\"at\">scale =</span> <span class=\"cn\">FALSE</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"sc\">-</span><span class=\"fl\">3.5</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> Intercept),</span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data,</span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary for this model now includes estimates for the\ntime-varying GP parameters:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod1, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; survival ~ 1</span></span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb22-7\"><a href=\"#cb22-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~dynamic(CUI.apr, k = 25, scale = FALSE) - 1</span></span>\n<span id=\"cb22-8\"><a href=\"#cb22-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb22-9\"><a href=\"#cb22-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-10\"><a href=\"#cb22-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb22-11\"><a href=\"#cb22-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; beta</span></span>\n<span id=\"cb22-12\"><a href=\"#cb22-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-13\"><a href=\"#cb22-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb22-14\"><a href=\"#cb22-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; logit</span></span>\n<span id=\"cb22-15\"><a href=\"#cb22-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-16\"><a href=\"#cb22-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb22-17\"><a href=\"#cb22-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb22-18\"><a href=\"#cb22-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-19\"><a href=\"#cb22-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb22-20\"><a href=\"#cb22-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb22-21\"><a href=\"#cb22-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-22\"><a href=\"#cb22-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb22-23\"><a href=\"#cb22-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb22-24\"><a href=\"#cb22-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-25\"><a href=\"#cb22-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb22-26\"><a href=\"#cb22-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 42 </span></span>\n<span id=\"cb22-27\"><a href=\"#cb22-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-28\"><a href=\"#cb22-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb22-29\"><a href=\"#cb22-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb22-30\"><a href=\"#cb22-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb22-31\"><a href=\"#cb22-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb22-32\"><a href=\"#cb22-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-33\"><a href=\"#cb22-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation precision parameter estimates:</span></span>\n<span id=\"cb22-34\"><a href=\"#cb22-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-35\"><a href=\"#cb22-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; phi[1]  170 340   650 1.01   794</span></span>\n<span id=\"cb22-36\"><a href=\"#cb22-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-37\"><a href=\"#cb22-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb22-38\"><a href=\"#cb22-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-39\"><a href=\"#cb22-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept) -4.4 -3.8  -2.9    1   682</span></span>\n<span id=\"cb22-40\"><a href=\"#cb22-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-41\"><a href=\"#cb22-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb22-42\"><a href=\"#cb22-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-43\"><a href=\"#cb22-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.17 0.32  0.51    1   661</span></span>\n<span id=\"cb22-44\"><a href=\"#cb22-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-45\"><a href=\"#cb22-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb22-46\"><a href=\"#cb22-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-47\"><a href=\"#cb22-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.57 0.93     1    1   498</span></span>\n<span id=\"cb22-48\"><a href=\"#cb22-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-49\"><a href=\"#cb22-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model gp term marginal deviation (alpha) and length scale (rho) estimates:</span></span>\n<span id=\"cb22-50\"><a href=\"#cb22-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                         2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-51\"><a href=\"#cb22-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; alpha_gp(time):CUI.apr 0.036 0.32   1.5 1.00   999</span></span>\n<span id=\"cb22-52\"><a href=\"#cb22-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; rho_gp(time):CUI.apr   1.300 5.80  43.0 1.01   607</span></span>\n<span id=\"cb22-53\"><a href=\"#cb22-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-54\"><a href=\"#cb22-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb22-55\"><a href=\"#cb22-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb22-56\"><a href=\"#cb22-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb22-57\"><a href=\"#cb22-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb22-58\"><a href=\"#cb22-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb22-59\"><a href=\"#cb22-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-60\"><a href=\"#cb22-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb22-61\"><a href=\"#cb22-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb22-62\"><a href=\"#cb22-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb22-63\"><a href=\"#cb22-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-64\"><a href=\"#cb22-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The estimates for the underlying dynamic process, and for the\nhindcasts, haven’t changed much:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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6TWBLp185VtewYm1hR9DdOdYlOWrQ4o14FlGqZS5ljIt4Ss9NS3Fetfr4LUdb3ibBvQGXV9L29mDitX4Cmuu5XQR1JhlGcT5CqtJPNTVWsVlW4zXaRyrNCKHE2vMKq0jOdey5RDmghrAGPvtZImxGsayfn77qn9oz+s43FBc8uHEGu+8tC50rqXEN99oVtpdc7wuQxevbccwyB4eYpHK54Kb0EAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIiVwfvLwneZlbROBMTKRGTt6xMCsTKBWGlArExmsR5N4ceX//r2aBTf52V+3qTWEzomECsTKtbvf91fXz79/evHsJTUw672q8QfF4iVCRXr6/zPt9//mpwSWhjziECsTKhY3+fVJR8+TatMiixiekwgViYesd6WcYit67cXIFYmwYwFFBArE49YUx8LeikgViYescY3sUi9iueIQKxMfGKVv4v0nEAsIALEAiJALCACxAIiQCwgAsQCIkAsIALEAiJALCACxAIiQCwgAsQCIkAsIALEAiJALCACxAIiQCwgAsQCIkAsIALEAiJALCACxAIiQCwgAsQCIvw/4Iu7mHR3epIAAAAASUVORK5CYII=\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>But the process error parameter <span class=\"math inline\">\\(\\sigma\\)</span> is slightly smaller for this model\nthan for the first model:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a><span class=\"co\"># Extract estimates of the process error &#39;sigma&#39; for each model</span></span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>mod0_sigma <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(mod0, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">model =</span> <span class=\"st\">&quot;Mod0&quot;</span>)</span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a>mod1_sigma <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(mod1, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">model =</span> <span class=\"st\">&quot;Mod1&quot;</span>)</span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a>sigmas <span class=\"ot\">&lt;-</span> <span class=\"fu\">rbind</span>(mod0_sigma, mod1_sigma)</span>\n<span id=\"cb25-7\"><a href=\"#cb25-7\" tabindex=\"-1\"></a></span>\n<span id=\"cb25-8\"><a href=\"#cb25-8\" tabindex=\"-1\"></a><span class=\"co\"># Plot using ggplot2</span></span>\n<span id=\"cb25-9\"><a href=\"#cb25-9\" tabindex=\"-1\"></a><span class=\"fu\">require</span>(ggplot2)</span>\n<span id=\"cb25-10\"><a href=\"#cb25-10\" tabindex=\"-1\"></a><span class=\"fu\">ggplot</span>(sigmas, <span class=\"fu\">aes</span>(<span class=\"at\">y =</span> <span class=\"st\">`</span><span class=\"at\">sigma[1]</span><span class=\"st\">`</span>, <span class=\"at\">fill =</span> model)) <span class=\"sc\">+</span></span>\n<span id=\"cb25-11\"><a href=\"#cb25-11\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_density</span>(<span class=\"at\">alpha =</span> <span class=\"fl\">0.3</span>, <span class=\"at\">colour =</span> <span class=\"cn\">NA</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb25-12\"><a href=\"#cb25-12\" tabindex=\"-1\"></a>  <span class=\"fu\">coord_flip</span>()</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Why does the process error not need to be as flexible in the second\nmodel? Because the estimates of this dynamic process are now informed\npartly by the time-varying effect of upwelling, which we can visualise\non the link scale using <code>plot()</code>:</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;smooths&quot;</span>, <span class=\"at\">trend_effects =</span> <span class=\"cn\">TRUE</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"comparing-model-predictive-performances\" class=\"section level3\">\n<h3>Comparing model predictive performances</h3>\n<p>A key question when fitting multiple time series models is whether\none of them provides better predictions than the other. There are\nseveral options in <code>mvgam</code> for exploring this quantitatively.\nFirst, we can compare models based on in-sample approximate\nleave-one-out cross-validation as implemented in the popular\n<code>loo</code> package:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a><span class=\"fu\">loo_compare</span>(mod0, mod1)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;      elpd_diff se_diff</span></span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mod0     0.0       0.0</span></span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mod1 -1308.3     135.3</span></span></code></pre></div>\n<p>The second model has the larger Expected Log Predictive Density\n(ELPD), meaning that it is slightly favoured over the simpler model that\ndid not include the time-varying upwelling effect. However, the two\nmodels certainly do not differ by much. But this metric only compares\nin-sample performance, and we are hoping to use our models to produce\nreasonable forecasts. Luckily, <code>mvgam</code> also has routines for\ncomparing models using approximate leave-future-out cross-validation.\nHere we refit both models to a reduced training set (starting at time\npoint 30) and produce approximate 1-step ahead forecasts. These\nforecasts are used to estimate forecast ELPD before expanding the\ntraining set one time point at a time. We use Pareto-smoothed importance\nsampling to reweight posterior predictions, acting as a kind of particle\nfilter so that we don’t need to refit the model too often (you can read\nmore about how this process works in Bürkner et al. 2020).</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a>lfo_mod0 <span class=\"ot\">&lt;-</span> <span class=\"fu\">lfo_cv</span>(mod0, <span class=\"at\">min_t =</span> <span class=\"dv\">30</span>)</span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a>lfo_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">lfo_cv</span>(mod1, <span class=\"at\">min_t =</span> <span class=\"dv\">30</span>)</span></code></pre></div>\n<p>The model with the time-varying upwelling effect tends to provides\nbetter 1-step ahead forecasts, with a higher total forecast ELPD</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a><span class=\"fu\">sum</span>(lfo_mod0<span class=\"sc\">$</span>elpds)</span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] 35.92439</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a><span class=\"fu\">sum</span>(lfo_mod1<span class=\"sc\">$</span>elpds)</span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] 37.0323</span></span></code></pre></div>\n<p>We can also plot the ELPDs for each model as a contrast. Here, values\nless than zero suggest the time-varying predictor model (Mod1) gives\nbetter 1-step ahead forecasts:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a>  <span class=\"at\">x =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">length</span>(lfo_mod0<span class=\"sc\">$</span>elpds) <span class=\"sc\">+</span> <span class=\"dv\">30</span>,</span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> lfo_mod0<span class=\"sc\">$</span>elpds <span class=\"sc\">-</span> lfo_mod1<span class=\"sc\">$</span>elpds,</span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;ELPDmod0 - ELPDmod1&quot;</span>,</span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Evaluation time point&quot;</span>,</span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>,</span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span></span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Comparing forecast skill for dynamic beta regression models in mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Comparing forecast skill for dynamic beta regression models in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>A useful exercise to further expand this model would be to think\nabout what kinds of predictors might impact measurement error, which\ncould easily be implemented into the observation formula in\n<code>mvgam()</code>. But for now, we will leave the model as-is.</p>\n</div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer a lot of useful material\nabout dynamic linear models and how they can be applied / evaluated in\npractice:</p>\n<p>Bürkner, PC, Gabry, J and Vehtari, A <a href=\"https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262\">Approximate\nleave-future-out cross-validation for Bayesian time series models</a>.\n<em>Journal of Statistical Computation and Simulation</em>. 90:14 (2020)\n2499-2523.</p>\n<p>Herrero, Asier, et al. <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/1365-2745.12527\">From\nthe individual to the landscape and back: time‐varying effects of\nclimate and herbivory on tree sapling growth at distribution limits</a>.\n<em>Journal of Ecology</em> 104.2 (2016): 430-442.</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. “<a href=\"https://journal.r-project.org/articles/RJ-2012-002/\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata.</a>” <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Scheuerell, Mark D., and John G. Williams. <a href=\"https://onlinelibrary.wiley.com/doi/10.1111/j.1365-2419.2005.00346.x\">Forecasting\nclimate induced changes in the survival of Snake River Spring/Summer\nChinook Salmon (<em>Oncorhynchus Tshawytscha</em>)</a> <em>Fisheries\nOceanography</em> 14 (2005): 448–57.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "doc/trend_formulas.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda\"))\n\n\n## --------------------------------------------------------------------------------\noutcomes <- c(\"Greens\", \"Bluegreens\", \"Diatoms\", \"Unicells\", \"Other.algae\")\n\n\n## --------------------------------------------------------------------------------\n# loop across each plankton group to create the long datframe\nplankton_data <- do.call(\n  rbind,\n  lapply(outcomes, function(x) {\n    # create a group-specific dataframe with counts labelled 'y'\n    # and the group name in the 'series' variable\n    data.frame(\n      year = lakeWAplanktonTrans[, \"Year\"],\n      month = lakeWAplanktonTrans[, \"Month\"],\n      y = lakeWAplanktonTrans[, x],\n      series = x,\n      temp = lakeWAplanktonTrans[, \"Temp\"]\n    )\n  })\n) %>%\n  # change the 'series' label to a factor\n  dplyr::mutate(series = factor(series)) %>%\n  # filter to only include some years in the data\n  dplyr::filter(year >= 1965 & year < 1975) %>%\n  dplyr::arrange(year, month) %>%\n  dplyr::group_by(series) %>%\n  # z-score the counts so they are approximately standard normal\n  dplyr::mutate(y = as.vector(scale(y))) %>%\n  # add the time indicator\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  dplyr::ungroup()\n\n\n## --------------------------------------------------------------------------------\nhead(plankton_data)\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(plankton_data)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(data = plankton_data, series = \"all\")\n\n\n## --------------------------------------------------------------------------------\nplankton_data %>%\n  dplyr::filter(series == \"Other.algae\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y), col = \"white\", size = 1.3) +\n  geom_line(aes(y = y), col = \"darkred\", size = 1.1) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Other algae (red)\")\n\n\n## --------------------------------------------------------------------------------\nplankton_data %>%\n  dplyr::filter(series == \"Diatoms\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y), col = \"white\", size = 1.3) +\n  geom_line(aes(y = y), col = \"darkred\", size = 1.1) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Diatoms (red)\")\n\n\n## --------------------------------------------------------------------------------\nplankton_train <- plankton_data %>%\n  dplyr::filter(time <= 112)\nplankton_test <- plankton_data %>%\n  dplyr::filter(time > 112)\n\n\n## ----notrend_mod, include = FALSE, results='hide'--------------------------------\nnotrend_mod <- mvgam(\n  y ~\n    te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = series) -\n    1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# notrend_mod <- mvgam(\n#   y ~\n#     # tensor of temp and month to capture\n#     # \"global\" seasonality\n#     te(temp, month, k = c(4, 4)) +\n#\n#     # series-specific deviation tensor products\n#     te(temp, month, k = c(4, 4), by = series) - 1,\n#   family = gaussian(),\n#   data = plankton_train,\n#   newdata = plankton_test,\n#   trend_model = \"None\"\n# )\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(notrend_mod, smooth = 1)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(notrend_mod, smooth = 2)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(notrend_mod, smooth = 3)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"forecast\", series = 1)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"forecast\", series = 2)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"forecast\", series = 3)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"residuals\", series = 1)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"residuals\", series = 3)\n\n\n## --------------------------------------------------------------------------------\npriors <- get_mvgam_priors(\n  # observation formula, which has no terms in it\n  y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) -\n    1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train\n)\n\n\n## --------------------------------------------------------------------------------\npriors[, 3]\n\n\n## --------------------------------------------------------------------------------\npriors[, 4]\n\n\n## --------------------------------------------------------------------------------\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n\n\n## ----var_mod, include = FALSE, results='hide'------------------------------------\nvar_mod <- mvgam(\n  y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) -\n      1\n  ,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(),\n  priors = priors,\n  adapt_delta = 0.99,\n  burnin = 1000\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# var_mod <- mvgam(\n#   # observation formula, which is empty\n#   forumla = y ~ -1,\n#\n#   # process model formula, which includes the smooth functions\n#   trend_formula = ~ te(temp, month, k = c(4, 4)) +\n#     te(temp, month, k = c(4, 4), by = trend) - 1,\n#\n#   # VAR1 model with uncorrelated process errors\n#   trend_model = VAR(),\n#   family = gaussian(),\n#   data = plankton_train,\n#   newdata = plankton_test,\n#\n#   # include the updated priors\n#   priors = priors,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(var_mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot(var_mod, \"smooths\", trend_effects = TRUE)\n\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(\n  var_mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(\n  var_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(var_mod, variable = \"sigma_obs\", regex = TRUE, type = \"hist\")\n\n\n## --------------------------------------------------------------------------------\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n\n\n## ----varcor_mod, include = FALSE, results='hide'---------------------------------\nvarcor_mod <- mvgam(\n  y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) -\n      1\n  ,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(cor = TRUE),\n  burnin = 1000,\n  adapt_delta = 0.99,\n  priors = priors\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# varcor_mod <- mvgam(\n#   # observation formula, which remains empty\n#   formula = y ~ -1,\n#\n#   # process model formula, which includes the smooth functions\n#   trend_formula = ~ te(temp, month, k = c(4, 4)) +\n#     te(temp, month, k = c(4, 4), by = trend) - 1,\n#\n#   # VAR1 model with correlated process errors\n#   trend_model = VAR(cor = TRUE),\n#   family = gaussian(),\n#   data = plankton_train,\n#   newdata = plankton_test,\n#\n#   # include the updated priors\n#   priors = priors,\n#   silent = 2\n# )\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(\n  varcor_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n\n## --------------------------------------------------------------------------------\nSigma_post <- as.matrix(\n  varcor_mod,\n  variable = \"Sigma\",\n  regex = TRUE\n)\nmedian_correlations <- cov2cor(\n  matrix(apply(Sigma_post, 2, median), nrow = 5, ncol = 5)\n)\nrownames(median_correlations) <-\n  colnames(median_correlations) <-\n    levels(plankton_train$series)\n\nround(median_correlations, 2)\n\n\n## --------------------------------------------------------------------------------\nirfs <- irf(varcor_mod, h = 12)\n\n\n## --------------------------------------------------------------------------------\nsummary(irfs)\n\n\n## --------------------------------------------------------------------------------\nplot(irfs, series = 3)\n\n\n## --------------------------------------------------------------------------------\nfevds <- fevd(varcor_mod, h = 12)\nplot(fevds)\n\n\n## --------------------------------------------------------------------------------\n# create forecast objects for each model\nfcvar <- forecast(var_mod)\nfcvarcor <- forecast(varcor_mod)\n\n# plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"variogram\")$all_series$score -\n  score(fcvar, score = \"variogram\")$all_series$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(variogram[VAR1cor] ~ -~ variogram[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n\n\n## --------------------------------------------------------------------------------\n# plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"energy\")$all_series$score -\n  score(fcvar, score = \"energy\")$all_series$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(energy[VAR1cor] ~ -~ energy[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n\n\n## --------------------------------------------------------------------------------\ndescription <- how_to_cite(varcor_mod)\n\n\n## ----eval = FALSE----------------------------------------------------------------\n# description\n\n## ----echo=FALSE------------------------------------------------------------------\ncat(\"Methods text skeleton\\n\")\ncat(insight::format_message(description$methods_text))\n\n\n## ----echo=FALSE------------------------------------------------------------------\ncat(\"\\nPrimary references\\n\")\nfor (i in seq_along(description$citations)) {\n  cat(insight::format_message(description$citations[[i]]))\n  cat('\\n')\n}\ncat(\"\\nOther useful references\\n\")\nfor (i in seq_along(description$other_citations)) {\n  cat(insight::format_message(description$other_citations[[i]]))\n  cat('\\n')\n}\n"
  },
  {
    "path": "doc/trend_formulas.Rmd",
    "content": "---\ntitle: \"State-Space models in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{State-Space models in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to fit and interrogate State-Space models with nonlinear effects.\n\n## State-Space Models\n\n![Illustration of a basic State-Space model, which assumes that  a latent dynamic *process* (X) can evolve independently from the way we take *observations* (Y) of that process](SS_model.svg){width=85%}\n\n<br>\n\nState-Space models allow us to separately make inferences about the underlying dynamic *process model* that we are interested in (i.e. the evolution of a time series or a collection of time series) and the *observation model* (i.e. the way that we survey / measure this underlying process). This is extremely useful in ecology because our observations are always imperfect / noisy measurements of the thing we are interested in measuring. It is also helpful because we often know that some covariates will impact our ability to measure accurately (i.e. we cannot take accurate counts of rodents if there is a thunderstorm happening) while other covariates might impact the underlying process (it is highly unlikely that rodent abundance responds to one storm, but instead probably responds to longer-term weather and climate variation). A State-Space model allows us to model both components in a single unified modelling framework. A major advantage of `mvgam` is that it can include nonlinear effects and random effects in BOTH model components while also capturing dynamic processes.\n\n### Lake Washington plankton data\nThe data we will use to illustrate how we can fit State-Space models in `mvgam` are from a long-term monitoring study of plankton counts (cells per mL) taken from Lake Washington in Washington, USA. The data are available as part of the `MARSS` package and can be downloaded using the following: \n```{r}\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda\"))\n```\n\nWe will work with five different groups of plankton:\n```{r}\noutcomes <- c(\"Greens\", \"Bluegreens\", \"Diatoms\", \"Unicells\", \"Other.algae\")\n```\n\nAs usual, preparing the data into the correct format for `mvgam` modelling takes a little bit of wrangling in `dplyr`:\n```{r}\n# loop across each plankton group to create the long datframe\nplankton_data <- do.call(rbind, lapply(outcomes, function(x) {\n  # create a group-specific dataframe with counts labelled 'y'\n  # and the group name in the 'series' variable\n  data.frame(\n    year = lakeWAplanktonTrans[, \"Year\"],\n    month = lakeWAplanktonTrans[, \"Month\"],\n    y = lakeWAplanktonTrans[, x],\n    series = x,\n    temp = lakeWAplanktonTrans[, \"Temp\"]\n  )\n})) %>%\n  # change the 'series' label to a factor\n  dplyr::mutate(series = factor(series)) %>%\n  # filter to only include some years in the data\n  dplyr::filter(year >= 1965 & year < 1975) %>%\n  dplyr::arrange(year, month) %>%\n  dplyr::group_by(series) %>%\n  # z-score the counts so they are approximately standard normal\n  dplyr::mutate(y = as.vector(scale(y))) %>%\n  # add the time indicator\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  dplyr::ungroup()\n```\n\nInspect the data structure\n```{r}\nhead(plankton_data)\n```\n\n```{r}\ndplyr::glimpse(plankton_data)\n```\n\nNote that we have z-scored the counts in this example as that will make it easier to specify priors (though this is not completely necessary; it is often better to build a model that respects the properties of the actual outcome variables)\n```{r}\nplot_mvgam_series(data = plankton_data, series = \"all\")\n```\n\nWe have some missing observations, but this isn't an issue for modelling in `mvgam`. A useful property to understand about these counts is that they tend to be highly seasonal. Below are some plots of z-scored counts against the z-scored temperature measurements in the lake for each month:\n```{r}\nplankton_data %>%\n  dplyr::filter(series == \"Other.algae\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y),\n    col = \"white\",\n    size = 1.3\n  ) +\n  geom_line(aes(y = y),\n    col = \"darkred\",\n    size = 1.1\n  ) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Other algae (red)\")\n```\n\n\n```{r}\nplankton_data %>%\n  dplyr::filter(series == \"Diatoms\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y),\n    col = \"white\",\n    size = 1.3\n  ) +\n  geom_line(aes(y = y),\n    col = \"darkred\",\n    size = 1.1\n  ) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Diatoms (red)\")\n```\n\nWe will have to try and capture this seasonality in our process model, which should be easy to do given the flexibility of GAMs. Next we will split the data into training and testing splits:\n```{r}\nplankton_train <- plankton_data %>%\n  dplyr::filter(time <= 112)\nplankton_test <- plankton_data %>%\n  dplyr::filter(time > 112)\n```\n\nNow time to fit some models. This requires a bit of thinking about how we can best tackle the seasonal variation and the likely dependence structure in the data. These algae are interacting as part of a complex system within the same lake, so we certainly expect there to be some lagged cross-dependencies underling their dynamics. But if we do not capture the seasonal variation, our multivariate dynamic model will be forced to try and capture it, which could lead to poor convergence and unstable results (we could feasibly capture cyclic dynamics with a more complex multi-species Lotka-Volterra model, but ordinary differential equation approaches are beyond the scope of `mvgam`). \n\n### Capturing seasonality\n\nFirst we will fit a model that does not include a dynamic component, just to see if it can reproduce the seasonal variation in the observations. This model introduces hierarchical multidimensional smooths, where all time series share a \"global\" tensor product of the `month` and `temp` variables, capturing our expectation that algal seasonality responds to temperature variation. But this response should depend on when in the year these temperatures are recorded (i.e. a response to warm temperatures in Spring should be different to a response to warm temperatures in Autumn). The model also fits series-specific deviation smooths (i.e. one tensor product per series) to capture how each algal group's seasonality differs from the overall \"global\" seasonality. Note that we do not include series-specific intercepts in this model because each series was z-scored to have a mean of 0.\n```{r notrend_mod, include = FALSE, results='hide'}\nnotrend_mod <- mvgam(\n  y ~\n    te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = series) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n```\n\n```{r eval=FALSE}\nnotrend_mod <- mvgam(\n  y ~\n    # tensor of temp and month to capture\n    # \"global\" seasonality\n    te(temp, month, k = c(4, 4)) +\n\n    # series-specific deviation tensor products\n    te(temp, month, k = c(4, 4), by = series) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n```\n\nThe \"global\" tensor product smooth function can be quickly visualized:\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 1)\n```\n\nOn this plot, red indicates below-average linear predictors and white indicates above-average. We can then plot the deviation smooths for a few algal groups to see how they vary from the \"global\" pattern:\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 2)\n```\n\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 3)\n```\n\nThese multidimensional smooths have done a good job of capturing the seasonal variation in our observations:\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 1)\n```\n\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 2)\n```\n\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 3)\n```\n\nThis basic model gives us confidence that we can capture the seasonal variation in the observations. But the model has not captured the remaining temporal dynamics, which is obvious when we inspect Dunn-Smyth residuals for a few series:\n```{r}\nplot(notrend_mod, type = \"residuals\", series = 1)\n```\n\n```{r}\nplot(notrend_mod, type = \"residuals\", series = 3)\n```\n\n\n### Multiseries dynamics\nNow it is time to get into multivariate State-Space models. We will fit two models that can both incorporate lagged cross-dependencies in the latent process models. The first model assumes that the process errors operate independently from one another, while the second assumes that there may be contemporaneous correlations in the process errors. Both models include a Vector Autoregressive component for the process means, and so both can model complex community dynamics. The models can be described mathematically as follows:\n\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Normal}(\\mu_{obs[t]}, \\sigma_{obs}) \\\\\n\\mu_{obs[t]} & = process_t \\\\\nprocess_t & \\sim \\text{MVNormal}(\\mu_{process[t]}, \\Sigma_{process}) \\\\\n\\mu_{process[t]} & = A * process_{t-1} + f_{global}(\\boldsymbol{month},\\boldsymbol{temp})_t + f_{series}(\\boldsymbol{month},\\boldsymbol{temp})_t \\\\\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp}) & = \\sum_{k=1}^{K}b_{global} * \\beta_{global} \\\\\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp}) & = \\sum_{k=1}^{K}b_{series} * \\beta_{series} \\end{align*}\n\nHere you can see that there are no terms in the observation model apart from the underlying process model. But we could easily add covariates into the observation model if we felt that they could explain some of the systematic observation errors. We also assume independent observation processes (there is no covariance structure in the observation errors $\\sigma_{obs}$).  At present, `mvgam` does not support multivariate observation models. But this feature will be added in future versions. However the underlying process model is multivariate, and there is a lot going on here. This component has a Vector Autoregressive part, where the process mean at time $t$ $(\\mu_{process[t]})$ is a vector that evolves as a function of where the vector-valued process model was at time $t-1$. The $A$ matrix captures these dynamics with self-dependencies on the diagonal and possibly asymmetric cross-dependencies on the off-diagonals, while also incorporating the nonlinear smooth functions that capture seasonality for each series. The contemporaneous process errors are modeled by $\\Sigma_{process}$, which can be constrained so that process errors are independent (i.e. setting the off-diagonals to 0) or can be fully parameterized using a Cholesky decomposition (using `Stan`'s $LKJcorr$ distribution to place a prior on the strength of inter-species correlations). For those that are interested in the inner-workings, `mvgam` makes use of a recent breakthrough by [Sarah Heaps to enforce stationarity of Bayesian VAR processes](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648). This is advantageous as we often don't expect forecast variance to increase without bound forever into the future, but many estimated VARs tend to behave this way. \n\n<br>\nOk that was a lot to take in. Let's fit some models to try and inspect what is going on and what they assume. But first, we need to update `mvgam`'s default priors for the observation and process errors. By default, `mvgam` uses a fairly wide Student-T prior on these parameters to avoid being overly informative. But our observations are z-scored and so we do not expect very large process or observation errors. However, we also do not expect very small observation errors either as we know these measurements are not perfect. So let's update the priors for these parameters. In doing so, you will get to see how the formula for the latent process (i.e. trend) model is used in `mvgam`:\n```{r}\npriors <- get_mvgam_priors(\n  # observation formula, which has no terms in it\n  y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train\n)\n```\n\nGet names of all parameters whose priors can be modified:\n```{r}\npriors[, 3]\n```\n\nAnd their default prior distributions:\n```{r}\npriors[, 4]\n```\n\nSetting priors is easy in `mvgam` as you can use `brms` routines. Here we use more informative Normal priors for both error components, but we impose a lower bound of 0.2 for the observation errors:\n```{r}\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n```\n\nYou may have noticed something else unique about this model: there is no intercept term in the observation formula. This is because a shared intercept parameter can sometimes be unidentifiable with respect to the latent VAR process, particularly if our series have similar long-run averages (which they do in this case because they were z-scored). We will often get better convergence in these State-Space models if we drop this parameter. `mvgam` accomplishes this by fixing the coefficient for the intercept to zero. Now we can fit the first model, which assumes that process errors are contemporaneously uncorrelated\n```{r var_mod, include = FALSE, results='hide'}\nvar_mod <- mvgam(y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(),\n  priors = priors,\n  adapt_delta = 0.99,\n  burnin = 1000\n)\n```\n\n```{r eval=FALSE}\nvar_mod <- mvgam(\n  # observation formula, which is empty\n  forumla = y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n\n  # include the updated priors\n  priors = priors,\n  silent = 2\n)\n```\n\n### Inspecting SS models\nThis model's summary is a bit different to other `mvgam` summaries. It separates parameters based on whether they belong to the observation model or to the latent process model. This is because we may often have covariates that impact the observations but not the latent process, so we can have fairly complex models for each component. You will notice that some parameters have not fully converged, particularly for the VAR coefficients (called `A` in the output) and for the process errors (`Sigma`). Note that we set `include_betas = FALSE` to stop the summary from printing output for all of the spline coefficients, which can be dense and hard to interpret:\n```{r}\nsummary(var_mod, include_betas = FALSE)\n```\n\nThe convergence of this model isn't fabulous (more on this in a moment). But we can again plot the smooth functions, which this time operate on the process model. We can see the same plot using `trend_effects = TRUE` in the plotting functions:\n```{r}\nplot(var_mod, \"smooths\", trend_effects = TRUE)\n```\n\nThe autoregressive coefficient matrix is of particular interest here, as it captures lagged dependencies and cross-dependencies in the latent process model. Unfortunately `bayesplot` doesn't know this is a matrix of parameters so what we see is actually the transpose of the VAR matrix. Using `dir = 'v'` in the `facet_args` argument will accomplish this:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  var_mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThere is a lot happening in this matrix. Each cell captures the lagged effect of the process in the column on the process in the row in the next timestep. So for example, the effect in cell [1,3] shows how an *increase* in the process for series 3 (Greens) at time $t$ is expected to impact the process for series 1 (Bluegreens) at time $t+1$. The latent process model is now capturing these effects and the smooth seasonal effects.\n  \nThe process error $(\\Sigma)$ captures unmodelled variation in the process models. Again, we fixed the off-diagonals to 0, so the histograms for these will look like flat boxes:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  var_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThe observation error estimates $(\\sigma_{obs})$ represent how much the model thinks we might miss the true count when we take our imperfect measurements: \n```{r warning=FALSE, message=FALSE}\nmcmc_plot(var_mod, variable = \"sigma_obs\", regex = TRUE, type = \"hist\")\n```\n\nThese are still a bit hard to identify overall, especially when trying to estimate both process and observation error. Often we need to make some strong assumptions about which of these is more important for determining unexplained variation in our observations. \n\n### Correlated process errors\n\nLet's see if these estimates improve when we allow the process errors to be correlated. Once again, we need to first update the priors for the observation errors:\n```{r}\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n```\n\nAnd now we can fit the correlated process error model\n```{r varcor_mod, include = FALSE, results='hide'}\nvarcor_mod <- mvgam(y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(cor = TRUE),\n  burnin = 1000,\n  adapt_delta = 0.99,\n  priors = priors\n)\n```\n\n```{r eval=FALSE}\nvarcor_mod <- mvgam(\n  # observation formula, which remains empty\n  formula = y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with correlated process errors\n  trend_model = VAR(cor = TRUE),\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n\n  # include the updated priors\n  priors = priors,\n  silent = 2\n)\n```\n\nThe $(\\Sigma)$ matrix now captures any evidence of contemporaneously correlated process error:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  varcor_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThis symmetric matrix tells us there is support for correlated process errors, as several of the off-diagonal entries are strongly non-zero. But it is easier to interpret these estimates if we convert the covariance matrix to a correlation matrix. Here we compute the posterior median process error correlations:\n```{r}\nSigma_post <- as.matrix(\n  varcor_mod, \n  variable = \"Sigma\", \n  regex = TRUE\n)\nmedian_correlations <- cov2cor(\n  matrix(apply(Sigma_post, 2, median),\n         nrow = 5, \n         ncol = 5\n  )\n)\nrownames(median_correlations) <- \n  colnames(median_correlations) <- \n  levels(plankton_train$series)\n\nround(median_correlations, 2)\n```\n\n### Impulse response functions\nBecause Vector Autoregressions can capture complex lagged dependencies, it is often difficult to understand how the member time series are thought to interact with one another. A method that is commonly used to directly test for possible interactions is to compute an [Impulse Response Function](https://en.wikipedia.org/wiki/Impulse_response) (IRF). If $h$ represents the simulated forecast horizon, an IRF asks how each of the remaining series might respond over times $(t+1):h$ if a focal series is given an innovation \"shock\" at time $t = 0$. `mvgam` can compute Generalized and Orthogonalized IRFs from models that included latent VAR dynamics. We simply feed the fitted model to the `irf()` function and then use the S3 `plot()` function to view the estimated responses. By default, `irf()` will compute IRFs by separately imposing positive shocks of one standard deviation to each series in the VAR process. Here we compute Generalized IRFs over a horizon of 12 timesteps:\n```{r}\nirfs <- irf(varcor_mod, h = 12)\n```\n\nA summary of the IRFs can be computed using the `summary()` function:\n```{r}\nsummary(irfs)\n```\n\nBut it is easier to understand these responses using plots. For example, we can plot the expected responses of the remaining series to a positive shock for series 3 (Greens) using the `plot()` function:\n```{r}\nplot(irfs, series = 3)\n```\n\nThis series of plots makes it clear that some of the other series would be expected to show both instantaneous responses to a shock for the Greens (due to their correlated process errors) as well as delayed and nonlinear responses over time (due to the complex lagged dependence structure captured by the $A$ matrix). This hopefully makes it clear why IRFs are an important tool in the analysis of multivariate autoregressive models. You can also use these IRFs to calculate a relative contribution from each shock to the forecast error variance for a focal series. This method, known as a [Forecast Error Variance Decomposition](https://en.wikipedia.org/wiki/Variance_decomposition_of_forecast_errors) (FEVD), is useful to get an idea about the amount of information that each series contributes to the evolution of all other series in a Vector Autoregression:\n```{r}\nfevds <- fevd(varcor_mod, h = 12)\nplot(fevds)\n```\n\nThe plot above shows the median contribution to forecast error variance for each series.\n\n### Comparing forecast scores\n\nBut which model is better? We can compute the variogram score for out of sample forecasts to get a sense of which model does a better job of capturing the dependence structure in the true evaluation set:\n```{r}\n# create forecast objects for each model\nfcvar <- forecast(var_mod)\nfcvarcor <- forecast(varcor_mod)\n\n# plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"variogram\")$all_series$score -\n  score(fcvar, score = \"variogram\")$all_series$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(variogram[VAR1cor] ~ -~ variogram[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nAnd we can also compute the energy score for out of sample forecasts to get a sense of which model provides forecasts that are better calibrated:\n```{r}\n# plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"energy\")$all_series$score -\n  score(fcvar, score = \"energy\")$all_series$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(energy[VAR1cor] ~ -~ energy[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nThe models tend to provide similar forecasts, though the correlated error model does slightly better overall. We would probably need to use a more extensive rolling forecast evaluation exercise if we felt like we needed to only choose one for production. `mvgam` offers some utilities for doing this (i.e. see `?lfo_cv` for guidance). Alternatively, we could use forecasts from *both* models by creating an evenly-weighted ensemble forecast distribution. This capability is available using the `ensemble()` function in `mvgam` (see `?ensemble` for guidance). \n\nUsing `how_to_cite()` for models with VAR dynamics will give you information on how they are restricted to remain stationary:\n```{r}\ndescription <- how_to_cite(varcor_mod)\n```\n\n```{r, eval = FALSE}\ndescription\n```\n\n```{r, echo=FALSE}\ncat(\"Methods text skeleton\\n\")\ncat(insight::format_message(description$methods_text))\n```\n\n```{r echo=FALSE}\ncat(\"\\nPrimary references\\n\")\nfor (i in seq_along(description$citations)) {\n  cat(insight::format_message(description$citations[[i]]))\n  cat('\\n')\n}\ncat(\"\\nOther useful references\\n\")\nfor (i in seq_along(description$other_citations)) {\n  cat(insight::format_message(description$other_citations[[i]]))\n  cat('\\n')\n}\n```\n\nMore advanced hierarchical panel VAR models can also be handled by using the `gr` and `subgr` arguments in `VAR()`. These models are useful if you have a data for the same set of series (`subgr`) that are measured in different regions (`gr`), such as species measured in different sampling regions or financial series measured in different countries.\n\n## Further reading\nThe following papers and resources offer a lot of useful material about multivariate State-Space models and how they can be applied in practice:\n  \nAuger‐Méthé, Marie, et al. [A guide to state–space modeling of ecological time series](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470). *Ecological Monographs* 91.4 (2021): e01470.\n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nHeaps, Sarah E. [Enforcing stationarity through the prior in vector autoregressions](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648). *Journal of Computational and Graphical Statistics* 32.1 (2023): 74-83.\n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant](https://doi.org/10.1016/j.csda.2022.107659). *Computational Statistics & Data Analysis* 179 (2023): 107659.\n  \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. [MARSS: multivariate autoregressive state-space models for analyzing time-series data](https://journal.r-project.org/articles/RJ-2012-002/). *R Journal*. 4.1 (2012): 11.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.  \n  \nWard, Eric J., et al. [Inferring spatial structure from time‐series data: using multivariate state‐space models to detect metapopulation structure of California sea lions in the Gulf of California, Mexico](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x). *Journal of Applied Ecology* 47.1 (2010): 47-56.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "doc/trend_formulas.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>State-Space models in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">State-Space models in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#state-space-models\" id=\"toc-state-space-models\">State-Space Models</a>\n<ul>\n<li><a href=\"#lake-washington-plankton-data\" id=\"toc-lake-washington-plankton-data\">Lake Washington plankton\ndata</a></li>\n<li><a href=\"#capturing-seasonality\" id=\"toc-capturing-seasonality\">Capturing seasonality</a></li>\n<li><a href=\"#multiseries-dynamics\" id=\"toc-multiseries-dynamics\">Multiseries dynamics</a></li>\n<li><a href=\"#inspecting-ss-models\" id=\"toc-inspecting-ss-models\">Inspecting SS models</a></li>\n<li><a href=\"#correlated-process-errors\" id=\"toc-correlated-process-errors\">Correlated process errors</a></li>\n<li><a href=\"#impulse-response-functions\" id=\"toc-impulse-response-functions\">Impulse response functions</a></li>\n<li><a href=\"#comparing-forecast-scores\" id=\"toc-comparing-forecast-scores\">Comparing forecast scores</a></li>\n</ul></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to fit and interrogate State-Space models with\nnonlinear effects.</p>\n<div id=\"state-space-models\" class=\"section level2\">\n<h2>State-Space Models</h2>\n<div class=\"float\">\n<img role=\"img\" aria-label=\"Illustration of a basic State-Space model, which assumes that a latent dynamic process (X) can evolve independently from the way we take observations (Y) of that process\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgc3R5bGU9Im92ZXJmbG93OmhpZGRlbiIKICAgaWQ9InN2ZzgxIgogICB2ZXJzaW9uPSIxLjEiCiAgIG92ZXJmbG93PSJoaWRkZW4iCiAgIGhlaWdodD0iMzI0LjUwNzA1IgogICB3aWR0aD0iOTQ1LjM1MjExIgogICBzb2RpcG9kaTpkb2NuYW1lPSJTU19tb2RlbC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuNCAoNWRhNjg5YzMxMywgMjAxOS0wMS0xNCkiPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlkPSJuYW1lZHZpZXc0MiIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMS42OTk0MTYxIgogICAgIGlua3NjYXBlOmN4PSI0NzkuMzkzNjYiCiAgICAgaW5rc2NhcGU6Y3k9IjE1Ny4yMTc4MyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnODEiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhODUiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM1Ij4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXAwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3QyIgogICAgICAgICBoZWlnaHQ9IjcyMCIKICAgICAgICAgd2lkdGg9IjEyODAiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIHg9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogIDwvZGVmcz4KICA8cGF0aAogICAgIGQ9Im0gMzE4LjAxNDA4LDEyMS40OTUgMC4xNzUsNTMuNDAxIC0zLDAuMDEgLTAuMTc1LC01My40MDEgeiBtIDMuMTcsNTEuODkxIC00LjQ3LDkuMDE1IC00LjUyOSwtOC45ODYgeiIKICAgICBpZD0icGF0aDkiIC8+CiAgPHBhdGgKICAgICBkPSJtIDYwNi4wMTQwOCwxMjEuNDk1IDAuMTc1LDUzLjQwMSAtMywwLjAxIC0wLjE3NSwtNTMuNDAxIHogbSAzLjE3LDUxLjg5MSAtNC40Nyw5LjAxNSAtNC41MjksLTguOTg2IHoiCiAgICAgaWQ9InBhdGgxMSIgLz4KICA8cGF0aAogICAgIGQ9Im0gODUwLjAxNDA4LDEyMC40OTUgMC4xNzUsNTMuNDAxIC0zLDAuMDEgLTAuMTc1LC01My40MDEgeiBtIDMuMTcsNTEuODkxIC00LjQ3LDkuMDE1IC00LjUyOSwtOC45ODYgeiIKICAgICBpZD0icGF0aDEzIiAvPgogIDxwYXRoCiAgICAgZD0ibSA3NTMuNTE0MDgsNzEgMzQuMSw5ZS01IHYgMyBsIC0zNC4xLC05ZS01IHogbSAzMi42LC0yLjk5OTkyIDksNC41MDAwMjUgLTksNC40OTk5NzUgeiIKICAgICBpZD0icGF0aDE1IgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgPHBhdGgKICAgICBkPSJtIDM2Ny41MTQwOCw3MSBoIDI2LjkgdiAzIGggLTI2LjkgeiBtIDI1LjQsLTMgOSw0LjUgLTksNC41IHoiCiAgICAgaWQ9InBhdGgxNyIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTExLjUxNDA4LDcxIGggMjYuOSB2IDMgaCAtMjYuOSB6IG0gMjUuNCwtMyA5LDQuNSAtOSw0LjUgeiIKICAgICBpZD0icGF0aDE5IiAvPgogIDxwYXRoCiAgICAgZD0ibSA2NTIuNTE0MDgsNzIgaCAyNi45IHYgMyBoIC0yNi45IHogbSAyNS40LC0zIDksNC41IC05LDQuNSB6IgogICAgIGlkPSJwYXRoMjEiIC8+CiAgPHBhdGgKICAgICBkPSJtIDcyMi4wMTQwOCwxMjIuNDk1IDAuMDM5LDEyIC0zLDAuMDEgLTAuMDM5LC0xMiB6IG0gMC4wNjksMjEgMC4wMzksMTIgLTMsMC4wMSAtMC4wMzksLTEyIHogbSAwLjA2OSwyMSAwLjAzNywxMS40MDEgLTMsMC4wMSAtMC4wMzcsLTExLjQwMSB6IG0gMy4wMzIsOS44OTEgLTQuNDcsOS4wMTUgLTQuNTI5LC04Ljk4NiB6IgogICAgIGlkPSJwYXRoMjMiIC8+CiAgPHBhdGgKICAgICBkPSJtIDI2NS4wMTQwOCw3MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDI1IgogICAgIHN0eWxlPSJmaWxsOiNlN2U2ZTY7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSI4MyIKICAgICB4PSIzMDIuMjE0MDgiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0MjciCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlg8L3RleHQ+CiAgPHRleHQKICAgICB5PSI5MSIKICAgICB4PSIzMjUuMDQ3MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0MjkiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPjE8L3RleHQ+CiAgPHBhdGgKICAgICBkPSJtIDQwOS4wMTQwOCw3MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDMxIgogICAgIHN0eWxlPSJmaWxsOiNlN2U2ZTY7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSI4MyIKICAgICB4PSI0NDUuODE0MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0MzMiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlg8L3RleHQ+CiAgPHRleHQKICAgICB5PSI5MSIKICAgICB4PSI0NjguNjQ3MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0MzUiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPjI8L3RleHQ+CiAgPHBhdGgKICAgICBkPSJtIDc5Ny4wMTQwOCw3MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDM3IgogICAgIHN0eWxlPSJmaWxsOiNlN2U2ZTY7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSI4MyIKICAgICB4PSI4MzQuNjE0MDciCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0MzkiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlg8L3RleHQ+CiAgPHRleHQKICAgICB5PSI5MSIKICAgICB4PSI4NTcuNDQ3MDgiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NDEiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlQ8L3RleHQ+CiAgPHRleHQKICAgICB5PSI3NCIKICAgICB4PSI3MDguMzE0MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0NDMiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPuKApjwvdGV4dD4KICA8cGF0aAogICAgIGQ9Im0gNTUzLjAxNDA4LDcyIGMgMCwtMjguMTY3IDIyLjgzMywtNTEgNTEsLTUxIDI4LjE2NywwIDUxLDIyLjgzMyA1MSw1MSAwLDI4LjE2NyAtMjIuODMzLDUxIC01MSw1MSAtMjguMTY3LDAgLTUxLC0yMi44MzMgLTUxLC01MSB6IgogICAgIGlkPSJwYXRoNDUiCiAgICAgc3R5bGU9ImZpbGw6I2U3ZTZlNjtmaWxsLXJ1bGU6ZXZlbm9kZCIgLz4KICA8dGV4dAogICAgIHk9Ijg1IgogICAgIHg9IjU5MC4xMTQwNyIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMzUiCiAgICAgaWQ9InRleHQ0NyIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZTozNXB4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+WDwvdGV4dD4KICA8dGV4dAogICAgIHk9IjkzIgogICAgIHg9IjYxMi45NDcwOCIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMjMiCiAgICAgaWQ9InRleHQ0OSIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToyM3B4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+MzwvdGV4dD4KICA8cGF0aAogICAgIGQ9Im0gMjY1LjAxNDA4LDI0MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDUxIgogICAgIHN0eWxlPSJmaWxsOiNjMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSIyNTQiCiAgICAgeD0iMzAyLjIxNDA4IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIzNSIKICAgICBpZD0idGV4dDUzIgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjM1cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmO2ZpbGw6I2ZmZmZmZiI+WTwvdGV4dD4KICA8dGV4dAogICAgIHk9IjI2MiIKICAgICB4PSIzMjIuNzE0MDgiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NTUiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWY7ZmlsbDojZmZmZmZmIj4xPC90ZXh0PgogIDxwYXRoCiAgICAgZD0ibSA1NTMuMDE0MDgsMjQxIGMgMCwtMjguMTY3IDIyLjgzMywtNTEgNTEsLTUxIDI4LjE2NywwIDUxLDIyLjgzMyA1MSw1MSAwLDI4LjE2NyAtMjIuODMzLDUxIC01MSw1MSAtMjguMTY3LDAgLTUxLC0yMi44MzMgLTUxLC01MSB6IgogICAgIGlkPSJwYXRoNTciCiAgICAgc3R5bGU9ImZpbGw6I2MwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZCIgLz4KICA8cmVjdAogICAgIHg9IjU4MC4wMTQxIgogICAgIHk9IjIxNyIKICAgICB3aWR0aD0iNTgiCiAgICAgaGVpZ2h0PSI1MSIKICAgICBpZD0icmVjdDU5IgogICAgIHN0eWxlPSJmaWxsOiNjMDAwMDAiIC8+CiAgPHRleHQKICAgICB5PSIyNTQiCiAgICAgeD0iNTkwLjExNDA3IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIzNSIKICAgICBpZD0idGV4dDYxIgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjM1cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmO2ZpbGw6I2ZmZmZmZiI+WTwvdGV4dD4KICA8dGV4dAogICAgIHk9IjI2MiIKICAgICB4PSI2MTAuNjE0MDciCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NjMiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWY7ZmlsbDojZmZmZmZmIj4zPC90ZXh0PgogIDxwYXRoCiAgICAgZD0ibSA3OTcuMDE0MDgsMjQxIGMgMCwtMjguMTY3IDIyLjgzMywtNTEgNTEsLTUxIDI4LjE2NywwIDUxLDIyLjgzMyA1MSw1MSAwLDI4LjE2NyAtMjIuODMzLDUxIC01MSw1MSAtMjguMTY3LDAgLTUxLC0yMi44MzMgLTUxLC01MSB6IgogICAgIGlkPSJwYXRoNjUiCiAgICAgc3R5bGU9ImZpbGw6I2MwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZCIgLz4KICA8cmVjdAogICAgIHg9IjgyNS4wMTQxIgogICAgIHk9IjIxNyIKICAgICB3aWR0aD0iNTgiCiAgICAgaGVpZ2h0PSI1MSIKICAgICBpZD0icmVjdDY3IgogICAgIHN0eWxlPSJmaWxsOiNjMDAwMDAiIC8+CiAgPHRleHQKICAgICB5PSIyNTQiCiAgICAgeD0iODM0LjYxNDA3IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIzNSIKICAgICBpZD0idGV4dDY5IgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjM1cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmO2ZpbGw6I2ZmZmZmZiI+WTwvdGV4dD4KICA8dGV4dAogICAgIHk9IjI2MiIKICAgICB4PSI4NTUuOTYxMDYiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NzEiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWY7ZmlsbDojZmZmZmZmIj5UPC90ZXh0PgogIDx0ZXh0CiAgICAgeT0iMjUwIgogICAgIHg9IjcwOC4zMTQwOSIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMzUiCiAgICAgaWQ9InRleHQ3MyIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZTozNXB4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+4oCmPC90ZXh0PgogIDx0ZXh0CiAgICAgeT0iNzciCiAgICAgeD0iOTMuNDE0MDg1IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIyNCIKICAgICBpZD0idGV4dDc1IgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjI0cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmIj5Qcm9jZXNzIG1vZGVsPC90ZXh0PgogIDx0ZXh0CiAgICAgeT0iMjUwIgogICAgIHg9IjQ2LjYxNDA4MiIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMjQiCiAgICAgaWQ9InRleHQ3NyIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+T2JzZXJ2YXRpb24gbW9kZWw8L3RleHQ+Cjwvc3ZnPgo=\" style=\"width:85.0%\" alt=\"Illustration of a basic State-Space model, which assumes that a latent dynamic process (X) can evolve independently from the way we take observations (Y) of that process\" />\n<div class=\"figcaption\">Illustration of a basic State-Space model, which\nassumes that a latent dynamic <em>process</em> (X) can evolve\nindependently from the way we take <em>observations</em> (Y) of that\nprocess</div>\n</div>\n<p><br></p>\n<p>State-Space models allow us to separately make inferences about the\nunderlying dynamic <em>process model</em> that we are interested in\n(i.e. the evolution of a time series or a collection of time series) and\nthe <em>observation model</em> (i.e. the way that we survey / measure\nthis underlying process). This is extremely useful in ecology because\nour observations are always imperfect / noisy measurements of the thing\nwe are interested in measuring. It is also helpful because we often know\nthat some covariates will impact our ability to measure accurately\n(i.e. we cannot take accurate counts of rodents if there is a\nthunderstorm happening) while other covariates might impact the\nunderlying process (it is highly unlikely that rodent abundance responds\nto one storm, but instead probably responds to longer-term weather and\nclimate variation). A State-Space model allows us to model both\ncomponents in a single unified modelling framework. A major advantage of\n<code>mvgam</code> is that it can include nonlinear effects and random\neffects in BOTH model components while also capturing dynamic\nprocesses.</p>\n<div id=\"lake-washington-plankton-data\" class=\"section level3\">\n<h3>Lake Washington plankton data</h3>\n<p>The data we will use to illustrate how we can fit State-Space models\nin <code>mvgam</code> are from a long-term monitoring study of plankton\ncounts (cells per mL) taken from Lake Washington in Washington, USA. The\ndata are available as part of the <code>MARSS</code> package and can be\ndownloaded using the following:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">load</span>(<span class=\"fu\">url</span>(<span class=\"st\">&quot;https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda&quot;</span>))</span></code></pre></div>\n<p>We will work with five different groups of plankton:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a>outcomes <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;Greens&quot;</span>, <span class=\"st\">&quot;Bluegreens&quot;</span>, <span class=\"st\">&quot;Diatoms&quot;</span>, <span class=\"st\">&quot;Unicells&quot;</span>, <span class=\"st\">&quot;Other.algae&quot;</span>)</span></code></pre></div>\n<p>As usual, preparing the data into the correct format for\n<code>mvgam</code> modelling takes a little bit of wrangling in\n<code>dplyr</code>:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a><span class=\"co\"># loop across each plankton group to create the long datframe</span></span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>plankton_data <span class=\"ot\">&lt;-</span> <span class=\"fu\">do.call</span>(rbind, <span class=\"fu\">lapply</span>(outcomes, <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a>  <span class=\"co\"># create a group-specific dataframe with counts labelled &#39;y&#39;</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a>  <span class=\"co\"># and the group name in the &#39;series&#39; variable</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a>  <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a>    <span class=\"at\">year =</span> lakeWAplanktonTrans[, <span class=\"st\">&quot;Year&quot;</span>],</span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a>    <span class=\"at\">month =</span> lakeWAplanktonTrans[, <span class=\"st\">&quot;Month&quot;</span>],</span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a>    <span class=\"at\">y =</span> lakeWAplanktonTrans[, x],</span>\n<span id=\"cb3-9\"><a href=\"#cb3-9\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> x,</span>\n<span id=\"cb3-10\"><a href=\"#cb3-10\" tabindex=\"-1\"></a>    <span class=\"at\">temp =</span> lakeWAplanktonTrans[, <span class=\"st\">&quot;Temp&quot;</span>]</span>\n<span id=\"cb3-11\"><a href=\"#cb3-11\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb3-12\"><a href=\"#cb3-12\" tabindex=\"-1\"></a>})) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-13\"><a href=\"#cb3-13\" tabindex=\"-1\"></a>  <span class=\"co\"># change the &#39;series&#39; label to a factor</span></span>\n<span id=\"cb3-14\"><a href=\"#cb3-14\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">factor</span>(series)) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-15\"><a href=\"#cb3-15\" tabindex=\"-1\"></a>  <span class=\"co\"># filter to only include some years in the data</span></span>\n<span id=\"cb3-16\"><a href=\"#cb3-16\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(year <span class=\"sc\">&gt;=</span> <span class=\"dv\">1965</span> <span class=\"sc\">&amp;</span> year <span class=\"sc\">&lt;</span> <span class=\"dv\">1975</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-17\"><a href=\"#cb3-17\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(year, month) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-18\"><a href=\"#cb3-18\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">group_by</span>(series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-19\"><a href=\"#cb3-19\" tabindex=\"-1\"></a>  <span class=\"co\"># z-score the counts so they are approximately standard normal</span></span>\n<span id=\"cb3-20\"><a href=\"#cb3-20\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">y =</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(y))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-21\"><a href=\"#cb3-21\" tabindex=\"-1\"></a>  <span class=\"co\"># add the time indicator</span></span>\n<span id=\"cb3-22\"><a href=\"#cb3-22\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">time =</span> dplyr<span class=\"sc\">::</span><span class=\"fu\">row_number</span>()) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-23\"><a href=\"#cb3-23\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>()</span></code></pre></div>\n<p>Inspect the data structure</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(plankton_data)</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; # A tibble: 6 × 6</span></span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    year month       y series       temp  time</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt; &lt;fct&gt;       &lt;dbl&gt; &lt;int&gt;</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  1965     1 -0.542  Greens      -1.23     1</span></span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  1965     1 -0.344  Bluegreens  -1.23     1</span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3  1965     1 -0.0768 Diatoms     -1.23     1</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4  1965     1 -1.52   Unicells    -1.23     1</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  1965     1 -0.491  Other.algae -1.23     1</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  1965     2 NA      Greens      -1.32     2</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(plankton_data)</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 600</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 6</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year   &lt;dbl&gt; 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 196…</span></span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ month  &lt;dbl&gt; 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, …</span></span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ y      &lt;dbl&gt; -0.54241769, -0.34410776, -0.07684901, -1.52243490, -0.49055442…</span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series &lt;fct&gt; Greens, Bluegreens, Diatoms, Unicells, Other.algae, Greens, Blu…</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ temp   &lt;dbl&gt; -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.…</span></span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time   &lt;int&gt; 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, …</span></span></code></pre></div>\n<p>Note that we have z-scored the counts in this example as that will\nmake it easier to specify priors (though this is not completely\nnecessary; it is often better to build a model that respects the\nproperties of the actual outcome variables)</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(<span class=\"at\">data =</span> plankton_data, <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We have some missing observations, but this isn’t an issue for\nmodelling in <code>mvgam</code>. A useful property to understand about\nthese counts is that they tend to be highly seasonal. Below are some\nplots of z-scored counts against the z-scored temperature measurements\nin the lake for each month:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a>plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;Other.algae&quot;</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a>  <span class=\"fu\">ggplot</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> temp)) <span class=\"sc\">+</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"at\">size =</span> <span class=\"fl\">1.1</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>,</span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.3</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.1</span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;z-score&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a>  <span class=\"fu\">xlab</span>(<span class=\"st\">&quot;Time&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a>  <span class=\"fu\">ggtitle</span>(<span class=\"st\">&quot;Temperature (black) vs Other algae (red)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a>plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;Diatoms&quot;</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a>  <span class=\"fu\">ggplot</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> temp)) <span class=\"sc\">+</span></span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"at\">size =</span> <span class=\"fl\">1.1</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>,</span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.3</span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb8-9\"><a href=\"#cb8-9\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb8-10\"><a href=\"#cb8-10\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb8-11\"><a href=\"#cb8-11\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.1</span></span>\n<span id=\"cb8-12\"><a href=\"#cb8-12\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb8-13\"><a href=\"#cb8-13\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;z-score&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb8-14\"><a href=\"#cb8-14\" tabindex=\"-1\"></a>  <span class=\"fu\">xlab</span>(<span class=\"st\">&quot;Time&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb8-15\"><a href=\"#cb8-15\" tabindex=\"-1\"></a>  <span class=\"fu\">ggtitle</span>(<span class=\"st\">&quot;Temperature (black) vs Diatoms (red)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We will have to try and capture this seasonality in our process\nmodel, which should be easy to do given the flexibility of GAMs. Next we\nwill split the data into training and testing splits:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a>plankton_train <span class=\"ot\">&lt;-</span> plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&lt;=</span> <span class=\"dv\">112</span>)</span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a>plankton_test <span class=\"ot\">&lt;-</span> plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&gt;</span> <span class=\"dv\">112</span>)</span></code></pre></div>\n<p>Now time to fit some models. This requires a bit of thinking about\nhow we can best tackle the seasonal variation and the likely dependence\nstructure in the data. These algae are interacting as part of a complex\nsystem within the same lake, so we certainly expect there to be some\nlagged cross-dependencies underling their dynamics. But if we do not\ncapture the seasonal variation, our multivariate dynamic model will be\nforced to try and capture it, which could lead to poor convergence and\nunstable results (we could feasibly capture cyclic dynamics with a more\ncomplex multi-species Lotka-Volterra model, but ordinary differential\nequation approaches are beyond the scope of <code>mvgam</code>).</p>\n</div>\n<div id=\"capturing-seasonality\" class=\"section level3\">\n<h3>Capturing seasonality</h3>\n<p>First we will fit a model that does not include a dynamic component,\njust to see if it can reproduce the seasonal variation in the\nobservations. This model introduces hierarchical multidimensional\nsmooths, where all time series share a “global” tensor product of the\n<code>month</code> and <code>temp</code> variables, capturing our\nexpectation that algal seasonality responds to temperature variation.\nBut this response should depend on when in the year these temperatures\nare recorded (i.e. a response to warm temperatures in Spring should be\ndifferent to a response to warm temperatures in Autumn). The model also\nfits series-specific deviation smooths (i.e. one tensor product per\nseries) to capture how each algal group’s seasonality differs from the\noverall “global” seasonality. Note that we do not include\nseries-specific intercepts in this model because each series was\nz-scored to have a mean of 0.</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>notrend_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span></span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>    <span class=\"co\"># tensor of temp and month to capture</span></span>\n<span id=\"cb10-4\"><a href=\"#cb10-4\" tabindex=\"-1\"></a>    <span class=\"co\"># &quot;global&quot; seasonality</span></span>\n<span id=\"cb10-5\"><a href=\"#cb10-5\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb10-6\"><a href=\"#cb10-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb10-7\"><a href=\"#cb10-7\" tabindex=\"-1\"></a>    <span class=\"co\"># series-specific deviation tensor products</span></span>\n<span id=\"cb10-8\"><a href=\"#cb10-8\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> series) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb10-9\"><a href=\"#cb10-9\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb10-10\"><a href=\"#cb10-10\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train,</span>\n<span id=\"cb10-11\"><a href=\"#cb10-11\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> plankton_test,</span>\n<span id=\"cb10-12\"><a href=\"#cb10-12\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"st\">&quot;None&quot;</span></span>\n<span id=\"cb10-13\"><a href=\"#cb10-13\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The “global” tensor product smooth function can be quickly\nvisualized:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(notrend_mod, <span class=\"at\">smooth =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>On this plot, red indicates below-average linear predictors and white\nindicates above-average. We can then plot the deviation smooths for a\nfew algal groups to see how they vary from the “global” pattern:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(notrend_mod, <span class=\"at\">smooth =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(notrend_mod, <span class=\"at\">smooth =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>These multidimensional smooths have done a good job of capturing the\nseasonal variation in our observations:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This basic model gives us confidence that we can capture the seasonal\nvariation in the observations. But the model has not captured the\nremaining temporal dynamics, which is obvious when we inspect Dunn-Smyth\nresiduals for a few series:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;residuals&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;residuals&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"multiseries-dynamics\" class=\"section level3\">\n<h3>Multiseries dynamics</h3>\n<p>Now it is time to get into multivariate State-Space models. We will\nfit two models that can both incorporate lagged cross-dependencies in\nthe latent process models. The first model assumes that the process\nerrors operate independently from one another, while the second assumes\nthat there may be contemporaneous correlations in the process errors.\nBoth models include a Vector Autoregressive component for the process\nmeans, and so both can model complex community dynamics. The models can\nbe described mathematically as follows:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Normal}(\\mu_{obs[t]},\n\\sigma_{obs}) \\\\\n\\mu_{obs[t]} &amp; = process_t \\\\\nprocess_t &amp; \\sim \\text{MVNormal}(\\mu_{process[t]}, \\Sigma_{process})\n\\\\\n\\mu_{process[t]} &amp; = A * process_{t-1} +\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp})_t +\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp})_t \\\\\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp}) &amp; =\n\\sum_{k=1}^{K}b_{global} * \\beta_{global} \\\\\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp}) &amp; =\n\\sum_{k=1}^{K}b_{series} * \\beta_{series} \\end{align*}\\]</span></p>\n<p>Here you can see that there are no terms in the observation model\napart from the underlying process model. But we could easily add\ncovariates into the observation model if we felt that they could explain\nsome of the systematic observation errors. We also assume independent\nobservation processes (there is no covariance structure in the\nobservation errors <span class=\"math inline\">\\(\\sigma_{obs}\\)</span>).\nAt present, <code>mvgam</code> does not support multivariate observation\nmodels. But this feature will be added in future versions. However the\nunderlying process model is multivariate, and there is a lot going on\nhere. This component has a Vector Autoregressive part, where the process\nmean at time <span class=\"math inline\">\\(t\\)</span> <span class=\"math inline\">\\((\\mu_{process[t]})\\)</span> is a vector that\nevolves as a function of where the vector-valued process model was at\ntime <span class=\"math inline\">\\(t-1\\)</span>. The <span class=\"math inline\">\\(A\\)</span> matrix captures these dynamics with\nself-dependencies on the diagonal and possibly asymmetric\ncross-dependencies on the off-diagonals, while also incorporating the\nnonlinear smooth functions that capture seasonality for each series. The\ncontemporaneous process errors are modeled by <span class=\"math inline\">\\(\\Sigma_{process}\\)</span>, which can be\nconstrained so that process errors are independent (i.e. setting the\noff-diagonals to 0) or can be fully parameterized using a Cholesky\ndecomposition (using <code>Stan</code>’s <span class=\"math inline\">\\(LKJcorr\\)</span> distribution to place a prior on\nthe strength of inter-species correlations). For those that are\ninterested in the inner-workings, <code>mvgam</code> makes use of a\nrecent breakthrough by <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Sarah\nHeaps to enforce stationarity of Bayesian VAR processes</a>. This is\nadvantageous as we often don’t expect forecast variance to increase\nwithout bound forever into the future, but many estimated VARs tend to\nbehave this way.</p>\n<p><br> Ok that was a lot to take in. Let’s fit some models to try and\ninspect what is going on and what they assume. But first, we need to\nupdate <code>mvgam</code>’s default priors for the observation and\nprocess errors. By default, <code>mvgam</code> uses a fairly wide\nStudent-T prior on these parameters to avoid being overly informative.\nBut our observations are z-scored and so we do not expect very large\nprocess or observation errors. However, we also do not expect very small\nobservation errors either as we know these measurements are not perfect.\nSo let’s update the priors for these parameters. In doing so, you will\nget to see how the formula for the latent process (i.e. trend) model is\nused in <code>mvgam</code>:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a>priors <span class=\"ot\">&lt;-</span> <span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a>  <span class=\"co\"># observation formula, which has no terms in it</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"dv\">1</span>,</span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> trend) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a>  <span class=\"co\"># VAR1 model with uncorrelated process errors</span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">VAR</span>(),</span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train</span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Get names of all parameters whose priors can be modified:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a>priors[, <span class=\"dv\">3</span>]</span>\n<span id=\"cb20-2\"><a href=\"#cb20-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [1] &quot;(Intercept)&quot;                                                                                                                                                                                                                                                           </span></span>\n<span id=\"cb20-3\"><a href=\"#cb20-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [2] &quot;process error sd&quot;                                                                                                                                                                                                                                                      </span></span>\n<span id=\"cb20-4\"><a href=\"#cb20-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [3] &quot;diagonal autocorrelation population mean&quot;                                                                                                                                                                                                                              </span></span>\n<span id=\"cb20-5\"><a href=\"#cb20-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [4] &quot;off-diagonal autocorrelation population mean&quot;                                                                                                                                                                                                                          </span></span>\n<span id=\"cb20-6\"><a href=\"#cb20-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [5] &quot;diagonal autocorrelation population variance&quot;                                                                                                                                                                                                                          </span></span>\n<span id=\"cb20-7\"><a href=\"#cb20-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [6] &quot;off-diagonal autocorrelation population variance&quot;                                                                                                                                                                                                                      </span></span>\n<span id=\"cb20-8\"><a href=\"#cb20-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [7] &quot;shape1 for diagonal autocorrelation precision&quot;                                                                                                                                                                                                                         </span></span>\n<span id=\"cb20-9\"><a href=\"#cb20-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [8] &quot;shape1 for off-diagonal autocorrelation precision&quot;                                                                                                                                                                                                                     </span></span>\n<span id=\"cb20-10\"><a href=\"#cb20-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [9] &quot;shape2 for diagonal autocorrelation precision&quot;                                                                                                                                                                                                                         </span></span>\n<span id=\"cb20-11\"><a href=\"#cb20-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [10] &quot;shape2 for off-diagonal autocorrelation precision&quot;                                                                                                                                                                                                                     </span></span>\n<span id=\"cb20-12\"><a href=\"#cb20-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [11] &quot;observation error sd&quot;                                                                                                                                                                                                                                                  </span></span>\n<span id=\"cb20-13\"><a href=\"#cb20-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [12] &quot;te(temp,month) smooth parameters, te(temp,month):trendtrend1 smooth parameters, te(temp,month):trendtrend2 smooth parameters, te(temp,month):trendtrend3 smooth parameters, te(temp,month):trendtrend4 smooth parameters, te(temp,month):trendtrend5 smooth parameters&quot;</span></span></code></pre></div>\n<p>And their default prior distributions:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>priors[, <span class=\"dv\">4</span>]</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [1] &quot;(Intercept) ~ student_t(3, -0.1, 2.5);&quot;</span></span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [2] &quot;sigma ~ inv_gamma(1.418, 0.452);&quot;      </span></span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [3] &quot;es[1] = 0;&quot;                            </span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [4] &quot;es[2] = 0;&quot;                            </span></span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [5] &quot;fs[1] = sqrt(0.455);&quot;                  </span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [6] &quot;fs[2] = sqrt(0.455);&quot;                  </span></span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [7] &quot;gs[1] = 1.365;&quot;                        </span></span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [8] &quot;gs[2] = 1.365;&quot;                        </span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [9] &quot;hs[1] = 0.071175;&quot;                     </span></span>\n<span id=\"cb21-11\"><a href=\"#cb21-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [10] &quot;hs[2] = 0.071175;&quot;                     </span></span>\n<span id=\"cb21-12\"><a href=\"#cb21-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [11] &quot;sigma_obs ~ inv_gamma(1.418, 0.452);&quot;  </span></span>\n<span id=\"cb21-13\"><a href=\"#cb21-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [12] &quot;lambda_trend ~ normal(5, 30);&quot;</span></span></code></pre></div>\n<p>Setting priors is easy in <code>mvgam</code> as you can use\n<code>brms</code> routines. Here we use more informative Normal priors\nfor both error components, but we impose a lower bound of 0.2 for the\nobservation errors:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>priors <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.1</span>), <span class=\"at\">class =</span> sigma_obs, <span class=\"at\">lb =</span> <span class=\"fl\">0.2</span>),</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.25</span>), <span class=\"at\">class =</span> sigma)</span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>You may have noticed something else unique about this model: there is\nno intercept term in the observation formula. This is because a shared\nintercept parameter can sometimes be unidentifiable with respect to the\nlatent VAR process, particularly if our series have similar long-run\naverages (which they do in this case because they were z-scored). We\nwill often get better convergence in these State-Space models if we drop\nthis parameter. <code>mvgam</code> accomplishes this by fixing the\ncoefficient for the intercept to zero. Now we can fit the first model,\nwhich assumes that process errors are contemporaneously uncorrelated</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a>var_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>  <span class=\"co\"># observation formula, which is empty</span></span>\n<span id=\"cb23-3\"><a href=\"#cb23-3\" tabindex=\"-1\"></a>  <span class=\"at\">forumla =</span> y <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"dv\">1</span>,</span>\n<span id=\"cb23-4\"><a href=\"#cb23-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb23-5\"><a href=\"#cb23-5\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span id=\"cb23-6\"><a href=\"#cb23-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb23-7\"><a href=\"#cb23-7\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> trend) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb23-8\"><a href=\"#cb23-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb23-9\"><a href=\"#cb23-9\" tabindex=\"-1\"></a>  <span class=\"co\"># VAR1 model with uncorrelated process errors</span></span>\n<span id=\"cb23-10\"><a href=\"#cb23-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">VAR</span>(),</span>\n<span id=\"cb23-11\"><a href=\"#cb23-11\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb23-12\"><a href=\"#cb23-12\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train,</span>\n<span id=\"cb23-13\"><a href=\"#cb23-13\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> plankton_test,</span>\n<span id=\"cb23-14\"><a href=\"#cb23-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb23-15\"><a href=\"#cb23-15\" tabindex=\"-1\"></a>  <span class=\"co\"># include the updated priors</span></span>\n<span id=\"cb23-16\"><a href=\"#cb23-16\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> priors,</span>\n<span id=\"cb23-17\"><a href=\"#cb23-17\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb23-18\"><a href=\"#cb23-18\" tabindex=\"-1\"></a>)</span></code></pre></div>\n</div>\n<div id=\"inspecting-ss-models\" class=\"section level3\">\n<h3>Inspecting SS models</h3>\n<p>This model’s summary is a bit different to other <code>mvgam</code>\nsummaries. It separates parameters based on whether they belong to the\nobservation model or to the latent process model. This is because we may\noften have covariates that impact the observations but not the latent\nprocess, so we can have fairly complex models for each component. You\nwill notice that some parameters have not fully converged, particularly\nfor the VAR coefficients (called <code>A</code> in the output) and for\nthe process errors (<code>Sigma</code>). Note that we set\n<code>include_betas = FALSE</code> to stop the summary from printing\noutput for all of the spline coefficients, which can be dense and hard\nto interpret:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(var_mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ 1</span></span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017ff1154728&gt;</span></span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-6\"><a href=\"#cb24-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb24-7\"><a href=\"#cb24-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~te(temp, month, k = c(4, 4)) + te(temp, month, k = c(4, 4), </span></span>\n<span id=\"cb24-8\"><a href=\"#cb24-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     by = trend) - 1</span></span>\n<span id=\"cb24-9\"><a href=\"#cb24-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017ff1154728&gt;</span></span>\n<span id=\"cb24-10\"><a href=\"#cb24-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-11\"><a href=\"#cb24-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb24-12\"><a href=\"#cb24-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb24-13\"><a href=\"#cb24-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-14\"><a href=\"#cb24-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb24-15\"><a href=\"#cb24-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb24-16\"><a href=\"#cb24-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-17\"><a href=\"#cb24-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb24-18\"><a href=\"#cb24-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; VAR()</span></span>\n<span id=\"cb24-19\"><a href=\"#cb24-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-20\"><a href=\"#cb24-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb24-21\"><a href=\"#cb24-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5 </span></span>\n<span id=\"cb24-22\"><a href=\"#cb24-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-23\"><a href=\"#cb24-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb24-24\"><a href=\"#cb24-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5 </span></span>\n<span id=\"cb24-25\"><a href=\"#cb24-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-26\"><a href=\"#cb24-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb24-27\"><a href=\"#cb24-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 120 </span></span>\n<span id=\"cb24-28\"><a href=\"#cb24-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-29\"><a href=\"#cb24-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb24-30\"><a href=\"#cb24-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb24-31\"><a href=\"#cb24-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1500; warmup = 1000; thin = 1 </span></span>\n<span id=\"cb24-32\"><a href=\"#cb24-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb24-33\"><a href=\"#cb24-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-34\"><a href=\"#cb24-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb24-35\"><a href=\"#cb24-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-36\"><a href=\"#cb24-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1] 0.20 0.26  0.34 1.01   412</span></span>\n<span id=\"cb24-37\"><a href=\"#cb24-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[2] 0.24 0.40  0.54 1.02   193</span></span>\n<span id=\"cb24-38\"><a href=\"#cb24-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[3] 0.43 0.65  0.83 1.15    29</span></span>\n<span id=\"cb24-39\"><a href=\"#cb24-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[4] 0.25 0.37  0.49 1.01   242</span></span>\n<span id=\"cb24-40\"><a href=\"#cb24-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[5] 0.31 0.43  0.56 1.03   226</span></span>\n<span id=\"cb24-41\"><a href=\"#cb24-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-42\"><a href=\"#cb24-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb24-43\"><a href=\"#cb24-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-44\"><a href=\"#cb24-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    0   0     0  NaN   NaN</span></span>\n<span id=\"cb24-45\"><a href=\"#cb24-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-46\"><a href=\"#cb24-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb24-47\"><a href=\"#cb24-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-48\"><a href=\"#cb24-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.26 0.34  0.42 1.01   463</span></span>\n<span id=\"cb24-49\"><a href=\"#cb24-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[2] 0.23 0.39  0.55 1.09    35</span></span>\n<span id=\"cb24-50\"><a href=\"#cb24-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[3] 0.10 0.49  0.80 1.33    14</span></span>\n<span id=\"cb24-51\"><a href=\"#cb24-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[4] 0.33 0.45  0.59 1.02   201</span></span>\n<span id=\"cb24-52\"><a href=\"#cb24-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[5] 0.22 0.35  0.51 1.04   142</span></span>\n<span id=\"cb24-53\"><a href=\"#cb24-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-54\"><a href=\"#cb24-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; var coefficient matrix:</span></span>\n<span id=\"cb24-55\"><a href=\"#cb24-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%    50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-56\"><a href=\"#cb24-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,1]  0.600  0.790 0.910 1.03   163</span></span>\n<span id=\"cb24-57\"><a href=\"#cb24-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,2] -0.420 -0.140 0.041 1.04   111</span></span>\n<span id=\"cb24-58\"><a href=\"#cb24-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,3] -0.210  0.016 0.310 1.00   345</span></span>\n<span id=\"cb24-59\"><a href=\"#cb24-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,4] -0.055  0.056 0.220 1.01   543</span></span>\n<span id=\"cb24-60\"><a href=\"#cb24-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,5] -0.037  0.120 0.380 1.03   181</span></span>\n<span id=\"cb24-61\"><a href=\"#cb24-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,1] -0.540 -0.190 0.025 1.03   128</span></span>\n<span id=\"cb24-62\"><a href=\"#cb24-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,2]  0.062  0.430 0.740 1.02   242</span></span>\n<span id=\"cb24-63\"><a href=\"#cb24-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,3] -0.290  0.026 1.300 1.20    26</span></span>\n<span id=\"cb24-64\"><a href=\"#cb24-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,4] -0.110  0.110 0.370 1.03   117</span></span>\n<span id=\"cb24-65\"><a href=\"#cb24-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,5] -0.040  0.230 0.640 1.03   133</span></span>\n<span id=\"cb24-66\"><a href=\"#cb24-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,1] -0.330 -0.030 0.190 1.02   333</span></span>\n<span id=\"cb24-67\"><a href=\"#cb24-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,2] -0.500 -0.051 0.320 1.03   193</span></span>\n<span id=\"cb24-68\"><a href=\"#cb24-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,3] -0.034  0.520 0.900 1.08    64</span></span>\n<span id=\"cb24-69\"><a href=\"#cb24-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,4] -0.090  0.120 0.500 1.04   142</span></span>\n<span id=\"cb24-70\"><a href=\"#cb24-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,5] -0.290  0.027 0.380 1.01   465</span></span>\n<span id=\"cb24-71\"><a href=\"#cb24-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,1] -0.450 -0.120 0.086 1.06    89</span></span>\n<span id=\"cb24-72\"><a href=\"#cb24-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,2] -0.660 -0.180 0.130 1.06   107</span></span>\n<span id=\"cb24-73\"><a href=\"#cb24-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,3] -0.270  0.086 1.300 1.16    30</span></span>\n<span id=\"cb24-74\"><a href=\"#cb24-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,4]  0.520  0.730 0.960 1.02   212</span></span>\n<span id=\"cb24-75\"><a href=\"#cb24-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,5] -0.051  0.190 0.650 1.03   150</span></span>\n<span id=\"cb24-76\"><a href=\"#cb24-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,1] -0.110  0.053 0.270 1.00   449</span></span>\n<span id=\"cb24-77\"><a href=\"#cb24-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,2] -0.430 -0.110 0.130 1.01   238</span></span>\n<span id=\"cb24-78\"><a href=\"#cb24-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,3] -0.150  0.060 0.780 1.12    41</span></span>\n<span id=\"cb24-79\"><a href=\"#cb24-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,4] -0.210 -0.040 0.110 1.01   373</span></span>\n<span id=\"cb24-80\"><a href=\"#cb24-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,5]  0.460  0.740 0.950 1.00   370</span></span>\n<span id=\"cb24-81\"><a href=\"#cb24-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-82\"><a href=\"#cb24-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb24-83\"><a href=\"#cb24-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb24-84\"><a href=\"#cb24-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month)              3.374     15 37.656   0.427</span></span>\n<span id=\"cb24-85\"><a href=\"#cb24-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend1 2.798     15  3.441   0.996</span></span>\n<span id=\"cb24-86\"><a href=\"#cb24-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend2 4.454     15 48.402   0.245</span></span>\n<span id=\"cb24-87\"><a href=\"#cb24-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend3 1.748     15  3.363   1.000</span></span>\n<span id=\"cb24-88\"><a href=\"#cb24-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend4 1.352     15  6.409   0.999</span></span>\n<span id=\"cb24-89\"><a href=\"#cb24-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend5 3.085     15  6.703   0.979</span></span>\n<span id=\"cb24-90\"><a href=\"#cb24-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-91\"><a href=\"#cb24-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb24-92\"><a href=\"#cb24-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb24-93\"><a href=\"#cb24-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✖ Rhats above 1.05 found for some parameters</span></span>\n<span id=\"cb24-94\"><a href=\"#cb24-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Use pairs() and mcmc_plot() to investigate</span></span>\n<span id=\"cb24-95\"><a href=\"#cb24-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb24-96\"><a href=\"#cb24-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb24-97\"><a href=\"#cb24-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-98\"><a href=\"#cb24-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb24-99\"><a href=\"#cb24-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb24-100\"><a href=\"#cb24-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb24-101\"><a href=\"#cb24-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-102\"><a href=\"#cb24-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The convergence of this model isn’t fabulous (more on this in a\nmoment). But we can again plot the smooth functions, which this time\noperate on the process model. We can see the same plot using\n<code>trend_effects = TRUE</code> in the plotting functions:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(var_mod, <span class=\"st\">&quot;smooths&quot;</span>, <span class=\"at\">trend_effects =</span> <span class=\"cn\">TRUE</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAIAAAD2dYQOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAgAElEQVR4nOyde3gURdbG31FuCYoiIHeSaAYByaogKBNB2AU0QRFWBUERRQgK7CYrgrKKeF1UhE1WRIl+COqioLsgSqLgCsIS1CjqBgGZaAgQwlW8kQAB5/ujZjo11d3V3XOf6fN7eHhm+lJd6Z7Tb51Tp6ocHo8HBEEQBGFXzoh2BQiCIAgimpAQEgRBELaGhJAgCIKwNSSEBEEQhK0hISQIgiBsDQkhQRAEYWtICAmCIAhbQ0JIEARB2BoSQoIgCMLWkBASBEEQtoaEkCAIgrA1JIQEQRCErSEhJAiCIGwNCSFBEARha0gICYIgCFtDQkgQBEHYGhJCgiAIwtaQEBIEQRC2hoSQIAiCsDUkhARBEIStISEkCIIgbA0JIUEQBGFrSAgJgiAIW0NCSBAEQdgaEkKCIAjC1pAQEgRBELaGhJAgCIKwNYkjhOXFBRMzJxabPbx4osPhcNQfb/H0OMb/L2X3waHzl4t3iSAkkA2aJBw2GNG7p6pydK/urUNBpsPhyCwoD6DIRBHC4onO7LzCErOHlxc8UQi48qdlBXR6HGPtL82alu8CCp8I6LdF2AuyQZOEwwaje/di4dkVT3TmBV6DRBFCaxTPySsBXCOGpEe7JrFO+pARLqAkb44d2ulEBCEbNAvZoBHlxRMzHdmFQZXhiX+Kcvz/pJwij8fj8biL8nNc3k2unHy3eILLu8na6e58Fzu5qMi7m+105ytfi9x+9copKsp3uSDsFLBQrFg5uHLy6/cpF1XOhMvl3a/1lyrH85fib5ZSM+2KE4SHbDDCNui/QavM+j8m3+Xb6pY8EVmdfX+uq75u9VWO8tXrT3a5XEG8qRJWCMWN3A3yv40WT3fnu8Q9gMvl0jhUXYbfdf2wUKx2wXp/DX+uxAiFS/GV9FZNs9oE4fF4yAalfw1/bmhs0LQQal9J4w+S1Vl+H6N7dY/HU5TDmiFBNdkTQQg9HpVhCffE73ekdb/Mn+72a+LUP3C/r6wc3+PzNm3c9d/VTyqAYr3NU3f9d9lFBSNVTMroeI1TCEILssEo2qB4gFJ9X+PBrVIKvycirYP/nfG4OT8vFq7uf9HAhDAx+wjLVy8vAYCSPKfD4XA4vL2ohSuLAbi3lQBA9866nRPS073kDMtKB9I7dwfAuvy5r37kPJSblQ4gPWshe74l29y6NTcutnhlIbeLK9a/espFh2m3pnQrae54gpBDNhgTNpjzUC6rYnq6qVuqWQfv48opWujdmfuQuRpG9+pWSEwhDD+ubk4AgLObRjhF80iOrTv1EsDMF6vxDtEvNiSEuXiCsAbZoDEaf3kEie7VLZHQQqhykhdmRfB0LxptT0lD2DQaJhGKYiWEuXgiISEbDCWhKD7wWxoKlY/u1fVJTCFkCccoyZtTUA7fQEvfAExvS09yX6WnW6Ywe2JxOYDy4oInWEQlqHaSN2pQkjenuBwAyosnssThnGGBvCNME0etOyIGIBsMPcHVOvBb6n1cvr9XuYvxc3VDEkwIC7PZvU33hpEL85xKONo3dNcb7dfqJTBzekC1cjocDmc2i4r74ube6REsT4TABtj6SnU4vSZYZKmt7PtLTVC+cytADiFhErJB01UK2Aa9MqKut7TMgG+p70ThLqqI7tWDIlGEMGtaUf2gHpQDWQvdRTlKPrIrJ9+9Kdf7K/K25/jmqJXTrcINjnHl5LsDC+7wpOduUo9hMluq6i81wtvJHea2LhH/kA1G0QbNlRnwLc1aqDmSLzauHhICyDSNf/xH84b3KrJhB+58V8yPSmB/RazXkog3yAbNQzYYdhLFI7QGi2yULF8d1TzI8uI5eSUx3vXGJoQkf5AINWSDZiEbjAD2FEJv2Dm6Vlg854mtOUUBR3siAovJWOz7IAgTkA2ag2wwEjg8Hk+060AQBEEQUcOmHiFBEARBMEgICYIgCFtDQkgQBEHYGhJCgiAIwtaQEBIEQRC2hoSQIAiCsDUkhARBEIStISEkCIIgbA0JIUEQBGFrSAgJgiAIW0NCSBAEQdgaEkKCIAjC1pAQEgRBELaGhJAgCIKwNSSEBEEQhK0hISQIgiBsDQkhQRAEYWtICAmCIAhbQ0JIEARB2BoSQoIgCMLWkBASBEEQtqZBtCtgAYfDobfL4/FEsiYEYU/IBomExBHvP19mmSvunBDtisQHjZomC1uGzC+QHL96Si7/tWGyeLqly/WfNVNy8KY5cyV7GyYlya/Ve8ok/uuWRYtlpSXLSmuQlNT1hqGgl7s5mA1uf2cVu2nuNWuVXQ2aNJGcmNavL/91d2kp//VM/3PPbNxYOL1N587810OVlZJrndFIPF2gRds27MOR6v1nNGoIABUvDn4ufc28gQAqXrz2H+nv/30ggA//cm35n9+/O81vI9be26Io+wj7LOeMBgbux2+nThmXok/zFi34r0ePHPEr/GSd7NInT5i/UKuUFAD7d+7UO+D0Cb/STh8/LhzQqVcv5XPFho2ahaT2vcp8lQImnjxCIjCGv/KSZK8gdSFk8DOzhS3rH308JCULmsf4bP6CwErLuGWkeuP2d1YFVpqdYRLoHDyI/ypBUD7+tcioKiuTnC68gtl7mUcujQJHqveLm77bic7XiBsrLvzz+wPTfN++Ka/AwDSgonzb2Ow/vfiXF6/5+91p4inhRJA9qJQvhAh3+FBlpSB1ZuCfMv8DOF0rymQkSRAhlL/rGcG88U8eqzE65Od331u26BAADB404Z4OyvY9L7zy/hr4bVe7ZZaQ+3Bq1kyfEfC1DKsqcfLkHh6sO3kKmt6e3MnTVDuGWvMaGFWMUHOqtpZ9UO4nU0RDOVQQfIIzk5q0z8hQvgqqCZXLKKjmmY0b8y9uQTXV/iWP1zGqrcPJY6d+/RWAe3upJ7Xut5NA+w4pJ+t+A/DRtB4rrv/83Q6/naxDRdGK0iWldz+27Pq7m7fouqx6juIZKo5mmFDrt9znUx0sUzKmc4rnLdzD0ydOyIWQdwEV/VOe4+na47z4nVL5i5EkQYTQjMhZ1Q9rwrn3601pI1dc1wzY88J7W6s7dG8LAKj+5svK3iNXXNwMv2x9oGwPOnQMpkoBVMxqMNMQQfl4Jy8k1+LFj3fyGgRUuKJ/ZW8u47eT1EWA7e+sapCUZN5BVMOLH3uTquVQAv/iFuKoPLqOY5oTayqAVGBX+Y4x2XPq93w4rc3IHY99/m6O1/tLy3m/OgcAkLPM3aboozkDf+89Ui1U3rhroFjSuSBhN00S/DRDAA9OwTl4UGS6JxJECM1g1SOUq5TQK1n909GUc5oBAM7pgF3VABPCthcPfYodsPt7nNM/yCpFAHU8UyBU4U1EJMIp6J952Oub+giDR9E/RREV9LqFNGFvUnX4VMFSHJX3CNUxVTB1TP39Dd9e3SoFAHo9+sn73j27Xrz+yp1/2X+E08WKwuvuwfz3c1IN/4oYR7gVwUig4s0HLIEIqPEUGAkihGZ8kboaw/CmH5ZU6tCxA2e0Tm7UFMDJBmc2aNA0uVH9zh/feXtJ4X506duERRpD7qVJUMc25Rkrgs5Zqqo61KkX22QEk88ClfLJe/UMXUDhNW3pHU0wlOioJuoHJCTLmHnr8c/lzCS/0CgfR4VR6g0f06sqK1NHSgVJKJ11ZYtZ3Pdb2ywBgJ5PfPzvialIuWNK1xTfAaMXH7rqxG8nDf+UsGAp24UhCSALGPYInj5+nA+BssinXuefOhbK2yD7tch/USEkQYQwWny+rmDWNwC65/Rtq3/UuTfclHsDfnzn7S8+v+QPl4e/VnKvLoQunRpB+QJ279SoHb6AvT1oeSfmcx0JTdgDsvRQBOULicuoIPiOcn9RjVwSfIHWLx66OuUhYd/SO1ottZanExUU/eOrGkDyCyPk/l/EJJBhIyEMhx/WZ8iMNUMAAN+/n3f0RMPk5kD13jPbuJKTWT9A6ZrZ/2xxd37P5kD13v1HzzyR3LC5WIiZhBReveQuHXxSx85qmJycOW3qpjlzM6dNhVYCC9urfNVLYOk9ZRJTNeWDsp0/TO7kCZgcw8AwTOOU+3xyh0/wLYgAYI9eaK/IdVF42Vl1GQWXQmi+CI9Y8BchpCz6F3WmqiXUPiODl1Imk206d9bTS3W4df/OnUw+1RrZKiXFjHAqh5k8Xl4xpea8+AlC+NFjGWPeAoDbFpQ97fcovAj6J+S/CAjP61RtrWLgav8vwkKYIOMIDRMjS9fMfvArAO3vmXD7cD8pOrriny++UAUAaD9w8a292gVYEaUc7hJHS/OKtqOqahsAIPumGXkXaJzZqGmyobbxWHLprMo/L4TywCYjmHyWHuPukB9gaQyDIoRqxwJGvoWeEHa8PAIOfNzDbFCzDSQ8YrkuypsyfN6Ngnk/Xv2IJd2NMPIg5UmnaiSpOmqC8SY1+zt5LAQ/Nz7Wft2Aqof7Ati1e3dqp078kUwCBf9PPgSCCaE6/ql9sE8Iu48cISkzVERBCIsnOrILxY2ufPem3PQASjMlhN+/P3hzi8W39mqnfOB3lTvXDL4QQOma2ZvStbXKEMMcEznhC1daFULmODKsBjYNhTCEr0U1SutSs6spsLdkvDcT9QiHDZoZ0yL3Fw2FUL2Rf6sG1tbRPrhJE8GDVI/NMF+aWLjRuYZiJsFQRA0GPJw4sev1x9b2e3hCJ2D360MXp6x6WMMTVPxjwZOWCKHi3CvmKff52N6MW0YmZtZo8URH9tZ8t0cwuPKCTKdjW5FnYVZgxQo6JOhK1bHDF/+uf2rTZGRkXPf2tgNNk1OVfRl/XO/7wae27bi5CUt4AUxEICVXtEQwMdu9Gzfu7dv3Sr60QAfnMUIY24TFfBYBwxefQDDvQcMXXyIRJhs8ZSIZTfh18T8PSz88Bf4XJcRRedxr1srjqGoEX8dSJk6QBJOraaaT76OZnUcvAy578JNlYzsKx+9+/c9PvwXcMeG2TgDw1qT2b7EdGY+sWDTONzx6d2kpk0DzLqB7zVqmbXr6J2xnv43AfhUBEGEhLF5Z6Mp3q5ud6blL8pc7VxYvzArMCg11KK3FeQCAFqkddY5wv3ProQHrOUkJa1KJSfZufG7kql0AgD5z59x0pbD78MbHV331h659r2wpnihRuxAmsKix1EVkSPhSWqxOYpJAhMsGA4B/zWnGyS39fra/s2r3u9OveXkHrnlk+6QefEMqgGi5gOEkOAKx+3PaMHNe+tr9O1OwYWabmRuqHrqiftfu14cO+T5v9f35iyuBTuh024rSm7y7SmZ3eq1k3AyX1atZHQWhvEAiJoGMRE6W+fTdmfd/Dlx++z9boeLID3CeBxzZtQdMCnk/7JN/TZ2K8ZtGdo1WVXk4l+7gp2UdCuZP7wPsXf/srE9/6dv/fOWwveuf/eMXPe/NPANJSQ0536lBcnKPcXdY+hntWfvEDfuGbhn7OwQxPwsjmDEMVpMGLQW75DmEwUS6CEbvKZMM5xKS8Nn8BerQuvB7E37Vwm91d/HMBzG57M02u4tnjvp38zf+WD/VmebPUpKJo87sl2fiqH+Kcg8yiuxyf9slpc3pEydwxe2PzF/84fFLBij7zr9pRSmAkvd3lH93vFcqf1qn1J5a/p9kOhhmznwWjDwWKriAZgIMISTCQpg1LCc7e2zBELEvorxgbF6JK98Z0otdcf3j668HALi3ffPxt1VX9mnv3vZex/NH+R11ePnzsyv+MHdTl5BeOzQcqkBbNuNsh+49sfYQUC+EHfrf91l/7F3/xWsHAX+P0IoKHlz6t+lrej2zpUdxj7/tf+evg/keUsMRC0HOzyIon9BsDNjh02ytx24LPdKEywaVzGSeIMMPwi9Z6jXu37AZ10xuA6BTjz54dz9QL4S8p6hs5NXRMBPHKkFOoxoROl3ofOv9kukDRDevkxMvf7R31LgOJTN65aKgdLZr76KH53UZXwoYzILG30MlFmpIhKOgmkTaI8xa6HEXZDodecJ2l7rPwgoG3WyXjJpbPvXWWUVAau79o1KTAWx/+vnDt07uu/dfswt2Af83ldlE96EzFvZVxRk1rxicBuiFLv3bxY3PqDi8Nzk5FUCTho4DR6uTk4XI7pkNzzijcXID/b/eoBvvwDcfnjF29g0pDXH36h9mLt55w2N9kuBLPAlyxIIaS4PWDR0+oWNGaYNrvmLkPp/eeOqETJYJkw3W1dSoPULhdx6MywiVrDJLqathb9vK8t8uv/3s2roaoLbut12VO49cxIxlz9onZiKn7M0U5im+ltUG2P/6w7lP7wQGzigbfykrTf1rF17rkooZdkCq5wFQD+dQCKv72LHdBa9/+NHferkApHTM2FG5F676mZFP1x4HWvbv71lYfvx0ix5PbNi4fk6vTrndH35j4xPtj5v0/xinamvlQlhXU8taNkwCBRewLuHHEabnbvJEfGaxK2+cu+lGfkPX+ycDQAdxe8iQ56SYaym3SUvfs/ugzw9s30bdv9mxTUf3/oPIOF+1R5eMW0b6OXad2rG06E5tO7mrve1o/gfd9YahckWUdANoKl9av74VGzZKUhvYAXp79bpngmxiq2fWD6a0GCdiNigon+AyBqmLfhzc71Y+H6hGryyfsRzcWIrB489HvafYBge2fICxq9/M7vTVSxm3lC54c8IArSL5n708ehEAErWTd0BqniiZz1Nc7cF19a0vV3bqlbu7tLTfvLKe92pcIqXTBW9M6/u3DRsB9J+2sWKapDp+5m9+8F8seIE88dRHKFkUNPIYjrELIij0vyfHzfsXgPTR/+iFl78+OHrQ+ThQjXaXah+9bz8fMlUjS2Bp3c65e99uXNoJQNv2+NwvoMQw9Av5l4KZ9wUTOYnUKbs03wiKtQeZqmdpNTuCEaQNynVRTWBGtGf/HmcbxSL2V6D37cq33ft241Js2Yw+kzsBuHRC2ZumyjScBEfATCbOutm9xv4b+GPBbv8kFLlHKJFJub34cE0c9PKOQSuAvY9kZKBvBwAomd3p5dQNi0Z5Ww9XTKvYoKt+QbYJlBmIfK68jMxpUz33aWl1qIknIdSMU0ks01L00szgcR65iQa2VIKP3z24aPGD3s+DseSOHuOAzmNXP5binbX+QNGY5/HkY9mdAKR2wt/n9fhYVpxUyVLTz9hSlZR0AYDGDR1nNrY6J6dA8OktvDFbcvLkwU/1iGaJ8hku4mpb5DZodTpfw4lt5ZFVv+jZmSkDTy/7ePdVt2DdQ59c9ujUmlOsLof37DyN0zU1dQB27f6tZ1bbmsqlm3Z+VZ6bsQTAgH8sGnuVL76q9EGqs1UNJ8HhaZCUxAc8NKWi8q17Ctq/WbGhfeVb9wx7tfW/bm4vKZDH6qRI6gyXjsMWzH3rnk698PAbL9zZ4vjpWuCyv1Q8DxjlwmhOhGZyOhghHbSuplYeC9WbCStMxJMQBkkoYpVR4Kqxi8vu8R+VnLsEwJBblrCvwQ1Lb9v/qsoH3q3ue33b3Z//Fx3/IuwO65yc5PDZiB82Ty4o+ga4OOsvz195nsmTLHmQn81/5M25k3rj5n9PHdDh8Lq7HqkeP390H+4AxVMc/dfFo9mWtU/MXHvwqkFeh1GJ1AU/sa1emMS3veqjdRf8aUF7ACmu32PpHkAQwk/+Ogd/myYOmAoVKTe/UHGzqSPNd5Rqwq+DZtIFZB8iJoGMSI8j1JrRQiEn4NG8ms5fMBNAB+fSiRgOPBeQj1IIflg6zwUjnpucP6jrDbjsniXLh7cLZhEGw8appXmQg5zFSq58cp8vyBXjYptw2aB08eqjK96uHj19Ri+gdM2ry/Zy0xweLc176cNtQLc/3L2gn4FXJB/a23sKmwHjrT9OeQvsTVpbW9c0/feeNz7ec2VrrHlwc/eZk4/Ubno785uLP7utB4DTdb95UKPO1Ff3XQUzQFYrhWTHjlPnZx49ehzATzWe0yd536tyRe7AF7Zdds8SzeQUofVpdWF3w/VvhTeAUHmxNCMXULmTVl1Aq9GFIInSFGsIfAILAUloNBgnL2JCGMAqepZyNa0O3QtmDIPhdI6W5uMIYahTjUQI+SXFEzJrFGG2QY35Do+W5pWelz/4QgD7vnh1efPbfRMZHl3xz0873HotE8jqq+++6TzA/U7/1z9nu6+77fH7TI/nECKrJjogJ8+eUpz2yH23qPLEg5ws0NhCq1eNXtFhKRvLseX50QdHLx/um/Zx379nfnrleDw9DffXb+QLDy5Sohnt5LG0BITmdDAMtQuoJ4SaUVBFCK9+WFzeIxxEITSatdCdn+nMLAhwYkNNYjawqYfeyukRIMhYhxy58gWPon9BrpqtRtG/I9X7E9ojBMJjg7L5fo8e2QatcOjR8o9bOfMBAO1bYPMR4DxUHTlgSf/0kMbWDv9rwezeU54HgEcmzQNg8R0imK26OWs+bLPxkw8u6ncft+HK8cPb7crfdlGmnwoqZhvkSpkhT39lBLAIFyPCfYF6RKWPMCoDKCId7ZSHN/lfjNXReGEdvScQxfQWAb0lbPQwE/xs3qKFsuXokSPmKxP/hN4G1bGs6q+Xj99YDeDai7t3OS+JHVC5v+q35Jq6GgBo6C+Qvx2vOXns6H//17JP9sfPbEjP66lasSxkJN84aa4wbIrvSbHasFaHUpUp4LcsWqzxrjg3Y3DF84t3db0NRQsqxj49qfaU4js1b96+tvb7013SWnAbOWWVjDsyg6DQZma+liCMBTTpAjLksVBppD302ChZJqyEdtlYSxhmcsdLeotAWLNdmATaTPwiTdtLRqy+BADw05dTt/wEnAv8WHWkex9u1F437yTAqDpShebA0fKPq77cVjTwyS7vDn7m/CenX6v84AwXeAlycmDeKVEn1gUsjXqz4dz22OTXHx6ZgbGrH8vuVL1q9N177nlnsk/iqisqU9J0lvoO0ocLfp0/+bx3hlhKhxn8zGzP03+zVH5gJI4QRtfhC+HcY1YHMAQZKrGU4WJ10Lp5n89knx+/JOkZjRq3aNvmSPV+M+XzPX/gJLB5ixZqOTyjQeLYRUxwTlq/I0uGzAcAXDxstW9zXdLZv23fX1fTGPixcn/3K66qqcPFc6ZczI57dH/Bxu39LvXNc7B6ioEHKywXI1+aTXA4hMWx1ZoqH8ghGallNIfqkiG3LCl7c9mrbwK1tae8G3eV/9bmqvqvYYTXRTbVhqTXRj0j9qmamh7j7tBrJfAuoFr/FBeQLSEuPBHW7jF86KEiQRbm1fy1BYOmEApdwZLTQyuEYZqTk2Epw8WqzycRwiCzXWBitB8vfpacP0UImzVrZqlK9oTZoLV31k9fTn3th1FTela9vaSQtWQuHrZ6QEr118ufxeC5l5wL4PN1BZsvyP1ToGvzDZlfID+AV0pBCNXIM3GCHFUspt4UFGwE+rZuo3lwkBP8CpgZ+aegdv7kU2PX1dZK/D9JLHTwM7OVn1P2c/mSS4SKBBHCAKbqsTSkQd0VHFafD1ZWHJUTwBIN5t2+YEY4GMqe1VHtfIaLYeTTpM9HQmgGZoMr7pwQisL2vPDK+2vYx1Z9FlzXXSdAaIyhtglKKfcg5aWp1y7l3/tW5yW2tGKo1aFZ8sF8vCRblT1ouYCSeLXgAjJdZA+Fb1RFVQjLCzKdeSXi1sDHGIWP8Amh3P8LnxCqp28IxuezFPncXVpqyeczKYSK/oVqhIPO8Q2V5BdD/y8OhDDebDBEQhgyDIWQp2FystIHqamI8tLUc+LwnpBVIZR7kJqdjqFC/iI1I4T8Hy4fC2gyFhoZIdR8HZQXjM0riUWLCzvmg5+hJaxDGgTCPcJBIXxDHRT0ev7iH/vaYLRQ9E8zK8dqJo7iEWoOZwxmuFdYPcIACHKBEeVuR6w7UBNNIXRvK3HlL7GXBcrHwYR8hEMIE15CO5+LWLiV4OeZjRvzaziEvM+Ph0mgeeWLt/yXxLTB4a+8FL7CBZc04Px7zTcyH/yUB1EF1AraMDk5hKtTnaqpwbalvRf8F0DGTY8syU41Pj5QDKcDraupkXiBltJhYmH4hLObq2SbGwjZWNuYJuChoIER2sinHuLaKz5CO8IBEZ/S0zbD3hPBBtWyt2zE6EhejifIyC0vfmqXMWB/kWEp9UbFN7MXoGD+gj44+ObcV5de/vBoC2uyWSMkq2jFiAsooNNHWDzR8US3UE47ETbM9xHqJYJqSmD4XED3mrVWlS9mE14Q5m4/HqsuoHjpgDzCaPYRxpsNrrhzwsljx0YuX6psD6vsWYWvGIOvXqOmTS2VJnQZqjNUJV6jYeelOvVGTb0IHd448eOWC2/sCmDvxuf+2epP93cxPFsX+bx0hnovceMM9U849+SxY+zDiGX/lF80JAhCGK4JecNHMEKop4IInRDy+ld/cOiEUD3CPUxD/TQ7/KyKqFUhtNoFqJksw0YKNm/R4qeffhKOP+ecc9QbeaIhhPFqg4yYEj85ammEacfRMHdG7TUq0mgpiwdamTh+7Hh74qH+C/u2hL8QGk61qonaycucNpXv75Rr4cljNXrzHqyZPoMfFKEwZH4B26gWQvaAIjOuIZ6GT0jm145NIXQOHqSZ+RISIdRbkzqEQ/0YTAI1E17CJ4RMAvnB8kEGQuPPI4xJJDbIPMJIViaEKB6hXnxVEEirSaTwD6haCqWaF8JP/jX144vnBuMRyjFcEULek2o+iZQ9BdaoioxHqPl20ArKlBdkOrc9FNXWqNWFeeVIVNAMloZABLmGg4AggeEY8MCwOr2nmgBioYoERkX5Yob4s8EAVDDCCRFm0PNoeYEMzOvlnSFJ8FOtH/JJcHBWc8/XVXU1ycAPFVWXZ2Z553ENB5rPixd4/m9Uy578cbPfD/MCIx9XMP2ycG9TDWkiNFDnwoQQPS8wtPBRUKs+XzCovUDCD7LB6MG/mtUxVauZOEKEkPf5JDFVbc67aMCBv/efBbBFjy3Vwzry6gWziGC0JJDhL8PtyzIAACAASURBVIR894TTkSccm1MUa50TCqdqakI7xVpg6MVC5Zhf4YFJYMy6gAHnwgSZCJNQxK0NahJCn+9ESOOujf2zYyzV87UhwwS3TJ4faykTR92LZjjb+JrpM4b6Pgd5ww2vpa6e+fESqr2y1KqoDp/IWujxLIynfLVYIjAVNCTcXiCfBRphF5BhfuJsW0A2aJrx64Myt9eGDAtVTdR+TPBeo4J8mIFmYk7ACN5n+JaJ53sBYwHN0GjWQk98tTtjjlANDezUq1eYpj1DlLoA/U9vqLn4Q0j47ZTf3P3x1mVoRxvU9Pkkavdyf4MFyOSMWb0yhKUJ8CrL3EfJMEdBDyx5kCeP1fASazUlVSC0iwIK3cbyoTXR7TDWeTvEzzyHAcMWHAnVOPpwuINMBUNbpkKbzp3DN/OZScKngomADWxQDpPA0OoTj1By+BSXIfF+BPcx3LO2fr6uYNY3ANrmjBlxwznq/ZXPzS/vM+UPlwd9IeHvih3/Tw3NNRqjhFUFY4EWbduQCupjXxtUBCl8EqiJ5HJqjQxhWBUqhQjrFDmo/M+sI/1ennJZ28r/DFn7Ze+bLmvrv3fIu1uB7n3MFSavaiwrn0DizDWqnkNPSJ8RZpu1OlltCDEzQCLcnYKBuYPyWKilZXLZkcpodyaKch9RONgk7PhzzjnHzHh8dkwMxFHj0gatIsRC5S7giV9+jUSdtHi+p6gLQlhVTTAqLqisYWKOHEGN9u/d37lt2tkHD/2a1Grg/j3fHewwfvnSZSNGj1y+dNmI64v2tgIwtuXx4wcP8bdbc/IBdeF6jPRdwrABMWb1ytA2Mkxi67lGQxsdjQvCGhG1qoLwZYoqEiXXKuFgk5g/K5Y8VLvYoML49Wsj7AIGg2FVBScyrIk5Vul01tkAgLPat6wvkP2f7Tw723l90UfbQ3tRdrqZmxAVFYSOEKYPGeHKe6JgWlbi56zFoBZadQctZceEe1JsMxyp3s+08LeTdfx2ZQT92ntbjFgCjF12dN7AaFRQTLSJBjayQeioYJAu4ImfQ+lBNm52ll/hRnUTnEi5BymXVcFvbmxxWlTG11tXPlsJpPR59ixP5Q8HTzY7Czi85/CpVsdqTorH1p4+fapOY3tECe1oGUO0Z5aZk1cClKhGMcVul0XvKZMCXuIrBrUwHMRCdowC00JoOZEVL15blH3k6DxUvHjtXz4c+PfoSGHUiT8bDJj48gUDg9fFxmefJeyVjwMJyc25pPuw17oDAA5Wu8sPHEg9q/XB6o+an50dfNEJgd7wCc/CSNckKD6bvyC6WuheszZM4wgTFSaBKjmseH9lt+z3ASDtmmHfPPchBvJKWPHCtc+lvz8vwd+aQDzaIBEwcqkzHC5pLZx4/qX3HVx53+oyoMVtAy5tDQAHXin5Ndt1YWsLpejx6wclH75+FAB+32vYnfyCUAe/GlN+9rP1V6k/Es0zng3N1QMn6kkBoaGutpZpIbjVvIT0GXnujKCFp/yXoLQ6B7ec07XH+a+WVllKMHiP8LeTdagoWuG58IWTdb8B+HZH6ek0JXx6RqO9L1x7+V9Lxy4PQzWEIC0Rj1iNhd7rtrBOyzxnhsXqhAwhyqp2KA0zd3he7j+oS9qgl9MAAJ5jJ44BOGv0JWfh2LET3kMc/S9xcl+t8MOOT1pmvnxJMhyHX/1i++6zOrX2AEDZt2sLqoFmF52oOXaCzVbrOLL79EVPDvAeEODlQoeuEAqjmFz5oZrlorwg05nXvcizMMvvGqEI+TAJDNg1ZFqIQBfpJacwNHRJT/N97OW8QNm89t7Ldw57sleg6SPKCk2WiO7aLPFogzGLWvYsaZsl1bRaeJBYip0GOR2P/LoHan9tl8T8jeR2OHQQaA3AUXN+yqCXU3Y/VZncWrGn2pp9TY99sG7tBnTIHdA1Q8vOWFXvClV1pWgLoc9QNvnMoniiw5mJ4O1QsMBtD3m882eUF2Q6JiIYO6zz+XCb5swVXEPzKFpoiNxlPHXcz+cLxxr0CqdP+LWlwjpH2m8n/a4V5Mwycj4sfq1b1hzv52ltirL2z0srvHZ7egrzF30IaxbqEXezuMWjDUYYQxeQVy9BmU4c/fnE0Z/NX2t2yxRLdZMLZ+z4lwJqdzMIfj1Qi4wmgCe5dRPguP/OmmPl1RgyYNDttbufWrcdnBZGZSCpbrJMTtEmziCyFhblOLLnFOcGaSX1o6PKVy8vyXlIKS19yAhX3srihVkhsUK2kmRgchhMf2FInMLdpaXhGEe4f+fOILNGW6WkmDldGE2ofFVnxygaVr8xbfCwHVNerPj93Sh8dsdjL8wBgIrC6551fvL+74GP3HAOFi4Xdwpnjri3wahzr7ssinrDC2fj5uKqlgHL5L3uMrmSMSZ/sZk/TPk6+YvN8NdCtgVGAinBG/ZEh9wBXc/323NW6yRAL6RyXteX+wMeIKnl5c0OeCUTQMQnUmBEuI+wfnRUeufu2GbtZMnSg3U1NerlKxU5VC+7DGmX4ZZFixNVC1ulpAi5o+Y9SLUKajqIgjIpX9WKpaVhqXe/O//F69u0wGOfv5uTVlF4rcs9rGT+C2untGj7OQDgtWvxyfs5qSbrrFdVGxMuG2zUtKl6SUJhMHhk5pNkMqN2ASNwaU3Ul5b7l3KZNNMVOs+ZwR+mfGX3hN8l6F8AQ1Y6t+vzfDsAwM+/Ao33HD18omET4Oje0w0kzZADVaWv4OIH2rOfh1QyI4J21ui0fJcze+Kw+ihJ8cTsQle+O+imYnruQzmObAeKPAuzpuU/4ZxYzK5RXjA2D0blB7Yw76Y5czOnTdXUQgmJ6hfGA6l3v7v/bvYxLef9agBAzntHcnwB0t9HsW4RI6FsMJJE1xEMCQHLZPT/8Gbteu77cvIeALjK2ae1Bzi++6ltuLNnJyEptHWHtHbrNo13A0C/3w0aGFUVBODQSwcIW0c9/JdcC7Z4ZoTrH31c7RHyZE6bKsRI5esXsgnYlNwZw6xR9QG8Fsr7CPWyRhUhDO3qE8KAwhD2KYa1yxDYVVG45oNBOXenGR+qJjCPsGWnToFcLETElw3CxPwjgkeoDJoObEC9pm+kJ4RR9AhDizrQqqCpkXJ1FCYKCC0h6XG8a92a4AsxRFcI4wVFCNW7BGnMnDYV+l2Ggi7yM5FqppLKpZHt1fMLzeui5mKEcl00I2yS6UYjvx5hrLBr0dSPfj93XCq4/KPWTmc0qxQnMBtccecEw0XmJKHRMatXCloYpBAGo3zHD/8Q8LnB06TleSEsbcZhWb++JScySNUMTBcjI4QJMo7QDMrgCljMoGESGECklMVI2QdLJyowCQx5jJRJoLIkb+zMOBMJOMFTNi3849UPYdab193bKuWiNytn949S1eIdJoFshmWr5742ZJhaC4ngEQKtgkMZ5KiScDN+/drIDJ9IEI+QIfiFkmCp3DuEjoMo0ULBQRS+CnIYQKRUsk59qBxEaCli/DqIwqgSxkczO4/e+eDS7KLRT3ZeuvNxb29j5ZLrpmP+srGpqCwcOR3PLMvxvTrIIzQDs8HVU3IVh2/4Ky+x1YLU6TM86kipZLo1tYMYvtBodD3CYAjSm2zcvJlkzInG8VZ8REseIRtE8dqQYbe9t8L8WQGjI4TqHgQgNgfcMiNcM31Go6bJ/WfN5LVQ3mvYMClJ4h3qRUr1RtzLhZChREoD6zKEjmsYvBAqqEOmiSWEG6aNrJi8bGwqsGvJyOfTls3px++tLBw5aFX22vfG1regoymE8WaDvBDCt1qQ3DXU7DLU00KTQggdLSQhNIOev6iniGESwvHr1yrzxkVGCM/Q2ujNT/OIxJwFCqx/9PH+s2b2nzXT5PGBjbg3P+heQImUBgxLJWXeYTjYv3MnG26o/AvThcJBq5QU/p/8T0hN6/za2g1+mzasxzM752N6m5kbNE+JLPFqgwor7pyw4s4JeuvYSXi5/6AgZz+Z58ywOhEMock8Zwb7F8n7GZVJ2PX6CF0jhsTZ8i+sdblm+gwA/WfNZB94BAeRzURjchoaYWJSNtAQ+pOx6c07o9lrKDiIwkyk8PcRlV5D5fNp3yw2zF9kDmL7jIyqsrL2GRkA+A/qqio+n5JNynuErVLq3SPDrsQg3UfNYKYEQeQs9XSebpva87eTfle84pa7cAK3TLhtjPu7E1ekWqpKWIg/G1TDMmiURdXlkVJlgSGT/YXi0kghXXcpMB7FL7NwNv/5UfwCgP9g8vTAUPuylnxEwW9WHERFC8XRmf73PPgc1GgtRaIdGvVOvRQPrU8lNCpsH/zMbPj3GhqOrwAnh/LBFVD1GppJIuUxP7gC0vEVsJhTqlG4leUM1RtDGEdVC6HcJbWe41PfBXja/X9DF6esergvAGD3S2OGlOeUPd0X2PhY+3UDqrzb0a57d4uXCBlxZ4NCaJRHr8tQPr5e0EKrSaRCgNQmoVE1wQRLNefEkXQcyoXQMDTKq6DSKqI+QlMoRqipc0wOmUwKk1xoHs/kcNOcuQ2FPj99Xewx7g4EOrgCWgmlVnVRkkeDcOoiI6zhU2tOngmHctfrY/6MJ1fd1sn7od+GoQ/iH6/d1vF4+aJxwx8pA/5YsHuGSzm+4+WXB1LvkBBvNrhm+oy6GlHY+PQZWO8yZDFS8+kzfnt//lXTifHulepiuIWQeYd6BOkUyrGkixETQiU1Rr0rikJYPNGRjRg0OC3kQshQe4ewmFNq6CAKcmjeQVR6DYN0EPmOQ14Uwy2EsYPJyOpHj2WMeQu4eYHi9oELLyuw+xm9nOr4s0G5EDLkcigZbg8tOTQUQvYhgBnXwieEJgOk7EM4FDGmhJCfX1txAQWiK4RPdAvhLBbhRBnMKzh8UEkd7x3CyEGU55RCRxqZHG5ZtJgfjw8rDiKs+4hqXdQTRVjXRUtYFVGrnYLWCldpmxwhBaliw0YAqX2vCmWdLBB/NqjungAgSCOTOiaHK+6cYGlwBVt1T9KBJOiiOlIK/exHw8BpaKUxHj1CzRsYDheQobyfRyz7p7nKBoV+aDROzFAZR7h6Sq6wSx4sNRRC9kFPDg2DpQjIQYRWyDTg4RZQBU5JCKHSPAbfYlDylaInhHFpg1DJoaYQMqxOQ6MMroCOHMqFkKE3HiDCQhhFAhNCPUcwACFUnqCeC8iIBSHU7p2I5f4JlpwmaKE8WCqPlAp9hGo5NDlVaWCpNPCXw2CEkMG/+jVzR0NCLAuhxEvWODf6Qhh/NsgkUIi7SIQQwMljxyTT0AQZKZUnkQr+DQmhJkwIJc60JSEUHlzsC2E8oQghuJAL2yX3+TQ7DvUOZrpofgC+QsCpNAzNhBpLy/xaCpxqnB5OD9ISZkKdkhGWwl+qHqOiSTQ9wvhBme9Xka7Bz8yOtUipuPfnX6H/irc6T2ksy2QwnYLC/TEcHaEXCzUMhEL1um7kk8lhi7QahKEmoYSQodiVXAjZXjb6Xi2H/MHCyhW9p0xSviqfe0+ZtGXRYgA9xt0hfIAqWMqkrusNQ7e/s4q/KNuiGSlVcK9ZG6QQ8qiVI5J9ipbQy2fhMT8jKwlhCFELIXwNTfgHSw0jpdAJlo5cvlT9GlXSSuEbhs90kX048cuvwvq04JaoVYSQHy3OPs9zZghCOONwpXxppAQTQr0AcgBCyHuBJl1A39emAIa/8lJkFCqehFCy7NmyEaMb+d9lZlfqjkMFXurk3iEsLmQBaSoN9Ifhe8+V+otdbxgK6SzelmQSOoMxFEK8IOLeN4YPn/cFAGQ8smLRuA6+7SWzO+X+m33see+KFaM6aJ4tr5tJbdPklI67mT5oYMBlJiQSG9w0Z65m1qgQLOWROIiwuKhTCB1EhnyazdAu6iTX0dAuRmFmFafgXUBoeYHqfEYezRf4ijsnkEdoCmaZaiEE0Khp8pD5BdCRQ7WDqMzNJncQvVt8aaWwmEoDI0U0s/ah2k2s3xucEAoYTudmSSnXze615urS2S5g7xvDX0tZ4Ruxt272uIoxi8Z1APa+Mfxh/H3RqFStOsivFVohZHc43q0jMjAb1BNC9kFTDuU9iAFk0/AOonCwybEWCsKkYmFd7z6KQijXfqtCyM+Np06HMRRCpQ0ELshHQmgKZoSvDRmmvsuKc83uqfwxWHIQoYqdwrqDiBD5iHJdFA8OaajzzKQmJic+ZRpWL3gomTGucsLzw1MAoKqyqn1KewDAp3PSNvStmHZl8HXTc/L0EO4hi1p3GXp98DVJeJgNfjZ/QZ3/zIJQSR1ra2p6h+qDLfUgQstB5N2RE9LTDaetmfzFZv6rpbWKIrkmsMThYwgCL4SOxdKM5oJRpE59w2HFBZQE8LKfy5fXISQk/nqEynqhkjCpgLKWBYzkkMFmoglgpUPWidgwOUmZxdvqkocMQfkkQxJDjhWPcG+FW3O7TwWr3rpxGl7ZEAIVNAkvfvy9OqV6oRMhQTOzVA6fB2d+mUP2RmZvZxilaZhBUD5LaxWZ49SmH6veOwUAvZulDG/ENtasOHzoMwBAStP2dycF/ro2XEciYDQl0Dx6KR0RJvE9QgXe7zYcdKiUZiabBqpxh7A+1oKhOZd3AKMvGFaHJHJ88td+094AevzpzX/d3F7vIDMjN3j8PMJeHw/c8Jf+yr6qt24ctetPG6b11zvZIoJHqLnuh15DQRFC8gjNIHQcbpozV/ksCX6q5dDMWAvlq1oUJTOXKorIE8xEpjyaKzNYnub05A8vnm52d1IDoGbFj6f6ndusBXCktvottLo7qQFwatOPP7c897yLjIoRFhTUrI/f8YEOBFQwMyieR1iQRC/JXyEyHmGCCCFD3mA06YkzLI21UB8PX7wUWjOXCqhlUgmZQmueGvH00AVOfexbnPc0phfc0Q7/fW7Qmn4b/3aF//5P59y4e7REIHVRTqx668alHf+lhEBNqGBIQp1WISE0A7PBLYsWn6qpgX9bUAiWqjsR+Y55QcnM9CDy6eIBLALMPptZ7sBQKf0O9k1zqodalg7/+N26RhfenAzg5IY9h1t1bNfVb/8vb7l/6e7026h3CXm0UyCwxXL1DtAbAgHODzE5vI0x+JnZlDVqCt4jZG0NPTlspOq5Zak0MO0gWsqmUVAU0dJsbQq8KMLEmsCGe/XWROQE8rOZeXvH5/8xBWjw9XP+mlf1yqRbHtuKUXNU6miO9XP63vkugKGvMNmreuvGJ3Fd2j8ee1c5xLfLH7kQqv8oQe8Di3aSEJpBEEIFpogSB5FHMS6Tg/EZfJgngEWAGWYU0aoQmj+Y4S+Ee9Dmwn4NlZ0nN+z59kCLjJtNxA6tLoQkF0Lzzh9D0Dbe+eObLJoH682IOejpv8kvGhISRAj5DCUlZh2SrlqGfNpSWFnaghFAZg1Dc4S+BMMcVI3j9/17xPIOy/N6A6hckTsN9y8f3o7trVyRv+6KvLTluRUjCu5oZ6ngECBZ1jgwh09BTya7jxwRTLE2QRFC9a5TNTWWHERwighp4FSN0q5lCG9eMytA8RFU4aUvz7URMKma31RuXnAYQOtJPS84/+DWD5t0H9UMwPF1O/ad3+WCi71HHX3jix1w9hllkATjxZKHB9XYPiGGbJj8Iul+glFahiRvH5yzcfXDD0kKCRUJmCwj9JMr7UTJZE4MTQdxyPwC4XGyWTMGPzNbGTIM0zk17AM/9ALW82v45BqFwLJstKna/SXqR/Jd1KFe8VKG592BfYt3iWcEmZ4jUTiekDh5RCQRZp9gH3gfUUHpjF//6OP9Z81kkVLexNRWyf8PlfKpY3GG8O99zW5FhZAsHntxSp/nlWH6TZKrjh9HsyZA7X4k+ZbBPPrGF1VtuvcZEIYlYQRvjxF8zovVE62+RcNEAnqECqz9oqd/6kgp+6A59FC+qC9UnYjy4+UTmZpcE1iAl0ZeFIPzCOs7Czn2Lc5bnpafd7XW6SYlTSAw+QyhEKqLYvcz3q0jMij99GqnUAiWMo9QWfVT7uQJThszMYmTIY+dCi8B+ZrAagSPUFARQRctxVF9HF+348u3jwHAVcz/O1E9eesu7oDWk3oqbqIukqWOBMzM9iKg9giV4KemBMpjcuxNq7cckEJkPMLEEUL1LktjXPTmNdA8GBaXtjBzrmFXooJhDqrgL1pyFhskJQHVr94/cfYOAMA1j2yf1MP/kC2z7t9719NDO5kvNBpYlUnhprF3+mV3jg1hlRIVZoNlby5T5zzX1fg9BV4X1T2IApp9hJozt2keLyAETmEl0QZGwil3HxEiD1KTxk2byq9uaYZP1V5RJoMJfkLq/+k5D6777pVcIlTYQggZQgeAXAgZylM3ucYTg3/YsJhZA/+uRIYgjeYHYzAs6aKGB1m9avTde+55Z3Jf5Ws+nopzIZTHlpXXNwmhGRQhZF/5QbESIQRQV1sr/NpNDr2Ayso0lwWWnA7VO13ab1K9cPm6jwCk9Hmte2vJVTThM1TDQTCjJC3N9gKV52fG5+Mxn1eh/DAoa9QUSljGsM3F66LaR7TkIKqPF1DPUwPTawKr4V8WAQzGEBDSUAVC2dcYVdRSx6OZ2aGGhNAMzAbV+UpsXlyJgyjAZ9ZA6iz6SqvXNvmcNTDyF08eq5H0KW4peenTThPu6VD/wc+DrP5s5q9dH3cGvpqu3N0M7UhzzRa/giB7sOjzyX0Aww4j/ukrFhoZG0wQIXy+Zx82B5JEDtXRcH7iCUsOIsN8lilDLyxgKIQ8QQ7GUCN4kMGEVaOIYfaQ/BWsBwmhGfSEEMCp2lrNmLMmmqMvoK+IapdR7SbqHSwglaI9L7z307DrurcFsHfjAz9d8tTFzRQh/OrzpbO/x8C+oye0lRRvQCSFUBjPLmDJ4YPK5xMaIoYtfiEeoDkJSaIKYXlBpjOvBABc+dz628UTHdkIYNFRZoTznBlsAA2TQ80hpUI3stpBBOcjGv4C+KCB4fxAlmLlZk6H/4B9v4OtZsdYGcWohn+vyQf+W6Wuptbw6prVMMMpo1x8Rq/J91gqNk4Iiw1qZjwJAWpeF9VtLL04qt7s9uqpTf1Lq9EbiWFIXU1N9dfLx2+sBnBt3367fjhv7oAUAKj8z9Qfe8695FzvcZX/eQ5/6PN9waZ2E+7xXzFFmeI48qi9Oh5V8/3H6p/ObXuO90vD5GTg6Ip/ftrh1mvVkwgLIxxg3ecD9zQhNVvlZRKZIUyRFkLe1oonOrK3+gwxRELI0JRDiRAqmByDiOCGIQoEMG0Nj2GfohyrHqSAea0KAKvyZh47C2GYbBBaWlgvhFueH131x1cHnqvsspRZwxAGHRkKIf9VeIPDfBz1py+nbvEKYfXXy5/F4HohBAB8vm55ZdfrrldFRuWCFD50vDo/wWN8vq5g1jdtu7Sp3rG/+6NT/tDeq/3t75lw/RVo3q55/ZFKw938UgQC6lCWyVyHhBTC4omOJ7oJbdDCnCLPwqyQCiGDnzD++Z59mBAqq3cyIRyzeqXiBbLPfE4N6z9XBmDwIzFGLl8qdBnyUQJLoy+EaWtgsZ0lIITaYaSLQQqh36VD7RGGsDQBGwthuGzQvWatehLzU7W1ShLyB+O7XPNyhwVvTph0y0h1Zg2ALYsW88tZsy5DZeFr9QehGkJoxHBiGiGOKlBvwpwQfr5ueVWPETf4ycmP77z9ReusPj3URcQGjZomC4J3uXdP5XNv/3DTTZe19Qn8qB/W7HfdMby5rCj5tfQSXqCV3GAyFpWQyTKiEYKFaZaPcD+0zWlkhJJFQTWnlJX7iPIpGISkZMNp7yUzLAQZOIXFcaaGgXgBS+6jQAhFNABMilkAKNmM8d6DrkW4bLBiw0b1xlPHj6M037nJ5c7rDeD75X/6v/bPPKojGiy5RsEwHqDXpwjr/qIawYPMvmlGHt4fXO5cM/hCHC3Ne+nIrdNZ8PC7/GfcmdM1AonmrxUMJlrJ3+X/84cRt/ZqB+z74tVncH1+z+bK9ltzrm4PwP1O/x3dnsar93/OTuk4JTfnpvOMC9ccEq2wZdFi4ODSv01/thy4+t4tY3/nX3N/XUxK4n8ASpdzZKY5jPDMMlnDcrKz5xTncraWnrupaJvDmQ0gR36y5ltJYpk8TAIlPYhq+JxS+SymanhnUTIGQw8haCOPyxsiz76z5D4mEmqXgscwZTFuibQNfrxp9S2Zeexz5Z4d4Kdqr141+u6Xv/SNVRV6DU1l2Wxb2nvBf5E5+bNRF/M/XUN/0RDByvrPmlkEAF8O/sq75cFnvlT2FnGfGZa6JCNGu+bnbyv/AfA5fVVH9gLtAbQ4/2Ic3nPg8qcfveEKAD9snvzvzX3G90lVlWCqVX143V2PvFWWdvMe/O/VcavSnlq85Xzt44VHHOREicEQ6SnWsha68zOdjky+jx5ZCz1FcGQHsRCxmYVOGjc7i5dAfvaHQwe3PrLnFwDAubdc2WtgE3EiCSaKfMKV+bE7y0aMZv4iHzs10ZFe+dz8le9fPGz1gBS5LloyOXUTT3hByOVBkMnAfLLNb0zK3QQAwyctmNGN23F43V1L8OjUAR10TrSE/A9BIkudAWGywUbNzz2tMTF61e7d3TuPadKgCYCqvVXdu3Rp3qQ5wKZf/+6eB7O7ZY/IbKAVUxdei4q7oOhlw52vZ+zsW/bmn/DVSxkrm20ZXb9I0Za/DOjx93W8F6LuzOZ/zHL3EUZxVzXqLsnIoDVquVmDqj1HWrV0AnCkdN/brGmrlmyXM/WzfTXJDVsCNY0ch9H3z6PSmIfXIq1zg4NJLVo01HbydGmYnIQDRWOWJj/15rJOB4rGPPUeOmeOS01i84erxyjzj9jqHFihJUGGTzBmt0zhdwmLNevPy370jS+O9hzwuwwP8MP2p2pTHmhfrxZl325Hl66XJ+sOvYDFCb4Z8sUR8dOXU1/7YdSUP1xe+Z8h36evGdJVPIBD3dURcN6NIfL2IMPAp9y2tPfXl3w26mLgm9lzD47xyZ5XHdNuXyzyvAAAIABJREFU/rc5IYyMzkVmVot4R7FB9SrNp2vX/7XfxsHcSiPzFtysWOmp4xtmDi4ZuMY7XZ98DgT13o0vz6y8/vHbWgP46rGH9932wICObEfZkh5bLtsy9nfKhz1rn7jhjXKh4aX5EzL5swlrtDO0NEyuWf78Gxj5pxEtgcMbJy7DzMl9mYnt3fjc4xi1sG9L7Hg78/82a54uW1f14Jo7Hlj6v/TR7/x1cEfvtZLw1Utjqq9/LasNgI0vj5z0oXJ05xkvPnu7/iATXgj5zubIKFSCTLrNJHDG4Uqo5FCL4+t2fPl2UpfnU5oDOHSwqqpj+h2ad/v47tXHfsW6tQUAkHrfkEsv8e1Rz89rPnAKI4+wepc79foRlwNI6ZlT+kUputb3QBwtzXvpw22Xjlgz+EK2QT12x2Io9fDy52cX7AKuHL/pRpniwlzgVD6f+N6D+4Zfwm5UqzR8vQdseu+DHQct+GzQuruWGBRoviaGbXwitFSVlbXPyIAohx2d3b+vqEL/9li/9B8Xjd3oZ5ylJW9muwKdaPmrdR92GjBeY8d/t+y5L2ssAGRcduO7+/cAr77RsWD+vXhjUu8FF9z7yH23tAR0PEK9pl5k4wfuZ2e9+h4A4LrbHr/PGUQJHbOX/fkPrt/h8e2HR/RticMHtu7aPHIaPyXb7MxVgPcPPPyvBbPnVZhrjx5cc8fLeHzR4o4H19zxtzWP+7SQJ6V9Zwy8sWz8pQDw1UsZK7bcLs7X6EeQc/cHQ4II4fHDPzRpeZ4gh/rx0pOdW2XMq9s3+YtDE5zt8NPpS847xSKl3+zb26Z5RyVq+k3lt21a9xnl9GXWHDt2Qqs4NuV3YIFTLX4u2fFbu6trTh4DcGDX/lPta2rq2J6fvpy6FvdNyW1b+Z/Bq0+uHpAClZN38liNJJSqFsWqT17/7qrH19+Jqk8KZ3+d4rO6ekP65/g+llbg9ZslS6VGdSd/O32itq4WwInTnr3f76m9vCWAs1s3ra07XOdp3bJ1bW2dfoGSki0RRy36eOHMxo2rysoAMDkEUFVWBlw4/pUJM3r1TQPwx4Ld/Q8vGvcwHls0rgMAVO6vHDXggQZN/Mox/TZs7OiSemFSUgMA1YfK09Iu8CZffLXx49QB97BwXOMzzmjYYOf/vhs77MHkZNy1eMtd2mUpvg4L/clHbpghGOHcu3HDrqEzNvVticMbJy774sAlfSWapM4S92NP0chpRQAUwavvxluCR6cOSPV7e7S4bebi2/jCJXngPx48I/P6C5KTkHrD3akzS3654bbWaJCUhNRUx5dHGySlAejc2XlZcpcm550HAF2cl606UJWUpLSEGjRpktavL18kn291ZpL/zyLMJIgQ8vByKGz00ahlQ6Bhu3lOACc3nExq5V0D8+j/Drf+nXLgieriw6g4vPm/OPuWK68caPRcJGu4mHIWf9n6wNubvwVwUZfBh5pfwYYl/fJTZavm3DiatPtuOrctgJT0a0t/qEaKmekspJ2I7jeKW/d9FADat2j93g73fU4ngE/ffRW3Pb7eCbjf6f+ue/31gTRKFT7519SpnwDoM3fOTf4m3bZTy2AKJmIRJofgFNHLv3MxpiBt/GNp3h/B3o/WwfmgeLqif+qVTPx6Dav3un0fd3/+X3T8S/2uzu29Rnxgn7tTu8rPl3z14Yc9lgBIv++ph0brJG7IsZREpp5D1SRMPvce3HXBxS0BoGXXP2D9XtQviqZZbCAJbi0H/J+5CpqZaiqlPQq37L8tqw0AtO3g/GDzxkk9mMR9+cLYmR3WPt4LHy9/4cttGDj4Bf5EzUzjqJBQfYQEEXLi3UAiANkgEVYiYINnhPsCBEEQBBHLxL1HGAwOR+j//JCXGReVDEeZcVFJIkji4inHRSXDUWZcVDIkkEdIEARB2BoSQoIgCMLWkBASBEEQtoaEkCAIgrA1JIQEQRCErSEhJAiCIGwNCSFBEARha2JxSAdBEARBRAzyCAmCIAhbQ0JIEARB2BoSQoIgCMLWkBASBEEQtoaEkCAIgrA1JIQEQRCErSEhJAiCIGwNCSFBEARha0gICYIgCFtDQkgQBEHYGrsJYXlBpmNisWQnR2ZBeUTr5lcD3YtHuZKxX0O/esTws7YtMf5cYv8XHvs19KtHDD9rDo+NcOe7ACCnSGd/UY7+vgjgzncplSvKAVz5bo2jolnJ2K+hQow/a9sS488l9n/hsV9DhRh/1n7YRQi9z8SVk+PSvfkxYIPcr7ooR/M3Hm0bjO0aejyeuHjWtiQOnkvs/8Jjv4YejycunrU/9gmNjijyeDybpnXTPaB851bX1iei56e7t5W4RgxJ9311dnOVbHOLB0W1krFfQy8x/6xtSsw/l9j/hcd+Db3E/LP2xy5CmJ6bm2VwiHtbSQlG+FpXSzA2ss+mfOdW1batO8UaRLOSsV9DRuw/a3sS+88l9n/hsV9DRuw/awG7CKEJshZ6PJtyfW2t9M7dS/Lm6HXzRo3Yr2Ts1xBxUkkbEhfPJfYrGfs1RKxVMjGF0C8dSTdpSY6zmyvEtRIQKpneubvqkO6d0zVO5Ah7JXliv4aBEheVjDPIBsNB7NcwUKJcycQUwvTcTfXdoAuNfHRG8UR/e3VvK3F1c4apgoC6kkK4X/P6Ea+kH7FfQ5PERSXjHLLBsBD7NTRJrFUysBybuMWdr5vF5L9LJx0rnJhJjI5uJWO/hvo1keyKZiVtSCw/l9j/hcd+DfVrItkVbRu0uxD63/+iHKWBEJ2n4s06Fq4fS5WM/RoqxPizti0x/lxi/xce+zVUiPFnXY/D4/EE5koSBEEQRAKQmH2EBEEQBGESEkKCIAjC1pAQEgRBELaGhJAgCIKwNSSEBEEQhK0hISQIgiBsDQkhQRAEYWtICAmCIAhbQ0JIEARB2BoSQoIgCMLWkBASBEEQtoaEkCAIgrA1JIQEQRCErSEhJAiCIGwNCSFBEARha0gICYIgCFtDQkgQBEHYGhJCgiAIwtaQEBIEQRC2hoSQIAiCsDUkhIlAeXl5tKtAELaGbDCuISGMd8oLMh1jV0e7FgRhX8gG4x4SQoIgCMLWkBDGNeUFmc68EpTkOR0Ti31bHF4yC8qVoxyZBQUTvdsnFqOY+wwAxRMdmQXFyqnerQRBGEE2mAiQEMY16bmb3PkuuPLdnoVZzCaXj3B7PB6Px+Mesdyp2CFK8rYN83g8nqIcFGY7Vg7zeDwed76r8AnfESV52dseYifmb80mOyQIU5ANJgIkhAlE8Zy8kpyHctPZt/TcJfnIm+MzppxhWQCQNSxH+ZzeuTtKtrl9BxQtzPKe+FAOCleSFRKEVcgG4xMSwsShfOdWoDDboeDMK8HWnay16ermVA7kP2tudHZzKScSBGEWssE4hYQwsXDle4MyPjb5GqcEQUQCssE4hIQwcfCPsliFP9O9rQTdO5P1EoQ1yAbjFBLCBCJrWr6rMFvpnC+eyGWtGVOYraSvZRe68qdlhaWOBJHIkA3GJySE8U76kBEuX+p2eu4mdz7ynKx7IntrvttCVCYnB9mBnEcQNodsMO5xeDyeaNeBiDrFEx3ZKPIspBYoQUQHssFoQh4hQRAEYWtICAmCIAhbQ6FRgiAIwtaQR0gQBEHYGhJCgiAIwtaQEBIEQRC2hoSQIAiCsDUkhARBEIStISEkCIIgbA0JIUEQBGFrSAgJgiAIW0NCSBAEQdgaEkKCIAjC1pAQEgRBELaGhJAgCIKwNSSEBEEQhK0hISQIgiBsDQkhQRAEYWtICAmCIAhbQ0JIEARB2BoSQoIgCMLWkBASBEEQtoaEkCAIgrA1JIQEQRCErSEhJAiCIGwNCSFBEARha0gICYIgCFtDQkgQBEHYGhJCgiAIwtaQEBIEQRC2hoSQIAiCsDUkhARBEIStISEkCIIgbA0JIUEQBGFrSAgJgiAIW0NCSBAEQdgaEkKCIAjC1pAQEgRBELaGhJAgCIKwNSSEBEEQhK0hISQIgiBsDQkhQRAEYWtICAmCIAhbQ0JIEARB2BoSQoIgCMLWkBASBEEQtoaEkCAIgrA1iSOE5cUFEzMnFps9vHiiw+Fw1B9v8fQ4xv8vZffBofOXi3fJXJlhRlXlqF69vLggM9PByMycWFwemWrEJGSDJiEbDOnVy4sn+kzQEagJehKDohwAQE6RucPd+S4Arnx3YKfHMeJfavCXizfKVJlhRrhcVK/u/cZjgx+RNmSDJiEbDOnV1TYYQD0SxyO0QvGcvBLANWJIerRrEuukDxnhAkry5tihnW6Z8oInCgEgp8jt8b2wUPhEgZ29QrOQDZqFbFBGefHKQsDbUHDn5wBA4UrrtyrEWh0NxBaBtz3gLsrPcXk3uXL49hQ7wdfEsna6923nyi8q8u5mO935ytcit1+9coqK8l0uCDsFLBQrVg6unPz6fcpFlTPhcnn3a/2l9Y0r7lL8zVJqproDumXW/zH5Lt9Wt+SJyOrs+3Nd9XXj2oPRvbqnKMflQn0D1HtlOzg1ImSDZINRubrmIwzAAhNWCNX+svIz0nbrTZ7uu9X++1wujUM1wma6D8lCsdoF6/01/LkSIxQuxVfSWzVli2kj1L6Sxh8kq7P8Pkb36jo/RIMgVkJCNij5a/hzyQZDe3X14/NvQ5glEYTQ41EZltCE8vsdqZpXlk53+zVx6h+431dWju/xeZs27vrv6gcVQLHe5qm7/rvsonrRfKPjNU4xuvn11fe9uNxu6ROR1sGtalO6/GsY3aur7oId/UEG2SDZYFSuLl4zECVMTCHUbNv5dmv9psyfLjjfghPgV476Qvo/Z/PFargdGrvrL2HQrW10vLTWOgdoBCisPRHpH2T0F0X26spWf8u3I2SDZINRuTpHwLFReybLBI+rmxMA4Oym/XjVR3Js3amXTWG+2O6dVUkG+sWGBMvFa/zlESSCVy+emJldWALAle/elEvJHxGCbNAY29igF5ZYFMCNSmghVLXOF2ZF8HQvJdvc4iYNA7KMxpMORbESQlF84Lc0FG+YsFy9vIBUUALZYCghG1RRPDEzM9PMOEs5iSmE3nZBSd6cgnIA5QWZ3ABMb0tP8lSlp1umMJsN8Swv9ibbB9dOyhqWA1Y5NnC0vHhidiEA5AwL5B1hmuBqHfgt9T4u39+r3MXYuHrxRGdeCQDkFJEK+kE2GHrIBtVXd3ZDSYkyaKl4zvISIIAWQ4IJYWE2u7fpuQ/lAEBhntPhcLB3lSt/WhYApHfuDmi2Ek2dHlCtnA6Hw5ntfWU+xN6Y3ukRMq2OOsua5h2vlu10OBwOp9cEiyy1lX1/qQnKd24FuJ+W9yesrre0zIBvqe9E4S6qiMbVy+tNsjDboWCLyVF0IRs0XSWyweCv7ttbkud0OBy+4Izl30miCGHWtKL6QT0oB7IWur2jvACWSKS02L3tOb45auV0q3CDY1w5+e7Agjs86bmb1GOYzJaq+kuNKF+9vATytq65MgO+pVkLNUcRRf/q3ltDMMgGyQajcfWshfXjL9lgz0B+J8b5NAkIu5HhTvAzzPTyuPNdMZ9tz/6KWK8lEW+QDZqHbDDsJIpHaA0W2ShZvjqqc2GVF8/JK4luWpch3uBfmPs+CPtBNmgWssEIYE8h9AaWo2uFxXOe2BrrKRYsJmOx74MgTEA2aA6ywUjg8Hg80a4DQRAEQUQNm3qEBEEQBMEgISQIgiBsDQkhQRAEYWtICAmCIAhbQ0JIEARB2BoSQoIgCMLWkBASBEEQtoaEkCAIgrA1JIQEQRCErSEhJAiCIGwNCSFBEARha0gICYIgCFtDQkgQBEHYGhJCgiAIwtaQEBIEQRC2hoSQIAiCsDUkhARBEIStISEkCIIgbA0JIUEQBGFrSAgJgiAIW0NCSBAEQdiaBtGugAUcDofeLo/HE8maEIQ9IRskEhJHvP98mWWuuHNCkOWcPHYsFNVRSqsJYWmW+HrrymcrAeD3vYbdeT6/59cPSj7cly5sFGnUNDngSzdq2nT4Ky9JDhAek/xaDZPFvYOfmc1/Xf/o4+ZPz5w2VTjgs/kLlM8NVNfqMe4O0MvdHMwGt7+z6lRtbcYtIwGUvbmM7aqrqeWPZHdVufN1tfV72QPin6lgROzpr56Sq3fAyWPHRi5fCmDZiNHqSqpNcszqlcrnl/sPkv2FKk788qul43kan31WYCeOX78WwGtDhkmOEWxq5PKlhkY3ZH6BclcFqxn8zGz+ifB7M6dN3TRnblKLFvzxDZOTMm4ZqTz9BklJyq6uNwx1r1nLH9ygSRMAaf36VmzYCKBR83OVXe0zMvbv3Mk+t3Y6df/a0BFPHqEE9v4NXg7jnprv3kGf14a0Bg68svqrr4dceolvz9dbv/wULa4I0AbNIn8EgkzyLzUzrJk+g//af9ZM/qtcF3nZY/SeMon/umXRYslXwiTsJSjIoQJ7Cr2nTFI/jk1z5tbV1LBnqvko2a9lyPwC6P9ymARK5JCHVxRFFK0qYsQYv36t1bqNXL7U8CbwKhg+ut4wdPs7q9TbFRXkaZ+RUVVWFu4qCSSIR8gbiYLwgIPx0oL0F0PrICpGq24bHti1cSEuezj1LODXD0q+xKV9r2FtuINfPVaTfsOvX+6/wLclIsh9PvbCUpCLqKGrKjx9QTUNvU/BZdw0Zy4A1333yi9KwN8j5Ldn3DJSaE+cqvEaAtPCOv/j63x7+8+auf7RxyVWM/iZ2Wumz1COZwjHs1aXnhLoFa5nXCekb4Cyb9cWVANAv98Nuv084+2WkDuCej9sRQUbNW2qd/yQ+QUSM+k/ayazAoWGPg9PacoIoZQe4+7gWz/MI1RUsEnz5vzBaf367i4tVb6e2aQJ+8CE8MzGjdlX8ggtIyif8GZUiDvHkY/hwCg20jGZOX1ntWmG/WxTzXePlZ890XXW/q3GhcuRX9oqwktKElY188gEk7YUR4VP+RSYLnpICIOg7M1lai1kfDZ/AfPIhdvOWP/o48w1FJ6pwprpM9SRUgFL3qGC8guXNDdFju9ejcte7t8SjsOvrtteNqBrhkd3uyKN6c7MB9obtO3MxEI1MeMLBoymQx8qouIOIsGEUEDPI4yXOKpJU/R1CqbeN+TSNvWbf93/s/fDB1/9coPr0tbw6aI/lszMUDWDUUrJE9HUSHlIRx5HVSO8kTVf0IRVtixazPoF1XLIPELW1aQ+kXmEzPPTLJl5hPJIKfzlEMEpIkMjPllzDGe1BABPy8vaVhyoRUYTne3gpbGyrINPMv1h+qd9rdAhD4oyp9xSgYI7KEdwB6NOgoRGNa1FiJwICP6iVV0MJlhqJlI6ZvVKPVGRRWl+2P5UbcoD7ZPhOPzqFzXX9OzU2gM4Dr+67ssN3iPOveXKXgObBFJtMyg2rIklmTSMhcojqzqn//jO20sK9wOXjlgz+EJ+h6YHefXDD5mvsG3hU0mFriAlWMp6DTUjpYqHoRkpVXoN5ZFSmOsKUVpUckW01JdxYNfGVWf2YJHPsm9LD6R47etAVekHSb38ticdfnXdocsGdM2o3f3UNtzJzBNo3LQpL7eW0mEEmFFI3mbsdEUFhewYtldRQWFvw6QkwR1UQqM9xt2xZdHipBZ+8V8+WQa+7Bj4ugbPTPJ7DTU655w2nTsrOTIsNNoqJSUyCpXIHqEceRw1uv6iRAUNaJFy+RebxrsBoN/vBrX2AMd3P/XJsSEDBt2Omg+/+AbdwqiCMGrDyh1Kq3+y8IzMZOJUf71md6/c1Sk4tP3t/O8vzLuAbf4u/5nlANB+4OJbe7UDGjVNZu9fDwmhadxr1p6qrdVLi1CSaDRdQ3mYFD45lHiH0JFDAeU3I+9BNMQXhmlx24C+lwL7amuAZDhqDvi3UVXbk9s121uwbi+AdGdma+4NH5JOB3WOqCYB+4JhDYryKhh5EsQjlDcYNTHjLyo/F8PCLTmI8tLUKjhm9Uq1wBhmkbEDTvzy6+QvNj/fs8/kLzYDeL5nH+EwttewzsphJo/XRJ44rvYm+T+wsX+fvxoTAz+qX1q+p9eI3pcCjY5uGb47dYWrI4AtJS992mnCPR2AvRvZRqWo7OfyjcokvDaoJMc7Bw9SvgrpM2x8RQCDKwCoc0oFO2IWrRcsDcZBBDBy+VK1VnlN9eBXYw62fa17a+DAKyW/ZrsubM12H/xqTOmu14YMAw6MWb352SHD7lu9El7N88tlM9nwZYc1apqs7gJUukIbqcxEsAtBBS2Nl1CrYFLLFgCUZyq6gFoeoeF4CYaSLNOyUyeEnwQRQoZeg1ETuRAyeDdR3tQKqxDKM9bkBDPgKeRYHUElD7TCvx2tK4TVn43cWA6g8wXp+Pmcyb+/qI2fEP5c/UuztmcDAH7Z+kDZOU+REFpEEEKedXMH5eCR7ZN6sK9MF5XBFYIQKpFS+HoQ+b18Tim02r68RSuWa7Ita6iI0tN//aDkw9ePAsrg3ZrvHlv3yw1D0vf7b9dN6raC+nfO66JcCNW+YPBCqDdwUONrkyb8eAlFCIU0UUaEhTAKodHiiY7sQnGjK9+9KTc94DKVrnVliyVR1IO3onhJsYkw31RuXnAYAK5y9hnVTNyY1vGy+84PPBRr6BFKYq31b7S2vZeN6A0Av3w789tmSj7RReecAwDwqSB+fvfjzSmX2uL5hsMGVXw2c/CDv81atR3Pd71/7wdPD1XeZ5IwKbixhnr5SkqwVGLjiuWaHCen/FoCSKsBzrrGNewafkPyhQ8PAYBL/Le3Tu3ccfWHY74BAKT0eS3ogUyWcmINb4Wggjx6OU1qNi4YmvNBlxkvPnN7W3GX5qjBGCHSQlg80ZG9Nd/tEQyuvCDT6dhW5FmYFVixrOXCP0X1yFyhTSc0heQOYqOmycpQRfZBKE1oiIV2nhpLBOkCnvjZyuk1+xacTJ3nPBv45a09u6o6tmzpt/Hkhj27v2rSrqtO4Y2bWXAQ1X9X47PPkgSHhVSa14YMw/GTntPH2YMr3bmj/fldfj14iO1t9PPWkRt/HJs1+q6zj508Fs3HFwHCZIMNmjQ5dfy479u+xXkP4sm1j3avBSYXfjJ9ffVQ4c3IBldAZ+4CpeNQr1Nq05y56sloeJhFr56Sqxks1bNf1tJVJqmBT2bkgXfT/TKt7xwy7E6jg0zO7sQcQbULKEczO0Zvb0POpWuYlKSegIl3Bxl9h4+/DED+0K47rnl5zeiKvOVp+XlX+/YKCTIQx0tUFo4ctCp77XtjU85o1BgRJMJCWLyy0JXvVjc703OX5C93rixemBWgFarg+9gZofIRlahLQnqH97p1B/HMc2YIWw6frO1zdjsAQOPW+OUQ0NK3cfuBspeQOq9jO/PlB9z1qImgkYrvOKbSt6ly5UfcAeEbdxVjRMQGS5c/mfqkuxdO1QLY8mHlVXep/AP4JJAlHKr3Kq4hdOSQt3FJrr+ZKWnUCD5iTP08AqiSoTsYshyZtkPvwfSKvFXbsWr04LFfZj/pBgA4Bw8yMV4iJWfyyIfHD2rz5GVPlhTfnWb2msGTOFmj6qkp62pq1D4ifDYjdxDVRSmf+aiL8tWSgyi0woKcd8aSC6h2+ARlUqudaWoP1aFrQxw6UbP5UBnaZ8zDvnv3nPgrcxNNlM/SeSQEUTdFZY+v2/Hl20ldXu7eEQCO7x7/ybcA0PYyDQ+SsEJav74AWOxr/SeVD495oEETAPg4/5Ezxqy9gOst2rhgKN9xqOcasi5DXg7FiU6Sk5WNcu8QqsmnTDqI8LV3hZxkQYSCmaHXEiZHRwiESQXVAwdZp+CAUQNeWF42Li+tC4b+ecCnzsFvAFvVQdEzGzdWj5dAgzN7zfq4aBwKb2zT4vMxy6rnjJDUO3REOlnGG5YR+yLKCzKdeQikj4J11GvGr/WinYoimvcRJYFTZlrBpNJoTgfMv4jlyTKBCaGif1bVZfuBspd+BtBigrNdqx+/W9fowpuTAZzcsOdwq47tugKHf/xuKTr++dxGwMkNe/agzYX9Glq6gi4SbxIWHUolbefA8ZrWTZLxw/bx/9urDLJUxnXFeyqZJmGywd2lpadrjzM5fLh7dzz4wp3t8d0bEwdW3urO682OPFW7adYNj2DWqkfxfNdlHVc/MohPhBB6DU/5G51k9L33AP+0UkkqDYJOC+ebTRFwFvk4rTwWKp9TG1qhUV4F5QMH+dAo8+MbJvPpMPvffCz3yW3eL5dld+syYOHfrgB0Bg526tWLzxT1Zcfs+s86/GFA6hmNGqOi8FrXw59FxAajkDVaXpDpzCsRNgbcUc+MULPNImSdiXulM/waGoamXenJYawJ4b3uMpP6d+Loz7LdJ3948XSzu5MaADUrfjzV79xmLfw2ntr0488tzz3vIvP1C4IZhyv5r/I/0GT35KTPxR9qYhAOG2RCyLak9es7CngDQPaTigoC+xb9eex3I1c92gMANi6YXjHcL6VCWLxCnlMKnQH40AmWBj/WQg/zYzACwNAFFFAPlpA39+VCKGSKCsPnAfiNoN/y/OiDo5cPbwegckXuwBe24fo5FdOu1BwvAdWQCSFrtMFZXgs997xAJ2m1QoIMnwhMCNkHM2YjOZ0/fvgrL2n+ZK0KIfy1MLRCaF4FAZw4+vOMw5WzW6bo7D+16ceq904BQO9mKcMbAad/fvHoMTQ4WXkKAFKatq88VjW7ZQpfCPssKVZ6RV0aN2/Gfw2J+5ioQhha1EIInxPApc8ApfnODb18EdEts+7fexeXSgr/aWj0Blcw5HN2M8wMOmSo5dBqbwUzcCG6zghAHQV3k61uZmZdlxV3TlAPlmiYnMxmquPnq1O2wP/Vpwghc76tCmHX0n5cuwdV7/7lXjy05blbLA0c/P/2zjw+iiLt478oNyoCATlzsJmoSFSEsBA2CihogrDgEQRBDhHkWBNRQBZBDhExgokoCLIIolyiKAjxBVbAGECjgAZRk0gOEhIgCSIa7p33oXJPAAAgAElEQVT3j5qp1FR3V3fPlZlMff/IZ6anp6cyPdW/fp56DttnXXcdgMZNm3pHofxJCAVNQQmcHBoUQgIbVmMkPV+r8r3qT9Y5IYR9pcqNQjjh+/2mfKE6FqEvwQmhGLFMwq6UUgg5BHOQE0IA4XfH2pILM1Ms0/FYfF54/1eJCZi+pP+urjbTkMJm3ws6VxCUq4aq6xfU3BF7SmEmaViJYIKrqqMYxQKkibhQKoRaRdQ4TCUO6gghkLGs/2hU+QBq1Tv87/HH1x15UwqhxyEz8+DKVVcqK2mHOVcMRBhIvYBrq4bGdVG15ASni8aF0IgKuqJ8F8oqnH6vE9QLdpvPRCmiRCn9fXZ4BzIHi7Oyrl64wL0UEh0NWwRN8XvjX776/BsjWqFgcyJZOKxSvpItQ57+uk/q7KE3Vb1XkFxBoFNe7ClVxdQKou7bqxHVRUEwgxfkS+g2WuLyJciKoDiDnjhFO45bvXFgq7o/Lw1J/IQGi2o1WrId/HqHOXhNndqNmzY9U17uHddozYkaBaN/YkXUhYZlm62/Ttg2MdFdCfhr+g5wvu6of5KDc+QWuhOuf1Btexs0fBLXeHoYrkSoSijEFCBu0pFLhk+7u7cF7MLhwZf+OWsj2fX+0S87vpcmV0BbDgWdfsVkfp/ZulM0n9xjRxxi6ssYb7Tr3PVNmTjIETowNWcgCjYnWvocBaBMmWgdxc2sguWDes88ZHsy/MPSRb0AIO+dBwDsBB41O0Sn8LJFqFrRgjLGiWxecjeqXFEgkFkEu8nIvmTEQOQyLlh0PS0EJ2JKPRc743aL0AMm4OX/4JoncS1w9XNcuhn1LVXbMRC1m/DbncSgNfnC6XzXPscH8dQcJHDN5KiNyJiGth3fG//YnCN9V+xIuufEJwkjCifsSOquKExKHwvyKwjKdEN2ghf98vOVkNDW5EnF/gmp28Pj4vPStiPu2be7NoGehadbztubBqIgVUM3NIa+XdBfAob77kJhEbKtd5WNlq6tV49Nn69zww0AsHtafN7Y7aPCrqlTF8h/p1/X6Zjz3dYxnVu2OFNeDm8Fy3jZIoxbZrUOGBsUD+cLWJiCzhyunq9BqP7pJu1qwd5aOm0dussuJKW3vW/rzMY51e0v4XrFtisAcZhcezOs5YBd8K65CZfKUbsJ/ncStWLUDq52NIkST81BcoHTaqxKrokh0dFUC3tNX3917mNvb47J27s3flXqPcAV7YOTO12BdSjMvi8rOv3Tyv+s+AmdF8yOPf5JVs/EuY80AboGv77i1+Ku3Vrr/Wts70P4pIFoqlyA2Bb0aIsJVTJz8oAwAEDY01tL71/+4Ljlfbw5AFSLazRuWU5Kd0v3VPcWNtSBXUR04jQbrGGhBZuT65wcuksLF1miTEWNuguDKlUB603qbs+gYFxZi3MA2qAhe4tIj8zJrdRFAZ6bg8VZWYIm43lfpduD6VuHtsaIlJ09NyfedzR8hZaP0hFxJRpoZt8Hd419pFOneADI+WzqTT33kB9QztHPb2r/PPN2I/5SmC9S41HMDsbpFR81St+fmjj/F/L4lmnvvDamMQAUfDSux+J2Ro/Rc/76HaHNpq0qX/gA2RA+ZlL7fju83LS3hgTLqLqtVZ2l0LAOXQmlgWFPKdSsQ93KlvTgbCgpxZSn1L15hEZco7NxTqxJ9sW/a+9Hg0hUbka9J3EN8L8DuAA06AoAqNDYLv5c8Q5GlHKW1W+CZqsRMgdLs7OvXrxItlAt5MJnSFgpTSy7kv6q5cOQXSltdm9uM2JgqyvCOch5SsX5FdAoRnPg48WF9/wrIRiXKyu/2Toj/Za5zxOfg6O/9I0onUrxJgzEs4cmrfnqV+DmLoNevY2JBzl35IVN+1W2m6lTo9tNQnk0TggNJg5CtQH94XefODuMJA6SGuvr+yXnTe4K7Qx69g7J5hoFABxb+dDfZ38fPfvAF2PC8OXkpo+vOXv2LHnphhtMRIM7TY0KljEIuwhPMGUjclVMzd5e0VAaJ0xDIoGum4bELoRvhIRYcP1LVc+CikDuzKxlqB2j8RYj6OqctCA9B7ELoRYrAbtdCCBnx86caAAYMZDfR6vBL4FUZRMElIIpvcZoYVlhacsQUvGvYv/7J+P/3Y9sr9jk6C89EXWHro3KGYhQV8TfP9tZkTDyqbuAg/u2bD3Xv19Vq5MzKtuL0gcWhm3rrVOCwjknrdMOLQGHCooA8lV1mbtj59Nbn334o7YfP6rrbOZpN+qT8qfr5i1/sGnL7zB0LbDGjYM0Qg2xCAnczLnCh1Nr3m/qriAq7UUnylhwaBXvNmIg0hLSLiZXkPKeAjl0S+wMkRyx0hDDkRUne9To5f/gyt2o8ysqv7e90uAlXMu+y/gItT4XGhakv88O70Dm4OmCAmoRUlpERrJGAGcgchE0VxxfJQ1+6aRW2otsGRpoVKKBo2lYlL54LgYviz29YPKu8Kn/SiCi+Mum7j9Y9vSzAEDOZz1+ab+nnwUV+yeknnpi9j//DkAvHEbTA3T20HMHmyzsGQqg5IeNm25M+Feo9vazh55b8xVihy+840b1o6k5QsVpgjAWHUMgq4NsyD3puwu7CU5CY9h7lIxl/Udvr2pFySUOshYhV1ANwLV16zYLDT1dUED+0lIyJGvimlo2I807FmENEUJyYm79Z39ozxyBEILJSSLoOk5N5eOLU5o4Z6lxTymYpgpaZWh0swxJrRnyWKmIbgwiNSKHvoZ0jRpBIIRXL15klwx1PKWOr5L5Sye1luNU3OaXQuWwKH3xoC0tFyY/0hUAyorKgov2Ls77+5OPNAEAm78Un/XY2/zD0cHrXnr/885P7OlnMSWEJT9sHJ1eAuCB2zp8gYhtSiEs+G/fY9z2gsWbKh6Jrnj9906cELKZ/koT0IgQiquJ0u/HbAN6KBIHa/2w+OHCIbSUjEEhtB2qWoWwhrhGa9Wvf+X8eU4OlaeNhZs2tRo0YD0tnI1YW3go6LVCFMMlLZlymW5IGEKmKF0+VG1gK4bWGyMGovHq1ZxMinMS5qPJhbIK1vDyL1GUOIc4fIalVj2VlTlibVj69FZ6Sok0arX55UL/HcNKp9hubct+nrvg0yPotvDhBrUBlKWvKRsw444GqPznHgsAPD/7Cbx09Jt+lr8LO8Zw6hLSbcQOMoeOfVF4xtYKuriiBIzA3dKkEbP998825XZ75F78sDHsRt4c1F0FZFGuLxqJjtHKlzCCQ+Jgv+S8ya3DF9teulbthPomGkKoWpTXqRwj76NqHZpFtxeaAOdCTLklB7MriHT5EC60ECISaFYOTcGKn1ylE+Fvc7BZaCh3y08xEkoKhyxDnpwdO1W1kCJu80uh89q2cBgcuyw5tih98dz0sq6xpxcsOHzv1H+1AS5XffDRzzs7RJaao3FT5FYALYHfi8s7dOtp335jExw7C9xItgM70DuhM1Di9Ae5gDhfQpBBf+s/+1OnKJHDWvXqqbahVz37rDlIIeaguX/AHai6RnNTu1uSOvjsjHOAuGVyduxU9ZwQOYSaa0XXU0oeaBWpMVjPyUjLJ6363XSLeBFRNQGffSpo4w5t36myO6CLjlMY850K8L5SVp9r1P/mIFns4bSQdZa2joriYmeUtUnZa6jSU8pF0KjOaK3kCnFMqaO/FJcrizateOOt40DnJ2xrh44YzqA/s/nDd5YWAwBuG7CtZyjOHnpuTcXgiZ2KN61eXkq3N/qMPgUe6Jf4L+2a88YtQtV7ceONlgDUblBfq6AaORd8iTVHIaTFRVVrqrWIjGSFkBYXJULoC2uEaWODXm7v1TQ/56FCqHyJnSdKA1Ecq62USbZIDdSapQmPVslGmZpdeOeCxLi361YuFUTWwEz2BZVGaiwq2/zyb3dfzW7OraqLW1Sz+oTQ/+Yguag1Cw2lj+EohABaREaCqT6jXDJkTUPxkqFyGGzzCgjL0FCoy6dq/palj13w6RGEJdJQGgAuN6sxxpnNH25F/BMDG+vvqgUNjYF9kGLhFORLQJEyQWWP3pFwQsi1oSeuUWoOskLYIjKyvKSUfS8tLmp76gNrhJb2MfuO5gD+MAkNwvpLCeKKeUq4IjVwKukCTrUFVgZqm3KcUv0TK6Iu3FIixWs5GKa0zZRqmj245/HXOUjlUOn1gl71GTjWJlXdgU5ksZsUaquGSnhPKXDg58MAAHuWhQIXa2sIaTzw8SdcP4rxlHllf4mARSNq1H/uR8ndqOq0Ub2jpLCiKIhJI4gLmUJPFFXtxe6Tn6OPxZ0uFIOpFASSGbEX2dYwYlE0Yi8qnagUbqFR14J02NmLHaC0zM3qjKn2tzlYXlL6v0tV9h/RQs4iZDPuoZFlSFDUJtVJroBGfoVucgWBiwa4fP7ggskrtoQN2DAhto3a8MS1iKur9KhBXyh5oLo0KM6gV1qEusVF4ZpF2KhRo2ppw+T+gryexmkhZKGiqGUmihcU4SiKMF+2hs2+gJ6xqNoyhsN4MoZqvzR39QQ2stCoeXDHnsBGuvXSJvXsnoI+wHSj1uJldbhG/XUOckIItfAZTheVq4YOO5+/wJqGVxQ9nrhVQ9UJTtykcNpTqoFW9pRq70OPQoVQyxB0TgjJUiu3Rhj12KCfP9vCfudKISR3MAAKMzOpEMIeMEV/D1QIm7ZsQR74lBD6NOLGvEotNC6E9FU6beAoirpCqHqDSdCdV8pgGVLtnsLpopFGa2ysjbhHtqAtsBIu7sZUT2A45iwq4TTSyxah6naZR8ghmINKIYRCC3kD8cKFkOhoLS0UZxmCWTUk12XxBOc8papCSGA9pVq4EhznXkiaILT9tOL+EhxKIXR4VZFQX1MtQoKaUyY3tbvl6Iu+ejdK70QEEdjKieTwqmIWCSJOleiWrYG2+1T39lPLiUow1XobJntCcXDmo6mqp0o4HRW4WAmuOFr5jzamstXXhsn/5qCqEMJxvVDpKdVNt4ddCwXz19KntzJuXBlTKqjWbaROqQDlpDPewU0XQelRpQTq5tfrhomSB2wpGUqt+vXJV121xZ4pqFpclOu7RIWwRWRkaXa2shOvw1PvCqHhhPqco4qUJt+CLrOzT12B3vUQRTQbXEOhrRAFlWvEKLP1WXTvPdlFRNoxmOJc3A1By3CkiDM3OHQzF3WVksUXyqi6GZ+fg6rQGlqqrxpPtxegm2VIOLhylbjNL4XWKYUZOWRxvYObFlwRK7NvN9JlSbf7bs3D0SL0v+WJKouQ265rIHLo2otscA306pqKoZ3VKAadNra3O34Way8STIXecG5YDlMyqbQmxRakGG/al1rG5bPZP5oagxvw2zl4prz8f5cucy9RG9GJ2Bkuy1CJ2dqkFGVAqdhTCpNyKDAQCaYEzNR7TSVLwEziIBwz6G07CC1CrXYT5MdwTR2HtML/vtAiYTV5GP3Kd19MsPima9RX0RJCMGlJFE84TinG76EESYqquBh6AzPp/BzKSByBNDoXmMPCKqWLQqiLWCmJQVkNQmjD/+YgAG7VB4wQwnzsjFkh9NCSIcHIwiFFPKeg5tcRYEo1BUJIGnFw1SINJg4SPCSEuya3GPQBRmwof+M+24ZnH8hN3DWxXXULoT8hEEIlNKIJJn2nYpkkkBtSVYyZj6UfzExckA3cNy1r9J3sC2wID4zFv1GIaiqtRop4mikNSrEFKe4Lo2GeHl/63hc7gMiO/bIPbRW8ncNz9uXFc38SmfT32eEdqEXYuGlTTgt140hZDC4ZUsRCyO+stmQIDTepVkwpk19hygPkwSBSI4uCMBAdQ3BOCGlAkzNC+OXkpmlx5cm9mDXCvKUPLI7c9Wbv6l8j9Lc6hwZh9dIpUfx2Rp/p6wHEz8tJ6sK9xv5ExDmLqodOX5F47KENWXeiMG3GnMN3zmSk8ODKSfNGHbpn5fB/ANBL1VBFcTP784LJK7YA6DrarNOGNS6ZGV6w+K1Pv9DI5aCoWZN/bP38UJtHntp8Pb7du/lE3JD46wGUvLvxeHRClzuB0pwdb6PbXItKtruWfelis0aCh0qtmqCGzkHj5K8bdfcidu2ww8x1S0fqtbrj4vsF6Pa75yAtivwxA93gsFVa7zIoVdAt5OX+PDwu2WHLO+P+3f75s27/JCGqQpibOjxpX02fcaz4cR5U5Q6EvSnTMW9nTjT2pvSekblzbpWSnliVNHzeUaD9uF0pDymT3dhpyflU7b+8w7sLh48YDQAhLUNySkpxZwv7LqVrX1n0ccQQWnOCm7dityrUljcOfLwrfOrCjGAc+Pi53UMdmnSLnTYaLtbfP9v0TciwxG2N8N3u1P3tNCslqliE5woz0C7xegBo0Qgfl56Lv/56oOVTCS3F/xS0BU83hIdgKpDH6/jlHCwvKaVpYaqUZmeTiEGtHWjsTP4Hw57FnMLMqnT2q7lrHl57YOTkrrrDMK6FZqHt+pyLoJEoCR8zCS1bNGW2RM/77syicC8PQ1UIc47ui0lZ7U8zULXfx1WhP5O14pWeVXZ9Me+r9Fr16gEH/lv4zNMv1KsF3Nuz/5LC8lr1bHene5KHHxuZnvd3FHw0btLWe8QNmpV3VVfOn0fJ6dzw8HbEEVH32qDa9exOiZL3py6t/fjojgfaRDZtUrU/A3cTp1slFfhxX1nMEzc3rQ/07NZz1fGrDZo2B06tX/XL/bOWvBeMoj2vv4Qn/tOjOYSBORnJC+0W4ZkTtTsOjgju+9KMPUM7byy/pmEz9X5MtRvYhPDE9++P+C8pRYz2dyaMf+/dHVOmNbyudnb61uu6M87Vs4eWHmrx+MR219njXTePfIr8BVBHo+EUeZUuWA7auHZDwhDyl91NGcgzbNunRFydaGXlbvxvDhI4LeQCIgg0jF7ZvxB2LVzz6KPPTHEs6lKUfxBt2Q2qbZsIunGkNE9AtW2FshsRdZaq9qURe0p1vZdi36nu21nIQiD7FI5OI+W/RmxiahmrhozSGwuSPsElUeh61MjNjUbwcK9FJaWL7OkTjZs23fG0t1UQgVNr1An4s1t8/NfwtmqmzoEdec+MnQwAoY8u/djlzy0srvqtpC95A0mvPVHy9hdtowVvEcN7fk6V5rRu0Vax2z+GP98mGADaNG+V9cNpoLnyUOo3whVleTcFtwb2zJ5bfKAq4lEQs9Oq0xM7OgEAjn3RJ7dq+wP9qlSw5IeNo9Obzp54b2f7FupZ5TJAuFc5iP4pqwqwW2hpcs6aHKp6RG/gx3NQbBeSbAowhblV6dUTrefvK5wWAwD75ockfgL0f+8rfXOQYtwuJE19jftI4VqbNo/CqaAyOkYJ91+Lg/6I/pn1kZKVQvEZJ1RLDyZoCGFE34SYpJdTJ8f5RcyaJqbaQnLmI7fqCwD1agXVrkO255fkBdWua9unqCT7yJs97n4TAPDQ6sxpPZm305VIwU1TrXr1UNkgqE5DUqbhxMla/Ya0r9cYBR+N233fu6+0x28/HEeVjVi1gq0VniOY/FfOn0f92tfUrkvuiAsrim+JuLV+MICmFlJl+OT2YUtOTU29u34wANSyt7Yhb+fmjG2Onfzjp7rhDZo2BVC/Ye3I5pYGTQG1CwSbSclwqM9hAJjYtm3EQ8ENmwCo2LTijd0dnt0zu8qypNakVgSsqSgezklbp2FDVkd1w189j//NQdouwPa0Tm0AyoQKMFqoBTEKC1OvhkQnAsBDqYWZKiddN6yU1UIu7kMZsMZaRQbRkkNToTQwafPpHEpYQU3to+ujmhMH89/p1/XTfgd2TFRpd+U1VIUwLTlpH7DPEpTkuN3fliw8Rl4++g2z+20K879/KJXcuuavG7VsH3rGVO1JnK7KRA7+gF+tfzDvsX9/k/4KkkdieB7xrca82GdtbPhkssvwGW3YVUlAu/mUMrWD4877bJeVgmK0u4sZbdqMvqtDlqyfy41V2XlDwdddMmyPJs3S/Fw1g7Js49vzU/MB4K3jx5E64y36yvE3eqQ57CouHSAOWBVXZPU9/HsOkghSwd29avNCFpsWGosGF2BqvdAJLQQjh75jGnpxMMXvjX9szhHbk06TNm8erFqlXEDY01tLn9Z47exZLwXNqAph3DKrdZl3Pt+PaBPbL2fgtH2Z8zF/OEYX0tMdEtbJ/jAvPwsad7piN7pNJifHrgOALeGOSQTT27fHlNQRrYyOVMciRGnUY4lRu+ybdg1awOyQtV4UNaqRuXFq/cJZi/IAAN0nLJo1fpHG29WEMDhhwsIEAAZqqLqSuaFqEaq6WAniAq2eJ8DnYOG7w/pW9xjMQeNoql0Ozaqg0+bg3pTeo7d3mLku3XbjjuLVE9bsHjytpxPH4sh7p3fn6d+O2HQ21UsRbTUkj9DFEk3G+XJO1DAsKZ4Zi8IP+vc9lpQ1sxcK3x3WN3dM1oLQD/pPx5trhobpHUQcxaOEzfRQ4lxC5N6U3qMxLyepC058kjCiMH5c3rylR4H2wFHB212ppwNFQiSHE62sWLhcSVOdcbQKtPr77PAOZA6ePXv2f1eusNvNphUqY2cEaYVQuEYFRfaVRqHWT5eogtki+yymUu9dh1sC1FVBcSkZfmfHKtsO7uXMFEtGTN4Ld7P7f5UyPm/YylF2I8FUZRmu1mj+8riO074Fulit3wj+HXehWWuUy2KKSXFXlYvc1O6WpA7brcviHD7DP1w+6DUzyxbsGDJ0i+0Uhzy1JuvLOVGtc6ZmGFBBJxA7iMQyqYQ4VO9J2plDnrd6aOMOFJw4MWJgK3seSPvpq2wGqCAhUhXxraXY6eREHggLp3y6xTtccbR6BzkHYa++Zidq1uaq66wnIEGkZr2jLMQ0rJb8Cic8oq6sDnYMdTgTe5JjR9ZOLXTp7Ox6tumgVQCALvMPnT3bzpVjmUJdCO0TJcM+LdLGBlm6w/V5yM3Aoy9arXH2F4LGwr3zkO36oUuLyEhXPqs0O1szeUqBeGCqMeUCxNaw8j5a174czTzlItQ561NZcEdQXgdCny30RFRcoBWKW2PdunQCC9Kb/eS0qBlz0BXyPxgG5ud99cIFFK0buGbfqGkxwvfZqKUXLamFu7TQuTI0TmOwdowYE19adMzN04eHL63aMDg5vbCHKD6RvbJdvXiRT63Je6dP5+zJ5eVvAFDEXnkarVqj8eDuDtW2maeqgiLfUsbZFjMC1yjRG4MKJ1i3N4KLOirGFceve92wEDYNJ3A5RvSpWCNhQAi5LR4t0Ersxd4LXhG8y5P43xxUukah8I5yrtGrFy+y+fXcLeCXc+Zg5sxhdu/o1QsXsG9+yN57Cu1CKHaNcnBphWKvvm42hW5tUjDK5EYh5NIEoVFBjWu0RP8XZVU5OonI7FMVQq3IWyhulMUl1ky2YSpc0rvjtG+9tDzhVdVls6MiIjsIV6NUEDfmVZpZRJxcVDiDH2ckRcZpxLHmSth/2ZRZDAOi6+iq4inMzOTqJlPh1F3LFAfWQmFQioXTVIHW2vXrc+HvxF60VpsQeg4PzkEX4X6rvXqi9Rz7byZ9Tsj4j4CHVmcaMgd9AU+UZFP1uCo/hXtKf/yq0l5diROK7pVfTmo5ZHXnOd9tHRMOXFOr3fidZ8fD/UXdVFGPGp2cEmOJHzug6t4wbWz88piUHJedJhGJL44Jig/CduuyuMkpL1vGppHPyE0dngS946veGqjOTI9KoPfhVFbXd2rcPHXiK2KV0pTfVVcIxVm6XFqIkeZz7FOzBVqru4aW389Bgm7RNRGxM4sxp/VHaB0VhUeXFGZOceYgEm3ExUWNsCc5diSS8zTq3mk1mySV9hTGQ69/ze4MYFzLFu0/LH3zQbLRS1Gj6hZhRGJGDrpbmN+32xbq45ZZrQPG0qkTH7Tcdnhrhpsyh8XFDAMB4/++WY+urr0oaCmna/DplqsQlGyFyTgdpVu12qPeOfx6DrqN2JnARwDw0fiQj8gmj8fLuBEvBM5Ub/5ij8npeYA7sgkBIDzi1tVpEeUlpbsmt2j0eJf5h3aO/y0RD7/nvvFqoukajUjMsHoqbs4Xc6TMuhBNoVpx0TtHU/gfHDDr0dV10vIN55glBKWIcgal0ppkjUhl2I5qX1aKOFxeWaDViZ4enibQ5qDS1cHEy6RPGZI7duXgMDPxMk7jRFq9KkSl3BsswwaF+UIW/57k2JFbbdmE19avBxStHOVsNmGvuOFv5Oah133JpWdSi5Y+0KgR5lkfdvuQVfDyGqHEv9G1NTkT01SYj9KaNN5XGQrlc8VkvFJZSZKjrRPGiUYs8TDHjlmAwwCA2D6WpV8WDR5VzSOSOPJN8kgk5znUgG0TbsnJK0JPoU1Ymp2tVoO7V/wtQxZ/OWZRLwDh474o99r0qzlCSG8ni7OyWkRGFmdl+Y6R17RlC/2dqglT6zfcf600N7lfttiCFPcrv7ZePW49kjMZOeHkTEalo1VsMrLUblC/+kov1ijEC4S6qxjDPvqo09RtAFD4wZufWJ6Ztm9a9M5+m1ca+WhxQj0HG5PsRnPQ9YMo8WgyBuc4MZJNcVeYQwH/3fOjh8NQNiEps8ddMe5LLr3P0EjdjIYQpo0Nil+u2OqTCbdqkEXa6lopVMqeWGy4uGEv07hpU/2d7JiNehCH+ShXKMUWJKd8qoE5AquR65xs1mT0Nn4+B93Fm5jeOuow7pz6Vea0MKCnn0SNesdpmZG80JUPOrhylZGEelG91r/H3jz5sfDFVRseT80sZE6RVrwMQVULqwX1otskPs1NZSyqB2IXelkLiQQ6GSNXTZgarVLjXfkRKy1CLjfDlC6SwBzqTTUVekNuhNmMi+oWxZowB91C2NA1xUMB8xmxFFNNel03B71ccdQTSRpm6PrKV+k0x+ja+genRUeH2J8OXZK1IFZHC30ELddoTELfQJ+BLLqOUE4CPWrkadVcaNSoES3WTh43atQIAPtAcFhxuwCCcgctg1JdX/Pzj4WFCeomcdLImowGJxJVR0InQaoAACAASURBVNZeNFiOVRmVah2UYOSNniHQ5yDpPkH1T7fpkipUBY3UxRWooJEMejDRMSQVNSN5IUlIZR8I3q7Ml3cdbuRcoRlSRsegUSi+udyTHDuSdAuImvTVysFhKFr51JwvY2f20tif+IfIYqHSYvGyn0wrj/BlS3Jaop/7YEi2CjyfUOh8ppRbYXWOPKZbjHQzca4lJvsutvmcwjjOf6df1+nfdXp57ydjw4wenD1xZsNwWPGjZqLxAuXGbQjPUEPmoB/hoi2oNASJpFFhM6JwzqmgTzS++CZ5JJILM3sAwL75A9cVbR7c5m+WnN8K0SukmteqjKCRRxjZAUm29CIG312fuHrhgrIN79WLF8nl0qNy6LoKermqnhs/nSupxd7EOcrqrmebvh65YV508tUHIute49RnqRqLBs+p0kw01bKjWvC7OahE2X2CRdyP0EgzQkG7Cdhteq0bGi46BoqwYfFHsxARIhrmnbKiLOQT6afXrn9u/cJZi1pN+HbwbYbeXnkezLdB+vSq8vNnW7jqiWBPwaWrHds0t1ntl658n5N7dc97wz5qt3rKhasXAKAwM5PEMNL30mBG1fx61ZbOnsNwrVFfhaQFF2Zm6vajF9+SiENMBa5RVSE0ZddXrxC6grK2pIhdkxpvvb882cFTwn574pRH1Xo61Ewszc7mdhAvKXGOU60ylRG9qyWEDf44B021YSIhEvwpsz8lS0rcGaSu0fC7Y8l9jJYQqkogJ5Pk0q+UQNvOxkqJkgduzxR0nrL0pxf82HvW84+dWtvlhztUtVC1Bjf9Hjgh5KJGa9Wvr9RCO9/O6DM9KDl9bOG4Hosxc93Ska350qPX1qvHLhZyl1xOC+klt0mLmzT+W3eiuUbY3uKFT3cnygsfJ400rcL2quNp4GP36+rkCdDz5FIRKT9HV8LZK2Ne7tER/RZdU4d59dJl8u0BKC8pFedmKO9Url68SO9sdA1E7ufBWhtEFHWLiXsd/5uDLGTJWfW+XhwoKC5mq1ufyOCiICeBusrHSh232qerguKO07rUNto+omzjhsO9Z015LBgIvmNg2qki3KbMYlBdMqQlubnFQuV3SOxCepPBKGWXuTt2fr04dlLY+ryvWmsNURA4QyJI4eG6zVpodKjf/mnQ8NS+NS5kjZwG8tiNnlLf1EISIGMKI0uJTpObjcj7VbaT743Gozr3NZKz6ZwPvDAzkyTv+5K/tMbOQTHi8ELdc2QwQNSJLkts067qrkOrTlH6uv/ePnhlMADg6A+bW90h6rephuvZFD0mp/fQ+xSxFkLvPslDaKZPALAEJTlu96f1CS3oCXDvwqEPaqHBYFGKE8Jphl3bV7ePX6T5Mv3qXPkaqRw6cVrzvkr3JS307zkoiEAWXOZcUUFSLUFXBUmGjJEe9BR2CdCXKTrVcuTDRAZPrU87MWn4ECcOYjCI1EV8MHZGdY3QnyDrE3lfpXP+aCWqi4h07onXCHWL1BC3ntZFvHqXDI3LIZuA4RaqXKN57/QZh2VfPB0u2NnuRlP9GpXeaUEXDm5ZXonu+hMhLPYfgoNICGQOso5QegaVDQgFT7kAGa5iu3Jpil0U/PmzLWJfKJFAg75Q2ocLxiTQkPOzYv+E1O0/AUDbiYljHmkC5HzW44PvyIu3xT37dtcm+gdRYHeclm18ex0G/SshGAc+fu695tOWxQbbdhBWh9FaMiRflGDJkHzn/CKiMFDDYLdC2K0UcsMUHBICz1NDhBCK9GolWtE0us5StY4hNujtbbPQUM7FB0VaIXebrLxrJls4IXSXOBk0+DwlhEZ2dp8QQk8LtYQQjloohdAInBCypy83+9d2YWF0T0F0DLRbl5B1QS0hpG66W//Zn5gy1KYhD1gJpJd4IoRdJo7/dtasouDmdC2NhsCw+qeb3ucghErBAwB8s3VG+i1zn7cAFfsnZAS/3a/pphWb8NCYR5oAFfsnfIJ/j+6mubamDbOCWLbx7fmp+ej/5MKptzA72Dv3Qi2/Qqt/PfmixLEzysxCTgi520pTsTPX1q1Lrq5SCHkEbc9yduwkvhHB986h1EV2lV7XbNeNMhUsermYK+qzUabmgki1I6TJlVQcRArPWISQQihEMAeJEDrexOQvfbDri98PWV8w/14AGkLYmu1Bz3DxzO9kUmvlcXPuUK24UFb5HPlp/sS3N4e3i8o7ltV1dMbDt2r9azAT8PLN1hl7w6YltQPOZCZlNknp8zcAwJnNH25F/BMDGwP4LeXDioTHo1vR9xz7ok+uZYdtTxt9XptPHuyZPdfgR0MvsoaYuYJ0Q1YXSTyRkfbXarEzAFCrXj12NimFENo+OfK0WWhojexQ7xLipqDk62aDynRtRA720un6CiK76MVtkWjhjzXqAgqTjXnDej/YKftBy8LQh3I1CikI1gW1I/WNrghCoye7jbJTud1Jvt2pD19ftbHs1oRg3ePZ6PHSDPrYUagqjp9sG9oRANC4SdjpihP4WysAaNymGYpUj3UmM2kT5k35G7d5x5Rpys/S+FCjZCQvrF2/vsHse2IRipcMqS2udS7I0ju0M3d1i5GKB+ku/EkIBdCbQXbmuJI9zWbiQ00Rjadb0HOp6jU1AmdBmjW8HA5l0pp05bNUjqadJOtGCSTBMqbSCiVuQenTtl6JiOjx+GvZbSdHhsZN3/nZYw61agVF1JSLgtyKIBxNwPQVg8bvAgDcM+ng8NuhMAFVkhzOX7YWF+edb9cG1w/8R/CEH4sGaq/SXfqrkppoYFSKvMTsWK9l0/+pCx5LcXkx0ArAsS/6bMK8KQ+o1I9X+yyKlhIrLVfORrx8/jyp90a+EG4FUWk3k1BS1SVDilYcKUlDIudREOtUmJlZ7cVIa4gQqkK/d/EtiQD3hphSRWQdpwh4A8i9VqCLldZ9KXC0RtBj9JhQAHcnZ2d/OSOy9ZwlxTN1EgFhPwuq2Zzqxsfhd5e3Tj24shFwau0ry9eeun1Ic/UjO6QABt96L/YUAW0AWNqH7/21uKv6Kh1RHVVBsnNm84fvLC0GWt83rhmzmQoeEB3R/MNjZwZ2aowzFfl3WpIAnMlM2t901RTGR2oYOpg6DRtQUTRuJtLap0aqsh1cuUq3/pxuMdKcHTt1tRAmO5i6kZoshBSl19TsxY5NU2O36PLfaaGPrQWGrDo936FjM3vdN9u2qcbgdqexsq+TxGuoFlQLYxpS9pqbnfGfhKnpsQti1aNjCILLpZYLrrCkUDw21RAYIDjm9pK56WVdY1VcopzJ5Wj2KWk88PFpA8nDY+VJnODBpnn3NHunz2sAOs6bEg0gM3PX0WKMeI1Ysh3FdqEAqn9kzAblkHwVxt2kynR7DtUabCziDCUigdVlGvpTsIwqZH1CdXoIukoqI2s4VNd1Wbj6F6q6mL960ES89vnwUPrAdjTDgTYEV3TCvUXcXSwAyP1f4gUAcVAot4PydlLsC1W2MmDdBtQWqb4Sa/4EmYOq8U3i6JhLZ35nX+WiQ7nOulAEbuxeOuiZvQBw++DX5t6BltddB/w0f+GpYc/1bKOXAmF3IVZsWvFG/j1zux2ZMf2www5C+08ndua73akv/QSgw+yJ93YW7OcU4nAYXQNR9e3UUOY8pVxMqbIinTKslK1vp5pcQSeaVjBjSHQ0WzKzVYcOqru5lxoihARODsXtlUlEE7tFHOkrHoZaDkbB8kFT8NqGMaFAweoHV4R/Pvdu29Hq1tWyFKFW11Tc4N6bXX91hdDUUJ0oLkrRbUZhXAiVnnMphKZQCOHu50IXR+79ZGyYUSFUTZCg2REAVNIED78btf/2g8NvB06tfWVKXr9VU/9WiaNrnzx13396NNfNgidKxpp9YuVTfTul71upxt+ry7aJiYJXdYWQPlZVRMHb6X0DNRDFhUmhnWhIzpoguSL87lhBMCMJ7yA/Eu8IYQ1xjZIAJ67nuG5QGXeeBLqoC70QMzM/J9vaZ1yLi1cvApeuWP93ib6Uv3rQ6+E7S7ND8dWMuOWtqaWoOIINseUk1h4vIx6qOL1aDNe21xXlI7C9ma5cuOAb9UX9n/yV8ffkPFewKPeh0Gbfd5q1bdVTIUDhB/37/l+/bWtm9bV5RNmTpVVEm7UCr5w/z9eCuXgVVy5eqawErksY+uiTs1akJ8c+t+Rr4OsumwDgtrhnBXYbt+x3ubJSbOSJpW7zyKcEr5pF/FlimWRRxp0qxZ7VRXrfoHUbwRUmhcJGpzcrZLsguDdnx06uxi9rexCLkMx3mT5hGu6ssLooqI8H+wkjukjc3Ep7kW3lU5iZyf5VH01hwc+W0DDyuOAY2t2tutd3uQVAqOpLBjEVYazbYViMbm6fezHbg9AgTgdPSXQ59uXnt6765F7g3k8KxmJ3s9Co3CVZC2KHbskaqrouSFWQNQrJfKTTWRnBf9eoEQdXTsIbi/YPXpI4cfy3by0Z3X184uSv+wNbAHQdnfHwrZywcUkIYvtPKUWc/OgtGboEJ6uskQdmbE4oIgl81V1EJBIojqYhckhL1qnuI06uYM+76mT05mJhDXGNKosgQFEQCI73JrqOU/bptfXrsY17oJjPKr7Twg/6rwrdMjMWwJdzov6vZ9YCu7BeW7r+wd7zvgOAQWuz59K+RFrZGroF3ozjU0LIWYTKUBf2e9BfMjTTd4l71ffaMPkTDq7R3dOaLbZ888modgCAS39smxq1+/6smcPUOiuFREereqTJzeiFigrylKZG3D74tVW9q+JB87fPeagk7tvBt9liYboOSARiHo4lZWKoEKqGkHBKRnY2rjEeFUIOTggpqqPVbVVBFxHJFyLen0s6VHpKyVVXK9eQXGOpEArqsSk9pXKN0BxkEn771hKtk8RC7l8IYsepWCZhv2klKC+s19avBxStHDUTc1aOwrqBM/HGysFh5LWidQNn135zzdAw4Ms5w34bseYpRQkhLhKHuzNyoy56GWVtSfYp92+azfwTOD+hXZ2EoFWm8pb+/UyNITChQnj53B8A8lcP6ro9/sCG4WHA1YsX8z8YtjR0zQfjo4qzspTRMex54UqmnS+vAICs1Xcd7Hhw+O1XKvPXL5yVF7dkWnvb/pfPH+8+eT6IBfPLpjEnurLlOmnmn6rxp7rIZ9zDeemvvwzu6QR1GjY0s3MD1n5VSriW1Klah1o7kyJzyrKl3FX3wNoRtmzOyOHb5sS3c1wyFMdwcAGM1FPatrPb441UqCFCSOAyXQTdluEoijAZaAPF7Qz3qv3upmjlqIGzMOmrlYPDitYNHJj/TOa0nvvmh3x9H8mmyv9g2DOYt2WoTjE9cYc2JdVY1t1UAoOpKmi6cCY7zLQYlELoCpwQgmjhPMzZueHJFjnvDps+6/Bhg9ExrBtNIYSVKNv95KyS0W8N6QYA6DJxfEbyNFJgE2EDPhzZiWYB6mb+sdnxML/IN/C9d03tbwpTg1F1nBq3ETk5FIfSiEuVHt/58j9PP5o1+k4AhWkzVrWcO6cbX5sUwnpsYFzlUgjNQSYhWzqIYLy8LIGs/bK4YjKy9iJ4k/HAv+9ebVm3dGRr+sDhvbptNMTQReZqwWxZOwFKC4+Du/9wzubT2pncJ/n77PAOZA4qOs4XLB/Ue+ahKCCL/irIOaUXuwtnztC9lQkS9uiYH+eNOnTPyuGdyssBHPj4ub23Ldzyn+eg5u2k8rZjyjTO5rv0VyWrXpzYKC28QRvXCv7lNX0HCF51kWHbPqWPNyTodFNSNR/Z/5SzEVWljprOnKxyOwtXDX+aP/GHnitHk+K8X69+uTDuxeFhKjGlVA61PKXcqqF36v3WKCFkt7OiSBBXRtBKiKGYNRlZOF1UYrxWuC66mR6ew71lzEizXMEOnEfaOZuPwJ1r2K/IHQYl6IxSwnhllK6IFpGRXGclNqWaCKFWggSt7HV858v/PNE/48HWsF+LNzw5uii4WSf7ZVo1KpIKIfUcCiwtIoSs+HEK5AuLgoTD362df4w8jJiW0KWLnh+ViiJRRIHNpyzzze0saGRRtOf1l/DE6vgwADi1Y8QKzP13n3bCLk5wvHlVdq4AkPdVek0VwtzU7pakfQAQk5JT1X87bWxQPJxoOkom4Z7Zc3VXidke01CcSLG9SIrPslu4xWFTuqjcWayU4l4n/otY5+BuI4/bwp5Q7mzSSP2OI4cb/wj/wSNzEApfd+uoKO5mhVsUvFBRwcZZsAkSd40awczQU+sXzlqUBwB7hnaeUB5L1gKJOPV5bT7RPy0TkOifeFWPSKDAzrvoyUXBusYXBSt/m5tVZ0Kvm1sApTk7tl7X56mWDq8L1hfJt+EuA5GzDveve72g9/OPBZPH4/fcsWRae/6i6lz2fc1Mn0gba0nqsN2aEQcgbWxQUHd2InoWTvmoyWik2h4U10pOFylGKuIrEV/xdQ1KMR7NE9AVMwHi/9q9KM+Xp9tw+ywemoOnCwou/fGH68Oj+dpMAejmi/IwsS3eOo4ee5t/OLoqIoaqIIeR4BfW/jPr6hy9x20/3RU9xLP75Hvb9n8Z2m1Nh5sAnDx1Am1jaOJw4Z/ngOvJY8ZSvGXGyNi7FAci34ZyEVEJ+UrFuRZchba2LbHnFBCMoj2vJ2LCt+0ddv569QhSA4gE0dCYCCPNKwTjdCNeFsK0T5fHpOTY7jjjllm3jw2yBB114iaUg/hGtApJsH01u0wcT5SP/O0ycbzSiUqhqaNcw08C+5grqcDhnDpSVC3Cgo/G9Vh8BMDg5PRX/s6+Xvze+MdyhldtdEWrdHHll+reHHbVb54SsLKnwFNzkIOUj1GNjqEVKWnjXHp2uOLOZLaSGfrI6LmPAD1emtEa3aARDsNmFKg6M1Wdn6U5O2zLco2jXo/5203M/uxyHYueeplAqamOqnzTyL4DRp46PGzfn6/H3HT4BLp1tSlf6Vl0u9n2GOd+/fiPTqkJN4c0bFjy05ZPi3BXG6hCJNCgHJJcC0HeIb2KfvvWkh7rxndZAtg6W1VxfOfLz2DSwZW3125QvzBtxqrD8TPvdDiIbsFuL+Bl12ja2KCX2zvef+amdrdsTMh58ahFzy0jaArK3sJQxHmjBhNoKKZcqRzKSBwOVU0VUbJlSApeXdA/BCXvT/0kfMEEqnWFW6e88DUsg16brbwn9CtoxIpBtNybzny03RaJnjDO6YP4Kp6ag6XZ2ZfOniWPaaEJregYZWgMOdfsLKPFQsld7F+ny8DMcS4cRmkCsr5Qqn9qlt/J97aVRPW0RFmR9evOQ816P6HWi+niuT+1/nHXqXv9dexTThqrRDeoctf3BW1iO98BkGHf1ffOOwAAJ/PTl6HjzLDr6jRsUJqz4210e/jsVruBiD69nxqnpotKZ6kpTym7v2ocTa0GDWiskz2Ixm4aAsB9S9Y/RS9cWj1+vZPL62WLMG7AmPj45LREZq5FJGZsPxpkiQcwRvxm3aag3O0hV0vCbCtLLVcqQRx6w6Frjhi84ldZliXH8Y+HQgCgZXhoQV4JYslSwcG37z/+2PLQWbuMD86LiI02JdVoxpHTba2BQujZOQhGBbVQNhQkRuH5snK6j2qVL6UjVGwCUv3bkDCk6tVTh4dl5gOA3d8InDt5HlH1K0/+1abjLUB1hw9y5iZvMm4rWtN3wMn87OO3dRxp2/Tn4RP4+502NS09i26tT3x8vFNqws0tgDpnDr5w9g+0uUH5QZtHPsWlIar6mTkzQ/VCyveyKNv95KyPIp9d9UTplpzBY6aTnU7tWFHc881Xh/+jOQCU7H1lelppbJzN0UvdpHDZheYE3l4jjFuWk9Ldwi1LxC2zbkdQ/HLnD/vX6TLl3Qpn+ItrLHFv5xbeazdowM1JsZHHiaiy3SVLrQYNDMqqLbMKOJ7921WcPV9eF8CFC1cu/15xvg6AH+d92PSzf4cVrI4IqV9xvtzhvbpWqRcwdfcAPatO/K3qInCJQ1iv2d/x0BwkcCpIPaLEDU6s/Kz1G4gEkvNL3KGXK8+TVrHUCmTrf5LJu21iIhcLSk3AS39VKk1Aav9d+qvSFu0SVPZ+5pXEnr0j//jzp4L9M3/s+Hzzeg93CtmdtXM0effuy+M7tYv4g7f/JuW4s9zXIouJBKe3O3WrenKx5I0j+XaH7a5hPyGxZ+8onL9ytf5N+OviXwBOfnPsulb1861XkbjxeyBsWkLMnMaiWCHWjCZqR6+crIHIVS5VlUxWDjOSF9auX7n/2//d1/s6MlUPpK219Fv1D3tpoILibEvnqjrJ5CdB7n29L4ferzUakZhhVXqm45ZZrcs8+8HcmeP8qErEFqT4Qim+yBIMBunocaqw2PZg7Stbwke/2BZQrT0q7jHtHJcrzwM/zhu16GMAwMPPrppOJ/ipHSNeWPsjAEVlLA9h5Dtn4bxw7h6OL+OpOcipYEh0NLfwo1E1dBV9yi7nU8gyFXGNEvq+lao0Abn1v0t5+2yCUWX5AQBuaEh+i7e1CEvLO3O6ectmF898X/+Wt29pDOD0qSOzvt+v/NdMSZcuYll1UD6Oui1f6GGxPb5QllVembrb9g0/dv7WqHo4mZ99/LbIVify0eq+NTHX4dThYd+VbOhcFVo6aONaQW6ikRVE3VAatlTpJ4+0o0E0z2DSwSiA5MOsy8V907LuVL4bALLWb6Axpd5ZvKsheYQcqqeQ3N1k7pg//TBwZ8KOPn9jX1UalJwFacpEUNYiUmL8wq1iSNnLbTi64E+tfWXK67lkj4jnX31R2afb7UJ4fOfLMzBmVe/mNHmoLQDg+M6X32/x4vQocIsEAly0WV25sdASwpjnJzl9zMCBzkHOI8oJoaVPb2XoNfvbvmvUCHaWXa6sZKtiUiEkKggmt4+sdTle30uWbcwjS2g/HPn0s+vum9osCLAts93U6dbIP/4ELuz+JRfhHXpePDbhTGOU/WJ7a/Atixqbbl5W9vtvr5yuBBDW7OZnbqxj6r11b3BYI5zgqMScLnILijYuFI4+8Ct5uKZvN2b58OTqby7163Uz26GG3DGQr4tLt2Avg0QOxdXJxYVpSKRFanckZgDh7W7PO8beGYuvRXSN0DvVnWqIEG5IGMKeUTZ/iKXkpy2p6PHqbTeU/LTlzboPLLzjRgDA759tWr28FGhx94pHOpJ7J+WiscCCNLv6qJvyyMFlQPoIRHhozhApLdHDXv6qqOxUm+Dml8+fR1n62A2YMSGWXa1X/Y886o0UN9nR4p6ZL7p9JDUPKoRsCDEJkOFqx3DRMcpleHYq9XhpBnsV/ut0GTevaRY8uaY7Gogn302vuL9TyE1W4ELhq0cx1NKkGQDgp4L9Pzbu9hD+5MyysGY3P1OnbFIxnrK0anfGbB5I5ebfr9x94w1NcSXj9z+Cb2xyc9VLDlt+/bNgFYmVrtds/nW260DdxioLeBQ6TmKVcqqp1EW6priiR29U/Dz6bFvWIKZSx8oh8yqvi6x1qLxwkaNpRZaS/clkX9gVzx1wiCnVzTIkD7wjhDWqDRNFI3/oj+/yGic8eAOAliHt8PNZ4EYA3+1eXRiduC0UKPhv390F23qqN0USrClytqMSs0rJ4XZjlGP/uvGJGQDaTZplS4l1imbh4VVP2gQTa/TnBQsO3zv1X1zMWg1egQtYlDW1WUiAjFZ0DPGOCFQQwMD33uXmteql3E7DVjh+CrgJQP3gzvjpyMUmPevaja2y/V8DiyxRZb//trvO3x5tAABlv/826VzzRZbrASgbnUwrq1pwmB+suERcuvBtrXoDAaBWcK1zRy81uZnYhJcqpv1xDrh+BNnt6h+70Wx+cAMAv/5ZsPlS6EADpiP1ylJFFPlOif4Flb2/+9DoPTuBNs/3vUl1N/K9Cb9DwNFZqmUd7pk9V7XFB4H1lCLj7S4ZGDi+qnI6i1YXCy9QQyxCicRD+PsE8QJyDko8ihfm4DWe/gCJRCKRSHwZv7cIXSEoyP3/vtuP6ReD9MQx/WKQEhfxi7PsF4P0xDH9YpBuQVqEEolEIglopBBKJBKJJKCRQiiRSCSSgEYKoUQikUgCGimEEolEIglopBBKJBKJJKCRQiiRSCSSgMYXUzokEolEIvEa0iKUSCQSSUAjhVAikUgkAY0UQolEIpEENFIIJRKJRBLQSCGUSCQSSUAjhVAikUgkAY0UQolEIpEENFIIJRKJRBLQSCGUSCQSSUAjhVAikUgkAU2gCWFuavegsWmCFxm6p+Z6dWwOI9D88GoepO+P0GEcPnyuAxYfPy++/wv3/RE6jMOHzzWDNYDISYkBgDHbNV7fPkb7NS+QkxJDB7d9DBCTkqOyV3UO0vdHSPHxcx2w+Ph58f1fuO+PkOLj59qBQBFC2zmJGTMmRvPL94E5yPyqt49R/Y1X9xz07RFarVa/ONcBiR+cF9//hfv+CK1Wq1+ca0cCxzWasN1qtWZMbq+5Q272kZgjL1efnZ5zdF9MQt8I+1NL+5h9R3P4nap1kL4/Qhs+f64DFJ8/L77/C/f9Edrw+XPtSKAIYURiYpzOLjlH9+1Dgv3uajWGe/fc5GYfUWw7ks2PoDoH6fsjJPj+uQ5MfP+8+P4v3PdHSPD9c80RKEJogLhlVmtGov1eKyKyw76kZK1l3mrD9wfp+yOEnwwyAPGL8+L7g/T9EcLXBlkzhdAhHEkzaEmMpX2Mm0fFwQ0yIrKDYpcOkREqb2Tw+CBZfH+EzuIXg/Qz5Bz0BL4/Qmep5kHWTCGMSMyoWgZdpmejE9LGOs7XnKP7YtpbPDRAQDlIzt2v+vleH6QDvj9Cg/jFIP0cOQc9gu+P0CC+NkjnYmz8lpwUzSgmx5c0wrE8iZHA6OodpO+PUHskgpeqc5ABiC+fF9//hfv+CLVHInipuudgoAuh4/e/fQy9Qaies2KLOuY+35cG6fsjpPj4uQ5YfPy8+P4v3PdHSPHxc11FkNVqdc6UlEgkEomkBlAz1wglEolE0vEZPwAAAwBJREFUIjGIFEKJRCKRBDRSCCUSiUQS0EghlEgkEklAI4VQIpFIJAGNFEKJRCKRBDRSCCUSiUQS0EghlEgkEklAI4VQIpFIJAGNFEKJRCKRBDRSCCUSiUQS0EghlEgkEklAI4VQIpFIJAGNFEKJRCKRBDRSCCUSiUQS0EghlEgkEklAI4VQIpFIJAGNFEKJRCKRBDRSCCUSiUQS0EghlEgkEklAI4WwJpCbm1vdQ5BIAho5B/0aKYT+Tm5q96Dh26p7FBJJ4CLnoN8jhVAikUgkAY0UQr8mN7W7JWkf9iVZgsam2bcE2eiemkv3CuqemjrWtn1sGtKYxwCQNjaoe2oafattq0Qi0UPOwZqAFEK/JiIxIyclBjEpOdZlcWRObkzIsVqtVqs1J2Gjhc5D7Es6OsBqtVq3j8Hy+KBPB1itVmtOSszyl+177EuKP/oieWPKkXg5DyUSQ8g5WBOQQliDSEtO2jfmxcQI8iwicXUKkpLtk2nMgDgAiBswhj6OiOyAfUdz7DtsXxZne+OLY7D8UzkLJRKzyDnon0ghrDnkZh8BlscHUSxJ+3Akm9xtxrS30B3Zx6obLe1j6BslEolR5Bz0U6QQ1ixiUmxOGTsZ9ptTiUTiDeQc9EOkENYcHL0sZmHfmXN0HzpEytkrkZhDzkE/RQphDSJuckrM8ni6OJ82lola02d5PA1fi18ekzI5ziNjlEhqMnIO+idSCP2diL4JMfbQ7YjEjJwUJFnI8kT8kZQcE16ZMWMQ78z7JJIAR85BvyfIarVW9xgk1U7a2KB4bLcuk3egEkn1IOdgdSItQolEIpEENFIIJRKJRBLQSNeoRCKRSAIaaRFKJBKJJKCRQiiRSCSSgEYKoUQikUgCGimEEolEIglopBBKJBKJJKCRQiiRSCSSgEYKoUQikUgCGimEEolEIglopBBKJBKJJKCRQiiRSCSSgEYKoUQikUgCGimEEolEIglopBBKJBKJJKCRQiiRSCSSgEYKoUQikUgCGimEEolEIglo/h88Sp/XFbMFGQAAAABJRU5ErkJggg==\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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AACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKT2/wGkykK/xvA1VAAAAABJRU5ErkJggg==\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The autoregressive coefficient matrix is of particular interest here,\nas it captures lagged dependencies and cross-dependencies in the latent\nprocess model. Unfortunately <code>bayesplot</code> doesn’t know this is\na matrix of parameters so what we see is actually the transpose of the\nVAR matrix. Using <code>dir = &#39;v&#39;</code> in the <code>facet_args</code>\nargument will accomplish this:</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a>  var_mod,</span>\n<span id=\"cb26-3\"><a href=\"#cb26-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&#39;A&#39;</span>,</span>\n<span id=\"cb26-4\"><a href=\"#cb26-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb26-5\"><a href=\"#cb26-5\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&#39;hist&#39;</span>,</span>\n<span id=\"cb26-6\"><a href=\"#cb26-6\" tabindex=\"-1\"></a>  <span class=\"at\">facet_args =</span> <span class=\"fu\">list</span>(<span class=\"at\">dir =</span> <span class=\"st\">&#39;v&#39;</span>)</span>\n<span id=\"cb26-7\"><a href=\"#cb26-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>There is a lot happening in this matrix. Each cell captures the\nlagged effect of the process in the column on the process in the row in\nthe next timestep. So for example, the effect in cell [1,3] shows how an\n<em>increase</em> in the process for series 3 (Greens) at time <span class=\"math inline\">\\(t\\)</span> is expected to impact the process for\nseries 1 (Bluegreens) at time <span class=\"math inline\">\\(t+1\\)</span>.\nThe latent process model is now capturing these effects and the smooth\nseasonal effects.</p>\n<p>The process error <span class=\"math inline\">\\((\\Sigma)\\)</span>\ncaptures unmodelled variation in the process models. Again, we fixed the\noff-diagonals to 0, so the histograms for these will look like flat\nboxes:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a>  var_mod,</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&#39;Sigma&#39;</span>,</span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&#39;hist&#39;</span>,</span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a>  <span class=\"at\">facet_args =</span> <span class=\"fu\">list</span>(<span class=\"at\">dir =</span> <span class=\"st\">&#39;v&#39;</span>)</span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The observation error estimates <span class=\"math inline\">\\((\\sigma_{obs})\\)</span> represent how much the\nmodel thinks we might miss the true count when we take our imperfect\nmeasurements:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(var_mod, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma_obs&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">type =</span> <span class=\"st\">&quot;hist&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>These are still a bit hard to identify overall, especially when\ntrying to estimate both process and observation error. Often we need to\nmake some strong assumptions about which of these is more important for\ndetermining unexplained variation in our observations.</p>\n</div>\n<div id=\"correlated-process-errors\" class=\"section level3\">\n<h3>Correlated process errors</h3>\n<p>Let’s see if these estimates improve when we allow the process errors\nto be correlated. Once again, we need to first update the priors for the\nobservation errors:</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a>priors <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.1</span>), <span class=\"at\">class =</span> sigma_obs, <span class=\"at\">lb =</span> <span class=\"fl\">0.2</span>),</span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.25</span>), <span class=\"at\">class =</span> sigma)</span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>And now we can fit the correlated process error model</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a>varcor_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a>  <span class=\"co\"># observation formula, which remains empty</span></span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> y <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"dv\">1</span>,</span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> trend) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a>  <span class=\"co\"># VAR1 model with correlated process errors</span></span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">VAR</span>(<span class=\"at\">cor =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb30-11\"><a href=\"#cb30-11\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb30-12\"><a href=\"#cb30-12\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train,</span>\n<span id=\"cb30-13\"><a href=\"#cb30-13\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> plankton_test,</span>\n<span id=\"cb30-14\"><a href=\"#cb30-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb30-15\"><a href=\"#cb30-15\" tabindex=\"-1\"></a>  <span class=\"co\"># include the updated priors</span></span>\n<span id=\"cb30-16\"><a href=\"#cb30-16\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> priors,</span>\n<span id=\"cb30-17\"><a href=\"#cb30-17\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb30-18\"><a href=\"#cb30-18\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The <span class=\"math inline\">\\((\\Sigma)\\)</span> matrix now captures\nany evidence of contemporaneously correlated process error:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb31-1\"><a href=\"#cb31-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb31-2\"><a href=\"#cb31-2\" tabindex=\"-1\"></a>  varcor_mod,</span>\n<span id=\"cb31-3\"><a href=\"#cb31-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&#39;Sigma&#39;</span>,</span>\n<span id=\"cb31-4\"><a href=\"#cb31-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb31-5\"><a href=\"#cb31-5\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&#39;hist&#39;</span>,</span>\n<span id=\"cb31-6\"><a href=\"#cb31-6\" tabindex=\"-1\"></a>  <span class=\"at\">facet_args =</span> <span class=\"fu\">list</span>(<span class=\"at\">dir =</span> <span class=\"st\">&#39;v&#39;</span>)</span>\n<span id=\"cb31-7\"><a href=\"#cb31-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This symmetric matrix tells us there is support for correlated\nprocess errors, as several of the off-diagonal entries are strongly\nnon-zero. But it is easier to interpret these estimates if we convert\nthe covariance matrix to a correlation matrix. Here we compute the\nposterior median process error correlations:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb32-1\"><a href=\"#cb32-1\" tabindex=\"-1\"></a>Sigma_post <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.matrix</span>(</span>\n<span id=\"cb32-2\"><a href=\"#cb32-2\" tabindex=\"-1\"></a>  varcor_mod, </span>\n<span id=\"cb32-3\"><a href=\"#cb32-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&quot;Sigma&quot;</span>, </span>\n<span id=\"cb32-4\"><a href=\"#cb32-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span></span>\n<span id=\"cb32-5\"><a href=\"#cb32-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb32-6\"><a href=\"#cb32-6\" tabindex=\"-1\"></a>median_correlations <span class=\"ot\">&lt;-</span> <span class=\"fu\">cov2cor</span>(</span>\n<span id=\"cb32-7\"><a href=\"#cb32-7\" tabindex=\"-1\"></a>  <span class=\"fu\">matrix</span>(<span class=\"fu\">apply</span>(Sigma_post, <span class=\"dv\">2</span>, median),</span>\n<span id=\"cb32-8\"><a href=\"#cb32-8\" tabindex=\"-1\"></a>         <span class=\"at\">nrow =</span> <span class=\"dv\">5</span>, </span>\n<span id=\"cb32-9\"><a href=\"#cb32-9\" tabindex=\"-1\"></a>         <span class=\"at\">ncol =</span> <span class=\"dv\">5</span></span>\n<span id=\"cb32-10\"><a href=\"#cb32-10\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb32-11\"><a href=\"#cb32-11\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb32-12\"><a href=\"#cb32-12\" tabindex=\"-1\"></a><span class=\"fu\">rownames</span>(median_correlations) <span class=\"ot\">&lt;-</span> </span>\n<span id=\"cb32-13\"><a href=\"#cb32-13\" tabindex=\"-1\"></a>  <span class=\"fu\">colnames</span>(median_correlations) <span class=\"ot\">&lt;-</span> </span>\n<span id=\"cb32-14\"><a href=\"#cb32-14\" tabindex=\"-1\"></a>  <span class=\"fu\">levels</span>(plankton_train<span class=\"sc\">$</span>series)</span>\n<span id=\"cb32-15\"><a href=\"#cb32-15\" tabindex=\"-1\"></a></span>\n<span id=\"cb32-16\"><a href=\"#cb32-16\" tabindex=\"-1\"></a><span class=\"fu\">round</span>(median_correlations, <span class=\"dv\">2</span>)</span>\n<span id=\"cb32-17\"><a href=\"#cb32-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             Bluegreens Diatoms Greens Other.algae Unicells</span></span>\n<span id=\"cb32-18\"><a href=\"#cb32-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Bluegreens        1.00   -0.20  -0.04        0.17     0.48</span></span>\n<span id=\"cb32-19\"><a href=\"#cb32-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Diatoms          -0.20    1.00   0.13        0.45     0.17</span></span>\n<span id=\"cb32-20\"><a href=\"#cb32-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Greens           -0.04    0.13   1.00        0.30    -0.05</span></span>\n<span id=\"cb32-21\"><a href=\"#cb32-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Other.algae       0.17    0.45   0.30        1.00     0.28</span></span>\n<span id=\"cb32-22\"><a href=\"#cb32-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Unicells          0.48    0.17  -0.05        0.28     1.00</span></span></code></pre></div>\n</div>\n<div id=\"impulse-response-functions\" class=\"section level3\">\n<h3>Impulse response functions</h3>\n<p>Because Vector Autoregressions can capture complex lagged\ndependencies, it is often difficult to understand how the member time\nseries are thought to interact with one another. A method that is\ncommonly used to directly test for possible interactions is to compute\nan <a href=\"https://en.wikipedia.org/wiki/Impulse_response\">Impulse\nResponse Function</a> (IRF). If <span class=\"math inline\">\\(h\\)</span>\nrepresents the simulated forecast horizon, an IRF asks how each of the\nremaining series might respond over times <span class=\"math inline\">\\((t+1):h\\)</span> if a focal series is given an\ninnovation “shock” at time <span class=\"math inline\">\\(t = 0\\)</span>.\n<code>mvgam</code> can compute Generalized and Orthogonalized IRFs from\nmodels that included latent VAR dynamics. We simply feed the fitted\nmodel to the <code>irf()</code> function and then use the S3\n<code>plot()</code> function to view the estimated responses. By\ndefault, <code>irf()</code> will compute IRFs by separately imposing\npositive shocks of one standard deviation to each series in the VAR\nprocess. Here we compute Generalized IRFs over a horizon of 12\ntimesteps:</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb33-1\"><a href=\"#cb33-1\" tabindex=\"-1\"></a>irfs <span class=\"ot\">&lt;-</span> <span class=\"fu\">irf</span>(varcor_mod, <span class=\"at\">h =</span> <span class=\"dv\">12</span>)</span></code></pre></div>\n<p>A summary of the IRFs can be computed using the\n<code>summary()</code> function:</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb34-1\"><a href=\"#cb34-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(irfs)</span>\n<span id=\"cb34-2\"><a href=\"#cb34-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; # A tibble: 300 × 5</span></span>\n<span id=\"cb34-3\"><a href=\"#cb34-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    shock                  horizon irfQ50 irfQ2.5 irfQ97.5</span></span>\n<span id=\"cb34-4\"><a href=\"#cb34-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    &lt;chr&gt;                    &lt;int&gt;  &lt;dbl&gt;   &lt;dbl&gt;    &lt;dbl&gt;</span></span>\n<span id=\"cb34-5\"><a href=\"#cb34-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  1 Process_1 -&gt; Process_1       1 0.350   0.264     0.441</span></span>\n<span id=\"cb34-6\"><a href=\"#cb34-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  2 Process_1 -&gt; Process_1       2 0.297   0.227     0.374</span></span>\n<span id=\"cb34-7\"><a href=\"#cb34-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  3 Process_1 -&gt; Process_1       3 0.251   0.190     0.323</span></span>\n<span id=\"cb34-8\"><a href=\"#cb34-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  4 Process_1 -&gt; Process_1       4 0.214   0.155     0.283</span></span>\n<span id=\"cb34-9\"><a href=\"#cb34-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  5 Process_1 -&gt; Process_1       5 0.182   0.125     0.253</span></span>\n<span id=\"cb34-10\"><a href=\"#cb34-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  6 Process_1 -&gt; Process_1       6 0.155   0.0966    0.227</span></span>\n<span id=\"cb34-11\"><a href=\"#cb34-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  7 Process_1 -&gt; Process_1       7 0.132   0.0744    0.205</span></span>\n<span id=\"cb34-12\"><a href=\"#cb34-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  8 Process_1 -&gt; Process_1       8 0.113   0.0563    0.185</span></span>\n<span id=\"cb34-13\"><a href=\"#cb34-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  9 Process_1 -&gt; Process_1       9 0.0967  0.0419    0.167</span></span>\n<span id=\"cb34-14\"><a href=\"#cb34-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 Process_1 -&gt; Process_1      10 0.0833  0.0307    0.152</span></span>\n<span id=\"cb34-15\"><a href=\"#cb34-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; # ℹ 290 more rows</span></span></code></pre></div>\n<p>But it is easier to understand these responses using plots. For\nexample, we can plot the expected responses of the remaining series to a\npositive shock for series 3 (Greens) using the <code>plot()</code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb35-1\"><a href=\"#cb35-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(irfs, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This series of plots makes it clear that some of the other series\nwould be expected to show both instantaneous responses to a shock for\nthe Greens (due to their correlated process errors) as well as delayed\nand nonlinear responses over time (due to the complex lagged dependence\nstructure captured by the <span class=\"math inline\">\\(A\\)</span>\nmatrix). This hopefully makes it clear why IRFs are an important tool in\nthe analysis of multivariate autoregressive models. You can also use\nthese IRFs to calculate a relative contribution from each shock to the\nforecast error variance for a focal series. This method, known as a <a href=\"https://en.wikipedia.org/wiki/Variance_decomposition_of_forecast_errors\">Forecast\nError Variance Decomposition</a> (FEVD), is useful to get an idea about\nthe amount of information that each series contributes to the evolution\nof all other series in a Vector Autoregression:</p>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb36-1\"><a href=\"#cb36-1\" tabindex=\"-1\"></a>fevds <span class=\"ot\">&lt;-</span> <span class=\"fu\">fevd</span>(varcor_mod, <span class=\"at\">h =</span> <span class=\"dv\">12</span>)</span>\n<span id=\"cb36-2\"><a href=\"#cb36-2\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fevds)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The plot above shows the median contribution to forecast error\nvariance for each series.</p>\n</div>\n<div id=\"comparing-forecast-scores\" class=\"section level3\">\n<h3>Comparing forecast scores</h3>\n<p>But which model is better? We can compute the variogram score for out\nof sample forecasts to get a sense of which model does a better job of\ncapturing the dependence structure in the true evaluation set:</p>\n<div class=\"sourceCode\" id=\"cb37\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb37-1\"><a href=\"#cb37-1\" tabindex=\"-1\"></a><span class=\"co\"># create forecast objects for each model</span></span>\n<span id=\"cb37-2\"><a href=\"#cb37-2\" tabindex=\"-1\"></a>fcvar <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(var_mod)</span>\n<span id=\"cb37-3\"><a href=\"#cb37-3\" tabindex=\"-1\"></a>fcvarcor <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(varcor_mod)</span>\n<span id=\"cb37-4\"><a href=\"#cb37-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb37-5\"><a href=\"#cb37-5\" tabindex=\"-1\"></a><span class=\"co\"># plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better</span></span>\n<span id=\"cb37-6\"><a href=\"#cb37-6\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fcvarcor, <span class=\"at\">score =</span> <span class=\"st\">&quot;variogram&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb37-7\"><a href=\"#cb37-7\" tabindex=\"-1\"></a>  <span class=\"fu\">score</span>(fcvar, <span class=\"at\">score =</span> <span class=\"st\">&quot;variogram&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score</span>\n<span id=\"cb37-8\"><a href=\"#cb37-8\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb37-9\"><a href=\"#cb37-9\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb37-10\"><a href=\"#cb37-10\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb37-11\"><a href=\"#cb37-11\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb37-12\"><a href=\"#cb37-12\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb37-13\"><a href=\"#cb37-13\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb37-14\"><a href=\"#cb37-14\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb37-15\"><a href=\"#cb37-15\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb37-16\"><a href=\"#cb37-16\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(variogram[VAR1cor] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> variogram[VAR1])</span>\n<span id=\"cb37-17\"><a href=\"#cb37-17\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb37-18\"><a href=\"#cb37-18\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>And we can also compute the energy score for out of sample forecasts\nto get a sense of which model provides forecasts that are better\ncalibrated:</p>\n<div class=\"sourceCode\" id=\"cb38\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb38-1\"><a href=\"#cb38-1\" tabindex=\"-1\"></a><span class=\"co\"># plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better</span></span>\n<span id=\"cb38-2\"><a href=\"#cb38-2\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fcvarcor, <span class=\"at\">score =</span> <span class=\"st\">&quot;energy&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb38-3\"><a href=\"#cb38-3\" tabindex=\"-1\"></a>  <span class=\"fu\">score</span>(fcvar, <span class=\"at\">score =</span> <span class=\"st\">&quot;energy&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score</span>\n<span id=\"cb38-4\"><a href=\"#cb38-4\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb38-5\"><a href=\"#cb38-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb38-6\"><a href=\"#cb38-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb38-7\"><a href=\"#cb38-7\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb38-8\"><a href=\"#cb38-8\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb38-9\"><a href=\"#cb38-9\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb38-10\"><a href=\"#cb38-10\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb38-11\"><a href=\"#cb38-11\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb38-12\"><a href=\"#cb38-12\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(energy[VAR1cor] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> energy[VAR1])</span>\n<span id=\"cb38-13\"><a href=\"#cb38-13\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb38-14\"><a href=\"#cb38-14\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The models tend to provide similar forecasts, though the correlated\nerror model does slightly better overall. We would probably need to use\na more extensive rolling forecast evaluation exercise if we felt like we\nneeded to only choose one for production. <code>mvgam</code> offers some\nutilities for doing this (i.e. see <code>?lfo_cv</code> for guidance).\nAlternatively, we could use forecasts from <em>both</em> models by\ncreating an evenly-weighted ensemble forecast distribution. This\ncapability is available using the <code>ensemble()</code> function in\n<code>mvgam</code> (see <code>?ensemble</code> for guidance).</p>\n<p>Using <code>how_to_cite()</code> for models with VAR dynamics will\ngive you information on how they are restricted to remain\nstationary:</p>\n<div class=\"sourceCode\" id=\"cb39\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb39-1\"><a href=\"#cb39-1\" tabindex=\"-1\"></a>description <span class=\"ot\">&lt;-</span> <span class=\"fu\">how_to_cite</span>(varcor_mod)</span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb40\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb40-1\"><a href=\"#cb40-1\" tabindex=\"-1\"></a>description</span></code></pre></div>\n<pre><code>#&gt; Methods text skeleton\n#&gt; We used the R package mvgam (version 1.1.52; Clark &amp; Wells, 2023) to\n#&gt;   construct, fit and interrogate the model. mvgam fits Bayesian\n#&gt;   State-Space models that can include flexible predictor effects in both\n#&gt;   the process and observation components by incorporating functionalities\n#&gt;   from the brms (Burkner 2017), mgcv (Wood 2017) and splines2 (Wang &amp; Yan,\n#&gt;   2023) packages. To encourage stability and prevent forecast variance\n#&gt;   from increasing indefinitely, we enforced stationarity of the Vector\n#&gt;   Autoregressive process following methods described by Heaps (2023) and\n#&gt;   Clark et al. (2025). The mvgam-constructed model and observed data were\n#&gt;   passed to the probabilistic programming environment Stan (version\n#&gt;   2.36.0; Carpenter et al. 2017, Stan Development Team 2026), specifically\n#&gt;   through the cmdstanr interface (Gabry &amp; Cesnovar, 2021). We ran 4\n#&gt;   Hamiltonian Monte Carlo chains for 1000 warmup iterations and 500\n#&gt;   sampling iterations for joint posterior estimation. Rank normalized\n#&gt;   split Rhat (Vehtari et al. 2021) and effective sample sizes were used to\n#&gt;   monitor convergence.</code></pre>\n<pre><code>#&gt; \n#&gt; Primary references\n#&gt; Clark, NJ and Wells K (2023). Dynamic Generalized Additive Models\n#&gt;   (DGAMs) for forecasting discrete ecological time series. Methods in\n#&gt;   Ecology and Evolution, 14, 771-784. doi.org/10.1111/2041-210X.13974\n#&gt; Burkner, PC (2017). brms: An R Package for Bayesian Multilevel Models\n#&gt;   Using Stan. Journal of Statistical Software, 80(1), 1-28.\n#&gt;   doi:10.18637/jss.v080.i01\n#&gt; Wood, SN (2017). Generalized Additive Models: An Introduction with R\n#&gt;   (2nd edition). Chapman and Hall/CRC.\n#&gt; Wang W and Yan J (2021). Shape-Restricted Regression Splines with R\n#&gt;   Package splines2. Journal of Data Science, 19(3), 498-517.\n#&gt;   doi:10.6339/21-JDS1020 https://doi.org/10.6339/21-JDS1020.\n#&gt; Heaps, SE (2023). Enforcing stationarity through the prior in vector\n#&gt;   autoregressions. Journal of Computational and Graphical Statistics 32,\n#&gt;   74-83.\n#&gt; Clark NJ, Ernest SKM, Senyondo H, Simonis J, White EP, Yenni GM,\n#&gt;   Karunarathna KANK (2025). Beyond single-species models: leveraging\n#&gt;   multispecies forecasts to navigate the dynamics of ecological\n#&gt;   predictability. PeerJ 13:e18929.\n#&gt; Carpenter B, Gelman A, Hoffman MD, Lee D, Goodrich B, Betancourt M,\n#&gt;   Brubaker M, Guo J, Li P and Riddell A (2017). Stan: A probabilistic\n#&gt;   programming language. Journal of Statistical Software 76.\n#&gt; Gabry J, Cesnovar R, Johnson A, and Bronder S (2026). cmdstanr: R\n#&gt;   Interface to &#39;CmdStan&#39;. https://mc-stan.org/cmdstanr/,\n#&gt;   https://discourse.mc-stan.org.\n#&gt; Vehtari A, Gelman A, Simpson D, Carpenter B, and Burkner P (2021).\n#&gt;   Rank-normalization, folding, and localization: An improved Rhat for\n#&gt;   assessing convergence of MCMC (with discussion). Bayesian Analysis 16(2)\n#&gt;   667-718. https://doi.org/10.1214/20-BA1221.\n#&gt; \n#&gt; Other useful references\n#&gt; Arel-Bundock V, Greifer N, and Heiss A (2024). How to interpret\n#&gt;   statistical models using marginaleffects for R and Python. Journal of\n#&gt;   Statistical Software, 111(9), 1-32.\n#&gt;   https://doi.org/10.18637/jss.v111.i09\n#&gt; Gabry J, Simpson D, Vehtari A, Betancourt M, and Gelman A (2019).\n#&gt;   Visualization in Bayesian workflow. Journal of the Royal Statatistical\n#&gt;   Society A, 182, 389-402. doi:10.1111/rssa.12378.\n#&gt; Vehtari A, Gelman A, and Gabry J (2017). Practical Bayesian model\n#&gt;   evaluation using leave-one-out cross-validation and WAIC. Statistics and\n#&gt;   Computing, 27, 1413-1432. doi:10.1007/s11222-016-9696-4.\n#&gt; Burkner PC, Gabry J, and Vehtari A. (2020). Approximate leave-future-out\n#&gt;   cross-validation for Bayesian time series models. Journal of Statistical\n#&gt;   Computation and Simulation, 90(14), 2499-2523.\n#&gt;   https://doi.org/10.1080/00949655.2020.1783262</code></pre>\n<p>More advanced hierarchical panel VAR models can also be handled by\nusing the <code>gr</code> and <code>subgr</code> arguments in\n<code>VAR()</code>. These models are useful if you have a data for the\nsame set of series (<code>subgr</code>) that are measured in different\nregions (<code>gr</code>), such as species measured in different\nsampling regions or financial series measured in different\ncountries.</p>\n</div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer a lot of useful material\nabout multivariate State-Space models and how they can be applied in\npractice:</p>\n<p>Auger‐Méthé, Marie, et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470\">A\nguide to state–space modeling of ecological time series</a>.\n<em>Ecological Monographs</em> 91.4 (2021): e01470.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>Heaps, Sarah E. <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Enforcing\nstationarity through the prior in vector autoregressions</a>.\n<em>Journal of Computational and Graphical Statistics</em> 32.1 (2023):\n74-83.</p>\n<p>Hannaford, Naomi E., et al. <a href=\"https://doi.org/10.1016/j.csda.2022.107659\">A sparse Bayesian\nhierarchical vector autoregressive model for microbial dynamics in a\nwastewater treatment plant</a>. <em>Computational Statistics &amp; Data\nAnalysis</em> 179 (2023): 107659.</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. <a href=\"https://journal.r-project.org/articles/RJ-2012-002/\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata</a>. <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Karunarathna, K.A.N.K., et al. <a href=\"https://doi.org/10.1016/j.ecolmodel.2024.110648\">Modelling\nnonlinear responses of a desert rodent species to environmental change\nwith hierarchical dynamic generalized additive models</a>.\n<em>Ecological Modelling</em> (2024): 490, 110648.</p>\n<p>Ward, Eric J., et al. <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x\">Inferring\nspatial structure from time‐series data: using multivariate state‐space\nmodels to detect metapopulation structure of California sea lions in the\nGulf of California, Mexico</a>. <em>Journal of Applied Ecology</em> 47.1\n(2010): 47-56.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "docs/404.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<title>Page not found (404) • mvgam</title>\n<script src=\"https://nicholasjclark.github.io/mvgam/deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"https://nicholasjclark.github.io/mvgam/deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"https://nicholasjclark.github.io/mvgam/deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"https://nicholasjclark.github.io/mvgam/pkgdown.js\"></script><link href=\"https://nicholasjclark.github.io/mvgam/extra.css\" rel=\"stylesheet\">\n<meta property=\"og:title\" content=\"Page not found (404)\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n</head>\n<body>\n    <a href=\"https://nicholasjclark.github.io/mvgam/#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"https://nicholasjclark.github.io/mvgam/index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5002</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n<li><a class=\"dropdown-item\" href=\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"https://nicholasjclark.github.io/mvgam/reference/index.html\">Reference</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"https://nicholasjclark.github.io/mvgam/news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\n<li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\">\n</form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"https://nicholasjclark.github.io/mvgam/logo.png\" class=\"logo\" alt=\"\"><h1>Page not found (404)</h1>\n\n    </div>\n\nContent not found. Please use links in the navbar.\n\n  </main>\n</div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/CODE_OF_CONDUCT.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Contributor Covenant Code of Conduct • mvgam</title><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Contributor Covenant Code of Conduct\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5002</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>Contributor Covenant Code of Conduct</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/.github/CODE_OF_CONDUCT.md\" class=\"external-link\"><code>.github/CODE_OF_CONDUCT.md</code></a></small>\n    </div>\n\n<div id=\"contributor-covenant-code-of-conduct\" class=\"section level1\">\n\n<div class=\"section level2\">\n<h2 id=\"our-pledge\">Our Pledge<a class=\"anchor\" aria-label=\"anchor\" href=\"#our-pledge\"></a></h2>\n<p>We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.</p>\n<p>We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"our-standards\">Our Standards<a class=\"anchor\" aria-label=\"anchor\" href=\"#our-standards\"></a></h2>\n<p>Examples of behavior that contributes to a positive environment for our community include:</p>\n<ul><li>Demonstrating empathy and kindness toward other people</li>\n<li>Being respectful of differing opinions, viewpoints, and experiences</li>\n<li>Giving and gracefully accepting constructive feedback</li>\n<li>Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience</li>\n<li>Focusing on what is best not just for us as individuals, but for the overall community</li>\n</ul><p>Examples of unacceptable behavior include:</p>\n<ul><li>The use of sexualized language or imagery, and sexual attention or advances of any kind</li>\n<li>Trolling, insulting or derogatory comments, and personal or political attacks</li>\n<li>Public or private harassment</li>\n<li>Publishing others’ private information, such as a physical or email address, without their explicit permission</li>\n<li>Other conduct which could reasonably be considered inappropriate in a professional setting</li>\n</ul></div>\n<div class=\"section level2\">\n<h2 id=\"enforcement-responsibilities\">Enforcement Responsibilities<a class=\"anchor\" aria-label=\"anchor\" href=\"#enforcement-responsibilities\"></a></h2>\n<p>Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.</p>\n<p>Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"scope\">Scope<a class=\"anchor\" aria-label=\"anchor\" href=\"#scope\"></a></h2>\n<p>This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"enforcement\">Enforcement<a class=\"anchor\" aria-label=\"anchor\" href=\"#enforcement\"></a></h2>\n<p>Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at <a href=\"mailto:codeofconduct@posit.co\" class=\"email\">codeofconduct@posit.co</a>. All complaints will be reviewed and investigated promptly and fairly.</p>\n<p>All community leaders are obligated to respect the privacy and security of the reporter of any incident.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"enforcement-guidelines\">Enforcement Guidelines<a class=\"anchor\" aria-label=\"anchor\" href=\"#enforcement-guidelines\"></a></h2>\n<p>Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:</p>\n<div class=\"section level3\">\n<h3 id=\"id_1-correction\">1. Correction<a class=\"anchor\" aria-label=\"anchor\" href=\"#id_1-correction\"></a></h3>\n<p><strong>Community Impact</strong>: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.</p>\n<p><strong>Consequence</strong>: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"id_2-warning\">2. Warning<a class=\"anchor\" aria-label=\"anchor\" href=\"#id_2-warning\"></a></h3>\n<p><strong>Community Impact</strong>: A violation through a single incident or series of actions.</p>\n<p><strong>Consequence</strong>: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"id_3-temporary-ban\">3. Temporary Ban<a class=\"anchor\" aria-label=\"anchor\" href=\"#id_3-temporary-ban\"></a></h3>\n<p><strong>Community Impact</strong>: A serious violation of community standards, including sustained inappropriate behavior.</p>\n<p><strong>Consequence</strong>: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"id_4-permanent-ban\">4. Permanent Ban<a class=\"anchor\" aria-label=\"anchor\" href=\"#id_4-permanent-ban\"></a></h3>\n<p><strong>Community Impact</strong>: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.</p>\n<p><strong>Consequence</strong>: A permanent ban from any sort of public interaction within the community.</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"attribution\">Attribution<a class=\"anchor\" aria-label=\"anchor\" href=\"#attribution\"></a></h2>\n<p>This Code of Conduct is adapted from the <a href=\"https://www.contributor-covenant.org\" class=\"external-link\">Contributor Covenant</a>, version 2.1, available at <a href=\"https://www.contributor-covenant.org/version/2/1/code_of_conduct.html\" class=\"external-link uri\">https://www.contributor-covenant.org/version/2/1/code_of_conduct.html</a>.</p>\n<p>Community Impact Guidelines were inspired by [Mozilla’s code of conduct enforcement ladder][<a href=\"https://github.com/mozilla/inclusion\" class=\"external-link uri\">https://github.com/mozilla/inclusion</a>].</p>\n<p>For answers to common questions about this code of conduct, see the FAQ at <a href=\"https://www.contributor-covenant.org/faq\" class=\"external-link uri\">https://www.contributor-covenant.org/faq</a>. Translations are available at <a href=\"https://www.contributor-covenant.org/translations\" class=\"external-link uri\">https://www.contributor-covenant.org/translations</a>.</p>\n</div>\n</div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/CONTRIBUTING.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Contributing to mvgam • mvgam</title><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Contributing to mvgam\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5002</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>Contributing to mvgam</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/.github/CONTRIBUTING.md\" class=\"external-link\"><code>.github/CONTRIBUTING.md</code></a></small>\n    </div>\n\n<div id=\"contributing-to-mvgam\" class=\"section level1\">\n\n<p>This document outlines how to propose a change to mvgam. For a detailed discussion on contributing to this and other open source R packages, please see the <a href=\"https://rstd.io/tidy-contrib\" class=\"external-link\">development contributing guide</a> and our <a href=\"https://code-review.tidyverse.org/\" class=\"external-link\">code review principles</a>.</p>\n<div class=\"section level2\">\n<h2 id=\"fixing-typos\">Fixing typos<a class=\"anchor\" aria-label=\"anchor\" href=\"#fixing-typos\"></a></h2>\n<p>You can fix typos, spelling mistakes, or grammatical errors in the documentation directly using the GitHub web interface, as long as the changes are made in the <em>source</em> file. This generally means you’ll need to edit <a href=\"https://roxygen2.r-lib.org/articles/roxygen2.html\" class=\"external-link\">roxygen2 comments</a> in an <code>.R</code>, not a <code>.Rd</code> file. You can find the <code>.R</code> file that generates the <code>.Rd</code> by reading the comment in the first line.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"bigger-changes\">Bigger changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#bigger-changes\"></a></h2>\n<p>If you want to make a bigger change, it’s a good idea to first file an issue and make sure someone from the team agrees that it’s needed. If you’ve found a bug, please file an issue that illustrates the bug with a minimal <a href=\"https://www.tidyverse.org/help/#reprex\" class=\"external-link\">reprex</a> (this will also help you write a unit test, if needed). See the tidyverse guide on <a href=\"https://code-review.tidyverse.org/issues/\" class=\"external-link\">how to create a great issue</a> for more advice.</p>\n<div class=\"section level3\">\n<h3 id=\"pull-request-process\">Pull request process<a class=\"anchor\" aria-label=\"anchor\" href=\"#pull-request-process\"></a></h3>\n<ul><li><p>Fork the package and clone onto your computer. If you haven’t done this before, we recommend using <code>usethis::create_from_github(\"nicholasjclark/mvgam\", fork = TRUE)</code>.</p></li>\n<li><p>Install all development dependencies with <code><a href=\"https://devtools.r-lib.org/reference/install_deps.html\" class=\"external-link\">devtools::install_dev_deps()</a></code>, and then make sure the package passes R CMD check by running <code><a href=\"https://devtools.r-lib.org/reference/check.html\" class=\"external-link\">devtools::check()</a></code>. If R CMD check doesn’t pass cleanly, it’s a good idea to ask for help before continuing.</p></li>\n<li><p>Create a Git branch for your pull request (PR). We recommend using <code>usethis::pr_init(\"brief-description-of-change\")</code>.</p></li>\n<li><p>Make your changes, commit to git, and then create a PR by running <code><a href=\"https://usethis.r-lib.org/reference/pull-requests.html\" class=\"external-link\">usethis::pr_push()</a></code>, and following the prompts in your browser. The title of your PR should briefly describe the change. The body of your PR should contain <code>Fixes #issue-number</code>.</p></li>\n<li><p>For user-facing changes, add a bullet to the top of <code>NEWS.md</code> (i.e. just below the first header). Follow the style described in <a href=\"https://style.tidyverse.org/news.html\" class=\"external-link uri\">https://style.tidyverse.org/news.html</a>.</p></li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"code-style\">Code style<a class=\"anchor\" aria-label=\"anchor\" href=\"#code-style\"></a></h3>\n<ul><li><p>New code should follow the tidyverse <a href=\"https://style.tidyverse.org\" class=\"external-link\">style guide</a> where possible. You can use the <a href=\"https://CRAN.R-project.org/package=styler\" class=\"external-link\">styler</a> package to apply these styles, but please don’t restyle code that has nothing to do with your PR.</p></li>\n<li><p>We use <a href=\"https://cran.r-project.org/package=roxygen2\" class=\"external-link\">roxygen2</a>, with <a href=\"https://cran.r-project.org/web/packages/roxygen2/vignettes/rd-formatting.html\" class=\"external-link\">Markdown syntax</a>, for documentation.</p></li>\n<li><p>We use <a href=\"https://cran.r-project.org/package=testthat\" class=\"external-link\">testthat</a> for unit tests. Contributions with test cases included are easier to accept.</p></li>\n</ul></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"code-of-conduct\">Code of Conduct<a class=\"anchor\" aria-label=\"anchor\" href=\"#code-of-conduct\"></a></h2>\n<p>Please note that the mvgam project is released with a <a href=\"CODE_OF_CONDUCT.html\">Contributor Code of Conduct</a>. By contributing to this project you agree to abide by its terms.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"roadmap\">Roadmap<a class=\"anchor\" aria-label=\"anchor\" href=\"#roadmap\"></a></h2>\n<p>The mvgam package is in a stable state of development, with some degree of active subsequent development as envisioned by the primary authors.</p>\n</div>\n</div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/LICENSE-text.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>License • mvgam</title><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"License\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5002</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>License</h1>\n\n    </div>\n\n<pre>YEAR: 2021\nCOPYRIGHT HOLDER: Nicholas Clark\n</pre>\n\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/LICENSE.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>MIT License • mvgam</title><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"MIT License\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5002</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>MIT License</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/LICENSE.md\" class=\"external-link\"><code>LICENSE.md</code></a></small>\n    </div>\n\n<div id=\"mit-license\" class=\"section level1\">\n\n<p>Copyright (c) 2021 Nicholas Clark</p>\n<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>\n<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>\n<p>THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>\n</div>\n\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/articles/data_in_mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"description\" content=\"mvgam\">\n<title>Formatting data for use in mvgam • mvgam</title>\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\">\n<!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Formatting data for use in mvgam\">\n<meta property=\"og:description\" content=\"mvgam\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n<!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"active nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul>\n<form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\">\n</form>\n\n      <ul class=\"navbar-nav\">\n<li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n</div>\n\n    \n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Formatting data for use in mvgam</h1>\n                        <h4 data-toc-skip class=\"author\">Nicholas J\nClark</h4>\n            \n            <h4 data-toc-skip class=\"date\">2025-02-06</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/vignettes/data_in_mvgam.Rmd\" class=\"external-link\"><code>vignettes/data_in_mvgam.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>data_in_mvgam.Rmd</code></div>\n    </div>\n\n    \n    \n<p>This vignette gives an example of how to take raw data and format it\nfor use in <code>mvgam</code>. This is not an exhaustive example, as\ndata can be recorded and stored in a variety of ways, which requires\ndifferent approaches to wrangle the data into the necessary format for\n<code>mvgam</code>. For full details on the basic <code>mvgam</code>\nfunctionality, please see <a href=\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\">the\nintroductory vignette</a> and <a href=\"https://youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3&amp;si=lyg7qUrMLbD-tHCB\" class=\"external-link\">the\ngrowing set of walk through video tutorials on <code>mvgam</code>\napplications</a>.</p>\n<div class=\"section level2\">\n<h2 id=\"required-long-data-format\">Required <em>long</em> data format<a class=\"anchor\" aria-label=\"anchor\" href=\"#required-long-data-format\"></a>\n</h2>\n<p>Manipulating the data into a ‘long’ format is necessary for modelling\nin <code>mvgam</code>. By ‘long’ format, we mean that each\n<code>series x time</code> observation needs to have its own entry in\nthe <code>dataframe</code> or <code>list</code> object that we wish to\npass as data for to the two primary modelling functions,\n<code><a href=\"../reference/mvgam.html\">mvgam()</a></code> and <code><a href=\"../reference/jsdgam.html\">jsdgam()</a></code>. A simple example can be\nviewed by simulating data using the <code><a href=\"../reference/sim_mvgam.html\">sim_mvgam()</a></code> function.\nSee <code><a href=\"../reference/sim_mvgam.html\">?sim_mvgam</a></code> for more details</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">4</span>, T <span class=\"op\">=</span> <span class=\"fl\">24</span>, prop_missing <span class=\"op\">=</span> <span class=\"fl\">0.2</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, <span class=\"fl\">16</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;     y season year   series time</span></span>\n<span><span class=\"co\">#&gt; 1   1      1    1 series_1    1</span></span>\n<span><span class=\"co\">#&gt; 2   0      1    1 series_2    1</span></span>\n<span><span class=\"co\">#&gt; 3  NA      1    1 series_3    1</span></span>\n<span><span class=\"co\">#&gt; 4   2      1    1 series_4    1</span></span>\n<span><span class=\"co\">#&gt; 5   1      2    1 series_1    2</span></span>\n<span><span class=\"co\">#&gt; 6   2      2    1 series_2    2</span></span>\n<span><span class=\"co\">#&gt; 7   0      2    1 series_3    2</span></span>\n<span><span class=\"co\">#&gt; 8   0      2    1 series_4    2</span></span>\n<span><span class=\"co\">#&gt; 9   0      3    1 series_1    3</span></span>\n<span><span class=\"co\">#&gt; 10 NA      3    1 series_2    3</span></span>\n<span><span class=\"co\">#&gt; 11  0      3    1 series_3    3</span></span>\n<span><span class=\"co\">#&gt; 12 NA      3    1 series_4    3</span></span>\n<span><span class=\"co\">#&gt; 13  1      4    1 series_1    4</span></span>\n<span><span class=\"co\">#&gt; 14 NA      4    1 series_2    4</span></span>\n<span><span class=\"co\">#&gt; 15  0      4    1 series_3    4</span></span>\n<span><span class=\"co\">#&gt; 16  0      4    1 series_4    4</span></span></code></pre></div>\n<div class=\"section level3\">\n<h3 id=\"series-as-a-factor-variable\">\n<code>series</code> as a <code>factor</code> variable<a class=\"anchor\" aria-label=\"anchor\" href=\"#series-as-a-factor-variable\"></a>\n</h3>\n<p>Notice how we have four different time series in these simulated\ndata, and we have identified the series-level indicator as a\n<code>factor</code> variable.</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/class.html\" class=\"external-link\">class</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] \"factor\"</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] \"series_1\" \"series_2\" \"series_3\" \"series_4\"</span></span></code></pre></div>\n<p>It is important that the number of levels matches the number of\nunique series in the data to ensure indexing across series works\nproperly in the underlying modelling functions. Several of the main\nworkhorse functions in the package (including <code><a href=\"../reference/mvgam.html\">mvgam()</a></code> and\n<code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code>) will give an error if this is not the\ncase, but it may be worth checking anyway:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/all.html\" class=\"external-link\">all</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"https://rdrr.io/r/base/match.html\" class=\"external-link\">%in%</a></span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] TRUE</span></span></code></pre></div>\n<p>Note that you can technically supply data that does not have a\n<code>series</code> indicator, and the package will generally assume\nthat you are only using a single time series. There are exceptions to\nthis, for example if you have grouped data and would like to estimate\nhierarchical dependencies (see an example of hierarchical process error\ncorrelations in the <code><a href=\"../reference/RW.html\">?AR</a></code> documentation) or if you would like\nto set up a Joint Species Distribution Model (JSDM) using a Zero-Mean\nMultivariate Gaussian distribution for the latent residuals (see\nexamples in the <code><a href=\"../reference/ZMVN.html\">?ZMVN</a></code> documentation).</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"a-single-outcome-variable\">A single outcome variable<a class=\"anchor\" aria-label=\"anchor\" href=\"#a-single-outcome-variable\"></a>\n</h3>\n<p>You may also have notices that we do not spread the\n<code>numeric / integer</code>-classed outcome variable into different\ncolumns. Rather, there is only a single column for the outcome variable,\nlabelled <code>y</code> in these simulated data (though the outcome does\nnot have to be labelled <code>y</code>). This is another important\nrequirement in <code>mvgam</code>, but it shouldn’t be too unfamiliar to\n<code>R</code> users who frequently use modelling packages such as\n<code>lme4</code>, <code>mgcv</code>, <code>brms</code> or the many\nother regression modelling packages out there. The advantage of this\nformat is that it is now very easy to specify effects that vary among\ntime series:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/glm.html\" class=\"external-link\">glm</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">series</span> <span class=\"op\">+</span> <span class=\"va\">time</span>,</span>\n<span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Call:</span></span>\n<span><span class=\"co\">#&gt; glm(formula = y ~ series + time, family = poisson(), data = simdat$data_train)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Coefficients:</span></span>\n<span><span class=\"co\">#&gt;                Estimate Std. Error z value Pr(&gt;|z|)</span></span>\n<span><span class=\"co\">#&gt; (Intercept)     0.01533    0.34999   0.044    0.965</span></span>\n<span><span class=\"co\">#&gt; seriesseries_2  0.05442    0.33825   0.161    0.872</span></span>\n<span><span class=\"co\">#&gt; seriesseries_3 -0.26496    0.36853  -0.719    0.472</span></span>\n<span><span class=\"co\">#&gt; seriesseries_4 -0.27086    0.37753  -0.717    0.473</span></span>\n<span><span class=\"co\">#&gt; time            0.01117    0.02526   0.442    0.658</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; (Dispersion parameter for poisson family taken to be 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt;     Null deviance: 74.256  on 58  degrees of freedom</span></span>\n<span><span class=\"co\">#&gt; Residual deviance: 72.679  on 54  degrees of freedom</span></span>\n<span><span class=\"co\">#&gt;   (13 observations deleted due to missingness)</span></span>\n<span><span class=\"co\">#&gt; AIC: 165.69</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Number of Fisher Scoring iterations: 5</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">series</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span><span class=\"op\">)</span>,</span>\n<span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family: poisson </span></span>\n<span><span class=\"co\">#&gt; Link function: log </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Formula:</span></span>\n<span><span class=\"co\">#&gt; y ~ series + s(time, by = series)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Parametric coefficients:</span></span>\n<span><span class=\"co\">#&gt;                Estimate Std. Error z value Pr(&gt;|z|)</span></span>\n<span><span class=\"co\">#&gt; (Intercept)     0.11283    0.24567   0.459    0.646</span></span>\n<span><span class=\"co\">#&gt; seriesseries_2  0.07173    0.34072   0.211    0.833</span></span>\n<span><span class=\"co\">#&gt; seriesseries_3 -0.91273    0.58162  -1.569    0.117</span></span>\n<span><span class=\"co\">#&gt; seriesseries_4 -1.26425    0.85403  -1.480    0.139</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of smooth terms:</span></span>\n<span><span class=\"co\">#&gt;                          edf Ref.df Chi.sq p-value</span></span>\n<span><span class=\"co\">#&gt; s(time):seriesseries_1 1.000  1.000  0.274   0.601</span></span>\n<span><span class=\"co\">#&gt; s(time):seriesseries_2 1.000  1.000  0.017   0.896</span></span>\n<span><span class=\"co\">#&gt; s(time):seriesseries_3 2.904  3.639  6.329   0.142</span></span>\n<span><span class=\"co\">#&gt; s(time):seriesseries_4 5.916  6.950  7.541   0.375</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; R-sq.(adj) =  0.222   Deviance explained = 40.3%</span></span>\n<span><span class=\"co\">#&gt; UBRE = 0.25423  Scale est. = 1         n = 59</span></span></code></pre></div>\n<p>Depending on the observation families you plan to use when building\nmodels, there may be some restrictions that need to be satisfied within\nthe outcome variable. For example, a Beta regression can only handle\nproportional data, so values <code>&gt;= 1</code> or\n<code>&lt;= 0</code> are not allowed. Likewise, a Poisson regression can\nonly handle non-negative integers. Most regression functions in\n<code>R</code> will assume the user knows all of this and so will not\nissue any warnings or errors if you choose the wrong distribution, but\noften this ends up leading to some unhelpful error from an optimizer\nthat is difficult to interpret and diagnose. <code>mvgam</code> will\nattempt to provide some errors if you do something that is simply not\nallowed. For example, we can simulate data from a zero-centred Gaussian\ndistribution (ensuring that some of our values will be\n<code>&lt; 1</code>) and attempt a Beta regression in <code>mvgam</code>\nusing the <code>betar</code> family:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">gauss_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>outcome <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span>,</span>\n<span>                        series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"st\">'series1'</span>,</span>\n<span>                                        levels <span class=\"op\">=</span> <span class=\"st\">'series1'</span><span class=\"op\">)</span>,</span>\n<span>                        time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">gauss_dat</span></span>\n<span><span class=\"co\">#&gt;       outcome  series time</span></span>\n<span><span class=\"co\">#&gt; 1   0.8191774 series1    1</span></span>\n<span><span class=\"co\">#&gt; 2   0.4884789 series1    2</span></span>\n<span><span class=\"co\">#&gt; 3  -0.5435451 series1    3</span></span>\n<span><span class=\"co\">#&gt; 4  -0.8796024 series1    4</span></span>\n<span><span class=\"co\">#&gt; 5  -0.8100262 series1    5</span></span>\n<span><span class=\"co\">#&gt; 6   2.0134615 series1    6</span></span>\n<span><span class=\"co\">#&gt; 7  -0.1403682 series1    7</span></span>\n<span><span class=\"co\">#&gt; 8  -0.6321474 series1    8</span></span>\n<span><span class=\"co\">#&gt; 9  -1.0406050 series1    9</span></span>\n<span><span class=\"co\">#&gt; 10  0.2040207 series1   10</span></span></code></pre></div>\n<p>A call to <code>gam()</code> using the <code>mgcv</code> package\nleads to a model that actually fits (though it does give an unhelpful\nwarning message):</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"va\">time</span>,</span>\n<span>    family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>    data <span class=\"op\">=</span> <span class=\"va\">gauss_dat</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family: Beta regression(0.124) </span></span>\n<span><span class=\"co\">#&gt; Link function: logit </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Formula:</span></span>\n<span><span class=\"co\">#&gt; outcome ~ time</span></span>\n<span><span class=\"co\">#&gt; Total model degrees of freedom 2 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; REML score: -177.8074</span></span></code></pre></div>\n<p>But the same call to <code><a href=\"../reference/mvgam.html\">mvgam()</a></code> gives us something more\nuseful:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"va\">time</span>,</span>\n<span>      family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>      data <span class=\"op\">=</span> <span class=\"va\">gauss_dat</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Error: Values &lt;= 0 not allowed for beta responses</span></span></code></pre></div>\n<p>Please see <code><a href=\"../reference/mvgam_families.html\">?mvgam_families</a></code> for more information on the\ntypes of responses that the package can handle and their\nrestrictions</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"a-time-variable\">A <code>time</code> variable<a class=\"anchor\" aria-label=\"anchor\" href=\"#a-time-variable\"></a>\n</h3>\n<p>The other requirement for most models that can be fit in\n<code>mvgam</code> is a <code>numeric / integer</code>-classed variable\nlabelled <code>time</code>. This ensures the modelling software knows\nhow to arrange the time series when building models. This setup still\nallows us to formulate multivariate time series models. If you plan to\nuse any of the autoregressive dynamic trend functions available in\n<code>mvgam</code> (see <code><a href=\"../reference/mvgam_trends.html\">?mvgam_trends</a></code> for details of\navailable dynamic processes), you will need to ensure your time series\nare entered with a fixed sampling interval (i.e. the time between\ntimesteps 1 and 2 should be the same as the time between timesteps 2 and\n3, etc…). But note that you can have missing observations for some (or\nall) series. <code><a href=\"../reference/mvgam.html\">mvgam()</a></code> will check this for you, but again it\nis useful to ensure you have no missing timepoint x series combinations\nin your data. You can generally do this with a simple <code>dplyr</code>\ncall:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># A function to ensure all timepoints within a sequence are identical</span></span>\n<span><span class=\"va\">all_times_avail</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">time</span>, <span class=\"va\">min_time</span>, <span class=\"va\">max_time</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/identical.html\" class=\"external-link\">identical</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"va\">time</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>              <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq.int</a></span><span class=\"op\">(</span>from <span class=\"op\">=</span> <span class=\"va\">min_time</span>, to <span class=\"op\">=</span> <span class=\"va\">max_time</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">}</span></span>\n<span></span>\n<span><span class=\"co\"># Get min and max times from the data</span></span>\n<span><span class=\"va\">min_time</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">min</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">max_time</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Check that all times are recorded for each series</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span>,</span>\n<span>           time <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">group_by</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/summarise.html\" class=\"external-link\">summarise</a></span><span class=\"op\">(</span>all_there <span class=\"op\">=</span> <span class=\"fu\">all_times_avail</span><span class=\"op\">(</span><span class=\"va\">time</span>,</span>\n<span>                                                 <span class=\"va\">min_time</span>,</span>\n<span>                                                 <span class=\"va\">max_time</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">checked_times</span></span>\n<span><span class=\"kw\">if</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/any.html\" class=\"external-link\">any</a></span><span class=\"op\">(</span><span class=\"va\">checked_times</span><span class=\"op\">$</span><span class=\"va\">all_there</span> <span class=\"op\">==</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  <span class=\"kw\"><a href=\"https://rdrr.io/r/base/warning.html\" class=\"external-link\">warning</a></span><span class=\"op\">(</span><span class=\"st\">\"One or more series in is missing observations for one or more timepoints\"</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">}</span> <span class=\"kw\">else</span> <span class=\"op\">{</span></span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cat.html\" class=\"external-link\">cat</a></span><span class=\"op\">(</span><span class=\"st\">'All series have observations at all timepoints :)'</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">}</span></span>\n<span><span class=\"co\">#&gt; All series have observations at all timepoints :)</span></span></code></pre></div>\n<p>Note that models which use dynamic components will assume that\nsmaller values of <code>time</code> are <em>older</em>\n(i.e. <code>time = 1</code> came <em>before</em> <code>time = 2</code>,\netc…)</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"irregular-sampling-intervals\">Irregular sampling intervals?<a class=\"anchor\" aria-label=\"anchor\" href=\"#irregular-sampling-intervals\"></a>\n</h3>\n<p>Most <code>mvgam</code> dynamic trend models expect <code>time</code>\nto be measured in discrete, evenly-spaced intervals (i.e. one\nmeasurement per week, or one per year, for example; though missing\nvalues are allowed). But please note that irregularly sampled time\nintervals are allowed, in which case the <code><a href=\"../reference/RW.html\">CAR()</a></code> trend model\n(continuous time autoregressive) is appropriate. You can see an example\nof this kind of model in the <strong>Examples</strong> section in\n<code><a href=\"../reference/RW.html\">?CAR</a></code>. You can also use <code>trend_model = 'None'</code>\n(the default in <code><a href=\"../reference/mvgam.html\">mvgam()</a></code>) and instead use a Gaussian Process\nto model temporal variation for irregularly-sampled time series. See the\n<code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">?brms::gp</a></code> for details. But to reiterate the point from\nabove, if you do not have time series data (or don’t want to estimate\nlatent temporal dynamics) but you would like to estimate correlated\nlatent residuals among multivariate outcomes, you can set up models that\nuse <code>trend_model = ZMVN(...)</code> without the need for a\n<code>time</code> variable (see <code><a href=\"../reference/ZMVN.html\">?ZMVN</a></code> for details).</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"checking-data-with-get_mvgam_priors\">Checking data with <code>get_mvgam_priors()</code><a class=\"anchor\" aria-label=\"anchor\" href=\"#checking-data-with-get_mvgam_priors\"></a>\n</h2>\n<p>The <code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code> function is designed to return\ninformation about the parameters in a model whose prior distributions\ncan be modified by the user. But in doing so, it will perform a series\nof checks to ensure the data are formatted properly. It can therefore be\nvery useful to new users for ensuring there isn’t anything strange going\non in the data setup. For example, we can replicate the steps taken\nabove (to check factor levels and timepoint x series combinations) with\na single call to <code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code>. Here we first simulate\nsome data in which some of the timepoints in the <code>time</code>\nvariable are not included in the data:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">bad_times</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">16</span>, by <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span>\n<span>                        series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"st\">'series_1'</span><span class=\"op\">)</span>,</span>\n<span>                        outcome <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">bad_times</span></span>\n<span><span class=\"co\">#&gt;   time   series     outcome</span></span>\n<span><span class=\"co\">#&gt; 1    1 series_1  0.42056146</span></span>\n<span><span class=\"co\">#&gt; 2    3 series_1  0.43929390</span></span>\n<span><span class=\"co\">#&gt; 3    5 series_1 -2.37409657</span></span>\n<span><span class=\"co\">#&gt; 4    7 series_1  0.07924204</span></span>\n<span><span class=\"co\">#&gt; 5    9 series_1 -1.10342469</span></span>\n<span><span class=\"co\">#&gt; 6   11 series_1 -0.27835182</span></span>\n<span><span class=\"co\">#&gt; 7   13 series_1  0.28225978</span></span>\n<span><span class=\"co\">#&gt; 8   15 series_1  0.36767722</span></span></code></pre></div>\n<p>Next we call <code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code> by simply specifying an\nintercept-only model, which is enough to trigger all the checks:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">bad_times</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Error: One or more series in data is missing observations for one or more timepoints</span></span></code></pre></div>\n<p>This error is useful as it tells us where the problem is. There are\nmany ways to fill in missing timepoints, so the correct way will have to\nbe left up to the user. But if you don’t have any covariates, it should\nbe pretty easy using <code><a href=\"https://rdrr.io/r/base/expand.grid.html\" class=\"external-link\">expand.grid()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">bad_times</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate-joins.html\" class=\"external-link\">right_join</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/expand.grid.html\" class=\"external-link\">expand.grid</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">min</a></span><span class=\"op\">(</span><span class=\"va\">bad_times</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span>,</span>\n<span>                                           <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">bad_times</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                                series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">bad_times</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span>,</span>\n<span>                                                levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">bad_times</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">time</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">good_times</span></span>\n<span><span class=\"va\">good_times</span></span>\n<span><span class=\"co\">#&gt;    time   series     outcome</span></span>\n<span><span class=\"co\">#&gt; 1     1 series_1  0.42056146</span></span>\n<span><span class=\"co\">#&gt; 2     2 series_1          NA</span></span>\n<span><span class=\"co\">#&gt; 3     3 series_1  0.43929390</span></span>\n<span><span class=\"co\">#&gt; 4     4 series_1          NA</span></span>\n<span><span class=\"co\">#&gt; 5     5 series_1 -2.37409657</span></span>\n<span><span class=\"co\">#&gt; 6     6 series_1          NA</span></span>\n<span><span class=\"co\">#&gt; 7     7 series_1  0.07924204</span></span>\n<span><span class=\"co\">#&gt; 8     8 series_1          NA</span></span>\n<span><span class=\"co\">#&gt; 9     9 series_1 -1.10342469</span></span>\n<span><span class=\"co\">#&gt; 10   10 series_1          NA</span></span>\n<span><span class=\"co\">#&gt; 11   11 series_1 -0.27835182</span></span>\n<span><span class=\"co\">#&gt; 12   12 series_1          NA</span></span>\n<span><span class=\"co\">#&gt; 13   13 series_1  0.28225978</span></span>\n<span><span class=\"co\">#&gt; 14   14 series_1          NA</span></span>\n<span><span class=\"co\">#&gt; 15   15 series_1  0.36767722</span></span></code></pre></div>\n<p>Now the call to <code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code>, using our filled in\ndata, should work:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">good_times</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span><span class=\"co\">#&gt;                                   prior                  example_change</span></span>\n<span><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.2, 2.5);     (Intercept) ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 2     sigma_obs ~ student_t(3, 0, 2.5); sigma_obs ~ normal(0.79, 0.68);</span></span>\n<span><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<p>This function should also pick up on misaligned factor levels for the\n<code>series</code> variable. We can check this by again simulating,\nthis time adding an additional factor level that is not included in the\ndata:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">bad_levels</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">8</span>,</span>\n<span>                        series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"st\">'series_1'</span>,</span>\n<span>                                        levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'series_1'</span>,</span>\n<span>                                                   <span class=\"st\">'series_2'</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                        outcome <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">bad_levels</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] \"series_1\" \"series_2\"</span></span></code></pre></div>\n<p>Another call to <code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code> brings up a useful\nerror:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">bad_levels</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Error: Mismatch between factor levels of \"series\" and unique values of \"series\"</span></span>\n<span><span class=\"co\">#&gt; Use</span></span>\n<span><span class=\"co\">#&gt;   `setdiff(levels(data$series), unique(data$series))` </span></span>\n<span><span class=\"co\">#&gt; and</span></span>\n<span><span class=\"co\">#&gt;   `intersect(levels(data$series), unique(data$series))`</span></span>\n<span><span class=\"co\">#&gt; for guidance</span></span></code></pre></div>\n<p>Following the message’s advice tells us there is a level for\n<code>series_2</code> in the <code>series</code> variable, but there are\nno observations for this series in the data:</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sets.html\" class=\"external-link\">setdiff</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">bad_levels</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">bad_levels</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] \"series_2\"</span></span></code></pre></div>\n<p>Re-assigning the levels fixes the issue:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">bad_levels</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/droplevels.html\" class=\"external-link\">droplevels</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">good_levels</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">good_levels</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] \"series_1\"</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">good_levels</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span><span class=\"co\">#&gt;                                   prior                  example_change</span></span>\n<span><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.5, 2.5);     (Intercept) ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 2     sigma_obs ~ student_t(3, 0, 2.5); sigma_obs ~ normal(0.55, 0.12);</span></span>\n<span><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<div class=\"section level3\">\n<h3 id=\"covariates-with-no-nas\">Covariates with no <code>NA</code>s<a class=\"anchor\" aria-label=\"anchor\" href=\"#covariates-with-no-nas\"></a>\n</h3>\n<p>Covariates can be used in models just as you would when using\n<code>mgcv</code> (see <code>?formula.gam</code> for details of the\nformula syntax). But although the outcome variable can have\n<code>NA</code>s, covariates cannot. Most regression software will\nsilently drop any raws in the model matrix that have <code>NA</code>s,\nwhich is not helpful when debugging. Both the <code><a href=\"../reference/mvgam.html\">mvgam()</a></code> and\n<code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code> functions will run some simple checks\nfor you, and hopefully will return useful errors if it finds in missing\nvalues:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">miss_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>outcome <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span>,</span>\n<span>                       cov <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"cn\">NA</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">9</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                       series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"st\">'series1'</span>,</span>\n<span>                                       levels <span class=\"op\">=</span> <span class=\"st\">'series1'</span><span class=\"op\">)</span>,</span>\n<span>                       time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">miss_dat</span></span>\n<span><span class=\"co\">#&gt;        outcome        cov  series time</span></span>\n<span><span class=\"co\">#&gt; 1   0.99175685         NA series1    1</span></span>\n<span><span class=\"co\">#&gt; 2   0.34167507 -0.4104885 series1    2</span></span>\n<span><span class=\"co\">#&gt; 3  -1.10727293  1.4905883 series1    3</span></span>\n<span><span class=\"co\">#&gt; 4   0.57138854  0.5616821 series1    4</span></span>\n<span><span class=\"co\">#&gt; 5   1.35392769  0.3999663 series1    5</span></span>\n<span><span class=\"co\">#&gt; 6   0.14515171 -0.2146278 series1    6</span></span>\n<span><span class=\"co\">#&gt; 7   1.34566674  0.8597645 series1    7</span></span>\n<span><span class=\"co\">#&gt; 8   0.60786914  0.5446883 series1    8</span></span>\n<span><span class=\"co\">#&gt; 9  -1.83739244  0.7429980 series1    9</span></span>\n<span><span class=\"co\">#&gt; 10 -0.03545219  0.9991543 series1   10</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"va\">cov</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">miss_dat</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span><span class=\"co\">#&gt; 2                                  cov            1     cov fixed effect</span></span>\n<span><span class=\"co\">#&gt; 3 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span><span class=\"co\">#&gt;                                   prior                example_change</span></span>\n<span><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.5, 2.5);   (Intercept) ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 2             cov ~ student_t(3, 0, 2);           cov ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 3     sigma_obs ~ student_t(3, 0, 2.5); sigma_obs ~ normal(-1, 0.27);</span></span>\n<span><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 2             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 3             NA             NA</span></span></code></pre></div>\n<p>Just like with the <code>mgcv</code> package, <code>mvgam</code> can\nalso accept data as a <code>list</code> object. This is useful if you\nwant to set up <a href=\"https://rdrr.io/cran/mgcv/man/linear.functional.terms.html\" class=\"external-link\">linear\nfunctional predictors</a> or even distributed lag predictors. The checks\nrun by <code>mvgam</code> should still work on these data. Here we\nchange the <code>cov</code> predictor to be a <code>matrix</code>:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">miss_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>outcome <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span>,</span>\n<span>                 series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"st\">'series1'</span>,</span>\n<span>                                 levels <span class=\"op\">=</span> <span class=\"st\">'series1'</span><span class=\"op\">)</span>,</span>\n<span>                 time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">miss_dat</span><span class=\"op\">$</span><span class=\"va\">cov</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">50</span><span class=\"op\">)</span>, ncol <span class=\"op\">=</span> <span class=\"fl\">5</span>, nrow <span class=\"op\">=</span> <span class=\"fl\">10</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">miss_dat</span><span class=\"op\">$</span><span class=\"va\">cov</span><span class=\"op\">[</span><span class=\"fl\">2</span>,<span class=\"fl\">3</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"cn\">NA</span></span></code></pre></div>\n<p>A call to <code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code> returns the same error:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">outcome</span> <span class=\"op\">~</span> <span class=\"va\">cov</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">miss_dat</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span><span class=\"co\">#&gt; 2                                 cov1            1    cov1 fixed effect</span></span>\n<span><span class=\"co\">#&gt; 3                                 cov2            1    cov2 fixed effect</span></span>\n<span><span class=\"co\">#&gt; 4                                 cov3            1    cov3 fixed effect</span></span>\n<span><span class=\"co\">#&gt; 5                                 cov4            1    cov4 fixed effect</span></span>\n<span><span class=\"co\">#&gt; 6                                 cov5            1    cov5 fixed effect</span></span>\n<span><span class=\"co\">#&gt; 7 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span><span class=\"co\">#&gt;                                   prior                  example_change</span></span>\n<span><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.4, 2.5);     (Intercept) ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 2            cov1 ~ student_t(3, 0, 2);            cov1 ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 3            cov2 ~ student_t(3, 0, 2);            cov2 ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 4            cov3 ~ student_t(3, 0, 2);            cov3 ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 5            cov4 ~ student_t(3, 0, 2);            cov4 ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 6            cov5 ~ student_t(3, 0, 2);            cov5 ~ normal(0, 1);</span></span>\n<span><span class=\"co\">#&gt; 7     sigma_obs ~ student_t(3, 0, 2.5); sigma_obs ~ normal(0.69, 0.21);</span></span>\n<span><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 2             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 3             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 4             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 5             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 6             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 7             NA             NA</span></span></code></pre></div>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"plotting-with-plot_mvgam_series\">Plotting with <code>plot_mvgam_series()</code><a class=\"anchor\" aria-label=\"anchor\" href=\"#plotting-with-plot_mvgam_series\"></a>\n</h2>\n<p>Plotting the data is a useful way to ensure everything looks ok, once\nyou’ve gone throug the above checks on factor levels and timepoint x\nseries combinations. The <code><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series()</a></code> function will\ntake supplied data and plot either a series of line plots (if you choose\n<code>series = 'all'</code>) or a set of plots to describe the\ndistribution for a single time series. For example, to plot all of the\ntime series in our data, and highlight a single series in each plot, we\ncan use:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, </span>\n<span>                  y <span class=\"op\">=</span> <span class=\"st\">'y'</span>, </span>\n<span>                  series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"data_in_mvgam_files/figure-html/unnamed-chunk-24-1.png\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Or we can look more closely at the distribution for the first time\nseries:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, </span>\n<span>                  y <span class=\"op\">=</span> <span class=\"st\">'y'</span>, </span>\n<span>                  series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"data_in_mvgam_files/figure-html/unnamed-chunk-25-1.png\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>If you have split your data into training and testing folds (i.e. for\nforecast evaluation), you can include the test data in your plots:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>                  newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span>\n<span>                  y <span class=\"op\">=</span> <span class=\"st\">'y'</span>, </span>\n<span>                  series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"data_in_mvgam_files/figure-html/unnamed-chunk-26-1.png\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"example-with-neon-tick-data\">Example with NEON tick data<a class=\"anchor\" aria-label=\"anchor\" href=\"#example-with-neon-tick-data\"></a>\n</h2>\n<p>To give one example of how data can be reformatted for\n<code>mvgam</code> modelling, we will use observations from the National\nEcological Observatory Network (NEON) tick drag cloth samples.\n<em>Ixodes scapularis</em> is a widespread tick species capable of\ntransmitting a diversity of parasites to animals and humans, many of\nwhich are zoonotic. Due to the medical and ecological importance of this\ntick species, a common goal is to understand factors that influence\ntheir abundances. The NEON field team carries out standardised <a href=\"https://www.neonscience.org/data-collection/ticks\" target=\"_blank\" class=\"external-link\">long-term monitoring of tick abundances as well as other\nimportant indicators of ecological change</a>. Nymphal abundance of\n<em>I. scapularis</em> is routinely recorded across NEON plots using a\nfield sampling method called drag cloth sampling, which is a common\nmethod for sampling ticks in the landscape. Field researchers sample\nticks by dragging a large cloth behind themselves through terrain that\nis suspected of harboring ticks, usually working in a grid-like pattern.\nThe sites have been sampled since 2014, resulting in a rich dataset of\nnymph abundance time series. These tick time series show strong\nseasonality and incorporate many of the challenging features associated\nwith ecological data including overdispersion, high proportions of\nmissingness and irregular sampling in time, making them useful for\nexploring the utility of dynamic GAMs.</p>\n<p>We begin by loading NEON tick data for the years 2014 - 2021, which\nwere downloaded from NEON and prepared as described in <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.13974\" target=\"_blank\" class=\"external-link\">Clark &amp; Wells 2022</a>. You can read a bit about the\ndata using the call <code><a href=\"../reference/all_neon_tick_data.html\">?all_neon_tick_data</a></code></p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/data.html\" class=\"external-link\">data</a></span><span class=\"op\">(</span><span class=\"st\">\"all_neon_tick_data\"</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">ungroup</a></span><span class=\"op\">(</span><span class=\"va\">all_neon_tick_data</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; tibble [3,505 × 24] (S3: tbl_df/tbl/data.frame)</span></span>\n<span><span class=\"co\">#&gt;  $ Year                : num [1:3505] 2015 2015 2015 2015 2015 ...</span></span>\n<span><span class=\"co\">#&gt;  $ epiWeek             : chr [1:3505] \"37\" \"38\" \"39\" \"40\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ yearWeek            : chr [1:3505] \"201537\" \"201538\" \"201539\" \"201540\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ plotID              : chr [1:3505] \"BLAN_005\" \"BLAN_005\" \"BLAN_005\" \"BLAN_005\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ siteID              : chr [1:3505] \"BLAN\" \"BLAN\" \"BLAN\" \"BLAN\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ nlcdClass           : chr [1:3505] \"deciduousForest\" \"deciduousForest\" \"deciduousForest\" \"deciduousForest\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ decimalLatitude     : num [1:3505] 39.1 39.1 39.1 39.1 39.1 ...</span></span>\n<span><span class=\"co\">#&gt;  $ decimalLongitude    : num [1:3505] -78 -78 -78 -78 -78 ...</span></span>\n<span><span class=\"co\">#&gt;  $ elevation           : num [1:3505] 168 168 168 168 168 ...</span></span>\n<span><span class=\"co\">#&gt;  $ totalSampledArea    : num [1:3505] 162 NA NA NA 162 NA NA NA NA 164 ...</span></span>\n<span><span class=\"co\">#&gt;  $ amblyomma_americanum: num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ ixodes_scapularis   : num [1:3505] 2 NA NA NA 0 NA NA NA NA 0 ...</span></span>\n<span><span class=\"co\">#&gt;  $ time                : Date[1:3505], format: \"2015-09-13\" \"2015-09-20\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ RHMin_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ RHMin_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ RHMax_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ RHMax_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ airTempMin_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ airTempMin_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ airTempMax_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ airTempMax_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ soi                 : num [1:3505] -18.4 -17.9 -23.5 -28.4 -25.9 ...</span></span>\n<span><span class=\"co\">#&gt;  $ cum_sdd             : num [1:3505] 173 173 173 173 173 ...</span></span>\n<span><span class=\"co\">#&gt;  $ cum_gdd             : num [1:3505] 1129 1129 1129 1129 1129 ...</span></span></code></pre></div>\n<p>For this exercise, we will use the <code>epiWeek</code> variable as\nan index of seasonality, and we will only work with observations from a\nfew sampling plots (labelled in the <code>plotID</code> column):</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">plotIDs</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'SCBI_013'</span>,<span class=\"st\">'SCBI_002'</span>,</span>\n<span>             <span class=\"st\">'SERC_001'</span>,<span class=\"st\">'SERC_005'</span>,</span>\n<span>             <span class=\"st\">'SERC_006'</span>,<span class=\"st\">'SERC_012'</span>,</span>\n<span>             <span class=\"st\">'BLAN_012'</span>,<span class=\"st\">'BLAN_005'</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Now we can select the target species we want (<em>I.\nscapularis</em>), filter to the correct plot IDs and convert the\n<code>epiWeek</code> variable from <code>character</code> to\n<code>numeric</code>:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model_dat</span> <span class=\"op\">&lt;-</span> <span class=\"va\">all_neon_tick_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">ungroup</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>target <span class=\"op\">=</span> <span class=\"va\">ixodes_scapularis</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">plotID</span> <span class=\"op\"><a href=\"https://rdrr.io/r/base/match.html\" class=\"external-link\">%in%</a></span> <span class=\"va\">plotIDs</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"va\">Year</span>, <span class=\"va\">epiWeek</span>, <span class=\"va\">plotID</span>, <span class=\"va\">target</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>epiWeek <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">epiWeek</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Now is the tricky part: we need to fill in missing observations with\n<code>NA</code>s. The tick data are sparse in that field observers do\nnot go out and sample in each possible <code>epiWeek</code>. So there\nare many particular weeks in which observations are not included in the\ndata. But we can use <code><a href=\"https://rdrr.io/r/base/expand.grid.html\" class=\"external-link\">expand.grid()</a></code> again to take care of\nthis:</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model_dat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"co\"># Create all possible combos of plotID, Year and epiWeek; </span></span>\n<span>  <span class=\"co\"># missing outcomes will be filled in as NA</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate-joins.html\" class=\"external-link\">full_join</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/expand.grid.html\" class=\"external-link\">expand.grid</a></span><span class=\"op\">(</span>plotID <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">model_dat</span><span class=\"op\">$</span><span class=\"va\">plotID</span><span class=\"op\">)</span>,</span>\n<span>                               Year <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">model_dat</span><span class=\"op\">$</span><span class=\"va\">Year</span><span class=\"op\">)</span>,</span>\n<span>                               epiWeek <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">52</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># left_join back to original data so plotID and siteID will</span></span>\n<span>  <span class=\"co\"># match up, in case you need the siteID for anything else later on</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate-joins.html\" class=\"external-link\">left_join</a></span><span class=\"op\">(</span><span class=\"va\">all_neon_tick_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>                     <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"va\">siteID</span>, <span class=\"va\">plotID</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>                     <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/distinct.html\" class=\"external-link\">distinct</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">model_dat</span></span></code></pre></div>\n<p>Create the <code>series</code> variable needed for <code>mvgam</code>\nmodelling:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model_dat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"va\">plotID</span>,</span>\n<span>                y <span class=\"op\">=</span> <span class=\"va\">target</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>siteID <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">siteID</span><span class=\"op\">)</span>,</span>\n<span>                series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"va\">target</span>, <span class=\"op\">-</span><span class=\"va\">plotID</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">Year</span>, <span class=\"va\">epiWeek</span>, <span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">model_dat</span> </span></code></pre></div>\n<p>Now create the <code>time</code> variable, which needs to track\n<code>Year</code> and <code>epiWeek</code> for each unique series. The\n<code>n</code> function from <code>dplyr</code> is often useful if\ngenerating a <code>time</code> index for grouped dataframes:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model_dat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">ungroup</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">group_by</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">Year</span>, <span class=\"va\">epiWeek</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/context.html\" class=\"external-link\">n</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">ungroup</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">model_dat</span></span></code></pre></div>\n<p>Check factor levels for the <code>series</code>:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">model_dat</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] \"BLAN_005\" \"BLAN_012\" \"SCBI_002\" \"SCBI_013\" \"SERC_001\" \"SERC_005\" \"SERC_006\"</span></span>\n<span><span class=\"co\">#&gt; [8] \"SERC_012\"</span></span></code></pre></div>\n<p>This looks good, as does a more rigorous check using\n<code><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">model_dat</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;    param_name param_length  param_info                                  prior</span></span>\n<span><span class=\"co\">#&gt; 1 (Intercept)            1 (Intercept) (Intercept) ~ student_t(3, -2.3, 2.5);</span></span>\n<span><span class=\"co\">#&gt;                example_change new_lowerbound new_upperbound</span></span>\n<span><span class=\"co\">#&gt; 1 (Intercept) ~ normal(0, 1);             NA             NA</span></span></code></pre></div>\n<p>We can also set up a model in <code><a href=\"../reference/mvgam.html\">mvgam()</a></code> but use\n<code>run_model = FALSE</code> to further ensure all of the necessary\nsteps for creating the modelling code and objects will run. It is\nrecommended that you use the <code>cmdstanr</code> backend if possible,\nas the auto-formatting options available in this package are very useful\nfor checking the package-generated <code>Stan</code> code for any\ninefficiencies that can be fixed to lead to sampling performance\nimprovements:</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">testmod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">epiWeek</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>                   <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span>,</span>\n<span>                 trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">model_dat</span>,</span>\n<span>                 backend <span class=\"op\">=</span> <span class=\"st\">'cmdstanr'</span>,</span>\n<span>                 run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></code></pre></div>\n<p>This call runs without issue, and the resulting object now contains\nthe model code and data objects that are needed to initiate\nsampling:</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">testmod</span><span class=\"op\">$</span><span class=\"va\">model_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; List of 25</span></span>\n<span><span class=\"co\">#&gt;  $ y           : num [1:416, 1:8] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...</span></span>\n<span><span class=\"co\">#&gt;  $ n           : int 416</span></span>\n<span><span class=\"co\">#&gt;  $ X           : num [1:3328, 1:73] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. ..$ : chr [1:3328] \"1\" \"2\" \"3\" \"4\" ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..$ : chr [1:73] \"X.Intercept.\" \"V2\" \"V3\" \"V4\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ S1          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ zero        : num [1:73] 0 0 0 0 0 0 0 0 0 0 ...</span></span>\n<span><span class=\"co\">#&gt;  $ S2          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ S3          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ S4          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ S5          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ S6          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ S7          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ S8          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span><span class=\"co\">#&gt;  $ p_coefs     : Named num 0</span></span>\n<span><span class=\"co\">#&gt;   ..- attr(*, \"names\")= chr \"(Intercept)\"</span></span>\n<span><span class=\"co\">#&gt;  $ p_taus      : num 0.907</span></span>\n<span><span class=\"co\">#&gt;  $ ytimes      : int [1:416, 1:8] 1 9 17 25 33 41 49 57 65 73 ...</span></span>\n<span><span class=\"co\">#&gt;  $ n_series    : int 8</span></span>\n<span><span class=\"co\">#&gt;  $ sp          : Named num [1:9] 0.368 0.368 0.368 0.368 0.368 ...</span></span>\n<span><span class=\"co\">#&gt;   ..- attr(*, \"names\")= chr [1:9] \"s(epiWeek):seriesBLAN_005\" \"s(epiWeek):seriesBLAN_012\" \"s(epiWeek):seriesSCBI_002\" \"s(epiWeek):seriesSCBI_013\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ y_observed  : num [1:416, 1:8] 0 0 0 0 0 0 0 0 0 0 ...</span></span>\n<span><span class=\"co\">#&gt;  $ total_obs   : int 3328</span></span>\n<span><span class=\"co\">#&gt;  $ num_basis   : int 73</span></span>\n<span><span class=\"co\">#&gt;  $ n_sp        : num 9</span></span>\n<span><span class=\"co\">#&gt;  $ n_nonmissing: int 400</span></span>\n<span><span class=\"co\">#&gt;  $ obs_ind     : int [1:400] 89 93 98 101 115 118 121 124 127 130 ...</span></span>\n<span><span class=\"co\">#&gt;  $ flat_ys     : num [1:400] 2 0 0 0 0 0 0 25 36 14 ...</span></span>\n<span><span class=\"co\">#&gt;  $ flat_xs     : num [1:400, 1:73] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. ..$ : chr [1:400] \"705\" \"737\" \"777\" \"801\" ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..$ : chr [1:73] \"X.Intercept.\" \"V2\" \"V3\" \"V4\" ...</span></span>\n<span><span class=\"co\">#&gt;  - attr(*, \"trend_model\")= chr \"AR1\"</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">testmod</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span><span class=\"co\">#&gt; data {</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] zero; // prior locations for basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S2; // mgcv smooth penalty matrix S2</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S3; // mgcv smooth penalty matrix S3</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S4; // mgcv smooth penalty matrix S4</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S5; // mgcv smooth penalty matrix S5</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S6; // mgcv smooth penalty matrix S6</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S7; // mgcv smooth penalty matrix S7</span></span>\n<span><span class=\"co\">#&gt;   matrix[8, 8] S8; // mgcv smooth penalty matrix S8</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; parameters {</span></span>\n<span><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // random effect variances</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[1] sigma_raw;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // random effect means</span></span>\n<span><span class=\"co\">#&gt;   vector[1] mu_raw;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent trend AR1 terms</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent trend variance parameters</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_series] sigma;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent trends</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp] lambda;</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span><span class=\"co\">#&gt;   b[1 : 65] = b_raw[1 : 65];</span></span>\n<span><span class=\"co\">#&gt;   b[66 : 73] = mu_raw[1] + b_raw[66 : 73] * sigma_raw[1];</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; model {</span></span>\n<span><span class=\"co\">#&gt;   // prior for random effect population variances</span></span>\n<span><span class=\"co\">#&gt;   sigma_raw ~ student_t(3, 0, 2.5);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for random effect population means</span></span>\n<span><span class=\"co\">#&gt;   mu_raw ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for (Intercept)...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, -2.3, 2.5);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesBLAN_005...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[2 : 9] ~ multi_normal_prec(zero[2 : 9], S1[1 : 8, 1 : 8] * lambda[1]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesBLAN_012...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[10 : 17] ~ multi_normal_prec(zero[10 : 17],</span></span>\n<span><span class=\"co\">#&gt;                                      S2[1 : 8, 1 : 8] * lambda[2]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSCBI_002...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[18 : 25] ~ multi_normal_prec(zero[18 : 25],</span></span>\n<span><span class=\"co\">#&gt;                                      S3[1 : 8, 1 : 8] * lambda[3]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSCBI_013...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[26 : 33] ~ multi_normal_prec(zero[26 : 33],</span></span>\n<span><span class=\"co\">#&gt;                                      S4[1 : 8, 1 : 8] * lambda[4]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_001...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[34 : 41] ~ multi_normal_prec(zero[34 : 41],</span></span>\n<span><span class=\"co\">#&gt;                                      S5[1 : 8, 1 : 8] * lambda[5]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_005...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[42 : 49] ~ multi_normal_prec(zero[42 : 49],</span></span>\n<span><span class=\"co\">#&gt;                                      S6[1 : 8, 1 : 8] * lambda[6]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_006...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[50 : 57] ~ multi_normal_prec(zero[50 : 57],</span></span>\n<span><span class=\"co\">#&gt;                                      S7[1 : 8, 1 : 8] * lambda[7]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_012...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[58 : 65] ~ multi_normal_prec(zero[58 : 65],</span></span>\n<span><span class=\"co\">#&gt;                                      S8[1 : 8, 1 : 8] * lambda[8]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior (non-centred) for s(series)...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[66 : 73] ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // priors for AR parameters</span></span>\n<span><span class=\"co\">#&gt;   ar1 ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // priors for smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   lambda ~ normal(5, 30);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // priors for latent trend variance parameters</span></span>\n<span><span class=\"co\">#&gt;   sigma ~ student_t(3, 0, 2.5);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // trend estimates</span></span>\n<span><span class=\"co\">#&gt;   trend[1, 1 : n_series] ~ normal(0, sigma);</span></span>\n<span><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt;   {</span></span>\n<span><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span><span class=\"co\">#&gt;     vector[n_nonmissing] flat_trends;</span></span>\n<span><span class=\"co\">#&gt;     flat_trends = to_vector(trend)[obs_ind];</span></span>\n<span><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span></span>\n<span><span class=\"co\">#&gt;                               append_row(b, 1.0));</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; generated quantities {</span></span>\n<span><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span><span class=\"co\">#&gt;   vector[n_sp] rho;</span></span>\n<span><span class=\"co\">#&gt;   vector[n_series] tau;</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span><span class=\"co\">#&gt;   rho = log(lambda);</span></span>\n<span><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;     tau[s] = pow(sigma[s], -2.0);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span></span>\n<span><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span></code></pre></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\" class=\"external-link\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p>\n<p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p>\n<p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer>\n</div>\n\n  \n\n  \n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/forecast_evaluation.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<title>Forecasting and forecast evaluation in mvgam • mvgam</title>\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Forecasting and forecast evaluation in mvgam\">\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"active nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n<li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\n<li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\">\n</form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Forecasting and forecast evaluation in mvgam</h1>\n                        <h4 data-toc-skip class=\"author\">Nicholas J\nClark</h4>\n            \n            <h4 data-toc-skip class=\"date\">2025-02-26</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/vignettes/forecast_evaluation.Rmd\" class=\"external-link\"><code>vignettes/forecast_evaluation.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>forecast_evaluation.Rmd</code></div>\n    </div>\n\n    \n    \n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to produce probabilistic forecasts and to evaluate\nthose forecasts using a variety of proper scoring rules.</p>\n<div class=\"section level2\">\n<h2 id=\"simulating-discrete-time-series\">Simulating discrete time series<a class=\"anchor\" aria-label=\"anchor\" href=\"#simulating-discrete-time-series\"></a>\n</h2>\n<p>We begin by simulating some data to show how forecasts are computed\nand evaluated in <code>mvgam</code>. The <code><a href=\"../reference/sim_mvgam.html\">sim_mvgam()</a></code>\nfunction can be used to simulate series that come from a variety of\nresponse distributions as well as seasonal patterns and/or dynamic\ntemporal patterns. Here we simulate a collection of three time\ncount-valued series. These series all share the same seasonal pattern\nbut have different temporal dynamics. By setting\n<code>trend_model = GP()</code> and <code>prop_trend = 0.75</code>, we\nare generating time series that have smooth underlying temporal trends\n(evolving as Gaussian Processes with squared exponential kernel) and\nmoderate seasonal patterns. The observations are Poisson-distributed and\nwe allow 10% of observations to be missing.</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span></span>\n<span>  T <span class=\"op\">=</span> <span class=\"fl\">100</span>,</span>\n<span>  n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span>\n<span>  mu <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/GP.html\">GP</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.75</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  prop_missing <span class=\"op\">=</span> <span class=\"fl\">0.10</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p>The returned object is a <code>list</code> containing training and\ntesting data (<code><a href=\"../reference/sim_mvgam.html\">sim_mvgam()</a></code> automatically splits the data\ninto these folds for us) together with some other information about the\ndata generating process that was used to simulate the data</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; List of 6</span></span>\n<span><span class=\"co\">#&gt;  $ data_train        :'data.frame':  225 obs. of  5 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ y     : int [1:225] 6 NA 11 2 5 20 7 8 NA 11 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ season: int [1:225] 1 1 1 2 2 2 3 3 3 4 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ year  : int [1:225] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series: Factor w/ 3 levels \"series_1\",\"series_2\",..: 1 2 3 1 2 3 1 2 3 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ time  : int [1:225] 1 1 1 2 2 2 3 3 3 4 ...</span></span>\n<span><span class=\"co\">#&gt;  $ data_test         :'data.frame':  75 obs. of  5 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ y     : int [1:75] 4 23 8 3 NA 3 1 20 8 3 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ season: int [1:75] 4 4 4 5 5 5 6 6 6 7 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ year  : int [1:75] 7 7 7 7 7 7 7 7 7 7 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series: Factor w/ 3 levels \"series_1\",\"series_2\",..: 1 2 3 1 2 3 1 2 3 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ time  : int [1:75] 76 76 76 77 77 77 78 78 78 79 ...</span></span>\n<span><span class=\"co\">#&gt;  $ true_corrs        : num [1:3, 1:3] 1 0.0861 0.1161 0.0861 1 ...</span></span>\n<span><span class=\"co\">#&gt;  $ true_trends       : num [1:100, 1:3] -0.851 -0.758 -0.664 -0.571 -0.48 ...</span></span>\n<span><span class=\"co\">#&gt;  $ global_seasonality: num [1:100] -0.966 -0.197 0.771 1.083 0.37 ...</span></span>\n<span><span class=\"co\">#&gt;  $ trend_params      :List of 2</span></span>\n<span><span class=\"co\">#&gt;   ..$ alpha: num [1:3] 0.883 0.936 1.036</span></span>\n<span><span class=\"co\">#&gt;   ..$ rho  : num [1:3] 7.54 4.01 7.49</span></span></code></pre></div>\n<p>Each series in this case has a shared seasonal pattern. The resulting\ntime series are similar to what we might encounter when dealing with\ncount-valued data that can take small counts:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span></span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"st\">\"all\"</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-4-1.png\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>For individual series, we can plot the training and testing data, as\nwell as some more specific features of the observed data:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span></span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>  newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-5-1.png\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"section level3\">\n<h3 id=\"modelling-dynamics-with-splines\">Modelling dynamics with splines<a class=\"anchor\" aria-label=\"anchor\" href=\"#modelling-dynamics-with-splines\"></a>\n</h3>\n<p>The first model we will fit uses a shared cyclic spline to capture\nthe repeated seasonality, as well as series-specific splines of time to\ncapture the long-term dynamics. We allow the temporal splines to be\nfairly complex so they can capture as much of the temporal variation as\npossible:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">8</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cr\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">20</span><span class=\"op\">)</span>,</span>\n<span>  knots <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>season <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"st\">\"None\"</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p>The model fits without issue:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; y ~ s(season, bs = \"cc\", k = 8) + s(time, by = series, k = 20)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; poisson</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 3 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 100 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)  1.9 1.9     2    1  1458</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span><span class=\"co\">#&gt;                         edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(season)              3.50      6   23.0 &lt; 2e-16 ***</span></span>\n<span><span class=\"co\">#&gt; s(time):seriesseries_1 6.45     19   55.4 0.00042 ***</span></span>\n<span><span class=\"co\">#&gt; s(time):seriesseries_2 9.70     19   45.5 &lt; 2e-16 ***</span></span>\n<span><span class=\"co\">#&gt; s(time):seriesseries_3 5.52     19   56.6   9e-05 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 60 of 2000 iterations saturated the maximum tree depth of 10 (3%)</span></span>\n<span><span class=\"co\">#&gt;  *Run with max_treedepth set to a larger value to avoid saturation</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Wed Feb 26 9:51:17 AM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod1) to get started describing this model</span></span></code></pre></div>\n<p>And we can plot the conditional effects of the splines (on the link\nscale) to see that they are estimated to be highly nonlinear</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"link\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-9-1.png\" alt=\"Plotting GAM smooth functions using mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-9-2.png\" alt=\"Plotting GAM smooth functions using mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"modelling-dynamics-with-a-correlated-ar1\">Modelling dynamics with a correlated AR1<a class=\"anchor\" aria-label=\"anchor\" href=\"#modelling-dynamics-with-a-correlated-ar1\"></a>\n</h3>\n<p>Before showing how to produce and evaluate forecasts, we will fit a\nsecond model to these data so the two models can be compared. This model\nis equivalent to the above, except we now use a correlated AR(1) process\nto model series-specific dynamics. See <code><a href=\"../reference/RW.html\">?AR</a></code> for more\ndetails.</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">8</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>  trend_knots <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>season <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>  noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">1</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p>The summary for this model now contains information on the\nautoregressive and process error parameters for each time series:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span><span class=\"co\">#&gt; y ~ 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span><span class=\"co\">#&gt; ~s(season, bs = \"cc\", k = 8) - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; poisson</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; AR(cor = TRUE)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N process models:</span></span>\n<span><span class=\"co\">#&gt; 3 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 3 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 75 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)  1.7   2   2.4    1   558</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process model AR parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ar1[1] 0.74 0.89  0.99 1.01   515</span></span>\n<span><span class=\"co\">#&gt; ar1[2] 0.63 0.82  0.96 1.01   373</span></span>\n<span><span class=\"co\">#&gt; ar1[3] 0.87 0.96  1.00 1.01   487</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma[1] 0.25 0.33  0.47 1.01   477</span></span>\n<span><span class=\"co\">#&gt; sigma[2] 0.32 0.44  0.60 1.01   410</span></span>\n<span><span class=\"co\">#&gt; sigma[3] 0.19 0.26  0.37 1.01   361</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span><span class=\"co\">#&gt;            edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(season) 2.24      6   19.6 3.2e-06 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 7 of 2000 iterations ended with a divergence (0.35%)</span></span>\n<span><span class=\"co\">#&gt;  *Try running with larger adapt_delta to remove the divergences</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Wed Feb 26 9:52:08 AM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod2) to get started describing this model</span></span></code></pre></div>\n<p>We can plot the posteriors for these parameters, and for any other\nparameter for that matter, using <code>bayesplot</code> routines. First\nthe autoregressive parameters:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>, variable <span class=\"op\">=</span> <span class=\"st\">\"ar\"</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, type <span class=\"op\">=</span> <span class=\"st\">\"areas\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-13-1.png\" alt=\"Summarising latent Gaussian Process parameters in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>And now the variance\n(<math display=\"inline\" xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mi>σ</mi><annotation encoding=\"application/x-tex\">\\sigma</annotation></semantics></math>)\nparameters:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>, variable <span class=\"op\">=</span> <span class=\"st\">\"sigma\"</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, type <span class=\"op\">=</span> <span class=\"st\">\"areas\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-14-1.png\" alt=\"Summarising latent Gaussian Process parameters in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>We can again plot the conditional seasonal effect:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>, type <span class=\"op\">=</span> <span class=\"st\">\"link\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-15-1.png\" alt=\"Plotting latent Gaussian Process effects in mvgam and marginaleffects\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The estimates for the seasonal component are fairly similar for the\ntwo models, but below we will see if they produce similar forecasts</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"forecasting-with-the-forecast-function\">Forecasting with the <code>forecast()</code> function<a class=\"anchor\" aria-label=\"anchor\" href=\"#forecasting-with-the-forecast-function\"></a>\n</h2>\n<p>Probabilistic forecasts can be computed in two main ways in\n<code>mvgam</code>. The first is to take a model that was fit only to\ntraining data (as we did above in the two example models) and produce\ntemporal predictions from the posterior predictive distribution by\nfeeding <code>newdata</code> to the <code><a href=\"../reference/forecast.mvgam.html\">forecast()</a></code> function. It\nis crucial that any <code>newdata</code> fed to the\n<code><a href=\"../reference/forecast.mvgam.html\">forecast()</a></code> function follows on sequentially from the data\nthat was used to fit the model (this is not internally checked by the\npackage because it might be a headache to do so when data are not\nsupplied in a specific time-order). When calling the\n<code><a href=\"../reference/forecast.mvgam.html\">forecast()</a></code> function, you have the option to generate\ndifferent kinds of predictions (i.e. predicting on the link scale,\nresponse scale or to produce expectations; see\n<code><a href=\"../reference/forecast.mvgam.html\">?forecast.mvgam</a></code> for details). We will use the default and\nproduce forecasts on the response scale, which is the most common way to\nevaluate forecast distributions</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fc_mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">fc_mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The objects we have created are of class <code>mvgam_forecast</code>,\nwhich contain information on hindcast distributions, forecast\ndistributions and true observations for each series in the data:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod1</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; List of 16</span></span>\n<span><span class=\"co\">#&gt;  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\", k = 8) + s(time, by = series, k = 20)</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \".Environment\")=&lt;environment: R_GlobalEnv&gt; </span></span>\n<span><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span><span class=\"co\">#&gt;  $ family            : chr \"poisson\"</span></span>\n<span><span class=\"co\">#&gt;  $ family_pars       : NULL</span></span>\n<span><span class=\"co\">#&gt;  $ trend_model       : chr \"None\"</span></span>\n<span><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span><span class=\"co\">#&gt;  $ fit_engine        : chr \"stan\"</span></span>\n<span><span class=\"co\">#&gt;  $ type              : chr \"response\"</span></span>\n<span><span class=\"co\">#&gt;  $ series_names      : Factor w/ 3 levels \"series_1\",\"series_2\",..: 1 2 3</span></span>\n<span><span class=\"co\">#&gt;  $ train_observations:List of 3</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_1: int [1:75] 6 2 7 11 8 6 9 11 7 4 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_2: int [1:75] NA 5 8 2 1 NA 2 4 0 2 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_3: int [1:75] 11 20 NA 36 44 34 57 50 26 28 ...</span></span>\n<span><span class=\"co\">#&gt;  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;  $ test_observations :List of 3</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_1: int [1:25] 4 3 1 3 1 NA NA 7 9 8 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_2: int [1:25] 23 NA 20 20 14 7 6 6 6 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_3: int [1:25] 8 3 8 3 NA 1 1 9 8 NA ...</span></span>\n<span><span class=\"co\">#&gt;  $ test_times        : int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span></span>\n<span><span class=\"co\">#&gt;  $ hindcasts         :List of 3</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_1: num [1:2000, 1:75] 1 4 6 5 2 5 6 3 6 0 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_2: num [1:2000, 1:75] 4 6 3 7 4 9 5 5 7 6 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] \"ypred[1,2]\" \"ypred[2,2]\" \"ypred[3,2]\" \"ypred[4,2]\" ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_3: num [1:2000, 1:75] 16 10 11 17 11 15 22 16 8 6 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] \"ypred[1,3]\" \"ypred[2,3]\" \"ypred[3,3]\" \"ypred[4,3]\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ forecasts         :List of 3</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_1: num [1:2000, 1:25] 1 2 3 1 3 6 1 3 0 0 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] \"ypred[76,1]\" \"ypred[77,1]\" \"ypred[78,1]\" \"ypred[79,1]\" ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_2: num [1:2000, 1:25] 20 19 30 27 23 40 27 23 22 39 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] \"ypred[76,2]\" \"ypred[77,2]\" \"ypred[78,2]\" \"ypred[79,2]\" ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ series_3: num [1:2000, 1:25] 1 5 2 3 2 2 2 1 0 1 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] \"ypred[76,3]\" \"ypred[77,3]\" \"ypred[78,3]\" \"ypred[79,3]\" ...</span></span>\n<span><span class=\"co\">#&gt;  - attr(*, \"class\")= chr \"mvgam_forecast\"</span></span></code></pre></div>\n<p>We can plot the forecasts for some series from each model using the\n<code>S3 plot</code> method for objects of this class:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod1</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-18-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod2</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-18-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod1</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-18-3.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod2</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-18-4.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Clearly the two models do not produce equivalent forecasts. We will\ncome back to scoring these forecasts in a moment.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"forecasting-with-newdata-in-mvgam\">Forecasting with <code>newdata</code> in <code>mvgam()</code><a class=\"anchor\" aria-label=\"anchor\" href=\"#forecasting-with-newdata-in-mvgam\"></a>\n</h2>\n<p>The second way we can produce forecasts in <code>mvgam</code> is to\nfeed the testing data directly to the <code><a href=\"../reference/mvgam.html\">mvgam()</a></code> function as\n<code>newdata</code>. This will include the testing data as missing\nobservations so that they are automatically predicted from the posterior\npredictive distribution using the <code>generated quantities</code>\nblock in <code>Stan</code>. As an example, we can refit\n<code>mod2</code> but include the testing data for automatic\nforecasts:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">8</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>  trend_knots <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>season <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>  noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>  newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p>Because the model already contains a forecast distribution, we do not\nneed to feed <code>newdata</code> to the <code><a href=\"../reference/forecast.mvgam.html\">forecast()</a></code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fc_mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The forecasts will be nearly identical to those calculated\npreviously:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod2</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-22-1.png\" alt=\"Plotting posterior forecast distributions using mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"scoring-forecast-distributions\">Scoring forecast distributions<a class=\"anchor\" aria-label=\"anchor\" href=\"#scoring-forecast-distributions\"></a>\n</h2>\n<p>A primary purpose of the <code>mvgam_forecast</code> class is to\nreadily allow forecast evaluations for each series in the data, using a\nvariety of possible scoring functions. See\n<code><a href=\"../reference/score.mvgam_forecast.html\">?mvgam::score.mvgam_forecast</a></code> to view the types of scores\nthat are available. A useful scoring metric is the <a href=\"https://www.annualreviews.org/content/journals/10.1146/annurev-statistics-062713-085831\" target=\"_blank\" class=\"external-link\">Continuous Rank Probability Score (CRPS)</a>. A CRPS\nvalue is similar to what we might get if we calculated a weighted\nabsolute error using the full forecast distribution.</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">crps_mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod1</span>, score <span class=\"op\">=</span> <span class=\"st\">\"crps\"</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">crps_mod1</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; List of 4</span></span>\n<span><span class=\"co\">#&gt;  $ series_1  :'data.frame':  25 obs. of  5 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ score         : num [1:25] 1.014 0.817 0.343 0.96 0.276 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 1 NA NA 0 0 0 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] \"crps\" \"crps\" \"crps\" \"crps\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ series_2  :'data.frame':  25 obs. of  5 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ score         : num [1:25] 1.87 NA 7.22 16.71 20.02 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 NA 1 1 1 0 0 0 0 0 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] \"crps\" \"crps\" \"crps\" \"crps\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ series_3  :'data.frame':  25 obs. of  5 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ score         : num [1:25] 3.644 0.456 4.234 0.49 NA ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 0 1 0 1 NA 1 1 0 0 NA ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] \"crps\" \"crps\" \"crps\" \"crps\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ all_series:'data.frame':  25 obs. of  3 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ score       : num [1:25] 6.53 NA 11.8 18.16 NA ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ score_type  : chr [1:25] \"sum_crps\" \"sum_crps\" \"sum_crps\" \"sum_crps\" ...</span></span>\n<span><span class=\"va\">crps_mod1</span><span class=\"op\">$</span><span class=\"va\">series_1</span></span>\n<span><span class=\"co\">#&gt;         score in_interval interval_width eval_horizon score_type</span></span>\n<span><span class=\"co\">#&gt; 1   1.0140790           1            0.9            1       crps</span></span>\n<span><span class=\"co\">#&gt; 2   0.8172095           1            0.9            2       crps</span></span>\n<span><span class=\"co\">#&gt; 3   0.3430390           1            0.9            3       crps</span></span>\n<span><span class=\"co\">#&gt; 4   0.9601160           1            0.9            4       crps</span></span>\n<span><span class=\"co\">#&gt; 5   0.2761875           1            0.9            5       crps</span></span>\n<span><span class=\"co\">#&gt; 6          NA          NA            0.9            6       crps</span></span>\n<span><span class=\"co\">#&gt; 7          NA          NA            0.9            7       crps</span></span>\n<span><span class=\"co\">#&gt; 8   6.1122768           0            0.9            8       crps</span></span>\n<span><span class=\"co\">#&gt; 9   8.2056642           0            0.9            9       crps</span></span>\n<span><span class=\"co\">#&gt; 10  7.3489420           0            0.9           10       crps</span></span>\n<span><span class=\"co\">#&gt; 11 21.3067160           0            0.9           11       crps</span></span>\n<span><span class=\"co\">#&gt; 12 35.2279993           0            0.9           12       crps</span></span>\n<span><span class=\"co\">#&gt; 13 37.2142593           0            0.9           13       crps</span></span>\n<span><span class=\"co\">#&gt; 14 36.2565240           0            0.9           14       crps</span></span>\n<span><span class=\"co\">#&gt; 15 39.3413357           0            0.9           15       crps</span></span>\n<span><span class=\"co\">#&gt; 16 42.2836615           0            0.9           16       crps</span></span>\n<span><span class=\"co\">#&gt; 17 42.4259613           0            0.9           17       crps</span></span>\n<span><span class=\"co\">#&gt; 18 12.6684920           0            0.9           18       crps</span></span>\n<span><span class=\"co\">#&gt; 19 13.7129962           0            0.9           19       crps</span></span>\n<span><span class=\"co\">#&gt; 20  9.6689547           0            0.9           20       crps</span></span>\n<span><span class=\"co\">#&gt; 21  4.7457437           0            0.9           21       crps</span></span>\n<span><span class=\"co\">#&gt; 22  4.7838565           0            0.9           22       crps</span></span>\n<span><span class=\"co\">#&gt; 23  2.7938578           0            0.9           23       crps</span></span>\n<span><span class=\"co\">#&gt; 24  0.8515640           1            0.9           24       crps</span></span>\n<span><span class=\"co\">#&gt; 25  3.7254275           0            0.9           25       crps</span></span></code></pre></div>\n<p>The returned list contains a <code>data.frame</code> for each series\nin the data that shows the CRPS score for each evaluation in the testing\ndata, along with some other useful information about the fit of the\nforecast distribution. In particular, we are given a logical value (1s\nand 0s) telling us whether the true value was within a pre-specified\ncredible interval (i.e. the coverage of the forecast distribution). The\ndefault interval width is 0.9, so we would hope that the values in the\n<code>in_interval</code> column take a 1 approximately 90% of the time.\nThis value can be changed if you wish to compute different coverages,\nsay using a 60% interval:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">crps_mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod1</span>, score <span class=\"op\">=</span> <span class=\"st\">\"crps\"</span>, interval_width <span class=\"op\">=</span> <span class=\"fl\">0.6</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">crps_mod1</span><span class=\"op\">$</span><span class=\"va\">series_1</span></span>\n<span><span class=\"co\">#&gt;         score in_interval interval_width eval_horizon score_type</span></span>\n<span><span class=\"co\">#&gt; 1   1.0140790           1            0.6            1       crps</span></span>\n<span><span class=\"co\">#&gt; 2   0.8172095           1            0.6            2       crps</span></span>\n<span><span class=\"co\">#&gt; 3   0.3430390           1            0.6            3       crps</span></span>\n<span><span class=\"co\">#&gt; 4   0.9601160           1            0.6            4       crps</span></span>\n<span><span class=\"co\">#&gt; 5   0.2761875           1            0.6            5       crps</span></span>\n<span><span class=\"co\">#&gt; 6          NA          NA            0.6            6       crps</span></span>\n<span><span class=\"co\">#&gt; 7          NA          NA            0.6            7       crps</span></span>\n<span><span class=\"co\">#&gt; 8   6.1122768           0            0.6            8       crps</span></span>\n<span><span class=\"co\">#&gt; 9   8.2056642           0            0.6            9       crps</span></span>\n<span><span class=\"co\">#&gt; 10  7.3489420           0            0.6           10       crps</span></span>\n<span><span class=\"co\">#&gt; 11 21.3067160           0            0.6           11       crps</span></span>\n<span><span class=\"co\">#&gt; 12 35.2279993           0            0.6           12       crps</span></span>\n<span><span class=\"co\">#&gt; 13 37.2142593           0            0.6           13       crps</span></span>\n<span><span class=\"co\">#&gt; 14 36.2565240           0            0.6           14       crps</span></span>\n<span><span class=\"co\">#&gt; 15 39.3413357           0            0.6           15       crps</span></span>\n<span><span class=\"co\">#&gt; 16 42.2836615           0            0.6           16       crps</span></span>\n<span><span class=\"co\">#&gt; 17 42.4259613           0            0.6           17       crps</span></span>\n<span><span class=\"co\">#&gt; 18 12.6684920           0            0.6           18       crps</span></span>\n<span><span class=\"co\">#&gt; 19 13.7129962           0            0.6           19       crps</span></span>\n<span><span class=\"co\">#&gt; 20  9.6689547           0            0.6           20       crps</span></span>\n<span><span class=\"co\">#&gt; 21  4.7457437           0            0.6           21       crps</span></span>\n<span><span class=\"co\">#&gt; 22  4.7838565           0            0.6           22       crps</span></span>\n<span><span class=\"co\">#&gt; 23  2.7938578           0            0.6           23       crps</span></span>\n<span><span class=\"co\">#&gt; 24  0.8515640           0            0.6           24       crps</span></span>\n<span><span class=\"co\">#&gt; 25  3.7254275           0            0.6           25       crps</span></span></code></pre></div>\n<p>We can also compare forecasts against out of sample observations\nusing the <a href=\"https://link.springer.com/article/10.1007/s11222-016-9696-4\" target=\"_blank\" class=\"external-link\">Expected Log Predictive Density (ELPD; also known as the\nlog score)</a>. The ELPD is a strictly proper scoring rule that can be\napplied to any distributional forecast, but to compute it we need\npredictions on the link scale rather than on the outcome scale. This is\nwhere it is advantageous to change the type of prediction we can get\nusing the <code><a href=\"../reference/forecast.mvgam.html\">forecast()</a></code> function:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">link_mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>, type <span class=\"op\">=</span> <span class=\"st\">\"link\"</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">link_mod1</span>, score <span class=\"op\">=</span> <span class=\"st\">\"elpd\"</span><span class=\"op\">)</span><span class=\"op\">$</span><span class=\"va\">series_1</span></span>\n<span><span class=\"co\">#&gt;         score eval_horizon score_type</span></span>\n<span><span class=\"co\">#&gt; 1   -2.154963            1       elpd</span></span>\n<span><span class=\"co\">#&gt; 2   -1.951288            2       elpd</span></span>\n<span><span class=\"co\">#&gt; 3   -1.244906            3       elpd</span></span>\n<span><span class=\"co\">#&gt; 4   -2.188772            4       elpd</span></span>\n<span><span class=\"co\">#&gt; 5   -1.213424            5       elpd</span></span>\n<span><span class=\"co\">#&gt; 6          NA            6       elpd</span></span>\n<span><span class=\"co\">#&gt; 7          NA            7       elpd</span></span>\n<span><span class=\"co\">#&gt; 8   -6.953353            8       elpd</span></span>\n<span><span class=\"co\">#&gt; 9   -8.026647            9       elpd</span></span>\n<span><span class=\"co\">#&gt; 10  -7.606749           10       elpd</span></span>\n<span><span class=\"co\">#&gt; 11 -12.495600           11       elpd</span></span>\n<span><span class=\"co\">#&gt; 12 -16.939454           12       elpd</span></span>\n<span><span class=\"co\">#&gt; 13 -14.939413           13       elpd</span></span>\n<span><span class=\"co\">#&gt; 14 -14.029803           14       elpd</span></span>\n<span><span class=\"co\">#&gt; 15 -13.634550           15       elpd</span></span>\n<span><span class=\"co\">#&gt; 16 -12.172281           16       elpd</span></span>\n<span><span class=\"co\">#&gt; 17 -13.522049           17       elpd</span></span>\n<span><span class=\"co\">#&gt; 18  -8.960513           18       elpd</span></span>\n<span><span class=\"co\">#&gt; 19  -9.513524           19       elpd</span></span>\n<span><span class=\"co\">#&gt; 20  -7.717374           20       elpd</span></span>\n<span><span class=\"co\">#&gt; 21  -6.737752           21       elpd</span></span>\n<span><span class=\"co\">#&gt; 22  -6.851763           22       elpd</span></span>\n<span><span class=\"co\">#&gt; 23  -5.503431           23       elpd</span></span>\n<span><span class=\"co\">#&gt; 24  -3.002872           24       elpd</span></span>\n<span><span class=\"co\">#&gt; 25  -6.004690           25       elpd</span></span></code></pre></div>\n<p>Finally, when we have multiple time series it may also make sense to\nuse a multivariate proper scoring rule. <code>mvgam</code> offers two\nsuch options: the Energy score and the Variogram score. The first\npenalizes forecast distributions that are less well calibrated against\nthe truth, while the second penalizes forecasts that do not capture the\nobserved true correlation structure. Which score to use depends on your\ngoals, but both are very easy to compute:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">energy_mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod2</span>, score <span class=\"op\">=</span> <span class=\"st\">\"energy\"</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">energy_mod2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; List of 4</span></span>\n<span><span class=\"co\">#&gt;  $ series_1  :'data.frame':  25 obs. of  3 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 1 NA NA 1 1 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;  $ series_2  :'data.frame':  25 obs. of  3 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 NA 1 1 1 1 1 1 1 1 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;  $ series_3  :'data.frame':  25 obs. of  3 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 NA 1 1 1 1 NA ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;  $ all_series:'data.frame':  25 obs. of  3 variables:</span></span>\n<span><span class=\"co\">#&gt;   ..$ score       : num [1:25] 4.77 NA 5.06 5.34 NA ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;   ..$ score_type  : chr [1:25] \"energy\" \"energy\" \"energy\" \"energy\" ...</span></span></code></pre></div>\n<p>The returned object still provides information on interval coverage\nfor each individual series, but there is only a single score per horizon\nnow (which is provided in the <code>all_series</code> slot):</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">energy_mod2</span><span class=\"op\">$</span><span class=\"va\">all_series</span></span>\n<span><span class=\"co\">#&gt;        score eval_horizon score_type</span></span>\n<span><span class=\"co\">#&gt; 1   4.768684            1     energy</span></span>\n<span><span class=\"co\">#&gt; 2         NA            2     energy</span></span>\n<span><span class=\"co\">#&gt; 3   5.062792            3     energy</span></span>\n<span><span class=\"co\">#&gt; 4   5.336665            4     energy</span></span>\n<span><span class=\"co\">#&gt; 5         NA            5     energy</span></span>\n<span><span class=\"co\">#&gt; 6         NA            6     energy</span></span>\n<span><span class=\"co\">#&gt; 7         NA            7     energy</span></span>\n<span><span class=\"co\">#&gt; 8   3.987317            8     energy</span></span>\n<span><span class=\"co\">#&gt; 9   4.279798            9     energy</span></span>\n<span><span class=\"co\">#&gt; 10        NA           10     energy</span></span>\n<span><span class=\"co\">#&gt; 11 13.503764           11     energy</span></span>\n<span><span class=\"co\">#&gt; 12 22.628631           12     energy</span></span>\n<span><span class=\"co\">#&gt; 13        NA           13     energy</span></span>\n<span><span class=\"co\">#&gt; 14 21.107137           14     energy</span></span>\n<span><span class=\"co\">#&gt; 15 24.172967           15     energy</span></span>\n<span><span class=\"co\">#&gt; 16 25.344728           16     energy</span></span>\n<span><span class=\"co\">#&gt; 17 28.418573           17     energy</span></span>\n<span><span class=\"co\">#&gt; 18  6.473433           18     energy</span></span>\n<span><span class=\"co\">#&gt; 19 10.862253           19     energy</span></span>\n<span><span class=\"co\">#&gt; 20  4.235033           20     energy</span></span>\n<span><span class=\"co\">#&gt; 21  2.968658           21     energy</span></span>\n<span><span class=\"co\">#&gt; 22  3.526743           22     energy</span></span>\n<span><span class=\"co\">#&gt; 23        NA           23     energy</span></span>\n<span><span class=\"co\">#&gt; 24  8.938257           24     energy</span></span>\n<span><span class=\"co\">#&gt; 25  7.794639           25     energy</span></span></code></pre></div>\n<p>You can use your score(s) of choice to compare different models. For\nexample, we can compute and plot the difference in CRPS scores for each\nseries in data. Here, a negative value means the AR(1) model\n(<code>mod2</code>) is better, while a positive value means the spline\nmodel (<code>mod1</code>) is better.</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">crps_mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod1</span>, score <span class=\"op\">=</span> <span class=\"st\">\"crps\"</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">crps_mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod2</span>, score <span class=\"op\">=</span> <span class=\"st\">\"crps\"</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;-</span> <span class=\"va\">crps_mod2</span><span class=\"op\">$</span><span class=\"va\">series_1</span><span class=\"op\">$</span><span class=\"va\">score</span> <span class=\"op\">-</span></span>\n<span>  <span class=\"va\">crps_mod1</span><span class=\"op\">$</span><span class=\"va\">series_1</span><span class=\"op\">$</span><span class=\"va\">score</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>,</span>\n<span>  pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, cex <span class=\"op\">=</span> <span class=\"fl\">1.25</span>, col <span class=\"op\">=</span> <span class=\"st\">\"darkred\"</span>,</span>\n<span>  ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span></span>\n<span>    <span class=\"op\">-</span><span class=\"fl\">1</span> <span class=\"op\">*</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span>  <span class=\"op\">)</span>,</span>\n<span>  bty <span class=\"op\">=</span> <span class=\"st\">\"l\"</span>,</span>\n<span>  xlab <span class=\"op\">=</span> <span class=\"st\">\"Forecast horizon\"</span>,</span>\n<span>  ylab <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/expression.html\" class=\"external-link\">expression</a></span><span class=\"op\">(</span><span class=\"va\">CRPS</span><span class=\"op\">[</span><span class=\"va\">AR1</span><span class=\"op\">]</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"op\">~</span> <span class=\"va\">CRPS</span><span class=\"op\">[</span><span class=\"va\">spline</span><span class=\"op\">]</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>h <span class=\"op\">=</span> <span class=\"fl\">0</span>, lty <span class=\"op\">=</span> <span class=\"st\">\"dashed\"</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">ar1_better</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/title.html\" class=\"external-link\">title</a></span><span class=\"op\">(</span>main <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"st\">\"AR(1) better in \"</span>,</span>\n<span>  <span class=\"va\">ar1_better</span>,</span>\n<span>  <span class=\"st\">\" of \"</span>,</span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"st\">\" evaluations\"</span>,</span>\n<span>  <span class=\"st\">\"\\nMean difference = \"</span>,</span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Round.html\" class=\"external-link\">round</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/mean.html\" class=\"external-link\">mean</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-28-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span></span>\n<span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;-</span> <span class=\"va\">crps_mod2</span><span class=\"op\">$</span><span class=\"va\">series_2</span><span class=\"op\">$</span><span class=\"va\">score</span> <span class=\"op\">-</span></span>\n<span>  <span class=\"va\">crps_mod1</span><span class=\"op\">$</span><span class=\"va\">series_2</span><span class=\"op\">$</span><span class=\"va\">score</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>,</span>\n<span>  pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, cex <span class=\"op\">=</span> <span class=\"fl\">1.25</span>, col <span class=\"op\">=</span> <span class=\"st\">\"darkred\"</span>,</span>\n<span>  ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span></span>\n<span>    <span class=\"op\">-</span><span class=\"fl\">1</span> <span class=\"op\">*</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span>  <span class=\"op\">)</span>,</span>\n<span>  bty <span class=\"op\">=</span> <span class=\"st\">\"l\"</span>,</span>\n<span>  xlab <span class=\"op\">=</span> <span class=\"st\">\"Forecast horizon\"</span>,</span>\n<span>  ylab <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/expression.html\" class=\"external-link\">expression</a></span><span class=\"op\">(</span><span class=\"va\">CRPS</span><span class=\"op\">[</span><span class=\"va\">AR1</span><span class=\"op\">]</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"op\">~</span> <span class=\"va\">CRPS</span><span class=\"op\">[</span><span class=\"va\">spline</span><span class=\"op\">]</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>h <span class=\"op\">=</span> <span class=\"fl\">0</span>, lty <span class=\"op\">=</span> <span class=\"st\">\"dashed\"</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">ar1_better</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/title.html\" class=\"external-link\">title</a></span><span class=\"op\">(</span>main <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"st\">\"AR(1) better in \"</span>,</span>\n<span>  <span class=\"va\">ar1_better</span>,</span>\n<span>  <span class=\"st\">\" of \"</span>,</span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"st\">\" evaluations\"</span>,</span>\n<span>  <span class=\"st\">\"\\nMean difference = \"</span>,</span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Round.html\" class=\"external-link\">round</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/mean.html\" class=\"external-link\">mean</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-28-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;-</span> <span class=\"va\">crps_mod2</span><span class=\"op\">$</span><span class=\"va\">series_3</span><span class=\"op\">$</span><span class=\"va\">score</span> <span class=\"op\">-</span></span>\n<span>  <span class=\"va\">crps_mod1</span><span class=\"op\">$</span><span class=\"va\">series_3</span><span class=\"op\">$</span><span class=\"va\">score</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>,</span>\n<span>  pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, cex <span class=\"op\">=</span> <span class=\"fl\">1.25</span>, col <span class=\"op\">=</span> <span class=\"st\">\"darkred\"</span>,</span>\n<span>  ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span></span>\n<span>    <span class=\"op\">-</span><span class=\"fl\">1</span> <span class=\"op\">*</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span>  <span class=\"op\">)</span>,</span>\n<span>  bty <span class=\"op\">=</span> <span class=\"st\">\"l\"</span>,</span>\n<span>  xlab <span class=\"op\">=</span> <span class=\"st\">\"Forecast horizon\"</span>,</span>\n<span>  ylab <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/expression.html\" class=\"external-link\">expression</a></span><span class=\"op\">(</span><span class=\"va\">CRPS</span><span class=\"op\">[</span><span class=\"va\">AR1</span><span class=\"op\">]</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"op\">~</span> <span class=\"va\">CRPS</span><span class=\"op\">[</span><span class=\"va\">spline</span><span class=\"op\">]</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>h <span class=\"op\">=</span> <span class=\"fl\">0</span>, lty <span class=\"op\">=</span> <span class=\"st\">\"dashed\"</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">ar1_better</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/title.html\" class=\"external-link\">title</a></span><span class=\"op\">(</span>main <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"st\">\"AR(1) better in \"</span>,</span>\n<span>  <span class=\"va\">ar1_better</span>,</span>\n<span>  <span class=\"st\">\" of \"</span>,</span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"st\">\" evaluations\"</span>,</span>\n<span>  <span class=\"st\">\"\\nMean difference = \"</span>,</span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Round.html\" class=\"external-link\">round</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/mean.html\" class=\"external-link\">mean</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"forecast_evaluation_files/figure-html/unnamed-chunk-28-3.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The correlated AR(1) model consistently gives better forecasts, and\nthe difference between scores tends to grow as the forecast horizon\nincreases. This is not unexpected given the way that splines linearly\nextrapolate outside the range of training data</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"further-reading\">Further reading<a class=\"anchor\" aria-label=\"anchor\" href=\"#further-reading\"></a>\n</h2>\n<p>The following papers and resources offer useful material about\nBayesian forecasting and proper scoring rules:</p>\n<p>Clark N.J., Ernest S.K.M., Senyondo H., Simonis J., White E.P., Yenni\nG.M., Karunarathna K.A.N.K. <a href=\"https://peerj.com/articles/18929/\" class=\"external-link\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em> 13:e18929 (2025) <a href=\"https://doi.org/10.7717/peerj.18929\" class=\"external-link uri\">https://doi.org/10.7717/peerj.18929</a></p>\n<p>Hyndman, Rob J., and George Athanasopoulos. <a href=\"https://otexts.com/fpp3/distaccuracy.html\" class=\"external-link\">Forecasting: principles\nand practice</a>. <em>OTexts</em>, 2018.</p>\n<p>Gneiting, Tilmann, and Adrian E. Raftery. <a href=\"https://www.tandfonline.com/doi/abs/10.1198/016214506000001437\" class=\"external-link\">Strictly\nproper scoring rules, prediction, and estimation</a> <em>Journal of the\nAmerican statistical Association</em> 102.477 (2007) 359-378.</p>\n<p>Simonis, Juniper L., Ethan P. White, and SK Morgan Ernest. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecy.3431\" class=\"external-link\">Evaluating\nprobabilistic ecological forecasts</a> <em>Ecology</em> 102.8 (2021)\ne03431.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\" class=\"external-link\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Articles • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Articles\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-article-index\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Articles</h1>\n    </div>\n\n    <div class=\"section \">\n      <h3>All vignettes</h3>\n      <p class=\"section-desc\"></p>\n\n      <dl><dt><a href=\"data_in_mvgam.html\">Formatting data for use in mvgam</a></dt>\n        <dd>\n        </dd><dt><a href=\"forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></dt>\n        <dd>\n        </dd><dt><a href=\"mvgam_overview.html\">Overview of the mvgam package</a></dt>\n        <dd>\n        </dd><dt><a href=\"nmixtures.html\">N-mixtures in mvgam</a></dt>\n        <dd>\n        </dd><dt><a href=\"shared_states.html\">Shared latent states in mvgam</a></dt>\n        <dd>\n        </dd><dt><a href=\"time_varying_effects.html\">Time-varying effects in mvgam</a></dt>\n        <dd>\n        </dd><dt><a href=\"trend_formulas.html\">State-Space models in mvgam</a></dt>\n        <dd>\n      </dd></dl></div>\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/articles/mvgam_overview.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"description\" content=\"mvgam\">\n<title>Overview of the mvgam package • mvgam</title>\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\">\n<!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Overview of the mvgam package\">\n<meta property=\"og:description\" content=\"mvgam\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n<!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"active nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul>\n<form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\">\n</form>\n\n      <ul class=\"navbar-nav\">\n<li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n</div>\n\n    \n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Overview of the mvgam package</h1>\n                        <h4 data-toc-skip class=\"author\">Nicholas J\nClark</h4>\n            \n            <h4 data-toc-skip class=\"date\">2025-02-06</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/vignettes/mvgam_overview.Rmd\" class=\"external-link\"><code>vignettes/mvgam_overview.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_overview.Rmd</code></div>\n    </div>\n\n    \n    \n<p>The purpose of this vignette is to give a general overview of the\n<code>mvgam</code> package and its primary functions.</p>\n<div class=\"section level2\">\n<h2 id=\"dynamic-gams\">Dynamic GAMs<a class=\"anchor\" aria-label=\"anchor\" href=\"#dynamic-gams\"></a>\n</h2>\n<p><code>mvgam</code> is designed to propagate unobserved temporal\nprocesses to capture latent dynamics in the observed time series. This\nworks in a state-space format, with the temporal <em>trend</em> evolving\nindependently of the observation process. An introduction to the package\nand some worked examples are also shown in this seminar: <a href=\"https://www.youtube.com/watch?v=0zZopLlomsQ\" target=\"_blank\" class=\"external-link\">Ecological Forecasting with Dynamic Generalized Additive\nModels</a>. Briefly, assume <span class=\"math inline\">\\(\\tilde{\\boldsymbol{y}}_{i,t}\\)</span> is the\nconditional expectation of response variable <span class=\"math inline\">\\(\\boldsymbol{i}\\)</span> at time <span class=\"math inline\">\\(\\boldsymbol{t}\\)</span>. Assuming <span class=\"math inline\">\\(\\boldsymbol{y_i}\\)</span> is drawn from an\nexponential distribution with an invertible link function, the linear\npredictor for a multivariate Dynamic GAM can be written as:</p>\n<p><span class=\"math display\">\\[for~i~in~1:N_{series}~...\\]</span> <span class=\"math display\">\\[for~t~in~1:N_{timepoints}~...\\]</span></p>\n<p><span class=\"math display\">\\[g^{-1}(\\tilde{\\boldsymbol{y}}_{i,t})=\\alpha_{i}+\\sum\\limits_{j=1}^J\\boldsymbol{s}_{i,j,t}\\boldsymbol{x}_{j,t}+\\boldsymbol{Z}\\boldsymbol{z}_{k,t}\\,,\\]</span>\nHere <span class=\"math inline\">\\(\\alpha\\)</span> are the unknown\nintercepts, the <span class=\"math inline\">\\(\\boldsymbol{s}\\)</span>’s\nare unknown smooth functions of covariates (<span class=\"math inline\">\\(\\boldsymbol{x}\\)</span>’s), which can potentially\nvary among the response series, and <span class=\"math inline\">\\(\\boldsymbol{z}\\)</span> are dynamic latent\nprocesses. Each smooth function <span class=\"math inline\">\\(\\boldsymbol{s_j}\\)</span> is composed of basis\nexpansions whose coefficients, which must be estimated, control the\nfunctional relationship between <span class=\"math inline\">\\(\\boldsymbol{x}_{j}\\)</span> and <span class=\"math inline\">\\(g^{-1}(\\tilde{\\boldsymbol{y}})\\)</span>. The size\nof the basis expansion limits the smooth’s potential complexity. A\nlarger set of basis functions allows greater flexibility. For more\ninformation on GAMs and how they can smooth through data, see <a href=\"https://ecogambler.netlify.app/blog/interpreting-gams/\" target=\"_blank\" class=\"external-link\">this blogpost on how to interpret nonlinear effects from\nGeneralized Additive Models</a>. Latent processes are captured with\n<span class=\"math inline\">\\(\\boldsymbol{Z}\\boldsymbol{z}_{i,t}\\)</span>,\nwhere <span class=\"math inline\">\\(\\boldsymbol{Z}\\)</span> is an <span class=\"math inline\">\\(i~by~k\\)</span> matrix of loading coefficients\n(which can be fixed or a combination of fixed and freely estimated\nparameters) and <span class=\"math inline\">\\(\\boldsymbol{z}_{k,t}\\)</span> are a set of <span class=\"math inline\">\\(K\\)</span> latent factors that can also include\ntheir own GAM linear predictors (see the <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space\nmodels vignette</a>), the <a href=\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\">N-mixtures\nvignette</a> and the example in <a href=\"https://nicholasjclark.github.io/mvgam/reference/jsdgam.html\"><code>jsdgam</code></a>\nto get an idea of how flexible these processes can be.</p>\n<p>Several advantages of GAMs are that they can model a diversity of\nresponse families, including discrete distributions (i.e. Poisson,\nNegative Binomial, Gamma) that accommodate common ecological features\nsuch as zero-inflation or overdispersion, and that they can be\nformulated to include hierarchical smoothing for multivariate responses.\n<code>mvgam</code> supports a number of different observation families,\nwhich are summarized below:</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"supported-observation-families\">Supported observation families<a class=\"anchor\" aria-label=\"anchor\" href=\"#supported-observation-families\"></a>\n</h2>\n<table class=\"table\">\n<colgroup>\n<col width=\"16%\">\n<col width=\"15%\">\n<col width=\"46%\">\n<col width=\"20%\">\n</colgroup>\n<thead><tr class=\"header\">\n<th align=\"center\">Distribution</th>\n<th align=\"center\">Function</th>\n<th align=\"center\">Support</th>\n<th align=\"center\">Extra parameter(s)</th>\n</tr></thead>\n<tbody>\n<tr class=\"odd\">\n<td align=\"center\">Gaussian (identity link)</td>\n<td align=\"center\"><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code></td>\n<td align=\"center\">Real values in <span class=\"math inline\">\\((-\\infty,\n\\infty)\\)</span>\n</td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Student’s T (identity link)</td>\n<td align=\"center\"><code>student-t()</code></td>\n<td align=\"center\">Heavy-tailed real values in <span class=\"math inline\">\\((-\\infty, \\infty)\\)</span>\n</td>\n<td align=\"center\">\n<span class=\"math inline\">\\(\\sigma\\)</span>, <span class=\"math inline\">\\(\\nu\\)</span>\n</td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">LogNormal (identity link)</td>\n<td align=\"center\"><code><a href=\"../reference/mvgam_families.html\">lognormal()</a></code></td>\n<td align=\"center\">Positive real values in <span class=\"math inline\">\\([0, \\infty)\\)</span>\n</td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Gamma (log link)</td>\n<td align=\"center\"><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma()</a></code></td>\n<td align=\"center\">Positive real values in <span class=\"math inline\">\\([0, \\infty)\\)</span>\n</td>\n<td align=\"center\"><span class=\"math inline\">\\(\\alpha\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Beta (logit link)</td>\n<td align=\"center\"><code><a href=\"../reference/mvgam_families.html\">betar()</a></code></td>\n<td align=\"center\">Real values (proportional) in <span class=\"math inline\">\\([0,1]\\)</span>\n</td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Bernoulli (logit link)</td>\n<td align=\"center\"><code><a href=\"../reference/mvgam_families.html\">bernoulli()</a></code></td>\n<td align=\"center\">Binary data in <span class=\"math inline\">\\({0,1}\\)</span>\n</td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Poisson (log link)</td>\n<td align=\"center\"><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span>\n</td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Negative Binomial2 (log link)</td>\n<td align=\"center\"><code><a href=\"../reference/mvgam_families.html\">nb()</a></code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span>\n</td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Binomial (logit link)</td>\n<td align=\"center\"><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span>\n</td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Beta-Binomial (logit link)</td>\n<td align=\"center\"><code><a href=\"../reference/mvgam_families.html\">beta_binomial()</a></code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span>\n</td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Poisson Binomial N-mixture (log link)</td>\n<td align=\"center\"><code><a href=\"../reference/mvgam_families.html\">nmix()</a></code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span>\n</td>\n<td align=\"center\">-</td>\n</tr>\n</tbody>\n</table>\n<p>For all supported observation families, any extra parameters that\nneed to be estimated (i.e. the <span class=\"math inline\">\\(\\sigma\\)</span> in a Gaussian model or the <span class=\"math inline\">\\(\\phi\\)</span> in a Negative Binomial model) are by\ndefault estimated independently for each series. However, users can opt\nto force all series to share extra observation parameters using\n<code>share_obs_params = TRUE</code> in <code><a href=\"../reference/mvgam.html\">mvgam()</a></code>. Note that\ndefault link functions cannot currently be changed.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"supported-temporal-dynamic-processes\">Supported temporal dynamic processes<a class=\"anchor\" aria-label=\"anchor\" href=\"#supported-temporal-dynamic-processes\"></a>\n</h2>\n<p>As stated above, the latent processes can take a wide variety of\nforms, some of which can be multivariate to allow the different\nobservational variables to interact or be correlated. When using the\n<code><a href=\"../reference/mvgam.html\">mvgam()</a></code> function, the user chooses between different\nprocess models with the <code>trend_model</code> argument. Available\nprocess models are described in detail below.</p>\n<div class=\"section level3\">\n<h3 id=\"correlated-multivariate-processes\">Correlated multivariate processes<a class=\"anchor\" aria-label=\"anchor\" href=\"#correlated-multivariate-processes\"></a>\n</h3>\n<p>If more than one observational unit (usually referred to as ‘series’)\nis included in <code>data</code> <span class=\"math inline\">\\((N_{series}\n&gt; 1)\\)</span>, use <code>trend_model = ZMVN()</code> to set up a\nmodel where the outcomes for different observational units may be\ncorrelated according to:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{MVNormal}(0, \\Sigma) \\end{align*}\\]</span></p>\n<p>The covariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span>\nwill capture potentially correlated process errors. It is parameterised\nusing a Cholesky factorization, which requires priors on the\nseries-level variances <span class=\"math inline\">\\(\\sigma\\)</span> and\non the strength of correlations using <code>Stan</code>’s\n<code>lkj_corr_cholesky</code> distribution. Note that this\n<code>trend_model</code> does not assume that measurements occur over\n<em>time</em>, as users can specify what variable in the\n<code>data</code> represents the unit of analysis (i.e. outcomes could\nbe counts of different <em>species</em> across different <em>sites</em>\nor <em>regions</em>, for example; see <a href=\"https://nicholasjclark.github.io/mvgam/reference/ZMVN.html\">`?ZMVN()</a>\nfor guidelines).</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"independent-random-walks\">Independent Random Walks<a class=\"anchor\" aria-label=\"anchor\" href=\"#independent-random-walks\"></a>\n</h3>\n<p>Use <code>trend_model = 'RW'</code> or\n<code>trend_model = RW()</code> to set up a model where each series in\n<code>data</code> has independent latent temporal dynamics of the\nform:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Process error parameters <span class=\"math inline\">\\(\\sigma\\)</span>\nare modeled independently for each series. If a moving average process\nis required, use <code>trend_model = RW(ma = TRUE)</code> to set up the\nfollowing:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; = z_{i,t-1} + \\theta_i * error_{i,t-1} + error_{i,t} \\\\\nerror_{i,t} &amp; \\sim \\text{Normal}(0, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Moving average coefficients <span class=\"math inline\">\\(\\theta\\)</span> are independently estimated for\neach series and will be forced to be stationary by default <span class=\"math inline\">\\((abs(\\theta)&lt;1)\\)</span>. Only moving averages\nof order <span class=\"math inline\">\\(q=1\\)</span> are currently\nallowed.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"multivariate-random-walks\">Multivariate Random Walks<a class=\"anchor\" aria-label=\"anchor\" href=\"#multivariate-random-walks\"></a>\n</h3>\n<p>If more than one series is included in <code>data</code> <span class=\"math inline\">\\((N_{series} &gt; 1)\\)</span>, a multivariate\nRandom Walk can be set up using\n<code>trend_model = RW(cor = TRUE)</code>, resulting in the\nfollowing:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{MVNormal}(z_{t-1}, \\Sigma)\n\\end{align*}\\]</span></p>\n<p>Where the latent process estimate <span class=\"math inline\">\\(z_t\\)</span> now takes the form of a vector. The\ncovariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span> will\ncapture contemporaneously correlated process errors. It is parameterised\nusing a Cholesky factorization, which requires priors on the\nseries-level variances <span class=\"math inline\">\\(\\sigma\\)</span> and\non the strength of correlations using <code>Stan</code>’s\n<code>lkj_corr_cholesky</code> distribution.</p>\n<p>Moving average terms can also be included for multivariate random\nwalks, in which case the moving average coefficients <span class=\"math inline\">\\(\\theta\\)</span> will be parameterised as an <span class=\"math inline\">\\(N_{series} * N_{series}\\)</span> matrix</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"autoregressive-processes\">Autoregressive processes<a class=\"anchor\" aria-label=\"anchor\" href=\"#autoregressive-processes\"></a>\n</h3>\n<p>Autoregressive models up to <span class=\"math inline\">\\(p=3\\)</span>,\nin which the autoregressive coefficients are estimated independently for\neach series, can be used by specifying <code>trend_model = 'AR1'</code>,\n<code>trend_model = 'AR2'</code>, <code>trend_model = 'AR3'</code>, or\n<code>trend_model = AR(p = 1, 2, or 3)</code>. For example, a univariate\nAR(1) model takes the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(ar1_i * z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>All options are the same as for Random Walks, but additional options\nwill be available for placing priors on the autoregressive coefficients.\nBy default, these coefficients will not be forced into stationarity, but\nusers can impose this restriction by changing the upper and lower bounds\non their priors. See <code><a href=\"../reference/get_mvgam_priors.html\">?get_mvgam_priors</a></code> for more\ndetails.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"vector-autoregressive-processes\">Vector Autoregressive processes<a class=\"anchor\" aria-label=\"anchor\" href=\"#vector-autoregressive-processes\"></a>\n</h3>\n<p>A Vector Autoregression of order <span class=\"math inline\">\\(p=1\\)</span> can be specified if <span class=\"math inline\">\\(N_{series} &gt; 1\\)</span> using\n<code>trend_model = 'VAR1'</code> or <code>trend_model = VAR()</code>. A\nVAR(1) model takes the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{Normal}(A * z_{t-1}, \\Sigma)\n\\end{align*}\\]</span></p>\n<p>Where <span class=\"math inline\">\\(A\\)</span> is an <span class=\"math inline\">\\(N_{series} * N_{series}\\)</span> matrix of\nautoregressive coefficients in which the diagonals capture lagged\nself-dependence (i.e. the effect of a process at time <span class=\"math inline\">\\(t\\)</span> on its own estimate at time <span class=\"math inline\">\\(t+1\\)</span>), while off-diagonals capture lagged\ncross-dependence (i.e. the effect of a process at time <span class=\"math inline\">\\(t\\)</span> on the process for another series at\ntime <span class=\"math inline\">\\(t+1\\)</span>). By default, the\ncovariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span> will\nassume no process error covariance by fixing the off-diagonals to <span class=\"math inline\">\\(0\\)</span>. To allow for correlated errors, use\n<code>trend_model = 'VAR1cor'</code> or\n<code>trend_model = VAR(cor = TRUE)</code>. A moving average of order\n<span class=\"math inline\">\\(q=1\\)</span> can also be included using\n<code>trend_model = VAR(ma = TRUE, cor = TRUE)</code>.</p>\n<p>Note that for all VAR models, stationarity of the process is enforced\nwith a structured prior distribution that is described in detail in <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\" class=\"external-link\">Heaps\n2022</a></p>\n<p>Heaps, Sarah E. “<a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\" class=\"external-link\">Enforcing\nstationarity through the prior in vector autoregressions.</a>”\n<em>Journal of Computational and Graphical Statistics</em> 32.1 (2023):\n74-83.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"hierarchical-processes\">Hierarchical processes<a class=\"anchor\" aria-label=\"anchor\" href=\"#hierarchical-processes\"></a>\n</h3>\n<p>Several of the above-mentioned <code>trend_model</code> options can\nbe modified to account for grouping structures in <code>data</code> by\nsetting up hierarchical latent processes. If an optional grouping\nvariable (<code>gr</code>; which must be a <code>factor</code> in the\nsupplied <code>data</code>) exists, users can model hierarchical\nresidual correlation structures. where the residual correlations for a\nspecific level of <code>gr</code> are modelled hierarchically:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\Omega_{group} &amp; = \\alpha_{cor}\\Omega_{global} + (1 -\n\\alpha_{cor})\\Omega_{group, local} \\end{align*}\\]</span></p>\n<p>where <span class=\"math inline\">\\(\\Omega_{global}\\)</span> is a\n<em>global</em> correlation matrix, <span class=\"math inline\">\\(\\Omega_{group, local}\\)</span> is a <em>local\ndeviation</em> correlation matrix and <span class=\"math inline\">\\(\\alpha_{cor}\\)</span> is a weighting parameter\ncontrolling how strongly the local correlation matrix <span class=\"math inline\">\\(\\Omega_{group}\\)</span> (i.e. the derived\ncorrelation matrix that will be used for each level of the grouping\nfactor <code>gr</code>) is shrunk towards the global correlation matrix\n<span class=\"math inline\">\\(\\Omega_{global}\\)</span> (larger values of\n<span class=\"math inline\">\\(\\alpha_{cor}\\)</span> indicate a greater\ndegree of shrinkage, i.e. a greater degree of partial pooling). This\noption is valuable for many types of designs where the same\nobservational units (i.e. <em>financial assets</em> or <em>species</em>,\nfor example) are measured in different strata (i.e. <em>regions</em>,\n<em>countries</em> or <em>experimental units</em>, for example).\nCurrently hierarchical correlations can be included for\n<code><a href=\"../reference/RW.html\">AR()</a></code>, <code><a href=\"../reference/RW.html\">VAR()</a></code> or <code><a href=\"../reference/ZMVN.html\">ZMVN()</a></code>\n<code>trend_model</code> options.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"gaussian-processes\">Gaussian Processes<a class=\"anchor\" aria-label=\"anchor\" href=\"#gaussian-processes\"></a>\n</h3>\n<p>The final option for modelling temporal dynamics is to use a Gaussian\nProcess with squared exponential kernel. These are set up independently\nfor each series (there is currently no multivariate GP option), using\n<code>trend_model = 'GP'</code>. The dynamics for each latent process\nare modelled as:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz &amp; \\sim \\text{MVNormal}(0, \\Sigma_{error}) \\\\\n\\Sigma_{error}[t_i, t_j] &amp; = \\alpha^2 * exp(-0.5 * ((|t_i - t_j| /\n\\rho))^2) \\end{align*}\\]</span></p>\n<p>The latent dynamic process evolves from a complex, high-dimensional\nMultivariate Normal distribution which depends on <span class=\"math inline\">\\(\\rho\\)</span> (often called the length scale\nparameter) to control how quickly the correlations between the model’s\nerrors decay as a function of time. For these models, covariance decays\nexponentially fast with the squared distance (in time) between the\nobservations. The functions also depend on a parameter <span class=\"math inline\">\\(\\alpha\\)</span>, which controls the marginal\nvariability of the temporal function at all points; in other words it\ncontrols how much the GP term contributes to the linear predictor.\n<code>mvgam</code> capitalizes on some advances that allow GPs to be\napproximated using Hilbert space basis functions, which <a href=\"https://link.springer.com/article/10.1007/s11222-022-10167-2\" target=\"_blank\" class=\"external-link\">considerably speed up computation at little cost to\naccuracy or prediction performance</a>.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"piecewise-logistic-and-linear-trends\">Piecewise logistic and linear trends<a class=\"anchor\" aria-label=\"anchor\" href=\"#piecewise-logistic-and-linear-trends\"></a>\n</h3>\n<p>Modeling growth for many types of time series is often similar to\nmodeling population growth in natural ecosystems, where there series\nexhibits nonlinear growth that saturates at some particular carrying\ncapacity. The logistic trend model available in {<code>mvgam</code>}\nallows for a time-varying capacity <span class=\"math inline\">\\(C(t)\\)</span> as well as a non-constant growth\nrate. Changes in the base growth rate <span class=\"math inline\">\\(k\\)</span> are incorporated by explicitly defining\nchangepoints throughout the training period where the growth rate is\nallowed to vary. The changepoint vector <span class=\"math inline\">\\(a\\)</span> is represented as a vector of\n<code>1</code>s and <code>0</code>s, and the rate of growth at time\n<span class=\"math inline\">\\(t\\)</span> is represented as <span class=\"math inline\">\\(k+a(t)^T\\delta\\)</span>. Potential changepoints\nare selected uniformly across the training period, and the number of\nchangepoints, as well as the flexibility of the potential rate changes\nat these changepoints, can be controlled using\n<code>trend_model = PW()</code>. The full piecewise logistic growth\nmodel is then:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_t &amp; = \\frac{C_t}{1 +\n\\exp(-(k+a(t)^T\\delta)(t-(m+a(t)^T\\gamma)))}  \\end{align*}\\]</span></p>\n<p>For time series that do not appear to exhibit saturating growth, a\npiece-wise constant rate of growth can often provide a useful trend\nmodel. The piecewise linear trend is defined as:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_t &amp; = (k+a(t)^T\\delta)t +\n(m+a(t)^T\\gamma)  \\end{align*}\\]</span></p>\n<p>In both trend models, <span class=\"math inline\">\\(m\\)</span> is an\noffset parameter that controls the trend intercept. Because of this\nparameter, it is not recommended that you include an intercept in your\nobservation formula because this will not be identifiable. You can read\nabout the full description of piecewise linear and logistic trends <a href=\"https://www.tandfonline.com/doi/abs/10.1080/00031305.2017.1380080\" target=\"_blank\" class=\"external-link\">in this paper by Taylor and Letham</a>.</p>\n<p>Sean J. Taylor and Benjamin Letham. “<a href=\"https://www.tandfonline.com/doi/full/10.1080/00031305.2017.1380080\" class=\"external-link\">Forecasting\nat scale.</a>” <em>The American Statistician</em> 72.1 (2018):\n37-45.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"continuous-time-ar1-processes\">Continuous time AR(1) processes<a class=\"anchor\" aria-label=\"anchor\" href=\"#continuous-time-ar1-processes\"></a>\n</h3>\n<p>Most trend models in the <code><a href=\"../reference/mvgam.html\">mvgam()</a></code> function expect time to\nbe measured in regularly-spaced, discrete intervals (i.e. one\nmeasurement per week, or one per year for example). But some time series\nare taken at irregular intervals and we’d like to model autoregressive\nproperties of these. The <code>trend_model = CAR()</code> can be useful\nto set up these models, which currently only support autoregressive\nprocesses of order <code>1</code>. The evolution of the latent dynamic\nprocess follows the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(ar1_i^{distance} * z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Where <span class=\"math inline\">\\(distance\\)</span> is a vector of\nnon-negative measurements of the time differences between successive\nobservations. See the <strong>Examples</strong> section in\n<code><a href=\"../reference/RW.html\">?CAR</a></code> for an illustration of how to set these models up.</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"regression-formulae\">Regression formulae<a class=\"anchor\" aria-label=\"anchor\" href=\"#regression-formulae\"></a>\n</h2>\n<p><code>mvgam</code> supports an observation model regression formula,\nbuilt off the <code>mgcv</code> package, as well as an optional process\nmodel regression formula. The formulae supplied to are exactly like\nthose supplied to <code><a href=\"https://rdrr.io/r/stats/glm.html\" class=\"external-link\">glm()</a></code> except that smooth terms,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti()</a></code> and\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/t2.html\" class=\"external-link\">t2()</a></code>, time-varying effects using <code><a href=\"../reference/dynamic.html\">dynamic()</a></code>,\nmonotonically increasing (using <code>s(x, bs = 'moi')</code>) or\ndecreasing splines (using <code>s(x, bs = 'mod')</code>; see\n<code><a href=\"../reference/monotonic.html\">?smooth.construct.moi.smooth.spec</a></code> for details), as well as\nGaussian Process functions using <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code>, can be added to the\nright hand side (and <code>.</code> is not supported in\n<code>mvgam</code> formulae). See <code><a href=\"../reference/mvgam_formulae.html\">?mvgam_formulae</a></code> for more\nguidance.</p>\n<p>For setting up State-Space models, the optional process model formula\ncan be used (see <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">the\nState-Space model vignette</a> and <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">the\nshared latent states vignette</a> for guidance on using trend\nformulae).</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"example-time-series-data\">Example time series data<a class=\"anchor\" aria-label=\"anchor\" href=\"#example-time-series-data\"></a>\n</h2>\n<p>The ‘portal_data’ object contains time series of rodent captures from\nthe Portal Project, <a href=\"https://portal.weecology.org/\" target=\"_blank\" class=\"external-link\">a long-term monitoring study based near the town of\nPortal, Arizona</a>. Researchers have been operating a standardized set\nof baited traps within 24 experimental plots at this site since the\n1970’s. Sampling follows the lunar monthly cycle, with observations\noccurring on average about 28 days apart. However, missing observations\ndo occur due to difficulties accessing the site (weather events, COVID\ndisruptions etc…). You can read about the full sampling protocol <a href=\"https://www.biorxiv.org/content/10.1101/332783v3.full\" target=\"_blank\" class=\"external-link\">in this preprint by Ernest et al on the Biorxiv</a>.</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/data.html\" class=\"external-link\">data</a></span><span class=\"op\">(</span><span class=\"st\">\"portal_data\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p>As the data come pre-loaded with the <code>mvgam</code> package, you\ncan read a little about it in the help page using\n<code><a href=\"../reference/portal_data.html\">?portal_data</a></code>. Before working with data, it is important to\ninspect how the data are structured, first using <code>head</code>:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">portal_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;   moon DM DO PP OT year month mintemp precipitation     ndvi</span></span>\n<span><span class=\"co\">#&gt; 1  329 10  6  0  2 2004     1  -9.710          37.8 1.465889</span></span>\n<span><span class=\"co\">#&gt; 2  330 14  8  1  0 2004     2  -5.924           8.7 1.558507</span></span>\n<span><span class=\"co\">#&gt; 3  331  9  1  2  1 2004     3  -0.220          43.5 1.337817</span></span>\n<span><span class=\"co\">#&gt; 4  332 NA NA NA NA 2004     4   1.931          23.9 1.658913</span></span>\n<span><span class=\"co\">#&gt; 5  333 15  8 10  1 2004     5   6.568           0.9 1.853656</span></span>\n<span><span class=\"co\">#&gt; 6  334 NA NA NA NA 2004     6  11.590           1.4 1.761330</span></span></code></pre></div>\n<p>But the <code>glimpse</code> function in <code>dplyr</code> is also\nuseful for understanding how variables are structured</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">portal_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 199</span></span>\n<span><span class=\"co\">#&gt; Columns: 10</span></span>\n<span><span class=\"co\">#&gt; $ moon          <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 3…</span></span>\n<span><span class=\"co\">#&gt; $ DM            <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 10, 14, 9, <span style=\"color: #BB0000;\">NA</span>, 15, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 9, 5, 8, <span style=\"color: #BB0000;\">NA</span>, 14, 7, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 9…</span></span>\n<span><span class=\"co\">#&gt; $ DO            <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 6, 8, 1, <span style=\"color: #BB0000;\">NA</span>, 8, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 3, 3, 4, <span style=\"color: #BB0000;\">NA</span>, 3, 8, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 3, <span style=\"color: #BB0000;\">NA</span>…</span></span>\n<span><span class=\"co\">#&gt; $ PP            <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 0, 1, 2, <span style=\"color: #BB0000;\">NA</span>, 10, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 16, 18, 12, <span style=\"color: #BB0000;\">NA</span>, 3, 2, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 1…</span></span>\n<span><span class=\"co\">#&gt; $ OT            <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 2, 0, 1, <span style=\"color: #BB0000;\">NA</span>, 1, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 1, 0, 0, <span style=\"color: #BB0000;\">NA</span>, 2, 1, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 1, <span style=\"color: #BB0000;\">NA</span>…</span></span>\n<span><span class=\"co\">#&gt; $ year          <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 20…</span></span>\n<span><span class=\"co\">#&gt; $ month         <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,…</span></span>\n<span><span class=\"co\">#&gt; $ mintemp       <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -9.710, -5.924, -0.220, 1.931, 6.568, 11.590, 14.370, 16…</span></span>\n<span><span class=\"co\">#&gt; $ precipitation <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 37.8, 8.7, 43.5, 23.9, 0.9, 1.4, 20.3, 91.0, 60.5, 25.2,…</span></span>\n<span><span class=\"co\">#&gt; $ ndvi          <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.4658889, 1.5585069, 1.3378172, 1.6589129, 1.8536561, 1…</span></span></code></pre></div>\n<p>We will focus analyses on the time series of captures for one\nspecific rodent species, the Desert Pocket Mouse <em>Chaetodipus\npenicillatus</em>. This species is interesting in that it goes into a\nkind of “hibernation” during the colder months, leading to very low\ncaptures during the winter period</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"manipulating-data-for-modelling\">Manipulating data for modelling<a class=\"anchor\" aria-label=\"anchor\" href=\"#manipulating-data-for-modelling\"></a>\n</h2>\n<p>Manipulating the data into a ‘long’ format is necessary for modelling\nin <code>mvgam</code>. By ‘long’ format, we mean that each\n<code>series x time</code> observation needs to have its own entry in\nthe <code>dataframe</code> or <code>list</code> object that we wish to\nuse as data for modelling. A simple example can be viewed by simulating\ndata using the <code>sim_mvgam</code> function. See\n<code><a href=\"../reference/sim_mvgam.html\">?sim_mvgam</a></code> for more details</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">4</span>, T <span class=\"op\">=</span> <span class=\"fl\">24</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, <span class=\"fl\">12</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;    y season year   series time</span></span>\n<span><span class=\"co\">#&gt; 1  3      1    1 series_1    1</span></span>\n<span><span class=\"co\">#&gt; 2  3      1    1 series_2    1</span></span>\n<span><span class=\"co\">#&gt; 3  1      1    1 series_3    1</span></span>\n<span><span class=\"co\">#&gt; 4  3      1    1 series_4    1</span></span>\n<span><span class=\"co\">#&gt; 5  1      2    1 series_1    2</span></span>\n<span><span class=\"co\">#&gt; 6  0      2    1 series_2    2</span></span>\n<span><span class=\"co\">#&gt; 7  2      2    1 series_3    2</span></span>\n<span><span class=\"co\">#&gt; 8  3      2    1 series_4    2</span></span>\n<span><span class=\"co\">#&gt; 9  2      3    1 series_1    3</span></span>\n<span><span class=\"co\">#&gt; 10 0      3    1 series_2    3</span></span>\n<span><span class=\"co\">#&gt; 11 1      3    1 series_3    3</span></span>\n<span><span class=\"co\">#&gt; 12 0      3    1 series_4    3</span></span></code></pre></div>\n<p>Notice how we have four different time series in these simulated\ndata, but we do not spread the outcome values into different columns.\nRather, there is only a single column for the outcome variable, labelled\n<code>y</code> in these simulated data. We also must supply a variable\nlabelled <code>time</code> to ensure the modelling software knows how to\narrange the time series when building models. This setup still allows us\nto formulate multivariate time series models, as you can see in the <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space\nvignette</a>. Below are the steps needed to shape our\n<code>portal_data</code> object into the correct form. First, we create\na <code>time</code> variable, select the column representing counts of\nour target species (<code>PP</code>), and select appropriate variables\nthat we can use as predictors</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">portal_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># mvgam requires a 'time' variable be present in the data to index</span></span>\n<span>  <span class=\"co\"># the temporal observations. This is especially important when tracking </span></span>\n<span>  <span class=\"co\"># multiple time series. In the Portal data, the 'moon' variable indexes the</span></span>\n<span>  <span class=\"co\"># lunar monthly timestep of the trapping sessions</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"va\">moon</span> <span class=\"op\">-</span> <span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">min</a></span><span class=\"op\">(</span><span class=\"va\">moon</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">1</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># We can also provide a more informative name for the outcome variable, which </span></span>\n<span>  <span class=\"co\"># is counts of the 'PP' species (Chaetodipus penicillatus) across all control</span></span>\n<span>  <span class=\"co\"># plots</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>count <span class=\"op\">=</span> <span class=\"va\">PP</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># The other requirement for mvgam is a 'series' variable, which needs to be a</span></span>\n<span>  <span class=\"co\"># factor variable to index which time series each row in the data belongs to.</span></span>\n<span>  <span class=\"co\"># Again, this is more useful when you have multiple time series in the data</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"st\">'PP'</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># Select the variables of interest to keep in the model_data</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, <span class=\"va\">year</span>, <span class=\"va\">time</span>, <span class=\"va\">count</span>, <span class=\"va\">mintemp</span>, <span class=\"va\">ndvi</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">model_data</span></span></code></pre></div>\n<p>The data now contain six variables:<br><code>series</code>, a factor indexing which time series each\nobservation belongs to<br><code>year</code>, the year of sampling<br><code>time</code>, the indicator of which time step each observation\nbelongs to<br><code>count</code>, the response variable representing the number of\ncaptures of the species <code>PP</code> in each sampling\nobservation<br><code>mintemp</code>, the monthly average minimum temperature at each\ntime step<br><code>ndvi</code>, the monthly average Normalized Difference Vegetation\nIndex at each time step</p>\n<p>Now check the data structure again</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">model_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;   series year time count mintemp     ndvi</span></span>\n<span><span class=\"co\">#&gt; 1     PP 2004    1     0  -9.710 1.465889</span></span>\n<span><span class=\"co\">#&gt; 2     PP 2004    2     1  -5.924 1.558507</span></span>\n<span><span class=\"co\">#&gt; 3     PP 2004    3     2  -0.220 1.337817</span></span>\n<span><span class=\"co\">#&gt; 4     PP 2004    4    NA   1.931 1.658913</span></span>\n<span><span class=\"co\">#&gt; 5     PP 2004    5    10   6.568 1.853656</span></span>\n<span><span class=\"co\">#&gt; 6     PP 2004    6    NA  11.590 1.761330</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">model_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 199</span></span>\n<span><span class=\"co\">#&gt; Columns: 6</span></span>\n<span><span class=\"co\">#&gt; $ series  <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP…</span></span>\n<span><span class=\"co\">#&gt; $ year    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 20…</span></span>\n<span><span class=\"co\">#&gt; $ time    <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,…</span></span>\n<span><span class=\"co\">#&gt; $ count   <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 0, 1, 2, <span style=\"color: #BB0000;\">NA</span>, 10, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 16, 18, 12, <span style=\"color: #BB0000;\">NA</span>, 3, 2, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 13, <span style=\"color: #BB0000;\">NA</span>,…</span></span>\n<span><span class=\"co\">#&gt; $ mintemp <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -9.710, -5.924, -0.220, 1.931, 6.568, 11.590, 14.370, 16.520, …</span></span>\n<span><span class=\"co\">#&gt; $ ndvi    <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.4658889, 1.5585069, 1.3378172, 1.6589129, 1.8536561, 1.76132…</span></span></code></pre></div>\n<p>You can also summarize multiple variables, which is helpful to search\nfor data ranges and identify missing values</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">model_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  series        year           time           count          mintemp       </span></span>\n<span><span class=\"co\">#&gt;  PP:199   Min.   :2004   Min.   :  1.0   Min.   : 0.00   Min.   :-24.000  </span></span>\n<span><span class=\"co\">#&gt;           1st Qu.:2008   1st Qu.: 50.5   1st Qu.: 2.50   1st Qu.: -3.884  </span></span>\n<span><span class=\"co\">#&gt;           Median :2012   Median :100.0   Median :12.00   Median :  2.130  </span></span>\n<span><span class=\"co\">#&gt;           Mean   :2012   Mean   :100.0   Mean   :15.14   Mean   :  3.504  </span></span>\n<span><span class=\"co\">#&gt;           3rd Qu.:2016   3rd Qu.:149.5   3rd Qu.:24.00   3rd Qu.: 12.310  </span></span>\n<span><span class=\"co\">#&gt;           Max.   :2020   Max.   :199.0   Max.   :65.00   Max.   : 18.140  </span></span>\n<span><span class=\"co\">#&gt;                                          NA's   :36                       </span></span>\n<span><span class=\"co\">#&gt;       ndvi       </span></span>\n<span><span class=\"co\">#&gt;  Min.   :0.2817  </span></span>\n<span><span class=\"co\">#&gt;  1st Qu.:1.0741  </span></span>\n<span><span class=\"co\">#&gt;  Median :1.3501  </span></span>\n<span><span class=\"co\">#&gt;  Mean   :1.4709  </span></span>\n<span><span class=\"co\">#&gt;  3rd Qu.:1.8178  </span></span>\n<span><span class=\"co\">#&gt;  Max.   :3.9126  </span></span>\n<span><span class=\"co\">#&gt; </span></span></code></pre></div>\n<p>We have some <code>NA</code>s in our response variable\n<code>count</code>. These observations will generally be thrown out by\nmost modelling packages in . But as you will see when we work through\nthe tutorials, <code>mvgam</code> keeps these in the data so that\npredictions can be automatically returned for the full dataset. The time\nseries and some of its descriptive features can be plotted using\n<code><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">model_data</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span>, y <span class=\"op\">=</span> <span class=\"st\">'count'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-6-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"glms-with-temporal-random-effects\">GLMs with temporal random effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#glms-with-temporal-random-effects\"></a>\n</h2>\n<p>Our first task will be to fit a Generalized Linear Model (GLM) that\ncan adequately capture the features of our <code>count</code>\nobservations (integer data, lower bound at zero, missing values) while\nalso attempting to model temporal variation. We are almost ready to fit\nour first model, which will be a GLM with Poisson observations, a log\nlink function and random (hierarchical) intercepts for\n<code>year</code>. This will allow us to capture our prior belief that,\nalthough each year is unique, having been sampled from the same\npopulation of effects, all years are connected and thus might contain\nvaluable information about one another. This will be done by\ncapitalizing on the partial pooling properties of hierarchical models.\nHierarchical (also known as random) effects offer many advantages when\nmodelling data with grouping structures (i.e. multiple species,\nlocations, years etc…). The ability to incorporate these in time series\nmodels is a huge advantage over traditional models such as ARIMA or\nExponential Smoothing. But before we fit the model, we will need to\nconvert <code>year</code> to a factor so that we can use a random effect\nbasis in <code>mvgam</code>. See <code>?smooth.terms</code> and\n<code>?smooth.construct.re.smooth.spec</code> for details about the\n<code>re</code> basis construction that is used by both\n<code>mvgam</code> and <code>mgcv</code></p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># Create a 'year_fac' factor version of 'year'</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>year_fac <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">year</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">model_data</span></span></code></pre></div>\n<p>Preview the dataset to ensure year is now a factor with a unique\nfactor level for each year in the data</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">model_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 199</span></span>\n<span><span class=\"co\">#&gt; Columns: 7</span></span>\n<span><span class=\"co\">#&gt; $ series   <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, P…</span></span>\n<span><span class=\"co\">#&gt; $ year     <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2…</span></span>\n<span><span class=\"co\">#&gt; $ time     <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18…</span></span>\n<span><span class=\"co\">#&gt; $ count    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 0, 1, 2, <span style=\"color: #BB0000;\">NA</span>, 10, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 16, 18, 12, <span style=\"color: #BB0000;\">NA</span>, 3, 2, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 13, <span style=\"color: #BB0000;\">NA</span>…</span></span>\n<span><span class=\"co\">#&gt; $ mintemp  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -9.710, -5.924, -0.220, 1.931, 6.568, 11.590, 14.370, 16.520,…</span></span>\n<span><span class=\"co\">#&gt; $ ndvi     <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.4658889, 1.5585069, 1.3378172, 1.6589129, 1.8536561, 1.7613…</span></span>\n<span><span class=\"co\">#&gt; $ year_fac <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2…</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">model_data</span><span class=\"op\">$</span><span class=\"va\">year_fac</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] \"2004\" \"2005\" \"2006\" \"2007\" \"2008\" \"2009\" \"2010\" \"2011\" \"2012\" \"2013\"</span></span>\n<span><span class=\"co\">#&gt; [11] \"2014\" \"2015\" \"2016\" \"2017\" \"2018\" \"2019\" \"2020\"</span></span></code></pre></div>\n<p>We are now ready for our first <code>mvgam</code> model. The syntax\nwill be familiar to users who have previously built models with\n<code>mgcv</code>. But for a refresher, see <code>?formula.gam</code>\nand the examples in <code>?gam</code>. Random effects can be specified\nusing the <code>s</code> wrapper with the <code>re</code> basis. Note\nthat we can also suppress the primary intercept using the usual\n<code>R</code> formula syntax <code>- 1</code>. <code>mvgam</code> has a\nnumber of possible observation families that can be used, see\n<code><a href=\"../reference/mvgam_families.html\">?mvgam_families</a></code> for more information. We will use\n<code>Stan</code> as the fitting engine, which deploys Hamiltonian Monte\nCarlo (HMC) for full Bayesian inference. By default, 4 HMC chains will\nbe run using a warmup of 500 iterations and collecting 500 posterior\nsamples from each chain. The package will also aim to use the\n<code>Cmdstan</code> backend when possible, so it is recommended that\nusers have an up-to-date installation of <code>Cmdstan</code> and the\nassociated <code>cmdstanr</code> interface on their machines (note that\nyou can set the backend yourself using the <code>backend</code>\nargument: see <code><a href=\"../reference/mvgam.html\">?mvgam</a></code> for details). Interested users should\nconsult the <a href=\"https://mc-stan.org/docs/stan-users-guide/index.html\" target=\"_blank\" class=\"external-link\"><code>Stan</code> user’s guide</a> for more information\nabout the software and the enormous variety of models that can be\ntackled with HMC.</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">count</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">year_fac</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>                family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                data <span class=\"op\">=</span> <span class=\"va\">model_data</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The model can be described mathematically for each timepoint <span class=\"math inline\">\\(t\\)</span> as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = \\beta_{year[year_t]} \\\\\n\\beta_{year} &amp; \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year})\n\\end{align*}\\]</span></p>\n<p>Where the <span class=\"math inline\">\\(\\beta_{year}\\)</span> effects\nare drawn from a <em>population</em> distribution that is parameterized\nby a common mean <span class=\"math inline\">\\((\\mu_{year})\\)</span> and\nvariance <span class=\"math inline\">\\((\\sigma_{year})\\)</span>. Priors on\nmost of the model parameters can be interrogated and changed using\nsimilar functionality to the options available in <code>brms</code>. For\nexample, the default priors on <span class=\"math inline\">\\((\\mu_{year})\\)</span> and <span class=\"math inline\">\\((\\sigma_{year})\\)</span> can be viewed using the\nfollowing code:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span><span class=\"va\">count</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">year_fac</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">model_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;                      param_name param_length           param_info</span></span>\n<span><span class=\"co\">#&gt; 1             vector[1] mu_raw;            1 s(year_fac) pop mean</span></span>\n<span><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[1] sigma_raw;            1   s(year_fac) pop sd</span></span>\n<span><span class=\"co\">#&gt;                               prior                 example_change</span></span>\n<span><span class=\"co\">#&gt; 1            mu_raw ~ std_normal();  mu_raw ~ normal(-0.52, 0.32);</span></span>\n<span><span class=\"co\">#&gt; 2 sigma_raw ~ student_t(3, 0, 2.5); sigma_raw ~ exponential(0.53);</span></span>\n<span><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<p>See examples in <code><a href=\"../reference/get_mvgam_priors.html\">?get_mvgam_priors</a></code> to find out different\nways that priors can be altered. Once the model has finished, the first\nstep is to inspect the <code>summary</code> to ensure no major\ndiagnostic warnings have been produced and to quickly summarise\nposterior distributions for key parameters</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">model1</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; count ~ s(year_fac, bs = \"re\") - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; poisson</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 199 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;                 2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).1   1.80 2.1   2.3 1.00  2952</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).2   2.50 2.7   2.8 1.00  2499</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).3   3.00 3.1   3.2 1.00  2450</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).4   3.10 3.3   3.4 1.00  2896</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).5   1.90 2.1   2.3 1.00  3131</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).6   1.50 1.8   2.0 1.00  2330</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).7   1.80 2.0   2.3 1.00  2578</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).8   2.80 3.0   3.1 1.00  2998</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).9   3.10 3.2   3.4 1.00  2444</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).10  2.60 2.8   2.9 1.00  2269</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).11  2.90 3.1   3.2 1.00  3104</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).12  3.10 3.2   3.3 1.00  2814</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).13  2.00 2.3   2.5 1.00  2584</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).14  2.50 2.6   2.8 1.00  2500</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).15  1.90 2.2   2.4 1.00  2601</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).16  1.90 2.1   2.3 1.00  2783</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).17 -0.29 1.0   1.9 1.01   590</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM group-level estimates:</span></span>\n<span><span class=\"co\">#&gt;                   2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; mean(s(year_fac)) 2.10 2.40   2.7 1.02   160</span></span>\n<span><span class=\"co\">#&gt; sd(s(year_fac))   0.46 0.68   1.1 1.01   223</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span><span class=\"co\">#&gt;              edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(year_fac) 12.8     17   1758  &lt;2e-16 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:05:09 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(model1) to get started describing this model</span></span></code></pre></div>\n<p>The diagnostic messages at the bottom of the summary show that the\nHMC sampler did not encounter any problems or difficult posterior\nspaces. This is a good sign. Posterior distributions for model\nparameters can be extracted in any way that an object of class\n<code>brmsfit</code> can (see <code><a href=\"../reference/mvgam_draws.html\">?mvgam::mvgam_draws</a></code> for\ndetails). For example, we can extract the coefficients related to the\nGAM linear predictor (i.e. the <span class=\"math inline\">\\(\\beta\\)</span>’s) into a <code>data.frame</code>\nusing:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">beta_post</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.data.frame.html\" class=\"external-link\">as.data.frame</a></span><span class=\"op\">(</span><span class=\"va\">model1</span>, variable <span class=\"op\">=</span> <span class=\"st\">'betas'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">beta_post</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 2,000</span></span>\n<span><span class=\"co\">#&gt; Columns: 17</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).1`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.24750, 1.90580, 2.05282, 2.13643, 2.00244, 2.05844,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).2`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.70431, 2.65140, 2.64873, 2.69983, 2.59428, 2.72077,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).3`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 3.08997, 3.01857, 3.14596, 3.00698, 3.12615, 3.09019,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).4`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 3.32873, 3.27549, 3.22856, 3.24602, 3.21468, 3.21990,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).5`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.11989, 2.18383, 2.10280, 1.97372, 2.13022, 2.12983,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).6`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.89307, 1.70960, 1.72953, 1.68534, 1.77066, 1.73519,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).7`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.06631, 2.11429, 1.88207, 2.08131, 2.06614, 1.92626,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).8`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.90509, 2.99382, 2.93212, 3.04373, 2.82881, 3.04845,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).9`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 3.27292, 3.31954, 3.12765, 3.20833, 3.28495, 3.23128,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).10` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.78318, 2.67944, 2.78202, 2.69068, 2.70938, 2.80262,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).11` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 3.00746, 2.98039, 3.14399, 2.98110, 3.07569, 3.05284,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).12` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 3.20087, 3.14174, 3.24543, 3.29494, 3.19153, 3.17930,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).13` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.36027, 2.16231, 2.25140, 2.14675, 2.23117, 2.29141,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).14` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.61637, 2.65665, 2.67817, 2.72201, 2.69925, 2.58293,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).15` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.10499, 2.30554, 2.46154, 2.25384, 2.02545, 2.29679,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).16` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.11230, 2.07353, 2.01463, 1.95542, 2.10797, 2.02406,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).17` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.2708600, 0.9398070, 0.9854610, 1.0112900, 1.5607200…</span></span></code></pre></div>\n<p>With any model fitted in <code>mvgam</code>, the underlying\n<code>Stan</code> code can be viewed using the <code>code</code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">model1</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span><span class=\"co\">#&gt; data {</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; parameters {</span></span>\n<span><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // random effect variances</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[1] sigma_raw;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // random effect means</span></span>\n<span><span class=\"co\">#&gt;   vector[1] mu_raw;</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span><span class=\"co\">#&gt;   b[1 : 17] = mu_raw[1] + b_raw[1 : 17] * sigma_raw[1];</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; model {</span></span>\n<span><span class=\"co\">#&gt;   // prior for random effect population variances</span></span>\n<span><span class=\"co\">#&gt;   sigma_raw ~ student_t(3, 0, 2.5);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for random effect population means</span></span>\n<span><span class=\"co\">#&gt;   mu_raw ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior (non-centred) for s(year_fac)...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[1 : 17] ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   {</span></span>\n<span><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; generated quantities {</span></span>\n<span><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span></span>\n<span><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<div class=\"section level3\">\n<h3 id=\"plotting-effects-and-residuals\">Plotting effects and residuals<a class=\"anchor\" aria-label=\"anchor\" href=\"#plotting-effects-and-residuals\"></a>\n</h3>\n<p>Now for interrogating the model. We can get some sense of the\nvariation in yearly intercepts from the summary above, but it is easier\nto understand them using targeted plots. Plot posterior distributions of\nthe temporal random effects using <code>plot.mvgam</code> with\n<code>type = 're'</code>. See <code><a href=\"../reference/plot.mvgam.html\">?plot.mvgam</a></code> for more details\nabout the types of plots that can be produced from fitted\n<code>mvgam</code> objects</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">model1</span>, type <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/Plot%20random%20effect%20estimates-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"bayesplot-support\">\n<code>bayesplot</code> support<a class=\"anchor\" aria-label=\"anchor\" href=\"#bayesplot-support\"></a>\n</h3>\n<p>We can also capitalize on most of the useful MCMC plotting functions\nfrom the <code>bayesplot</code> package to visualize posterior\ndistributions and diagnostics (see <code><a href=\"../reference/mcmc_plot.mvgam.html\">?mvgam::mcmc_plot.mvgam</a></code>\nfor details):</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span>object <span class=\"op\">=</span> <span class=\"va\">model1</span>,</span>\n<span>          variable <span class=\"op\">=</span> <span class=\"st\">'betas'</span>,</span>\n<span>          type <span class=\"op\">=</span> <span class=\"st\">'areas'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-13-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>We can also use the wide range of posterior checking functions\navailable in <code>bayesplot</code> (see\n<code>?mvgam::ppc_check.mvgam</code> for details):</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span>object <span class=\"op\">=</span> <span class=\"va\">model1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-14-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>There is clearly some variation in these yearly intercept estimates.\nBut how do these translate into time-varying predictions? To understand\nthis, we can plot posterior hindcasts from this model for the training\nperiod using <code>plot.mvgam</code> with\n<code>type = 'forecast'</code></p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">model1</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/Plot%20posterior%20hindcasts-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>If you wish to extract these hindcasts for other downstream analyses,\nthe <code>hindcast</code> function can be used. This will return a list\nobject of class <code>mvgam_forecast</code>. In the\n<code>hindcasts</code> slot, a matrix of posterior retrodictions will be\nreturned for each series in the data (only one series in our\nexample):</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/hindcast.mvgam.html\">hindcast</a></span><span class=\"op\">(</span><span class=\"va\">model1</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">hc</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; List of 15</span></span>\n<span><span class=\"co\">#&gt;  $ call              :Class 'formula'  language count ~ s(year_fac, bs = \"re\") - 1</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \".Environment\")=&lt;environment: R_GlobalEnv&gt; </span></span>\n<span><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span><span class=\"co\">#&gt;  $ family            : chr \"poisson\"</span></span>\n<span><span class=\"co\">#&gt;  $ trend_model       : chr \"None\"</span></span>\n<span><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span><span class=\"co\">#&gt;  $ fit_engine        : chr \"stan\"</span></span>\n<span><span class=\"co\">#&gt;  $ type              : chr \"response\"</span></span>\n<span><span class=\"co\">#&gt;  $ series_names      : chr \"PP\"</span></span>\n<span><span class=\"co\">#&gt;  $ train_observations:List of 1</span></span>\n<span><span class=\"co\">#&gt;   ..$ PP: int [1:199] 0 1 2 NA 10 NA NA 16 18 12 ...</span></span>\n<span><span class=\"co\">#&gt;  $ train_times       : num [1:199] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;  $ test_observations : NULL</span></span>\n<span><span class=\"co\">#&gt;  $ test_times        : NULL</span></span>\n<span><span class=\"co\">#&gt;  $ hindcasts         :List of 1</span></span>\n<span><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:199] 6 5 8 15 11 14 10 12 6 3 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:199] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ forecasts         : NULL</span></span>\n<span><span class=\"co\">#&gt;  - attr(*, \"class\")= chr \"mvgam_forecast\"</span></span></code></pre></div>\n<p>You can also extract these hindcasts on the linear predictor scale,\nwhich in this case is the log scale (our Poisson GLM used a log link\nfunction). Sometimes this can be useful for asking more targeted\nquestions about drivers of variation:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/hindcast.mvgam.html\">hindcast</a></span><span class=\"op\">(</span><span class=\"va\">model1</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/range.html\" class=\"external-link\">range</a></span><span class=\"op\">(</span><span class=\"va\">hc</span><span class=\"op\">$</span><span class=\"va\">hindcasts</span><span class=\"op\">$</span><span class=\"va\">PP</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] -1.42247  3.50620</span></span></code></pre></div>\n<p>In any regression analysis, a key question is whether the residuals\nshow any patterns that can be indicative of un-modelled sources of\nvariation. For GLMs, we can use a modified residual called the <a href=\"https://www.jstor.org/stable/1390802\" target=\"_blank\" class=\"external-link\">Dunn-Smyth,\nor randomized quantile, residual</a>. Inspect Dunn-Smyth residuals from\nthe model using <code>plot.mvgam</code> with\n<code>type = 'residuals'</code></p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">model1</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/Plot%20posterior%20residuals-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"automatic-forecasting-for-new-data\">Automatic forecasting for new data<a class=\"anchor\" aria-label=\"anchor\" href=\"#automatic-forecasting-for-new-data\"></a>\n</h2>\n<p>These temporal random effects do not have a sense of “time”. Because\nof this, each yearly random intercept is not restricted in some way to\nbe similar to the previous yearly intercept. This drawback becomes\nevident when we predict for a new year. To do this, we can repeat the\nexercise above but this time will split the data into training and\ntesting sets before re-running the model. We can then supply the test\nset as <code>newdata</code>. For splitting, we will make use of the\n<code>filter</code> function from <code>dplyr</code></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span> </span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">time</span> <span class=\"op\">&lt;=</span> <span class=\"fl\">160</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">data_train</span> </span>\n<span><span class=\"va\">model_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span> </span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">time</span> <span class=\"op\">&gt;</span> <span class=\"fl\">160</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">data_test</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model1b</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">count</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">year_fac</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>                 family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                 data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span>\n<span>                 newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p>We can view the test data in the forecast plot to see that the\npredictions do not capture the temporal variation in the test set</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">model1b</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/Plotting%20predictions%20against%20test%20data-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>As with the <code>hindcast</code> function, we can use the\n<code>forecast</code> function to automatically extract the posterior\ndistributions for these predictions. This also returns an object of\nclass <code>mvgam_forecast</code>, but now it will contain both the\nhindcasts and forecasts for each series in the data:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">model1b</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; List of 16</span></span>\n<span><span class=\"co\">#&gt;  $ call              :Class 'formula'  language count ~ s(year_fac, bs = \"re\") - 1</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \".Environment\")=&lt;environment: R_GlobalEnv&gt; </span></span>\n<span><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span><span class=\"co\">#&gt;  $ family            : chr \"poisson\"</span></span>\n<span><span class=\"co\">#&gt;  $ family_pars       : NULL</span></span>\n<span><span class=\"co\">#&gt;  $ trend_model       : chr \"None\"</span></span>\n<span><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span><span class=\"co\">#&gt;  $ fit_engine        : chr \"stan\"</span></span>\n<span><span class=\"co\">#&gt;  $ type              : chr \"response\"</span></span>\n<span><span class=\"co\">#&gt;  $ series_names      : Factor w/ 1 level \"PP\": 1</span></span>\n<span><span class=\"co\">#&gt;  $ train_observations:List of 1</span></span>\n<span><span class=\"co\">#&gt;   ..$ PP: int [1:160] 0 1 2 NA 10 NA NA 16 18 12 ...</span></span>\n<span><span class=\"co\">#&gt;  $ train_times       : num [1:160] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span><span class=\"co\">#&gt;  $ test_observations :List of 1</span></span>\n<span><span class=\"co\">#&gt;   ..$ PP: int [1:39] NA 0 0 10 3 14 18 NA 28 46 ...</span></span>\n<span><span class=\"co\">#&gt;  $ test_times        : num [1:39] 161 162 163 164 165 166 167 168 169 170 ...</span></span>\n<span><span class=\"co\">#&gt;  $ hindcasts         :List of 1</span></span>\n<span><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:160] 8 4 11 6 10 7 4 13 2 9 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:160] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span></span>\n<span><span class=\"co\">#&gt;  $ forecasts         :List of 1</span></span>\n<span><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:39] 8 10 11 10 7 9 12 8 10 5 ...</span></span>\n<span><span class=\"co\">#&gt;   .. ..- attr(*, \"dimnames\")=List of 2</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span><span class=\"co\">#&gt;   .. .. ..$ : chr [1:39] \"ypred[161,1]\" \"ypred[162,1]\" \"ypred[163,1]\" \"ypred[164,1]\" ...</span></span>\n<span><span class=\"co\">#&gt;  - attr(*, \"class\")= chr \"mvgam_forecast\"</span></span></code></pre></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"adding-predictors-as-fixed-effects\">Adding predictors as “fixed” effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#adding-predictors-as-fixed-effects\"></a>\n</h2>\n<p>Any users familiar with GLMs will know that we nearly always wish to\ninclude predictor variables that may explain some of the variation in\nour observations. Predictors are easily incorporated into GLMs / GAMs.\nHere, we will update the model from above by including a parametric\n(fixed) effect of <code>ndvi</code> as a linear predictor:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">count</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">year_fac</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">+</span> </span>\n<span>                  <span class=\"va\">ndvi</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>                family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span>\n<span>                newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = \\beta_{year[year_t]} + \\beta_{ndvi} *\n\\boldsymbol{ndvi}_t \\\\\n\\beta_{year} &amp; \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\\\\n\\beta_{ndvi} &amp; \\sim \\text{Normal}(0, 1) \\end{align*}\\]</span></p>\n<p>Where the <span class=\"math inline\">\\(\\beta_{year}\\)</span> effects\nare the same as before but we now have another predictor <span class=\"math inline\">\\((\\beta_{ndvi})\\)</span> that applies to the\n<code>ndvi</code> value at each timepoint <span class=\"math inline\">\\(t\\)</span>. Inspect the summary of this model</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">model2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; count ~ ndvi + s(year_fac, bs = \"re\") - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; poisson</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 199 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;                2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ndvi           0.33 0.39  0.45    1  1642</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).1  1.10 1.40  1.60    1  2513</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).2  1.80 2.00  2.20    1  2354</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).3  2.20 2.40  2.60    1  1945</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).4  2.30 2.50  2.70    1  1837</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).5  1.20 1.40  1.60    1  2175</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).6  1.00 1.30  1.50    1  2603</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).7  1.10 1.40  1.70    1  2394</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).8  2.10 2.30  2.50    1  2341</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).9  2.70 2.90  3.00    1  1992</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).10 2.00 2.20  2.40    1  2523</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).11 2.30 2.40  2.60    1  2090</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).12 2.50 2.70  2.80    1  1974</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).13 1.40 1.60  1.80    1  2247</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).14 0.43 1.90  3.30    1  1820</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).15 0.57 1.90  3.20    1  1370</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).16 0.66 2.00  3.30    1  1308</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).17 0.63 2.00  3.30    1  1658</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM group-level estimates:</span></span>\n<span><span class=\"co\">#&gt;                   2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; mean(s(year_fac))  1.5 2.00   2.3 1.00   424</span></span>\n<span><span class=\"co\">#&gt; sd(s(year_fac))    0.4 0.61   1.0 1.01   388</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span><span class=\"co\">#&gt;              edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(year_fac) 10.8     17    275  &lt;2e-16 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:05:57 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(model2) to get started describing this model</span></span></code></pre></div>\n<p>Rather than printing the summary each time, we can also quickly look\nat the posterior empirical quantiles for the fixed effect of\n<code>ndvi</code> (and other linear predictor coefficients) using\n<code>coef</code>:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/coef.html\" class=\"external-link\">coef</a></span><span class=\"op\">(</span><span class=\"va\">model2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;                     2.5%       50%     97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ndvi           0.3256825 0.3899885 0.4531249    1  1642</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).1  1.1327712 1.4036350 1.6445010    1  2513</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).2  1.8074200 1.9992950 2.1872280    1  2354</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).3  2.1875958 2.3805100 2.5645070    1  1945</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).4  2.3322185 2.5112900 2.6777932    1  1837</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).5  1.1962677 1.4209350 1.6386312    1  2175</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).6  1.0228613 1.2804750 1.5080025    1  2603</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).7  1.1369240 1.4162050 1.6712360    1  2394</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).8  2.0874303 2.2704450 2.4544053    1  2341</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).9  2.7122645 2.8535800 2.9892530    1  1992</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).10 1.9949905 2.1855350 2.3791877    1  2523</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).11 2.2643445 2.4402900 2.5967460    1  2090</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).12 2.5413305 2.6920250 2.8385445    1  1974</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).13 1.3730840 1.6154300 1.8469810    1  2247</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).14 0.4345990 1.9269100 3.2774943    1  1820</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).15 0.5703857 1.9499800 3.2463585    1  1370</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).16 0.6586234 1.9673050 3.2961680    1  1308</span></span>\n<span><span class=\"co\">#&gt; s(year_fac).17 0.6262948 1.9681500 3.2743295    1  1658</span></span></code></pre></div>\n<p>Look at the estimated effect of <code>ndvi</code> using using a\nhistogram. This can be done by first extracting the posterior\ncoefficients:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">beta_post</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.data.frame.html\" class=\"external-link\">as.data.frame</a></span><span class=\"op\">(</span><span class=\"va\">model2</span>, variable <span class=\"op\">=</span> <span class=\"st\">'betas'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">beta_post</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 2,000</span></span>\n<span><span class=\"co\">#&gt; Columns: 18</span></span>\n<span><span class=\"co\">#&gt; $ ndvi             <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 0.314106, 0.462773, 0.362485, 0.437628, 0.441784, 0.3…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).1`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.58746, 1.48534, 1.59421, 1.13806, 1.10479, 1.54879,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).2`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.13317, 1.86345, 2.15433, 2.01243, 2.02203, 1.97593,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).3`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.54934, 2.29645, 2.47957, 2.26229, 2.29450, 2.49129,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).4`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.58859, 2.48111, 2.57932, 2.41897, 2.42637, 2.57229,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).5`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.59800, 1.30210, 1.56847, 1.56592, 1.56435, 1.27456,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).6`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.25149, 1.37874, 1.35929, 1.14402, 1.17067, 1.42695,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).7`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.53079, 1.22207, 1.45129, 1.51042, 1.49857, 1.41118,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).8`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.38441, 2.14815, 2.42610, 2.25680, 2.27784, 2.25634,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).9`  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 3.01334, 2.74536, 2.85456, 2.74256, 2.77100, 2.90889,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).10` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.14233, 2.22449, 2.20035, 2.05167, 2.06097, 2.26014,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).11` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.61197, 2.25615, 2.47429, 2.32546, 2.35079, 2.50332,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).12` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.78978, 2.66717, 2.75505, 2.54814, 2.51411, 2.67491,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).13` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.83302, 1.27570, 1.59194, 1.46359, 1.46365, 1.70662,…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).14` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.022070, 2.091280, 2.013660, 2.490420, 2.497030, 2.5…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).15` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1.941950, 2.604400, 1.844450, 2.683310, 2.642490, 1.6…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).16` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 0.841668, 4.271900, 1.890010, 2.719500, 2.730760, 1.5…</span></span>\n<span><span class=\"co\">#&gt; $ `s(year_fac).17` <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.27782, 1.88689, 1.96082, 2.57778, 2.63135, 2.31181,…</span></span></code></pre></div>\n<p>The posterior distribution for the effect of <code>ndvi</code> is\nstored in the <code>ndvi</code> column. A quick histogram confirms our\ninference that <code>log(counts)</code> respond positively to increases\nin <code>ndvi</code>:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/hist.html\" class=\"external-link\">hist</a></span><span class=\"op\">(</span><span class=\"va\">beta_post</span><span class=\"op\">$</span><span class=\"va\">ndvi</span>,</span>\n<span>     xlim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">1</span> <span class=\"op\">*</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">beta_post</span><span class=\"op\">$</span><span class=\"va\">ndvi</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>              <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">beta_post</span><span class=\"op\">$</span><span class=\"va\">ndvi</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>     col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span>,</span>\n<span>     border <span class=\"op\">=</span> <span class=\"st\">'white'</span>,</span>\n<span>     xlab <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/expression.html\" class=\"external-link\">expression</a></span><span class=\"op\">(</span><span class=\"va\">beta</span><span class=\"op\">[</span><span class=\"va\">NDVI</span><span class=\"op\">]</span><span class=\"op\">)</span>,</span>\n<span>     ylab <span class=\"op\">=</span> <span class=\"st\">''</span>,</span>\n<span>     yaxt <span class=\"op\">=</span> <span class=\"st\">'n'</span>,</span>\n<span>     main <span class=\"op\">=</span> <span class=\"st\">''</span>,</span>\n<span>     lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>v <span class=\"op\">=</span> <span class=\"fl\">0</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2.5</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/Histogram%20of%20NDVI%20effects-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"section level3\">\n<h3 id=\"marginaleffects-support\">\n<code>marginaleffects</code> support<a class=\"anchor\" aria-label=\"anchor\" href=\"#marginaleffects-support\"></a>\n</h3>\n<p>Given our model used a nonlinear link function (log link in this\nexample), it can still be difficult to fully understand what\nrelationship our model is estimating between a predictor and the\nresponse. Fortunately, the <code>marginaleffects</code> package makes\nthis relatively straightforward. Objects of class <code>mvgam</code> can\nbe used with <code>marginaleffects</code> to inspect contrasts,\nscenario-based predictions, conditional and marginal effects, all on the\noutcome scale. Like <code>brms</code>, <code>mvgam</code> has the simple\n<code>conditional_effects</code> function to make quick and informative\nplots for main effects, which rely on <code>marginaleffects</code>\nsupport. This will likely be your go-to function for quickly\nunderstanding patterns from fitted <code>mvgam</code> models</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">model2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-21-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-21-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"adding-predictors-as-smooths\">Adding predictors as smooths<a class=\"anchor\" aria-label=\"anchor\" href=\"#adding-predictors-as-smooths\"></a>\n</h2>\n<p>Smooth functions, using penalized splines, are a major feature of\n<code>mvgam</code>. Nonlinear splines are commonly viewed as variations\nof random effects in which the coefficients that control the shape of\nthe spline are drawn from a joint, penalized distribution. This strategy\nis very often used in ecological time series analysis to capture smooth\ntemporal variation in the processes we seek to study. When we construct\nsmoothing splines, the workhorse package <code>mgcv</code> will\ncalculate a set of basis functions that will collectively control the\nshape and complexity of the resulting spline. It is often helpful to\nvisualize these basis functions to get a better sense of how splines\nwork. We’ll create a set of 6 basis functions to represent possible\nvariation in the effect of <code>time</code> on our outcome.In addition\nto constructing the basis functions, <code>mgcv</code> also creates a\npenalty matrix <span class=\"math inline\">\\(S\\)</span>, which contains\n<strong>known</strong> coefficients that work to constrain the\nwiggliness of the resulting smooth function. When fitting a GAM to data,\nwe must estimate the smoothing parameters (<span class=\"math inline\">\\(\\lambda\\)</span>) that will penalize these\nmatrices, resulting in constrained basis coefficients and smoother\nfunctions that are less likely to overfit the data. This is the key to\nfitting GAMs in a Bayesian framework, as we can jointly estimate the\n<span class=\"math inline\">\\(\\lambda\\)</span>’s using informative priors\nto prevent overfitting and expand the complexity of models we can\ntackle. To see this in practice, we can now fit a model that replaces\nthe yearly random effects with a smooth function of <code>time</code>.\nWe will need a reasonably complex function (large <code>k</code>) to try\nand accommodate the temporal variation in our observations. Following\nsome <a href=\"https://fromthebottomoftheheap.net/2020/06/03/extrapolating-with-gams/\" target=\"_blank\" class=\"external-link\">useful advice by Gavin Simpson</a>, we will use a\nb-spline basis for the temporal smooth. Because we no longer have\nintercepts for each year, we also retain the primary intercept term in\nthis model (there is no <code>-1</code> in the formula now):</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model3</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">count</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, bs <span class=\"op\">=</span> <span class=\"st\">'bs'</span>, k <span class=\"op\">=</span> <span class=\"fl\">15</span><span class=\"op\">)</span> <span class=\"op\">+</span> </span>\n<span>                  <span class=\"va\">ndvi</span>,</span>\n<span>                family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span>\n<span>                newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = f(\\boldsymbol{time})_t + \\beta_{ndvi} *\n\\boldsymbol{ndvi}_t  \\\\\nf(\\boldsymbol{time}) &amp; = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} &amp; \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\\\\n\\beta_{ndvi} &amp; \\sim \\text{Normal}(0, 1) \\end{align*}\\]</span></p>\n<p>Where the smooth function <span class=\"math inline\">\\(f_{time}\\)</span> is built by summing across a set\nof weighted basis functions. The basis functions <span class=\"math inline\">\\((b)\\)</span> are constructed using a thin plate\nregression basis in <code>mgcv</code>. The weights <span class=\"math inline\">\\((\\beta_{smooth})\\)</span> are drawn from a\npenalized multivariate normal distribution where the precision matrix\n<span class=\"math inline\">\\((\\Omega\\)</span>) is multiplied by a\nsmoothing penalty <span class=\"math inline\">\\((\\lambda)\\)</span>. If\n<span class=\"math inline\">\\(\\lambda\\)</span> becomes large, this acts to\n<em>squeeze</em> the covariances among the weights <span class=\"math inline\">\\((\\beta_{smooth})\\)</span>, leading to a less\nwiggly spline. Note that sometimes there are multiple smoothing\npenalties that contribute to the covariance matrix, but I am only\nshowing one here for simplicity. View the summary as before</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">model3</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; count ~ s(time, bs = \"bs\", k = 15) + ndvi</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; poisson</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 199 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;              2.5%   50%  97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)  2.00  2.10  2.200 1.00   871</span></span>\n<span><span class=\"co\">#&gt; ndvi         0.26  0.33  0.400 1.00   909</span></span>\n<span><span class=\"co\">#&gt; s(time).1   -2.20 -1.10 -0.056 1.01   512</span></span>\n<span><span class=\"co\">#&gt; s(time).2    0.44  1.30  2.300 1.02   337</span></span>\n<span><span class=\"co\">#&gt; s(time).3   -0.55  0.45  1.500 1.02   320</span></span>\n<span><span class=\"co\">#&gt; s(time).4    1.60  2.50  3.400 1.02   320</span></span>\n<span><span class=\"co\">#&gt; s(time).5   -1.20 -0.20  0.770 1.02   320</span></span>\n<span><span class=\"co\">#&gt; s(time).6   -0.60  0.37  1.400 1.02   363</span></span>\n<span><span class=\"co\">#&gt; s(time).7   -1.50 -0.52  0.460 1.02   347</span></span>\n<span><span class=\"co\">#&gt; s(time).8    0.53  1.50  2.500 1.02   331</span></span>\n<span><span class=\"co\">#&gt; s(time).9    1.20  2.10  3.100 1.02   309</span></span>\n<span><span class=\"co\">#&gt; s(time).10  -0.41  0.54  1.500 1.02   318</span></span>\n<span><span class=\"co\">#&gt; s(time).11   0.82  1.80  2.800 1.02   311</span></span>\n<span><span class=\"co\">#&gt; s(time).12   0.62  1.50  2.400 1.02   299</span></span>\n<span><span class=\"co\">#&gt; s(time).13  -1.20 -0.31  0.610 1.01   455</span></span>\n<span><span class=\"co\">#&gt; s(time).14  -7.50 -4.20 -1.100 1.02   447</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span><span class=\"co\">#&gt;          edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(time) 9.98     14   64.9  &lt;2e-16 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:06:25 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(model3) to get started describing this model</span></span></code></pre></div>\n<p>The summary above now contains posterior estimates for the smoothing\nparameters as well as the basis coefficients for the nonlinear effect of\n<code>time</code>. We can visualize <code>conditional_effects</code> as\nbefore:</p>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">model3</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-24-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-24-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Inspect the underlying <code>Stan</code> code to gain some idea of\nhow the spline is being penalized:</p>\n<div class=\"sourceCode\" id=\"cb37\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">model3</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span><span class=\"co\">#&gt; data {</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] zero; // prior locations for basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span><span class=\"co\">#&gt;   matrix[14, 28] S1; // mgcv smooth penalty matrix S1</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; parameters {</span></span>\n<span><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp] lambda;</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; model {</span></span>\n<span><span class=\"co\">#&gt;   // prior for (Intercept)...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, 2.6, 2.5);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for ndvi...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[2] ~ student_t(3, 0, 2);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(time)...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[3 : 16] ~ multi_normal_prec(zero[3 : 16],</span></span>\n<span><span class=\"co\">#&gt;                                     S1[1 : 14, 1 : 14] * lambda[1]</span></span>\n<span><span class=\"co\">#&gt;                                     + S1[1 : 14, 15 : 28] * lambda[2]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // priors for smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   lambda ~ normal(5, 30);</span></span>\n<span><span class=\"co\">#&gt;   {</span></span>\n<span><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; generated quantities {</span></span>\n<span><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span><span class=\"co\">#&gt;   vector[n_sp] rho;</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span><span class=\"co\">#&gt;   rho = log(lambda);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span></span>\n<span><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>The line below <code>// prior for s(time)...</code> shows how the\nspline basis coefficients are drawn from a zero-centred multivariate\nnormal distribution. The precision matrix <span class=\"math inline\">\\(S\\)</span> is penalized by two different smoothing\nparameters (the <span class=\"math inline\">\\(\\lambda\\)</span>’s) to\nenforce smoothness and reduce overfitting</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"latent-dynamics-in-mvgam\">Latent dynamics in <code>mvgam</code><a class=\"anchor\" aria-label=\"anchor\" href=\"#latent-dynamics-in-mvgam\"></a>\n</h2>\n<p>Forecasts from the above model are not ideal:</p>\n<div class=\"sourceCode\" id=\"cb38\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">model3</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-26-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Why is this happening? The forecasts are driven almost entirely by\nvariation in the temporal spline, which is extrapolating linearly\n<em>forever</em> beyond the edge of the training data. Any slight\nwiggles near the end of the training set will result in wildly different\nforecasts. To visualize this, we can plot the extrapolated temporal\nfunctions into the out-of-sample test set for the two models. Here are\nthe extrapolated functions for the first model, with 15 basis\nfunctions:</p>\n<div class=\"sourceCode\" id=\"cb39\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">model3</span>, smooth <span class=\"op\">=</span> <span class=\"st\">'s(time)'</span>,</span>\n<span>                  <span class=\"co\"># feed newdata to the plot function to generate</span></span>\n<span>                  <span class=\"co\"># predictions of the temporal smooth to the end of the </span></span>\n<span>                  <span class=\"co\"># testing period</span></span>\n<span>                  newdata <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span>,</span>\n<span>                                       ndvi <span class=\"op\">=</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>v <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/Plot%20extrapolated%20temporal%20functions%20using%20newdata-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>This model is not doing well. Clearly we need to somehow account for\nthe strong temporal autocorrelation when modelling these data without\nusing a smooth function of <code>time</code>. Now onto another prominent\nfeature of <code>mvgam</code>: the ability to include (possibly latent)\nautocorrelated residuals in regression models. To do so, we use the\n<code>trend_model</code> argument (see <code><a href=\"../reference/mvgam_trends.html\">?mvgam_trends</a></code> for\ndetails of different dynamic trend models that are supported). This\nmodel will use a separate sub-model for latent residuals that evolve as\nan AR1 process (i.e. the error in the current time point is a function\nof the error in the previous time point, plus some stochastic noise). We\nalso include a smooth function of <code>ndvi</code> in this model,\nrather than the parametric term that was used above, to showcase that\n<code>mvgam</code> can include combinations of smooths and dynamic\ncomponents:</p>\n<div class=\"sourceCode\" id=\"cb40\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">model4</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">count</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">ndvi</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span>\n<span>                family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span>\n<span>                newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span>,</span>\n<span>                trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = f(\\boldsymbol{ndvi})_t + z_t \\\\\nz_t &amp; \\sim \\text{Normal}(ar1 * z_{t-1}, \\sigma_{error}) \\\\\nar1 &amp; \\sim \\text{Normal}(0, 1)[-1, 1] \\\\\n\\sigma_{error} &amp; \\sim \\text{Exponential}(2) \\\\\nf(\\boldsymbol{ndvi}) &amp; = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} &amp; \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1})\n\\end{align*}\\]</span></p>\n<p>Here the term <span class=\"math inline\">\\(z_t\\)</span> captures\nautocorrelated latent residuals, which are modelled using an AR1\nprocess. You can also notice that this model is estimating\nautocorrelated errors for the full time period, even though some of\nthese time points have missing observations. This is useful for getting\nmore realistic estimates of the residual autocorrelation parameters.\nSummarise the model to see how it now returns posterior summaries for\nthe latent AR1 process:</p>\n<div class=\"sourceCode\" id=\"cb41\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">model4</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; count ~ s(ndvi, k = 6)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; poisson</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; AR1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 199 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;               2.5%     50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)  1.200  2.1000  2.70 1.11    44</span></span>\n<span><span class=\"co\">#&gt; s(ndvi).1   -0.087  0.0099  0.18 1.00   539</span></span>\n<span><span class=\"co\">#&gt; s(ndvi).2   -0.200  0.0160  0.30 1.00   655</span></span>\n<span><span class=\"co\">#&gt; s(ndvi).3   -0.064 -0.0018  0.05 1.01   541</span></span>\n<span><span class=\"co\">#&gt; s(ndvi).4   -0.270  0.1200  1.30 1.00   323</span></span>\n<span><span class=\"co\">#&gt; s(ndvi).5   -0.065  0.1500  0.36 1.01   485</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span><span class=\"co\">#&gt;          edf Ref.df Chi.sq p-value</span></span>\n<span><span class=\"co\">#&gt; s(ndvi) 1.35      5   8.16    0.98</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Latent trend parameter AR estimates:</span></span>\n<span><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ar1[1]   0.69 0.81  0.92 1.00   245</span></span>\n<span><span class=\"co\">#&gt; sigma[1] 0.68 0.80  0.95 1.01   466</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhats above 1.05 found for 107 parameters</span></span>\n<span><span class=\"co\">#&gt;  *Diagnose further to investigate why the chains have not mixed</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:07:19 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(model4) to get started describing this model</span></span></code></pre></div>\n<p>View posterior hindcasts / forecasts and compare against the out of\nsample test data</p>\n<div class=\"sourceCode\" id=\"cb42\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">model4</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-28-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The trend is evolving as an AR1 process, which we can also view:</p>\n<div class=\"sourceCode\" id=\"cb43\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">model4</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"mvgam_overview_files/figure-html/unnamed-chunk-29-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>In-sample model performance can be interrogated using leave-one-out\ncross-validation utilities from the <code>loo</code> package (a higher\nvalue is preferred for this metric):</p>\n<div class=\"sourceCode\" id=\"cb44\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo_compare.html\" class=\"external-link\">loo_compare</a></span><span class=\"op\">(</span><span class=\"va\">model3</span>, <span class=\"va\">model4</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        elpd_diff se_diff</span></span>\n<span><span class=\"co\">#&gt; model4    0.0       0.0 </span></span>\n<span><span class=\"co\">#&gt; model3 -559.7      66.8</span></span></code></pre></div>\n<p>The higher estimated log predictive density (ELPD) value for the\ndynamic model suggests it provides a better fit to the in-sample\ndata.</p>\n<p>Though it should be obvious that this model provides better\nforecasts, we can quantify forecast performance for models 3 and 4 using\nthe <code>forecast</code> and <code>score</code> functions. Here we will\ncompare models based on their Discrete Ranked Probability Scores (a\nlower value is preferred for this metric)</p>\n<div class=\"sourceCode\" id=\"cb45\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fc_mod3</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">model3</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">fc_mod4</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">model4</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">score_mod3</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod3</span>, score <span class=\"op\">=</span> <span class=\"st\">'drps'</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">score_mod4</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_mod4</span>, score <span class=\"op\">=</span> <span class=\"st\">'drps'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">score_mod4</span><span class=\"op\">$</span><span class=\"va\">PP</span><span class=\"op\">$</span><span class=\"va\">score</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">score_mod3</span><span class=\"op\">$</span><span class=\"va\">PP</span><span class=\"op\">$</span><span class=\"va\">score</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] -128.6068</span></span></code></pre></div>\n<p>A strongly negative value here suggests the score for the dynamic\nmodel (model 4) is much smaller than the score for the model with a\nsmooth function of time (model 3)</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\" class=\"external-link\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p>\n<p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p>\n<p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer>\n</div>\n\n  \n\n  \n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/nmixtures.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"description\" content=\"mvgam\">\n<title>N-mixtures in mvgam • mvgam</title>\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\">\n<!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"N-mixtures in mvgam\">\n<meta property=\"og:description\" content=\"mvgam\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n<!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"active nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul>\n<form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\">\n</form>\n\n      <ul class=\"navbar-nav\">\n<li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n</div>\n\n    \n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>N-mixtures in mvgam</h1>\n                        <h4 data-toc-skip class=\"author\">Nicholas J\nClark</h4>\n            \n            <h4 data-toc-skip class=\"date\">2025-02-06</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/vignettes/nmixtures.Rmd\" class=\"external-link\"><code>vignettes/nmixtures.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>nmixtures.Rmd</code></div>\n    </div>\n\n    \n    \n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to fit and interrogate N-mixture models for\npopulation abundance counts made with imperfect detection.</p>\n<div class=\"section level2\">\n<h2 id=\"n-mixture-models\">N-mixture models<a class=\"anchor\" aria-label=\"anchor\" href=\"#n-mixture-models\"></a>\n</h2>\n<p>An N-mixture model is a fairly recent addition to the ecological\nmodeller’s toolkit that is designed to make inferences about variation\nin the abundance of species when observations are imperfect (<a href=\"https://onlinelibrary.wiley.com/doi/10.1111/j.0006-341X.2004.00142.x\" target=\"_blank\" class=\"external-link\">Royle 2004</a>). Briefly, assume <span class=\"math inline\">\\(\\boldsymbol{Y_{i,r}}\\)</span> is the number of\nindividuals recorded at site <span class=\"math inline\">\\(i\\)</span>\nduring replicate sampling observation <span class=\"math inline\">\\(r\\)</span> (recorded as a non-negative integer).\nIf multiple replicate surveys are done within a short enough period to\nsatisfy the assumption that the population remained closed (i.e. there\nwas no substantial change in true population size between replicate\nsurveys), we can account for the fact that observations aren’t perfect.\nThis is done by assuming that these replicate observations are Binomial\nrandom variables that are parameterized by the true “latent” abundance\n<span class=\"math inline\">\\(N\\)</span> and a detection probability <span class=\"math inline\">\\(p\\)</span>:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{Y_{i,r}} &amp; \\sim \\text{Binomial}(N_i, p_r) \\\\\nN_{i} &amp; \\sim \\text{Poisson}(\\lambda_i)  \\end{align*}\\]</span></p>\n<p>Using a set of linear predictors, we can estimate effects of\ncovariates <span class=\"math inline\">\\(\\boldsymbol{X}\\)</span> on the\nexpected latent abundance (with a log link for <span class=\"math inline\">\\(\\lambda\\)</span>) and, jointly, effects of\npossibly different covariates (call them <span class=\"math inline\">\\(\\boldsymbol{Q}\\)</span>) on detection probability\n(with a logit link for <span class=\"math inline\">\\(p\\)</span>):</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nlog(\\lambda) &amp; = \\beta \\boldsymbol{X} \\\\\nlogit(p) &amp; = \\gamma \\boldsymbol{Q}\\end{align*}\\]</span></p>\n<p><code>mvgam</code> can handle this type of model because it is\ndesigned to propagate unobserved temporal processes that evolve\nindependently of the observation process in a State-space format. This\nsetup adapts well to N-mixture models because they can be thought of as\nState-space models in which the latent state is a discrete variable\nrepresenting the “true” but unknown population size. This is very\nconvenient because we can incorporate any of the package’s diverse\neffect types (i.e. multidimensional splines, time-varying effects,\nmonotonic effects, random effects etc…) into the linear predictors. All\nthat is required for this to work is a marginalization trick that allows\n<code>Stan</code>’s sampling algorithms to handle discrete parameters\n(see more about how this method of “integrating out” discrete parameters\nworks in <a href=\"https://mbjoseph.github.io/posts/2020-04-28-a-step-by-step-guide-to-marginalizing-over-discrete-parameters-for-ecologists-using-stan/\" target=\"_blank\" class=\"external-link\">this nice blog post by Maxwell Joseph</a>).</p>\n<p>The family <code><a href=\"../reference/mvgam_families.html\">nmix()</a></code> is used to set up N-mixture models in\n<code>mvgam</code>, but we still need to do a little bit of data\nwrangling to ensure the data are set up in the correct format (this is\nespecially true when we have more than one replicate survey per time\nperiod). The most important aspects are: (1) how we set up the\nobservation <code>series</code> and <code>trend_map</code> arguments to\nensure replicate surveys are mapped to the correct latent abundance\nmodel and (2) the inclusion of a <code>cap</code> variable that defines\nthe maximum possible integer value to use for each observation when\nestimating latent abundance. The two examples below give a reasonable\noverview of how this can be done.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"example-1-a-two-species-system-with-nonlinear-trends\">Example 1: a two-species system with nonlinear trends<a class=\"anchor\" aria-label=\"anchor\" href=\"#example-1-a-two-species-system-with-nonlinear-trends\"></a>\n</h2>\n<p>First we will use a simple simulation in which multiple replicate\nobservations are taken at each timepoint for two different species. The\nsimulation produces observations at a single site over six years, with\nfive replicate surveys per year. Each species is simulated to have\ndifferent nonlinear temporal trends and different detection\nprobabilities. For now, detection probability is fixed (i.e. it does not\nchange over time or in association with any covariates). Notice that we\nadd the <code>cap</code> variable, which does not need to be static, to\ndefine the maximum possible value that we think the latent abundance\ncould be for each timepoint. This simply needs to be large enough that\nwe get a reasonable idea of which latent N values are most likely,\nwithout adding too much computational cost:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">999</span><span class=\"op\">)</span></span>\n<span><span class=\"co\"># Simulate observations for species 1, which shows a declining trend and 0.7 detection probability</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>site <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>           <span class=\"co\"># five replicates per year; six years</span></span>\n<span>           replicate <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>,</span>\n<span>           time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">6</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>           species <span class=\"op\">=</span> <span class=\"st\">'sp_1'</span>,</span>\n<span>           <span class=\"co\"># true abundance declines nonlinearly</span></span>\n<span>           truth <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">28</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                     <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">26</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                     <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">23</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                     <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">16</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                     <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">14</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                     <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">14</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>           <span class=\"co\"># observations are taken with detection prob = 0.7</span></span>\n<span>           obs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">28</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span>\n<span>                   <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">26</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span>\n<span>                   <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">23</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span>\n<span>                   <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">15</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span>\n<span>                   <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">14</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span>\n<span>                   <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">14</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"co\"># add 'series' information, which is an identifier of site, replicate and species</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'site_'</span>, <span class=\"va\">site</span>,</span>\n<span>                                <span class=\"st\">'_'</span>, <span class=\"va\">species</span>,</span>\n<span>                                <span class=\"st\">'_rep_'</span>, <span class=\"va\">replicate</span><span class=\"op\">)</span>,</span>\n<span>                time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">time</span><span class=\"op\">)</span>,</span>\n<span>                <span class=\"co\"># add a 'cap' variable that defines the maximum latent N to </span></span>\n<span>                <span class=\"co\"># marginalize over when estimating latent abundance; in other words</span></span>\n<span>                <span class=\"co\"># how large do we realistically think the true abundance could be?</span></span>\n<span>                cap <span class=\"op\">=</span> <span class=\"fl\">100</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"op\">-</span> <span class=\"va\">replicate</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">testdat</span></span>\n<span></span>\n<span><span class=\"co\"># Now add another species that has a different temporal trend and a smaller </span></span>\n<span><span class=\"co\"># detection probability (0.45 for this species)</span></span>\n<span><span class=\"va\">testdat</span> <span class=\"op\">=</span> <span class=\"va\">testdat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/bind_rows.html\" class=\"external-link\">bind_rows</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>site <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>                              replicate <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>,</span>\n<span>                              time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">6</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                              species <span class=\"op\">=</span> <span class=\"st\">'sp_2'</span>,</span>\n<span>                              truth <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                                        <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">7</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                                        <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">15</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                                        <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">16</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                                        <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">19</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>                                        <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">18</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                              obs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">4</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span>\n<span>                                      <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">7</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span>\n<span>                                      <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">15</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span>\n<span>                                      <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">16</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span>\n<span>                                      <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">19</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span>\n<span>                                      <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">18</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>                     <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'site_'</span>, <span class=\"va\">site</span>,</span>\n<span>                                                   <span class=\"st\">'_'</span>, <span class=\"va\">species</span>,</span>\n<span>                                                   <span class=\"st\">'_rep_'</span>, <span class=\"va\">replicate</span><span class=\"op\">)</span>,</span>\n<span>                                   time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">time</span><span class=\"op\">)</span>,</span>\n<span>                                   cap <span class=\"op\">=</span> <span class=\"fl\">50</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>                     <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"va\">replicate</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>This data format isn’t too difficult to set up, but it does differ\nfrom the traditional multidimensional array setup that is commonly used\nfor fitting N-mixture models in other software packages. Next we ensure\nthat species and series IDs are included as factor variables, in case\nwe’d like to allow certain effects to vary by species</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">species</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">species</span>,</span>\n<span>                          levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">species</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">series</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">series</span>,</span>\n<span>                         levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Preview the dataset to get an idea of how it is structured:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 60</span></span>\n<span><span class=\"co\">#&gt; Columns: 7</span></span>\n<span><span class=\"co\">#&gt; $ site    <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…</span></span>\n<span><span class=\"co\">#&gt; $ time    <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,…</span></span>\n<span><span class=\"co\">#&gt; $ species <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp…</span></span>\n<span><span class=\"co\">#&gt; $ truth   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 28, 28, 28, 28, 28, 26, 26, 26, 26, 26, 23, 23, 23, 23, 23, 16…</span></span>\n<span><span class=\"co\">#&gt; $ obs     <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 20, 19, 23, 17, 18, 21, 18, 21, 19, 18, 17, 16, 20, 11, 19, 9,…</span></span>\n<span><span class=\"co\">#&gt; $ series  <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> site_1_sp_1_rep_1, site_1_sp_1_rep_2, site_1_sp_1_rep_3, site_…</span></span>\n<span><span class=\"co\">#&gt; $ cap     <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 10…</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span>, <span class=\"fl\">12</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;    site time species truth obs            series cap</span></span>\n<span><span class=\"co\">#&gt; 1     1    1    sp_1    28  20 site_1_sp_1_rep_1 100</span></span>\n<span><span class=\"co\">#&gt; 2     1    1    sp_1    28  19 site_1_sp_1_rep_2 100</span></span>\n<span><span class=\"co\">#&gt; 3     1    1    sp_1    28  23 site_1_sp_1_rep_3 100</span></span>\n<span><span class=\"co\">#&gt; 4     1    1    sp_1    28  17 site_1_sp_1_rep_4 100</span></span>\n<span><span class=\"co\">#&gt; 5     1    1    sp_1    28  18 site_1_sp_1_rep_5 100</span></span>\n<span><span class=\"co\">#&gt; 6     1    2    sp_1    26  21 site_1_sp_1_rep_1 100</span></span>\n<span><span class=\"co\">#&gt; 7     1    2    sp_1    26  18 site_1_sp_1_rep_2 100</span></span>\n<span><span class=\"co\">#&gt; 8     1    2    sp_1    26  21 site_1_sp_1_rep_3 100</span></span>\n<span><span class=\"co\">#&gt; 9     1    2    sp_1    26  19 site_1_sp_1_rep_4 100</span></span>\n<span><span class=\"co\">#&gt; 10    1    2    sp_1    26  18 site_1_sp_1_rep_5 100</span></span>\n<span><span class=\"co\">#&gt; 11    1    3    sp_1    23  17 site_1_sp_1_rep_1 100</span></span>\n<span><span class=\"co\">#&gt; 12    1    3    sp_1    23  16 site_1_sp_1_rep_2 100</span></span></code></pre></div>\n<div class=\"section level3\">\n<h3 id=\"setting-up-the-trend_map\">Setting up the <code>trend_map</code><a class=\"anchor\" aria-label=\"anchor\" href=\"#setting-up-the-trend_map\"></a>\n</h3>\n<p>Finally, we need to set up the <code>trend_map</code> object. This is\ncrucial for allowing multiple observations to be linked to the same\nlatent process model (see more information about this argument in the <a href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\" target=\"_blank\">Shared latent states vignette</a>). In this case, the\nmapping operates by species and site to state that each set of replicate\nobservations from the same time point should all share the exact same\nlatent abundance model:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">testdat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"co\"># each unique combination of site*species is a separate process</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>trend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"va\">site</span>, <span class=\"va\">species</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"va\">trend</span>, <span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/distinct.html\" class=\"external-link\">distinct</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">trend_map</span></span>\n<span><span class=\"va\">trend_map</span></span>\n<span><span class=\"co\">#&gt;    trend            series</span></span>\n<span><span class=\"co\">#&gt; 1      1 site_1_sp_1_rep_1</span></span>\n<span><span class=\"co\">#&gt; 2      1 site_1_sp_1_rep_2</span></span>\n<span><span class=\"co\">#&gt; 3      1 site_1_sp_1_rep_3</span></span>\n<span><span class=\"co\">#&gt; 4      1 site_1_sp_1_rep_4</span></span>\n<span><span class=\"co\">#&gt; 5      1 site_1_sp_1_rep_5</span></span>\n<span><span class=\"co\">#&gt; 6      2 site_1_sp_2_rep_1</span></span>\n<span><span class=\"co\">#&gt; 7      2 site_1_sp_2_rep_2</span></span>\n<span><span class=\"co\">#&gt; 8      2 site_1_sp_2_rep_3</span></span>\n<span><span class=\"co\">#&gt; 9      2 site_1_sp_2_rep_4</span></span>\n<span><span class=\"co\">#&gt; 10     2 site_1_sp_2_rep_5</span></span></code></pre></div>\n<p>Notice how all of the replicates for species 1 in site 1 share the\nsame process (i.e. the same <code>trend</code>). This will ensure that\nall replicates are Binomial draws of the same latent N.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"modelling-with-the-nmix-family\">Modelling with the <code>nmix()</code> family<a class=\"anchor\" aria-label=\"anchor\" href=\"#modelling-with-the-nmix-family\"></a>\n</h3>\n<p>Now we are ready to fit a model using <code><a href=\"../reference/mvgam.html\">mvgam()</a></code>. This\nmodel will allow each species to have different detection probabilities\nand different temporal trends. We will use <code>Cmdstan</code> as the\nbackend, which by default will use Hamiltonian Monte Carlo for full\nBayesian inference</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"co\"># the observation formula sets up linear predictors for</span></span>\n<span>  <span class=\"co\"># detection probability on the logit scale</span></span>\n<span>  formula <span class=\"op\">=</span> <span class=\"va\">obs</span> <span class=\"op\">~</span> <span class=\"va\">species</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># the trend_formula sets up the linear predictors for </span></span>\n<span>  <span class=\"co\"># the latent abundance processes on the log scale</span></span>\n<span>  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span>, k <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"va\">species</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># the trend_map takes care of the mapping</span></span>\n<span>  trend_map <span class=\"op\">=</span> <span class=\"va\">trend_map</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># nmix() family and data</span></span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/mvgam_families.html\">nmix</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">testdat</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># priors can be set in the usual way</span></span>\n<span>  priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">b</span><span class=\"op\">)</span>,</span>\n<span>             <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">Intercept_trend</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>  samples <span class=\"op\">=</span> <span class=\"fl\">1000</span><span class=\"op\">)</span></span></code></pre></div>\n<p>View the automatically-generated <code>Stan</code> code to get a\nsense of how the marginalization over latent N works</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span><span class=\"co\">#&gt; data {</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp_trend; // number of trend smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_lv; // number of dynamic factors</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span><span class=\"co\">#&gt;   matrix[n_series, n_lv] Z; // matrix mapping series to latent states</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis_trend; // number of trend basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span><span class=\"co\">#&gt;   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_lv] int ytimes_trend;</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[total_obs] int&lt;lower=0&gt; cap; // upper limits of latent abundances</span></span>\n<span><span class=\"co\">#&gt;   array[total_obs] int ytimes_array; // sorted ytimes</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes_pred; // time-ordered matrix for prediction</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; K_groups; // number of unique replicated observations</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; K_reps; // maximum number of replicate observations</span></span>\n<span><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; K_starts; // col of K_inds where each group starts</span></span>\n<span><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; K_stops; // col of K_inds where each group ends</span></span>\n<span><span class=\"co\">#&gt;   array[K_groups, K_reps] int&lt;lower=0&gt; K_inds; // indices of replicated observations</span></span>\n<span><span class=\"co\">#&gt;   matrix[3, 6] S_trend1; // mgcv smooth penalty matrix S_trend1</span></span>\n<span><span class=\"co\">#&gt;   matrix[3, 6] S_trend2; // mgcv smooth penalty matrix S_trend2</span></span>\n<span><span class=\"co\">#&gt;   array[total_obs] int&lt;lower=0&gt; flat_ys; // flattened observations</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; transformed data {</span></span>\n<span><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X_ordered = X[ytimes_array,  : ];</span></span>\n<span><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; Y_max;</span></span>\n<span><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; N_max;</span></span>\n<span><span class=\"co\">#&gt;   for (k in 1 : K_groups) {</span></span>\n<span><span class=\"co\">#&gt;     Y_max[k] = max(flat_ys[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span><span class=\"co\">#&gt;     N_max[k] = max(cap[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; parameters {</span></span>\n<span><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis_trend] b_raw_trend;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp_trend] lambda_trend;</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span><span class=\"co\">#&gt;   // detection probability</span></span>\n<span><span class=\"co\">#&gt;   vector[total_obs] p;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent states</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_lv] LV;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent states and loading matrix</span></span>\n<span><span class=\"co\">#&gt;   vector[n * n_lv] trend_mus;</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis_trend] b_trend;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // observation model basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // process model basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend];</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // detection probability</span></span>\n<span><span class=\"co\">#&gt;   p = X_ordered * b;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent process linear predictors</span></span>\n<span><span class=\"co\">#&gt;   trend_mus = X_trend * b_trend;</span></span>\n<span><span class=\"co\">#&gt;   for (j in 1 : n_lv) {</span></span>\n<span><span class=\"co\">#&gt;     LV[1 : n, j] = trend_mus[ytimes_trend[1 : n, j]];</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // derived latent states</span></span>\n<span><span class=\"co\">#&gt;   for (i in 1 : n) {</span></span>\n<span><span class=\"co\">#&gt;     for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;       trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);</span></span>\n<span><span class=\"co\">#&gt;     }</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; model {</span></span>\n<span><span class=\"co\">#&gt;   // prior for speciessp_1...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[1] ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for speciessp_2...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[2] ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // dynamic process models</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for (Intercept)_trend...</span></span>\n<span><span class=\"co\">#&gt;   b_raw_trend[1] ~ normal(1, 1.5);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for speciessp_2_trend...</span></span>\n<span><span class=\"co\">#&gt;   b_raw_trend[2] ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(time):trendtrend1_trend...</span></span>\n<span><span class=\"co\">#&gt;   b_raw_trend[3 : 5] ~ multi_normal_prec(zero_trend[3 : 5],</span></span>\n<span><span class=\"co\">#&gt;                                          S_trend1[1 : 3, 1 : 3]</span></span>\n<span><span class=\"co\">#&gt;                                          * lambda_trend[1]</span></span>\n<span><span class=\"co\">#&gt;                                          + S_trend1[1 : 3, 4 : 6]</span></span>\n<span><span class=\"co\">#&gt;                                            * lambda_trend[2]);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(time):trendtrend2_trend...</span></span>\n<span><span class=\"co\">#&gt;   b_raw_trend[6 : 8] ~ multi_normal_prec(zero_trend[6 : 8],</span></span>\n<span><span class=\"co\">#&gt;                                          S_trend2[1 : 3, 1 : 3]</span></span>\n<span><span class=\"co\">#&gt;                                          * lambda_trend[3]</span></span>\n<span><span class=\"co\">#&gt;                                          + S_trend2[1 : 3, 4 : 6]</span></span>\n<span><span class=\"co\">#&gt;                                            * lambda_trend[4]);</span></span>\n<span><span class=\"co\">#&gt;   lambda_trend ~ normal(5, 30);</span></span>\n<span><span class=\"co\">#&gt;   {</span></span>\n<span><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span><span class=\"co\">#&gt;     array[total_obs] real flat_trends;</span></span>\n<span><span class=\"co\">#&gt;     array[total_obs] real flat_ps;</span></span>\n<span><span class=\"co\">#&gt;     flat_trends = to_array_1d(trend);</span></span>\n<span><span class=\"co\">#&gt;     flat_ps = to_array_1d(p);</span></span>\n<span><span class=\"co\">#&gt;     </span></span>\n<span><span class=\"co\">#&gt;     // loop over replicate sampling window (each site*time*species combination)</span></span>\n<span><span class=\"co\">#&gt;     for (k in 1 : K_groups) {</span></span>\n<span><span class=\"co\">#&gt;       // all log_lambdas are identical because they represent site*time</span></span>\n<span><span class=\"co\">#&gt;       // covariates; so just use the first measurement</span></span>\n<span><span class=\"co\">#&gt;       real log_lambda = flat_trends[K_inds[k, 1]];</span></span>\n<span><span class=\"co\">#&gt;       </span></span>\n<span><span class=\"co\">#&gt;       // logit-scale detection probilities for the replicate observations</span></span>\n<span><span class=\"co\">#&gt;       vector[size(K_inds[k, K_starts[k] : K_stops[k]])] logit_p = to_vector(flat_ps[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span><span class=\"co\">#&gt;       </span></span>\n<span><span class=\"co\">#&gt;       // K values and observed counts for these replicates</span></span>\n<span><span class=\"co\">#&gt;       int K_max = N_max[k];</span></span>\n<span><span class=\"co\">#&gt;       int K_min = Y_max[k];</span></span>\n<span><span class=\"co\">#&gt;       array[size(K_inds[k, K_starts[k] : K_stops[k]])] int N_obs = flat_ys[K_inds[k, K_starts[k] : K_stops[k]]];</span></span>\n<span><span class=\"co\">#&gt;       int possible_N = K_max - K_min;</span></span>\n<span><span class=\"co\">#&gt;       </span></span>\n<span><span class=\"co\">#&gt;       // marginalize over possible latent counts analytically</span></span>\n<span><span class=\"co\">#&gt;       real ff = exp(log_lambda) * prod(1 - inv_logit(logit_p));</span></span>\n<span><span class=\"co\">#&gt;       real prob_n = 1;</span></span>\n<span><span class=\"co\">#&gt;       for (i in 1 : possible_N) {</span></span>\n<span><span class=\"co\">#&gt;         real N = K_max - i + 1;</span></span>\n<span><span class=\"co\">#&gt;         real k_obs = 1;</span></span>\n<span><span class=\"co\">#&gt;         for (j in 1 : size(N_obs)) {</span></span>\n<span><span class=\"co\">#&gt;           k_obs *= N / (N - N_obs[j]);</span></span>\n<span><span class=\"co\">#&gt;         }</span></span>\n<span><span class=\"co\">#&gt;         prob_n = 1 + prob_n * ff * k_obs / N;</span></span>\n<span><span class=\"co\">#&gt;       }</span></span>\n<span><span class=\"co\">#&gt;       </span></span>\n<span><span class=\"co\">#&gt;       // add log(pr_n) to prob(K_min)</span></span>\n<span><span class=\"co\">#&gt;       target += poisson_log_lpmf(K_min | log_lambda)</span></span>\n<span><span class=\"co\">#&gt;                 + binomial_logit_lpmf(N_obs | K_min, logit_p) + log(prob_n);</span></span>\n<span><span class=\"co\">#&gt;     }</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; generated quantities {</span></span>\n<span><span class=\"co\">#&gt;   vector[n_lv] penalty = rep_vector(1e12, n_lv);</span></span>\n<span><span class=\"co\">#&gt;   vector[n_sp_trend] rho_trend = log(lambda_trend);</span></span>\n<span><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>The posterior summary of this model shows that it has converged\nnicely</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span><span class=\"co\">#&gt; obs ~ species - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span><span class=\"co\">#&gt; ~s(time, by = trend, k = 4) + species</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; nmix</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N process models:</span></span>\n<span><span class=\"co\">#&gt; 2 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 10 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 6 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1500; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 4000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;              2.5%   50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; speciessp_1 -0.28 0.710  1.40    1  2060</span></span>\n<span><span class=\"co\">#&gt; speciessp_2 -1.20 0.014  0.89    1  1892</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;                               2.5%     50%  97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)_trend            2.700  3.0000  3.500 1.00  1824</span></span>\n<span><span class=\"co\">#&gt; speciessp_2_trend           -1.200 -0.6200  0.160 1.00  1483</span></span>\n<span><span class=\"co\">#&gt; s(time):trendtrend1.1_trend -0.080  0.0160  0.220 1.00  1030</span></span>\n<span><span class=\"co\">#&gt; s(time):trendtrend1.2_trend -0.240  0.0078  0.280 1.00  2105</span></span>\n<span><span class=\"co\">#&gt; s(time):trendtrend1.3_trend -0.470 -0.2500 -0.036 1.00  2200</span></span>\n<span><span class=\"co\">#&gt; s(time):trendtrend2.1_trend -0.270 -0.0140  0.085 1.01   509</span></span>\n<span><span class=\"co\">#&gt; s(time):trendtrend2.2_trend -0.200  0.0290  0.500 1.00   859</span></span>\n<span><span class=\"co\">#&gt; s(time):trendtrend2.3_trend  0.028  0.3300  0.630 1.00  2317</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span><span class=\"co\">#&gt;                       edf Ref.df Chi.sq p-value</span></span>\n<span><span class=\"co\">#&gt; s(time):seriestrend1 1.13      3   1.10    0.74</span></span>\n<span><span class=\"co\">#&gt; s(time):seriestrend2 1.07      3   3.17    0.59</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 4000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 4000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:07:59 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod) to get started describing this model</span></span></code></pre></div>\n<p><code><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo()</a></code> functionality works just as it does for all\n<code>mvgam</code> models to aid in model comparison / selection (though\nnote that Pareto K values often give warnings for mixture models so\nthese may not be too helpful)</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Computed from 4000 by 60 log-likelihood matrix.</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt;          Estimate   SE</span></span>\n<span><span class=\"co\">#&gt; elpd_loo   -233.5 14.9</span></span>\n<span><span class=\"co\">#&gt; p_loo        86.8 14.0</span></span>\n<span><span class=\"co\">#&gt; looic       467.1 29.8</span></span>\n<span><span class=\"co\">#&gt; ------</span></span>\n<span><span class=\"co\">#&gt; MCSE of elpd_loo is NA.</span></span>\n<span><span class=\"co\">#&gt; MCSE and ESS estimates assume MCMC draws (r_eff in [0.3, 1.1]).</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Pareto k diagnostic values:</span></span>\n<span><span class=\"co\">#&gt;                          Count Pct.    Min. ESS</span></span>\n<span><span class=\"co\">#&gt; (-Inf, 0.7]   (good)     30    50.0%   679     </span></span>\n<span><span class=\"co\">#&gt;    (0.7, 1]   (bad)      13    21.7%   &lt;NA&gt;    </span></span>\n<span><span class=\"co\">#&gt;    (1, Inf)   (very bad) 17    28.3%   &lt;NA&gt;    </span></span>\n<span><span class=\"co\">#&gt; See help('pareto-k-diagnostic') for details.</span></span></code></pre></div>\n<p>Plot the estimated smooths of time from each species’ latent\nabundance process (on the log scale)</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooths'</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-11-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p><code>marginaleffects</code> support allows for more useful\nprediction-based interrogations on different scales (though note that at\nthe time of writing this Vignette, you must have the development version\nof <code>marginaleffects</code> installed for <code><a href=\"../reference/mvgam_families.html\">nmix()</a></code> models\nto be supported; use\n<code>remotes::install_github('vincentarelbundock/marginaleffects')</code>\nto install). Objects that use family <code><a href=\"../reference/mvgam_families.html\">nmix()</a></code> have a few\nadditional prediction scales that can be used (i.e. <code>link</code>,\n<code>response</code>, <code>detection</code> or <code>latent_N</code>).\nFor example, here are the estimated detection probabilities per species,\nwhich show that the model has done a nice job of estimating these\nparameters:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">marginaleffects</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"st\">'species'</span>,</span>\n<span>                 type <span class=\"op\">=</span> <span class=\"st\">'detection'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'Pr(detection)'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/lims.html\" class=\"external-link\">ylim</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggtheme.html\" class=\"external-link\">theme_classic</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/theme.html\" class=\"external-link\">theme</a></span><span class=\"op\">(</span>legend.position <span class=\"op\">=</span> <span class=\"st\">'none'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-12-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>A common goal in N-mixture modelling is to estimate the true latent\nabundance. The model has automatically generated predictions for the\nunknown latent abundance that are conditional on the observations. We\ncan extract these and produce decent plots using a small function</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/hindcast.mvgam.html\">hindcast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'latent_N'</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Function to plot latent abundance estimates vs truth</span></span>\n<span><span class=\"va\">plot_latentN</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">hindcasts</span>, <span class=\"va\">data</span>, <span class=\"va\">species</span> <span class=\"op\">=</span> <span class=\"st\">'sp_1'</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  <span class=\"va\">all_series</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>                         <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">species</span> <span class=\"op\">==</span> <span class=\"op\">!</span><span class=\"op\">!</span><span class=\"va\">species</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>                         <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/pull.html\" class=\"external-link\">pull</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span>  </span>\n<span>  <span class=\"co\"># Grab the first replicate that represents this series</span></span>\n<span>  <span class=\"co\"># so we can get the true simulated values</span></span>\n<span>  <span class=\"va\">series</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">all_series</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">]</span><span class=\"op\">)</span></span>\n<span>  <span class=\"va\">truths</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, <span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"op\">!</span><span class=\"op\">!</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">[</span><span class=\"va\">series</span><span class=\"op\">]</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/pull.html\" class=\"external-link\">pull</a></span><span class=\"op\">(</span><span class=\"va\">truth</span><span class=\"op\">)</span></span>\n<span>  </span>\n<span>  <span class=\"co\"># In case some replicates have missing observations,</span></span>\n<span>  <span class=\"co\"># pull out predictions for ALL replicates and average over them</span></span>\n<span>  <span class=\"va\">hcs</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/do.call.html\" class=\"external-link\">do.call</a></span><span class=\"op\">(</span><span class=\"va\">rbind</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/lapply.html\" class=\"external-link\">lapply</a></span><span class=\"op\">(</span><span class=\"va\">all_series</span>, <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>    <span class=\"va\">ind</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"../reference/index-mvgam.html\">names</a></span><span class=\"op\">(</span><span class=\"va\">hindcasts</span><span class=\"op\">$</span><span class=\"va\">hindcasts</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"https://rdrr.io/r/base/match.html\" class=\"external-link\">%in%</a></span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/character.html\" class=\"external-link\">as.character</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span>    <span class=\"va\">hindcasts</span><span class=\"op\">$</span><span class=\"va\">hindcasts</span><span class=\"op\">[[</span><span class=\"va\">ind</span><span class=\"op\">]</span><span class=\"op\">]</span></span>\n<span>  <span class=\"op\">}</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span>  </span>\n<span>  <span class=\"co\"># Calculate posterior empirical quantiles of predictions</span></span>\n<span>  <span class=\"va\">pred_quantiles</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/t.html\" class=\"external-link\">t</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/apply.html\" class=\"external-link\">apply</a></span><span class=\"op\">(</span><span class=\"va\">hcs</span>, <span class=\"fl\">2</span>, <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> </span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/quantile.html\" class=\"external-link\">quantile</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.05</span>, <span class=\"fl\">0.2</span>, <span class=\"fl\">0.3</span>, <span class=\"fl\">0.4</span>, </span>\n<span>                          <span class=\"fl\">0.5</span>, <span class=\"fl\">0.6</span>, <span class=\"fl\">0.7</span>, <span class=\"fl\">0.8</span>, <span class=\"fl\">0.95</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span>  <span class=\"va\">pred_quantiles</span><span class=\"op\">$</span><span class=\"va\">time</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">pred_quantiles</span><span class=\"op\">)</span></span>\n<span>  <span class=\"va\">pred_quantiles</span><span class=\"op\">$</span><span class=\"va\">truth</span> <span class=\"op\">&lt;-</span> <span class=\"va\">truths</span></span>\n<span>  </span>\n<span>  <span class=\"co\"># Grab observations</span></span>\n<span>  <span class=\"va\">data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">series</span> <span class=\"op\"><a href=\"https://rdrr.io/r/base/match.html\" class=\"external-link\">%in%</a></span> <span class=\"va\">all_series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, <span class=\"va\">obs</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">observations</span></span>\n<span>  </span>\n<span>  <span class=\"co\"># Plot</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></span><span class=\"op\">(</span><span class=\"va\">pred_quantiles</span>, <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">time</span>, group <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_ribbon.html\" class=\"external-link\">geom_ribbon</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>ymin <span class=\"op\">=</span> <span class=\"va\">X5.</span>, ymax <span class=\"op\">=</span> <span class=\"va\">X95.</span><span class=\"op\">)</span>, fill <span class=\"op\">=</span> <span class=\"st\">\"#DCBCBC\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> </span>\n<span>    <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_ribbon.html\" class=\"external-link\">geom_ribbon</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>ymin <span class=\"op\">=</span> <span class=\"va\">X30.</span>, ymax <span class=\"op\">=</span> <span class=\"va\">X70.</span><span class=\"op\">)</span>, fill <span class=\"op\">=</span> <span class=\"st\">\"#B97C7C\"</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_path.html\" class=\"external-link\">geom_line</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">time</span>, y <span class=\"op\">=</span> <span class=\"va\">truth</span><span class=\"op\">)</span>,</span>\n<span>              colour <span class=\"op\">=</span> <span class=\"st\">'black'</span>, linewidth <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_point.html\" class=\"external-link\">geom_point</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">time</span>, y <span class=\"op\">=</span> <span class=\"va\">truth</span><span class=\"op\">)</span>,</span>\n<span>               shape <span class=\"op\">=</span> <span class=\"fl\">21</span>, colour <span class=\"op\">=</span> <span class=\"st\">'white'</span>, fill <span class=\"op\">=</span> <span class=\"st\">'black'</span>,</span>\n<span>               size <span class=\"op\">=</span> <span class=\"fl\">2.5</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_jitter.html\" class=\"external-link\">geom_jitter</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">observations</span>, <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">time</span>, y <span class=\"op\">=</span> <span class=\"va\">obs</span><span class=\"op\">)</span>,</span>\n<span>                width <span class=\"op\">=</span> <span class=\"fl\">0.06</span>, </span>\n<span>                shape <span class=\"op\">=</span> <span class=\"fl\">21</span>, fill <span class=\"op\">=</span> <span class=\"st\">'darkred'</span>, colour <span class=\"op\">=</span> <span class=\"st\">'white'</span>, size <span class=\"op\">=</span> <span class=\"fl\">2.5</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">labs</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"st\">'Latent abundance (N)'</span>,</span>\n<span>         x <span class=\"op\">=</span> <span class=\"st\">'Time'</span>,</span>\n<span>         title <span class=\"op\">=</span> <span class=\"va\">species</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">}</span></span></code></pre></div>\n<p>Latent abundance plots vs the simulated truths for each species are\nshown below. Here, the red points show the imperfect observations, the\nblack line shows the true latent abundance, and the ribbons show\ncredible intervals of our estimates:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">plot_latentN</span><span class=\"op\">(</span><span class=\"va\">hc</span>, <span class=\"va\">testdat</span>, species <span class=\"op\">=</span> <span class=\"st\">'sp_1'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-14-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">plot_latentN</span><span class=\"op\">(</span><span class=\"va\">hc</span>, <span class=\"va\">testdat</span>, species <span class=\"op\">=</span> <span class=\"st\">'sp_2'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-14-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>We can see that estimates for both species have correctly captured\nthe true temporal variation and magnitudes in abundance</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"example-2-a-larger-survey-with-possible-nonlinear-effects\">Example 2: a larger survey with possible nonlinear effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#example-2-a-larger-survey-with-possible-nonlinear-effects\"></a>\n</h2>\n<p>Now for another example with a larger dataset. We will use data from\n<a href=\"https://doserlab.com/files/spabundance-web/articles/nmixturemodels\" target=\"_blank\" class=\"external-link\">Jeff Doser’s simulation example from the wonderful\n<code>spAbundance</code> package</a>. The simulated data include one\ncontinuous site-level covariate, one factor site-level covariate and two\ncontinuous sample-level covariates. This example will allow us to\nexamine how we can include possibly nonlinear effects in the latent\nprocess and detection probability models.</p>\n<p>Download the data and grab observations / covariate measurements for\none species</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># Date link</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/load.html\" class=\"external-link\">load</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/connections.html\" class=\"external-link\">url</a></span><span class=\"op\">(</span><span class=\"st\">'https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda'</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">data.one.sp</span> <span class=\"op\">&lt;-</span> <span class=\"va\">dataNMixSim</span></span>\n<span></span>\n<span><span class=\"co\"># Pull out observations for one species</span></span>\n<span><span class=\"va\">data.one.sp</span><span class=\"op\">$</span><span class=\"va\">y</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data.one.sp</span><span class=\"op\">$</span><span class=\"va\">y</span><span class=\"op\">[</span><span class=\"fl\">1</span>, , <span class=\"op\">]</span></span>\n<span></span>\n<span><span class=\"co\"># Abundance covariates that don't change across repeat sampling observations</span></span>\n<span><span class=\"va\">abund.cov</span> <span class=\"op\">&lt;-</span> <span class=\"va\">dataNMixSim</span><span class=\"op\">$</span><span class=\"va\">abund.covs</span><span class=\"op\">[</span>, <span class=\"fl\">1</span><span class=\"op\">]</span></span>\n<span><span class=\"va\">abund.factor</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">dataNMixSim</span><span class=\"op\">$</span><span class=\"va\">abund.covs</span><span class=\"op\">[</span>, <span class=\"fl\">2</span><span class=\"op\">]</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Detection covariates that can change across repeat sampling observations</span></span>\n<span><span class=\"co\"># Note that `NA`s are not allowed for covariates in mvgam, so we randomly</span></span>\n<span><span class=\"co\"># impute them here</span></span>\n<span><span class=\"va\">det.cov</span> <span class=\"op\">&lt;-</span> <span class=\"va\">dataNMixSim</span><span class=\"op\">$</span><span class=\"va\">det.covs</span><span class=\"op\">$</span><span class=\"va\">det.cov.1</span><span class=\"op\">[</span>,<span class=\"op\">]</span></span>\n<span><span class=\"va\">det.cov</span><span class=\"op\">[</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/NA.html\" class=\"external-link\">is.na</a></span><span class=\"op\">(</span><span class=\"va\">det.cov</span><span class=\"op\">)</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/NA.html\" class=\"external-link\">is.na</a></span><span class=\"op\">(</span><span class=\"va\">det.cov</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">det.cov2</span> <span class=\"op\">&lt;-</span> <span class=\"va\">dataNMixSim</span><span class=\"op\">$</span><span class=\"va\">det.covs</span><span class=\"op\">$</span><span class=\"va\">det.cov.2</span></span>\n<span><span class=\"va\">det.cov2</span><span class=\"op\">[</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/NA.html\" class=\"external-link\">is.na</a></span><span class=\"op\">(</span><span class=\"va\">det.cov2</span><span class=\"op\">)</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/NA.html\" class=\"external-link\">is.na</a></span><span class=\"op\">(</span><span class=\"va\">det.cov2</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Next we wrangle into the appropriate ‘long’ data format, adding\nindicators of <code>time</code> and <code>series</code> for working in\n<code>mvgam</code>. We also add the <code>cap</code> variable to\nrepresent the maximum latent N to marginalize over for each\nobservation</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/do.call.html\" class=\"external-link\">do.call</a></span><span class=\"op\">(</span><span class=\"va\">rbind</span>,</span>\n<span>                    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/lapply.html\" class=\"external-link\">lapply</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">data.one.sp</span><span class=\"op\">$</span><span class=\"va\">y</span><span class=\"op\">)</span>, <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>                      <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">data.one.sp</span><span class=\"op\">$</span><span class=\"va\">y</span><span class=\"op\">[</span><span class=\"va\">x</span>,<span class=\"op\">]</span>,</span>\n<span>                                 abund_cov <span class=\"op\">=</span> <span class=\"va\">abund.cov</span><span class=\"op\">[</span><span class=\"va\">x</span><span class=\"op\">]</span>,</span>\n<span>                                 abund_fac <span class=\"op\">=</span> <span class=\"va\">abund.factor</span><span class=\"op\">[</span><span class=\"va\">x</span><span class=\"op\">]</span>,</span>\n<span>                                 det_cov <span class=\"op\">=</span> <span class=\"va\">det.cov</span><span class=\"op\">[</span><span class=\"va\">x</span>,<span class=\"op\">]</span>,</span>\n<span>                                 det_cov2 <span class=\"op\">=</span> <span class=\"va\">det.cov2</span><span class=\"op\">[</span><span class=\"va\">x</span>,<span class=\"op\">]</span>,</span>\n<span>                                 replicate <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NCOL</a></span><span class=\"op\">(</span><span class=\"va\">data.one.sp</span><span class=\"op\">$</span><span class=\"va\">y</span><span class=\"op\">)</span>,</span>\n<span>                                 site <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'site'</span>, <span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span>                    <span class=\"op\">}</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>species <span class=\"op\">=</span> <span class=\"st\">'sp_1'</span>,</span>\n<span>                series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"va\">site</span>, <span class=\"st\">'_'</span>, <span class=\"va\">species</span>, <span class=\"st\">'_'</span>, <span class=\"va\">replicate</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>site <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">site</span>, levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">site</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">species</span>, levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">species</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                time <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>                cap <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">data.one.sp</span><span class=\"op\">$</span><span class=\"va\">y</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">20</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The data include observations for 225 sites with three replicates per\nsite, though some observations are missing</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">mod_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] 675</span></span>\n<span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">mod_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 675</span></span>\n<span><span class=\"co\">#&gt; Columns: 11</span></span>\n<span><span class=\"co\">#&gt; $ y         <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 1, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 2, 2, <span style=\"color: #BB0000;\">NA</span>, 1, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>, 0, 1, 0, 0, 0, 0, <span style=\"color: #BB0000;\">NA</span>, <span style=\"color: #BB0000;\">NA</span>…</span></span>\n<span><span class=\"co\">#&gt; $ abund_cov <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -0.3734384, -0.3734384, -0.3734384, 0.7064305, 0.7064305, 0.…</span></span>\n<span><span class=\"co\">#&gt; $ abund_fac <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> 3, 3, 3, 4, 4, 4, 9, 9, 9, 2, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, …</span></span>\n<span><span class=\"co\">#&gt; $ det_cov   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -1.2827999, 1.1770575, -1.3636225, -0.2922343, 0.1954809, 0.…</span></span>\n<span><span class=\"co\">#&gt; $ det_cov2  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.03047314, 0.01556041, 0.05861094, 0.90822039, 1.04555361, …</span></span>\n<span><span class=\"co\">#&gt; $ replicate <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, …</span></span>\n<span><span class=\"co\">#&gt; $ site      <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> site1, site1, site1, site2, site2, site2, site3, site3, site…</span></span>\n<span><span class=\"co\">#&gt; $ species   <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, …</span></span>\n<span><span class=\"co\">#&gt; $ series    <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> site1_sp_1_1, site1_sp_1_2, site1_sp_1_3, site2_sp_1_1, site…</span></span>\n<span><span class=\"co\">#&gt; $ time      <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …</span></span>\n<span><span class=\"co\">#&gt; $ cap       <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, …</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">mod_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;    y  abund_cov abund_fac    det_cov   det_cov2 replicate  site species</span></span>\n<span><span class=\"co\">#&gt; 1  1 -0.3734384         3 -1.2827999 2.03047314         1 site1    sp_1</span></span>\n<span><span class=\"co\">#&gt; 2 NA -0.3734384         3  1.1770575 0.01556041         2 site1    sp_1</span></span>\n<span><span class=\"co\">#&gt; 3 NA -0.3734384         3 -1.3636225 0.05861094         3 site1    sp_1</span></span>\n<span><span class=\"co\">#&gt; 4 NA  0.7064305         4 -0.2922343 0.90822039         1 site2    sp_1</span></span>\n<span><span class=\"co\">#&gt; 5  2  0.7064305         4  0.1954809 1.04555361         2 site2    sp_1</span></span>\n<span><span class=\"co\">#&gt; 6  2  0.7064305         4  0.9673034 1.91971178         3 site2    sp_1</span></span>\n<span><span class=\"co\">#&gt;         series time cap</span></span>\n<span><span class=\"co\">#&gt; 1 site1_sp_1_1    1  33</span></span>\n<span><span class=\"co\">#&gt; 2 site1_sp_1_2    1  33</span></span>\n<span><span class=\"co\">#&gt; 3 site1_sp_1_3    1  33</span></span>\n<span><span class=\"co\">#&gt; 4 site2_sp_1_1    1  33</span></span>\n<span><span class=\"co\">#&gt; 5 site2_sp_1_2    1  33</span></span>\n<span><span class=\"co\">#&gt; 6 site2_sp_1_3    1  33</span></span></code></pre></div>\n<p>The final step for data preparation is of course the\n<code>trend_map</code>, which sets up the mapping between observation\nreplicates and the latent abundance models. This is done in the same way\nas in the example above</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"co\"># each unique combination of site*species is a separate process</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>trend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"va\">site</span>, <span class=\"va\">species</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"va\">trend</span>, <span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/distinct.html\" class=\"external-link\">distinct</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">trend_map</span></span>\n<span></span>\n<span><span class=\"va\">trend_map</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">trend</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"fl\">12</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;    trend         series</span></span>\n<span><span class=\"co\">#&gt; 1      1 site100_sp_1_1</span></span>\n<span><span class=\"co\">#&gt; 2      1 site100_sp_1_2</span></span>\n<span><span class=\"co\">#&gt; 3      1 site100_sp_1_3</span></span>\n<span><span class=\"co\">#&gt; 4      2 site101_sp_1_1</span></span>\n<span><span class=\"co\">#&gt; 5      2 site101_sp_1_2</span></span>\n<span><span class=\"co\">#&gt; 6      2 site101_sp_1_3</span></span>\n<span><span class=\"co\">#&gt; 7      3 site102_sp_1_1</span></span>\n<span><span class=\"co\">#&gt; 8      3 site102_sp_1_2</span></span>\n<span><span class=\"co\">#&gt; 9      3 site102_sp_1_3</span></span>\n<span><span class=\"co\">#&gt; 10     4 site103_sp_1_1</span></span>\n<span><span class=\"co\">#&gt; 11     4 site103_sp_1_2</span></span>\n<span><span class=\"co\">#&gt; 12     4 site103_sp_1_3</span></span></code></pre></div>\n<p>Now we are ready to fit a model using <code><a href=\"../reference/mvgam.html\">mvgam()</a></code>. Here we\nwill use penalized splines for each of the continuous covariate effects\nto detect possible nonlinear associations. We also showcase how\n<code>mvgam</code> can make use of the different approximation\nalgorithms available in <code>Stan</code> by using the meanfield\nvariational Bayes approximator (this reduces computation time from\naround 90 seconds to around 12 seconds for this example)</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"co\"># effects of covariates on detection probability;</span></span>\n<span>  <span class=\"co\"># here we use penalized splines for both continuous covariates</span></span>\n<span>  formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">det_cov</span>, k <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">det_cov2</span>, k <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># effects of the covariates on latent abundance;</span></span>\n<span>  <span class=\"co\"># here we use a penalized spline for the continuous covariate and</span></span>\n<span>  <span class=\"co\"># hierarchical intercepts for the factor covariate</span></span>\n<span>  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">abund_cov</span>, k <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">abund_fac</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># link multiple observations to each site</span></span>\n<span>  trend_map <span class=\"op\">=</span> <span class=\"va\">trend_map</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># nmix() family and supplied data</span></span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/mvgam_families.html\">nmix</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">mod_data</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># standard normal priors on key regression parameters</span></span>\n<span>  priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"st\">'b'</span><span class=\"op\">)</span>,</span>\n<span>             <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"st\">'Intercept'</span><span class=\"op\">)</span>,</span>\n<span>             <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"st\">'Intercept_trend'</span><span class=\"op\">)</span>,</span>\n<span>             <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"st\">'sigma_raw_trend'</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># use Stan's variational inference for quicker results</span></span>\n<span>  algorithm <span class=\"op\">=</span> <span class=\"st\">'meanfield'</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># no need to compute \"series-level\" residuals</span></span>\n<span>  residuals <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  samples <span class=\"op\">=</span> <span class=\"fl\">1000</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Inspect the model summary but don’t bother looking at estimates for\nall individual spline coefficients. Notice how we no longer receive\ninformation on convergence because we did not use MCMC sampling for this\nmodel</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span><span class=\"co\">#&gt; y ~ s(det_cov, k = 3) + s(det_cov2, k = 3)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span><span class=\"co\">#&gt; ~s(abund_cov, k = 3) + s(abund_fac, bs = \"re\")</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; nmix</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N process models:</span></span>\n<span><span class=\"co\">#&gt; 225 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 675 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 1 chains, each with iter = 1000; warmup = ; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 1000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n.eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept) 0.022 0.33  0.63  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM observation smooths:</span></span>\n<span><span class=\"co\">#&gt;              edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(det_cov)  1.17      2    113 0.00063 ***</span></span>\n<span><span class=\"co\">#&gt; s(det_cov2) 1.84      2    572 &lt; 2e-16 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;                    2.5%   50%  97.5% Rhat n.eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)_trend -0.33 -0.18 -0.028  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process model group-level estimates:</span></span>\n<span><span class=\"co\">#&gt;                           2.5%   50% 97.5% Rhat n.eff</span></span>\n<span><span class=\"co\">#&gt; mean(s(abund_fac))_trend -0.11 0.037  0.19  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; sd(s(abund_fac))_trend    0.27 0.400  0.59  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value</span></span>\n<span><span class=\"co\">#&gt; s(abund_cov) 1.21      2   1.35    0.37</span></span>\n<span><span class=\"co\">#&gt; s(abund_fac) 8.84     10  12.23    0.19</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Posterior approximation used: no diagnostics to compute</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod) to get started describing this model</span></span></code></pre></div>\n<p>Again we can make use of <code>marginaleffects</code> support for\ninterrogating the model through targeted predictions. First, we can\ninspect the estimated average detection probability</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">marginaleffects</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/predictions.html\" class=\"external-link\">avg_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'detection'</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt;  Estimate 2.5 % 97.5 %</span></span>\n<span><span class=\"co\">#&gt;     0.568 0.504   0.63</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Type:  detection </span></span>\n<span><span class=\"co\">#&gt; Columns: estimate, conf.low, conf.high</span></span></code></pre></div>\n<p>Next investigate estimated effects of covariates on latent abundance\nusing the <code><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects()</a></code> function and specifying\n<code>type = 'link'</code>; this will return plots on the expectation\nscale</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">abund_plots</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span>\n<span>                                        type <span class=\"op\">=</span> <span class=\"st\">'link'</span>,</span>\n<span>                                        effects <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'abund_cov'</span>,</span>\n<span>                                                    <span class=\"st\">'abund_fac'</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                    plot <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The effect of the continuous covariate on expected latent\nabundance</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">abund_plots</span><span class=\"op\">[[</span><span class=\"fl\">1</span><span class=\"op\">]</span><span class=\"op\">]</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'Expected latent abundance'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-24-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The effect of the factor covariate on expected latent abundance,\nestimated as a hierarchical random effect</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">abund_plots</span><span class=\"op\">[[</span><span class=\"fl\">2</span><span class=\"op\">]</span><span class=\"op\">]</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'Expected latent abundance'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-25-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Now we can investigate estimated effects of covariates on detection\nprobability using <code>type = 'detection'</code></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">det_plots</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span>\n<span>                                      type <span class=\"op\">=</span> <span class=\"st\">'detection'</span>,</span>\n<span>                                      effects <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'det_cov'</span>,</span>\n<span>                                                  <span class=\"st\">'det_cov2'</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>                  plot <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The covariate smooths were estimated to be somewhat nonlinear on the\nlogit scale according to the model summary (based on their approximate\nsignificances). But inspecting conditional effects of each covariate on\nthe probability scale is more intuitive and useful</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">det_plots</span><span class=\"op\">[[</span><span class=\"fl\">1</span><span class=\"op\">]</span><span class=\"op\">]</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'Pr(detection)'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-27-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">det_plots</span><span class=\"op\">[[</span><span class=\"fl\">2</span><span class=\"op\">]</span><span class=\"op\">]</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'Pr(detection)'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-27-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>More targeted predictions are also easy with\n<code>marginaleffects</code> support. For example, we can ask: How does\ndetection probability change as we change <em>both</em> detection\ncovariates?</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fivenum_round</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Round.html\" class=\"external-link\">round</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/fivenum.html\" class=\"external-link\">fivenum</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">marginaleffects</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, </span>\n<span>                 newdata <span class=\"op\">=</span> <span class=\"fu\">marginaleffects</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/datagrid.html\" class=\"external-link\">datagrid</a></span><span class=\"op\">(</span>det_cov <span class=\"op\">=</span> <span class=\"va\">unique</span>,</span>\n<span>                                    det_cov2 <span class=\"op\">=</span> <span class=\"va\">fivenum_round</span><span class=\"op\">)</span>,</span>\n<span>                 by <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'det_cov'</span>, <span class=\"st\">'det_cov2'</span><span class=\"op\">)</span>,</span>\n<span>                 type <span class=\"op\">=</span> <span class=\"st\">'detection'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggtheme.html\" class=\"external-link\">theme_classic</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'Pr(detection)'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"nmixtures_files/figure-html/unnamed-chunk-28-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The model has found support for some important covariate effects, but\nof course we’d want to interrogate how well the model predicts and think\nabout possible spatial effects to capture unmodelled variation in latent\nabundance (which can easily be incorporated into both linear predictors\nusing spatial smooths).</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"further-reading\">Further reading<a class=\"anchor\" aria-label=\"anchor\" href=\"#further-reading\"></a>\n</h2>\n<p>The following papers and resources offer useful material about\nN-mixture models for ecological population dynamics investigations:</p>\n<p>Guélat, Jérôme, and Kéry, Marc. “<a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.12983\" class=\"external-link\">Effects\nof Spatial Autocorrelation and Imperfect Detection on Species\nDistribution Models.</a>” <em>Methods in Ecology and Evolution</em> 9\n(2018): 1614–25.</p>\n<p>Kéry, Marc, and Royle Andrew J. “<a href=\"https://shop.elsevier.com/books/applied-hierarchical-modeling-in-ecology-analysis-of-distribution-abundance-and-species-richness-in-r-and-bugs/kery/978-0-12-809585-0\" class=\"external-link\">Applied\nhierarchical modeling in ecology: Analysis of distribution, abundance\nand species richness in R and BUGS: Volume 2: Dynamic and advanced\nmodels</a>”. London, UK: Academic Press (2020).</p>\n<p>Royle, Andrew J. “<a href=\"https://onlinelibrary.wiley.com/doi/full/10.1111/j.0006-341X.2004.00142.x\" class=\"external-link\">N‐mixture\nmodels for estimating population size from spatially replicated\ncounts.</a>” <em>Biometrics</em> 60.1 (2004): 108-115.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\" class=\"external-link\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p>\n<p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p>\n<p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer>\n</div>\n\n  \n\n  \n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/shared_states.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"description\" content=\"mvgam\">\n<title>Shared latent states in mvgam • mvgam</title>\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\">\n<!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Shared latent states in mvgam\">\n<meta property=\"og:description\" content=\"mvgam\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n<!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"active nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul>\n<form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\">\n</form>\n\n      <ul class=\"navbar-nav\">\n<li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n</div>\n\n    \n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Shared latent states in mvgam</h1>\n                        <h4 data-toc-skip class=\"author\">Nicholas J\nClark</h4>\n            \n            <h4 data-toc-skip class=\"date\">2025-02-06</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/vignettes/shared_states.Rmd\" class=\"external-link\"><code>vignettes/shared_states.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>shared_states.Rmd</code></div>\n    </div>\n\n    \n    \n<p>This vignette gives an example of how <code>mvgam</code> can be used\nto estimate models where multiple observed time series share the same\nlatent process model. For full details on the basic <code>mvgam</code>\nfunctionality, please see <a href=\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\">the\nintroductory vignette</a>.</p>\n<div class=\"section level2\">\n<h2 id=\"the-trend_map-argument\">The <code>trend_map</code> argument<a class=\"anchor\" aria-label=\"anchor\" href=\"#the-trend_map-argument\"></a>\n</h2>\n<p>The <code>trend_map</code> argument in the <code><a href=\"../reference/mvgam.html\">mvgam()</a></code>\nfunction is an optional <code>data.frame</code> that can be used to\nspecify which series should depend on which latent process models\n(called “trends” in <code>mvgam</code>). This can be particularly useful\nif we wish to force multiple observed time series to depend on the same\nlatent trend process, but with different observation processes. If this\nargument is supplied, a latent factor model is set up by setting\n<code>use_lv = TRUE</code> and using the supplied <code>trend_map</code>\nto set up the shared trends. Users familiar with the <code>MARSS</code>\nfamily of packages will recognize this as a way of specifying the <span class=\"math inline\">\\(Z\\)</span> matrix. This <code>data.frame</code>\nneeds to have column names <code>series</code> and <code>trend</code>,\nwith integer values in the <code>trend</code> column to state which\ntrend each series should depend on. The <code>series</code> column\nshould have a single unique entry for each time series in the data, with\nnames that perfectly match the factor levels of the <code>series</code>\nvariable in <code>data</code>). For example, if we were to simulate a\ncollection of three integer-valued time series (using\n<code>sim_mvgam</code>), the following <code>trend_map</code> would\nforce the first two series to share the same latent trend process:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">122</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span>,</span>\n<span>                    mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span>, <span class=\"fl\">2</span><span class=\"op\">)</span>,</span>\n<span>                    family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">trend_map</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span>,</span>\n<span>                        trend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">trend_map</span></span>\n<span><span class=\"co\">#&gt;     series trend</span></span>\n<span><span class=\"co\">#&gt; 1 series_1     1</span></span>\n<span><span class=\"co\">#&gt; 2 series_2     1</span></span>\n<span><span class=\"co\">#&gt; 3 series_3     2</span></span></code></pre></div>\n<p>We can see that the factor levels in <code>trend_map</code> match\nthose in the data:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/all.equal.html\" class=\"external-link\">all.equal</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">trend_map</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] TRUE</span></span></code></pre></div>\n<div class=\"section level3\">\n<h3 id=\"checking-trend_map-with-run_model-false\">Checking <code>trend_map</code> with\n<code>run_model = FALSE</code><a class=\"anchor\" aria-label=\"anchor\" href=\"#checking-trend_map-with-run_model-false\"></a>\n</h3>\n<p>Supplying this <code>trend_map</code> to the <code>mvgam</code>\nfunction for a simple model, but setting <code>run_model = FALSE</code>,\nallows us to inspect the constructed <code>Stan</code> code and the data\nobjects that would be used to condition the model. Here we will set up a\nmodel in which each series has a different observation process (with\nonly a different intercept per series in this case), and the two latent\ndynamic process models evolve as independent AR1 processes that also\ncontain a shared nonlinear smooth function to capture repeated\nseasonality. This model is not too complicated but it does show how we\ncan learn shared and independent effects for collections of time series\nin the <code>mvgam</code> framework:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fake_mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> </span>\n<span>                    <span class=\"co\"># observation model formula, which has a </span></span>\n<span>                    <span class=\"co\"># different intercept per series</span></span>\n<span>                    <span class=\"va\">series</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>                  </span>\n<span>                  <span class=\"co\"># process model formula, which has a shared seasonal smooth</span></span>\n<span>                  <span class=\"co\"># (each latent process model shares the SAME smooth)</span></span>\n<span>                  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span>\n<span>                  </span>\n<span>                  <span class=\"co\"># AR1 dynamics (each latent process model has DIFFERENT)</span></span>\n<span>                  <span class=\"co\"># dynamics; processes are estimated using the noncentred</span></span>\n<span>                  <span class=\"co\"># parameterisation for improved efficiency</span></span>\n<span>                  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                  noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>                  </span>\n<span>                  <span class=\"co\"># supplied trend_map</span></span>\n<span>                  trend_map <span class=\"op\">=</span> <span class=\"va\">trend_map</span>,</span>\n<span>                  </span>\n<span>                  <span class=\"co\"># data and observation family</span></span>\n<span>                  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>                  run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Inspecting the <code>Stan</code> code shows how this model is a\ndynamic factor model in which the loadings are constructed to reflect\nthe supplied <code>trend_map</code>:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">fake_mod</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span><span class=\"co\">#&gt; data {</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp_trend; // number of trend smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_lv; // number of dynamic factors</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span><span class=\"co\">#&gt;   matrix[n_series, n_lv] Z; // matrix mapping series to latent states</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis_trend; // number of trend basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span><span class=\"co\">#&gt;   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_lv] int ytimes_trend;</span></span>\n<span><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   matrix[4, 4] S_trend1; // mgcv smooth penalty matrix S_trend1</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; transformed data {</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; parameters {</span></span>\n<span><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis_trend] b_raw_trend;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent state SD terms</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_lv] sigma;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent state AR1 terms</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=-1, upper=1&gt;[n_lv] ar1;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // raw latent states</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_lv] LV_raw;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp_trend] lambda_trend;</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span><span class=\"co\">#&gt;   // raw latent states</span></span>\n<span><span class=\"co\">#&gt;   vector[n * n_lv] trend_mus;</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent states</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_lv] LV;</span></span>\n<span><span class=\"co\">#&gt;   vector[num_basis_trend] b_trend;</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // observation model basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // process model basis coefficients</span></span>\n<span><span class=\"co\">#&gt;   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend];</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // latent process linear predictors</span></span>\n<span><span class=\"co\">#&gt;   trend_mus = X_trend * b_trend;</span></span>\n<span><span class=\"co\">#&gt;   LV = LV_raw .* rep_matrix(sigma', rows(LV_raw));</span></span>\n<span><span class=\"co\">#&gt;   for (j in 1 : n_lv) {</span></span>\n<span><span class=\"co\">#&gt;     LV[1, j] += trend_mus[ytimes_trend[1, j]];</span></span>\n<span><span class=\"co\">#&gt;     for (i in 2 : n) {</span></span>\n<span><span class=\"co\">#&gt;       LV[i, j] += trend_mus[ytimes_trend[i, j]]</span></span>\n<span><span class=\"co\">#&gt;                   + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]);</span></span>\n<span><span class=\"co\">#&gt;     }</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // derived latent states</span></span>\n<span><span class=\"co\">#&gt;   for (i in 1 : n) {</span></span>\n<span><span class=\"co\">#&gt;     for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;       trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);</span></span>\n<span><span class=\"co\">#&gt;     }</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; model {</span></span>\n<span><span class=\"co\">#&gt;   // prior for seriesseries_1...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, 0, 2);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for seriesseries_2...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[2] ~ student_t(3, 0, 2);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for seriesseries_3...</span></span>\n<span><span class=\"co\">#&gt;   b_raw[3] ~ student_t(3, 0, 2);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // priors for AR parameters</span></span>\n<span><span class=\"co\">#&gt;   ar1 ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // priors for latent state SD parameters</span></span>\n<span><span class=\"co\">#&gt;   sigma ~ student_t(3, 0, 2.5);</span></span>\n<span><span class=\"co\">#&gt;   to_vector(LV_raw) ~ std_normal();</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // dynamic process models</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for (Intercept)_trend...</span></span>\n<span><span class=\"co\">#&gt;   b_raw_trend[1] ~ student_t(3, 0, 2);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   // prior for s(season)_trend...</span></span>\n<span><span class=\"co\">#&gt;   b_raw_trend[2 : 5] ~ multi_normal_prec(zero_trend[2 : 5],</span></span>\n<span><span class=\"co\">#&gt;                                          S_trend1[1 : 4, 1 : 4]</span></span>\n<span><span class=\"co\">#&gt;                                          * lambda_trend[1]);</span></span>\n<span><span class=\"co\">#&gt;   lambda_trend ~ normal(5, 30);</span></span>\n<span><span class=\"co\">#&gt;   {</span></span>\n<span><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span><span class=\"co\">#&gt;     vector[n_nonmissing] flat_trends;</span></span>\n<span><span class=\"co\">#&gt;     flat_trends = to_vector(trend)[obs_ind];</span></span>\n<span><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span></span>\n<span><span class=\"co\">#&gt;                               append_row(b, 1.0));</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span>\n<span><span class=\"co\">#&gt; generated quantities {</span></span>\n<span><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span><span class=\"co\">#&gt;   vector[n_sp_trend] rho_trend;</span></span>\n<span><span class=\"co\">#&gt;   vector[n_lv] penalty;</span></span>\n<span><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span><span class=\"co\">#&gt;   penalty = 1.0 / (sigma .* sigma);</span></span>\n<span><span class=\"co\">#&gt;   rho_trend = log(lambda_trend);</span></span>\n<span><span class=\"co\">#&gt;   </span></span>\n<span><span class=\"co\">#&gt;   matrix[n_series, n_lv] lv_coefs = Z;</span></span>\n<span><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span></span>\n<span><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span><span class=\"co\">#&gt;   }</span></span>\n<span><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>Notice the line that states “lv_coefs = Z;”. This uses the supplied\n<span class=\"math inline\">\\(Z\\)</span> matrix to construct the loading\ncoefficients. The supplied matrix now looks exactly like what you’d use\nif you were to create a similar model in the <code>MARSS</code>\npackage:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fake_mod</span><span class=\"op\">$</span><span class=\"va\">model_data</span><span class=\"op\">$</span><span class=\"va\">Z</span></span>\n<span><span class=\"co\">#&gt;      [,1] [,2]</span></span>\n<span><span class=\"co\">#&gt; [1,]    1    0</span></span>\n<span><span class=\"co\">#&gt; [2,]    1    0</span></span>\n<span><span class=\"co\">#&gt; [3,]    0    1</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"fitting-and-inspecting-the-model\">Fitting and inspecting the model<a class=\"anchor\" aria-label=\"anchor\" href=\"#fitting-and-inspecting-the-model\"></a>\n</h3>\n<p>Though this model doesn’t perfectly match the data-generating process\n(which allowed each series to have different underlying dynamics), we\ncan still fit it to show what the resulting inferences look like:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">full_mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">series</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>                  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span>\n<span>                  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                  noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>                  trend_map <span class=\"op\">=</span> <span class=\"va\">trend_map</span>,</span>\n<span>                  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>                  silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The summary of this model is informative as it shows that only two\nlatent process models have been estimated, even though we have three\nobserved time series. The model converges well</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">full_mod</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span><span class=\"co\">#&gt; y ~ series - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span><span class=\"co\">#&gt; ~s(season, bs = \"cc\", k = 6)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; poisson</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; log</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; AR()</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N process models:</span></span>\n<span><span class=\"co\">#&gt; 2 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 3 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 75 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;                 2.5%   50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; seriesseries_1 -2.50 -0.67   1.2    1   835</span></span>\n<span><span class=\"co\">#&gt; seriesseries_2 -1.60  0.27   2.1    1   835</span></span>\n<span><span class=\"co\">#&gt; seriesseries_3 -0.59  1.30   3.2    1   835</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process model AR parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;         2.5%    50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ar1[1] -0.57 -0.210  0.16 1.01   669</span></span>\n<span><span class=\"co\">#&gt; ar1[2] -0.29  0.018  0.32 1.01   399</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma[1] 0.38 0.56  0.76 1.00   712</span></span>\n<span><span class=\"co\">#&gt; sigma[2] 0.50 0.63  0.79 1.01   702</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;                     2.5%    50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)_trend -1.100  0.760  2.60    1   831</span></span>\n<span><span class=\"co\">#&gt; s(season).1_trend -0.300 -0.051  0.22    1   852</span></span>\n<span><span class=\"co\">#&gt; s(season).2_trend -0.038  0.230  0.53    1   974</span></span>\n<span><span class=\"co\">#&gt; s(season).3_trend -0.510 -0.190  0.11    1   615</span></span>\n<span><span class=\"co\">#&gt; s(season).4_trend  0.340  0.680  0.97    1   603</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span><span class=\"co\">#&gt;            edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(season) 2.95      4   16.4 0.00017 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:12:13 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(full_mod) to get started describing this model</span></span></code></pre></div>\n<p>Both series 1 and 2 share the exact same latent process estimates,\nwhile the estimates for series 3 are different:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">full_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-9-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">full_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-9-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">full_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-9-3.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>However, forecasts for series’ 1 and 2 will differ because they have\ndifferent intercepts in the observation model</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"example-signal-detection\">Example: signal detection<a class=\"anchor\" aria-label=\"anchor\" href=\"#example-signal-detection\"></a>\n</h2>\n<p>Now we will explore a more complicated example. Here we simulate a\ntrue hidden signal that we are trying to track. This signal depends\nnonlinearly on some covariate (called <code>productivity</code>, which\nrepresents a measure of how productive the landscape is). The signal\nalso demonstrates a fairly large amount of temporal autocorrelation:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span>\n<span><span class=\"co\"># simulate a nonlinear relationship using the mgcv function gamSim</span></span>\n<span><span class=\"va\">signal_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">100</span>, eg <span class=\"op\">=</span> <span class=\"fl\">1</span>, scale <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Gu &amp; Wahba 4 term additive model</span></span>\n<span></span>\n<span><span class=\"co\"># productivity is one of the variables in the simulated data</span></span>\n<span><span class=\"va\">productivity</span> <span class=\"op\">&lt;-</span> <span class=\"va\">signal_dat</span><span class=\"op\">$</span><span class=\"va\">x2</span></span>\n<span></span>\n<span><span class=\"co\"># simulate the true signal, which already has a nonlinear relationship</span></span>\n<span><span class=\"co\"># with productivity; we will add in a fairly strong AR1 process to </span></span>\n<span><span class=\"co\"># contribute to the signal</span></span>\n<span><span class=\"va\">true_signal</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">as.vector</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/scale.html\" class=\"external-link\">scale</a></span><span class=\"op\">(</span><span class=\"va\">signal_dat</span><span class=\"op\">$</span><span class=\"va\">y</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>                         <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/arima.sim.html\" class=\"external-link\">arima.sim</a></span><span class=\"op\">(</span><span class=\"fl\">100</span>, model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>ar <span class=\"op\">=</span> <span class=\"fl\">0.8</span>, sd <span class=\"op\">=</span> <span class=\"fl\">0.1</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Plot the signal to inspect it’s evolution over time</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">true_signal</span>, type <span class=\"op\">=</span> <span class=\"st\">'l'</span>,</span>\n<span>     bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span>\n<span>     ylab <span class=\"op\">=</span> <span class=\"st\">'True signal'</span>,</span>\n<span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Time'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-11-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Next we simulate three sensors that are trying to track the same\nhidden signal. All of these sensors have different observation errors\nthat can depend nonlinearly on a second external covariate, called\n<code>temperature</code> in this example. Again this makes use of\n<code>gamSim</code></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">sim_series</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">n_series</span> <span class=\"op\">=</span> <span class=\"fl\">3</span>, <span class=\"va\">true_signal</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  <span class=\"va\">temp_effects</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">100</span>, eg <span class=\"op\">=</span> <span class=\"fl\">7</span>, scale <span class=\"op\">=</span> <span class=\"fl\">0.1</span><span class=\"op\">)</span></span>\n<span>  <span class=\"va\">temperature</span> <span class=\"op\">&lt;-</span> <span class=\"va\">temp_effects</span><span class=\"op\">$</span><span class=\"va\">y</span></span>\n<span>  <span class=\"va\">alphas</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">n_series</span>, sd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span></span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/do.call.html\" class=\"external-link\">do.call</a></span><span class=\"op\">(</span><span class=\"va\">rbind</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/lapply.html\" class=\"external-link\">lapply</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq_len</a></span><span class=\"op\">(</span><span class=\"va\">n_series</span><span class=\"op\">)</span>, <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>observed <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">true_signal</span><span class=\"op\">)</span>,</span>\n<span>                                mean <span class=\"op\">=</span> <span class=\"va\">alphas</span><span class=\"op\">[</span><span class=\"va\">series</span><span class=\"op\">]</span> <span class=\"op\">+</span></span>\n<span>                                       <span class=\"fl\">1.5</span><span class=\"op\">*</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">as.vector</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/scale.html\" class=\"external-link\">scale</a></span><span class=\"op\">(</span><span class=\"va\">temp_effects</span><span class=\"op\">[</span>, <span class=\"va\">series</span> <span class=\"op\">+</span> <span class=\"fl\">1</span><span class=\"op\">]</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>                                       <span class=\"va\">true_signal</span>,</span>\n<span>                                sd <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>               series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'sensor_'</span>, <span class=\"va\">series</span><span class=\"op\">)</span>,</span>\n<span>               time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">true_signal</span><span class=\"op\">)</span>,</span>\n<span>               temperature <span class=\"op\">=</span> <span class=\"va\">temperature</span>,</span>\n<span>               productivity <span class=\"op\">=</span> <span class=\"va\">productivity</span>,</span>\n<span>               true_signal <span class=\"op\">=</span> <span class=\"va\">true_signal</span><span class=\"op\">)</span></span>\n<span>   <span class=\"op\">}</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span>  <span class=\"op\">}</span></span>\n<span><span class=\"va\">model_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">sim_series</span><span class=\"op\">(</span>true_signal <span class=\"op\">=</span> <span class=\"va\">true_signal</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Gu &amp; Wahba 4 term additive model, correlated predictors</span></span></code></pre></div>\n<p>Plot the sensor observations</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">model_dat</span>, y <span class=\"op\">=</span> <span class=\"st\">'observed'</span>,</span>\n<span>                  series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-13-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>And now plot the observed relationships between the three sensors and\nthe <code>temperature</code> covariate</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span> <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">observed</span> <span class=\"op\">~</span> <span class=\"va\">temperature</span>, data <span class=\"op\">=</span> <span class=\"va\">model_dat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"st\">'sensor_1'</span><span class=\"op\">)</span>,</span>\n<span>   pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>,</span>\n<span>   ylab <span class=\"op\">=</span> <span class=\"st\">'Sensor 1'</span>,</span>\n<span>   xlab <span class=\"op\">=</span> <span class=\"st\">'Temperature'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-14-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span> <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">observed</span> <span class=\"op\">~</span> <span class=\"va\">temperature</span>, data <span class=\"op\">=</span> <span class=\"va\">model_dat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"st\">'sensor_2'</span><span class=\"op\">)</span>,</span>\n<span>   pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>,</span>\n<span>   ylab <span class=\"op\">=</span> <span class=\"st\">'Sensor 2'</span>,</span>\n<span>   xlab <span class=\"op\">=</span> <span class=\"st\">'Temperature'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-14-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span> <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">observed</span> <span class=\"op\">~</span> <span class=\"va\">temperature</span>, data <span class=\"op\">=</span> <span class=\"va\">model_dat</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"st\">'sensor_3'</span><span class=\"op\">)</span>,</span>\n<span>   pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>,</span>\n<span>   ylab <span class=\"op\">=</span> <span class=\"st\">'Sensor 3'</span>,</span>\n<span>   xlab <span class=\"op\">=</span> <span class=\"st\">'Temperature'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-14-3.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"section level3\">\n<h3 id=\"the-shared-signal-model\">The shared signal model<a class=\"anchor\" aria-label=\"anchor\" href=\"#the-shared-signal-model\"></a>\n</h3>\n<p>Now we can formulate and fit a model that allows each sensor’s\nobservation error to depend nonlinearly on <code>temperature</code>\nwhile allowing the true signal to depend nonlinearly on\n<code>productivity</code>. By fixing all of the values in the\n<code>trend</code> column to <code>1</code> in the\n<code>trend_map</code>, we are assuming that all observation sensors are\ntracking the same latent signal. We use informative priors on the two\nvariance components (process error and observation error), which reflect\nour prior belief that the observation error is smaller overall than the\ntrue process error</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span></span>\n<span>               <span class=\"co\"># formula for observations, allowing for different</span></span>\n<span>               <span class=\"co\"># intercepts and hierarchical smooth effects of temperature</span></span>\n<span>               <span class=\"va\">observed</span> <span class=\"op\">~</span> <span class=\"va\">series</span> <span class=\"op\">+</span> </span>\n<span>               <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">temperature</span>, k <span class=\"op\">=</span> <span class=\"fl\">10</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>               <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, <span class=\"va\">temperature</span>, bs <span class=\"op\">=</span> <span class=\"st\">'sz'</span>, k <span class=\"op\">=</span> <span class=\"fl\">8</span><span class=\"op\">)</span>,</span>\n<span>             </span>\n<span>             trend_formula <span class=\"op\">=</span></span>\n<span>               <span class=\"co\"># formula for the latent signal, which can depend</span></span>\n<span>               <span class=\"co\"># nonlinearly on productivity</span></span>\n<span>               <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">productivity</span>, k <span class=\"op\">=</span> <span class=\"fl\">8</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>             </span>\n<span>             trend_model <span class=\"op\">=</span></span>\n<span>               <span class=\"co\"># in addition to productivity effects, the signal is</span></span>\n<span>               <span class=\"co\"># assumed to exhibit temporal autocorrelation</span></span>\n<span>               <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>             </span>\n<span>             trend_map <span class=\"op\">=</span></span>\n<span>               <span class=\"co\"># trend_map forces all sensors to track the same</span></span>\n<span>               <span class=\"co\"># latent signal</span></span>\n<span>               <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">model_dat</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span>,</span>\n<span>                          trend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>             </span>\n<span>             <span class=\"co\"># informative priors on process error</span></span>\n<span>             <span class=\"co\"># and observation error will help with convergence</span></span>\n<span>             priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">sigma</span><span class=\"op\">)</span>,</span>\n<span>                        <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">sigma_obs</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>             </span>\n<span>             <span class=\"co\"># Gaussian observations</span></span>\n<span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>             data <span class=\"op\">=</span> <span class=\"va\">model_dat</span>,</span>\n<span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>View a reduced version of the model summary because there will be\nmany spline coefficients in this model</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span><span class=\"co\">#&gt; observed ~ series + s(temperature, k = 10) + s(series, temperature, </span></span>\n<span><span class=\"co\">#&gt;     bs = \"sz\", k = 8)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span><span class=\"co\">#&gt; ~s(productivity, k = 8) - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; gaussian</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; identity</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; AR()</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N process models:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 3 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 100 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1100; warmup = 600; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;              2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[1]  1.4 1.7   2.1    1  1117</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[2]  1.7 2.0   2.4    1  1881</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[3]  2.0 2.3   2.7    1  2132</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;                 2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)    -3.30 -2.1 -0.81    1  1136</span></span>\n<span><span class=\"co\">#&gt; seriessensor_2 -2.80 -1.4 -0.19    1   945</span></span>\n<span><span class=\"co\">#&gt; seriessensor_3  0.75  3.1  4.80    1  1150</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM observation smooths:</span></span>\n<span><span class=\"co\">#&gt;                        edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(temperature)        1.30      9   0.15 1.00000    </span></span>\n<span><span class=\"co\">#&gt; s(series,temperature) 2.17     16 107.42 0.00084 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process model AR parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ar1[1] 0.38 0.6   0.8 1.02   490</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;          2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma[1]  1.4 1.8   2.2 1.01   738</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span><span class=\"co\">#&gt;                  edf Ref.df Chi.sq p-value</span></span>\n<span><span class=\"co\">#&gt; s(productivity) 1.02      7   5.17    0.95</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:13:15 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod) to get started describing this model</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"inspecting-effects-on-both-process-and-observation-models\">Inspecting effects on both process and observation models<a class=\"anchor\" aria-label=\"anchor\" href=\"#inspecting-effects-on-both-process-and-observation-models\"></a>\n</h3>\n<p>Don’t pay much attention to the approximate <em>p</em>-values of the\nsmooth terms. The calculation for these values is incredibly sensitive\nto the estimates for the smoothing parameters so I don’t tend to find\nthem to be very meaningful. What are meaningful, however, are\nprediction-based plots of the smooth functions. All main effects can be\nquickly plotted with <code>conditional_effects</code>:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-17-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"shared_states_files/figure-html/unnamed-chunk-17-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"shared_states_files/figure-html/unnamed-chunk-17-3.png\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"shared_states_files/figure-html/unnamed-chunk-17-4.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p><code>conditional_effects</code> is simply a wrapper to the more\nflexible <code>plot_predictions</code> function from the\n<code>marginaleffects</code> package. We can get more useful plots of\nthese effects using this function for further customisation:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">require</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://marginaleffects.com/\" class=\"external-link\">marginaleffects</a></span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, </span>\n<span>                 condition <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'temperature'</span>, <span class=\"st\">'series'</span>, <span class=\"st\">'series'</span><span class=\"op\">)</span>,</span>\n<span>                 points <span class=\"op\">=</span> <span class=\"fl\">0.5</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/theme.html\" class=\"external-link\">theme</a></span><span class=\"op\">(</span>legend.position <span class=\"op\">=</span> <span class=\"st\">'none'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-18-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>We have successfully estimated effects, some of them nonlinear, that\nimpact the hidden process AND the observations. All in a single joint\nmodel. But there can always be challenges with these models,\nparticularly when estimating both process and observation error at the\nsame time.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"recovering-the-hidden-signal\">Recovering the hidden signal<a class=\"anchor\" aria-label=\"anchor\" href=\"#recovering-the-hidden-signal\"></a>\n</h3>\n<p>A final but very key question is whether we can successfully recover\nthe true hidden signal. The <code>trend</code> slot in the returned\nmodel parameters has the estimates for this signal, which we can easily\nplot using the <code>mvgam</code> S3 method for <code>plot</code>. We\ncan also overlay the true values for the hidden signal, which shows that\nour model has done a good job of recovering it:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Overlay the true simulated signal</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/points.html\" class=\"external-link\">points</a></span><span class=\"op\">(</span><span class=\"va\">true_signal</span>, pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, cex <span class=\"op\">=</span> <span class=\"fl\">1</span>, col <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/points.html\" class=\"external-link\">points</a></span><span class=\"op\">(</span><span class=\"va\">true_signal</span>, pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, cex <span class=\"op\">=</span> <span class=\"fl\">0.8</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"shared_states_files/figure-html/unnamed-chunk-19-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"further-reading\">Further reading<a class=\"anchor\" aria-label=\"anchor\" href=\"#further-reading\"></a>\n</h2>\n<p>The following papers and resources offer a lot of useful material\nabout other types of State-Space models and how they can be applied in\npractice:</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. “<a href=\"https://journal.r-project.org/archive/2012/RJ-2012-002/index.html\" class=\"external-link\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata.</a>” <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Ward, Eric J., et al. “<a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x\" class=\"external-link\">Inferring\nspatial structure from time‐series data: using multivariate state‐space\nmodels to detect metapopulation structure of California sea lions in the\nGulf of California, Mexico.</a>” <em>Journal of Applied Ecology</em>\n47.1 (2010): 47-56.</p>\n<p>Auger‐Méthé, Marie, et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470\" class=\"external-link\">“A\nguide to state–space modeling of ecological time series.</a>”\n<em>Ecological Monographs</em> 91.4 (2021): e01470.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please reach out if you are\ninterested (n.clark’at’uq.edu.au)</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p>\n<p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p>\n<p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer>\n</div>\n\n  \n\n  \n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/time_varying_effects.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"description\" content=\"mvgam\">\n<title>Time-varying effects in mvgam • mvgam</title>\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\">\n<!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Time-varying effects in mvgam\">\n<meta property=\"og:description\" content=\"mvgam\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n<!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"active nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul>\n<form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\">\n</form>\n\n      <ul class=\"navbar-nav\">\n<li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n</div>\n\n    \n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Time-varying effects in mvgam</h1>\n                        <h4 data-toc-skip class=\"author\">Nicholas J\nClark</h4>\n            \n            <h4 data-toc-skip class=\"date\">2025-02-06</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/vignettes/time_varying_effects.Rmd\" class=\"external-link\"><code>vignettes/time_varying_effects.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>time_varying_effects.Rmd</code></div>\n    </div>\n\n    \n    \n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to estimate and forecast regression coefficients\nthat vary through time.</p>\n<div class=\"section level2\">\n<h2 id=\"time-varying-effects\">Time-varying effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#time-varying-effects\"></a>\n</h2>\n<p>Dynamic fixed-effect coefficients (often referred to as dynamic\nlinear models) can be readily incorporated into GAMs / DGAMs. In\n<code>mvgam</code>, the <code><a href=\"../reference/dynamic.html\">dynamic()</a></code> formula wrapper offers a\nconvenient interface to set these up. The plan is to incorporate a range\nof dynamic options (such as random walk, AR1 etc…) but for the moment\nonly low-rank Gaussian Process (GP) smooths are allowed (making use\neither of the <code>gp</code> basis in <code>mgcv</code> of of Hilbert\nspace approximate GPs). These are advantageous over splines or random\nwalk effects for several reasons. First, GPs will force the time-varying\neffect to be smooth. This often makes sense in reality, where we would\nnot expect a regression coefficient to change rapidly from one time\npoint to the next. Second, GPs provide information on the ‘global’\ndynamics of a time-varying effect through their length-scale parameters.\nThis means we can use them to provide accurate forecasts of how an\neffect is expected to change in the future, something that we couldn’t\ndo well if we used splines to estimate the effect. An example below\nillustrates.</p>\n<div class=\"section level3\">\n<h3 id=\"simulating-time-varying-effects\">Simulating time-varying effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#simulating-time-varying-effects\"></a>\n</h3>\n<p>Simulate a time-varying coefficient using a squared exponential\nGaussian Process function with length scale <span class=\"math inline\">\\(\\rho\\)</span>=10. We will do this using an\ninternal function from <code>mvgam</code> (the <code>sim_gp</code>\nfunction):</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">1111</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">N</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">200</span></span>\n<span><span class=\"va\">beta_temp</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mvgam</span><span class=\"fu\">:::</span><span class=\"fu\">sim_gp</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span>,</span>\n<span>                            alpha_gp <span class=\"op\">=</span> <span class=\"fl\">0.75</span>,</span>\n<span>                            rho_gp <span class=\"op\">=</span> <span class=\"fl\">10</span>,</span>\n<span>                            h <span class=\"op\">=</span> <span class=\"va\">N</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0.5</span></span></code></pre></div>\n<p>A plot of the time-varying coefficient shows that it changes smoothly\nthrough time:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">beta_temp</span>, type <span class=\"op\">=</span> <span class=\"st\">'l'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">3</span>, </span>\n<span>     bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>, xlab <span class=\"op\">=</span> <span class=\"st\">'Time'</span>, ylab <span class=\"op\">=</span> <span class=\"st\">'Coefficient'</span>,</span>\n<span>     col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/box.html\" class=\"external-link\">box</a></span><span class=\"op\">(</span>bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-3-1.png\" alt=\"Simulating time-varying effects in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Next we need to simulate the values of the covariate, which we will\ncall <code>temp</code> (to represent <span class=\"math inline\">\\(temperature\\)</span>). In this case we just use a\nstandard normal distribution to simulate this covariate:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">temp</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">N</span>, sd <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Finally, simulate the outcome variable, which is a Gaussian\nobservation process (with observation error) over the time-varying\neffect of <span class=\"math inline\">\\(temperature\\)</span></p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">out</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">N</span>, mean <span class=\"op\">=</span> <span class=\"fl\">4</span> <span class=\"op\">+</span> <span class=\"va\">beta_temp</span> <span class=\"op\">*</span> <span class=\"va\">temp</span>,</span>\n<span>             sd <span class=\"op\">=</span> <span class=\"fl\">0.25</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">time</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq_along</a></span><span class=\"op\">(</span><span class=\"va\">temp</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">out</span>,  type <span class=\"op\">=</span> <span class=\"st\">'l'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">3</span>, </span>\n<span>     bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>, xlab <span class=\"op\">=</span> <span class=\"st\">'Time'</span>, ylab <span class=\"op\">=</span> <span class=\"st\">'Outcome'</span>,</span>\n<span>     col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/box.html\" class=\"external-link\">box</a></span><span class=\"op\">(</span>bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-5-1.png\" alt=\"Simulating time-varying effects in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Gather the data into a <code>data.frame</code> for fitting models,\nand split the data into training and testing folds.</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">out</span>, <span class=\"va\">temp</span>, <span class=\"va\">time</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">data_train</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">190</span>,<span class=\"op\">]</span></span>\n<span><span class=\"va\">data_test</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data</span><span class=\"op\">[</span><span class=\"fl\">191</span><span class=\"op\">:</span><span class=\"fl\">200</span>,<span class=\"op\">]</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"the-dynamic-function\">The <code>dynamic()</code> function<a class=\"anchor\" aria-label=\"anchor\" href=\"#the-dynamic-function\"></a>\n</h3>\n<p>Time-varying coefficients can be fairly easily set up using the\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code> or <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> wrapper functions in\n<code>mvgam</code> formulae by fitting a nonlinear effect of\n<code>time</code> and using the covariate of interest as the numeric\n<code>by</code> variable (see <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">?mgcv::s</a></code> or\n<code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">?brms::gp</a></code> for more details). The <code><a href=\"../reference/dynamic.html\">dynamic()</a></code>\nformula wrapper offers a way to automate this process, and will\neventually allow for a broader variety of time-varying effects (such as\nrandom walk or AR processes). Depending on the arguments that are\nspecified to <code>dynamic</code>, it will either set up a low-rank GP\nsmooth function using <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code> with <code>bs = 'gp'</code> and a\nfixed value of the length scale parameter <span class=\"math inline\">\\(\\rho\\)</span>, or it will set up a Hilbert space\napproximate GP using the <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> function with\n<code>c=5/4</code> so that <span class=\"math inline\">\\(\\rho\\)</span> is\nestimated (see <code><a href=\"../reference/dynamic.html\">?dynamic</a></code> for more details). In this first\nexample we will use the <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code> option, and will mis-specify\nthe <span class=\"math inline\">\\(\\rho\\)</span> parameter here as, in\npractice, it is never known. This call to <code><a href=\"../reference/dynamic.html\">dynamic()</a></code> will\nset up the following smooth:\n<code>s(time, by = temp, bs = \"gp\", m = c(-2, 8, 2), k = 40)</code></p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">out</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"../reference/dynamic.html\">dynamic</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, rho <span class=\"op\">=</span> <span class=\"fl\">8</span>, stationary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, k <span class=\"op\">=</span> <span class=\"fl\">40</span><span class=\"op\">)</span>,</span>\n<span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>             data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span>\n<span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Inspect the model summary, which shows how the <code><a href=\"../reference/dynamic.html\">dynamic()</a></code>\nwrapper was used to construct a low-rank Gaussian Process smooth\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; out ~ s(time, by = temp, bs = \"gp\", m = c(-2, 8, 2), k = 40)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; gaussian</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; identity</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 190 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[1] 0.23 0.25  0.28    1  2374</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)    4   4   4.1    1  3037</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value    </span></span>\n<span><span class=\"co\">#&gt; s(time):temp 16.1     40    169  &lt;2e-16 ***</span></span>\n<span><span class=\"co\">#&gt; ---</span></span>\n<span><span class=\"co\">#&gt; Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 1 of 2000 iterations ended with a divergence (0.05%)</span></span>\n<span><span class=\"co\">#&gt;  *Try running with larger adapt_delta to remove the divergences</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:13:49 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod) to get started describing this model</span></span></code></pre></div>\n<p>Because this model used a spline with a <code>gp</code> basis, it’s\nsmooths can be visualised just like any other <code>gam</code>. We can\nplot the estimates for the in-sample and out-of-sample periods to see\nhow the Gaussian Process function produces sensible smooth forecasts.\nHere we supply the full dataset to the <code>newdata</code> argument in\n<code><a href=\"../reference/plot_mvgam_smooth.html\">plot_mvgam_smooth()</a></code> to inspect posterior forecasts of the\ntime-varying smooth function. Overlay the true simulated function to see\nthat the model has adequately estimated it’s dynamics in both the\ntraining and testing data partitions</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, smooth <span class=\"op\">=</span> <span class=\"fl\">1</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>v <span class=\"op\">=</span> <span class=\"fl\">190</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">beta_temp</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2.5</span>, col <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">beta_temp</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-10-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>We can also use <code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions()</a></code> from the\n<code>marginaleffects</code> package to visualise the time-varying\ncoefficient for what the effect would be estimated to be at different\nvalues of <span class=\"math inline\">\\(temperature\\)</span>:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">require</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://marginaleffects.com/\" class=\"external-link\">marginaleffects</a></span><span class=\"op\">)</span></span>\n<span><span class=\"va\">range_round</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Round.html\" class=\"external-link\">round</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/range.html\" class=\"external-link\">range</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">}</span></span>\n<span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, </span>\n<span>                 newdata <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/datagrid.html\" class=\"external-link\">datagrid</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"va\">unique</span>,</span>\n<span>                                    temp <span class=\"op\">=</span> <span class=\"va\">range_round</span><span class=\"op\">)</span>,</span>\n<span>                 by <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'time'</span>, <span class=\"st\">'temp'</span>, <span class=\"st\">'temp'</span><span class=\"op\">)</span>,</span>\n<span>                 type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-11-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>This results in sensible forecasts of the observations as well</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-12-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The syntax is very similar if we wish to estimate the parameters of\nthe underlying Gaussian Process, this time using a Hilbert space\napproximation. We simply omit the <code>rho</code> argument in\n<code><a href=\"../reference/dynamic.html\">dynamic()</a></code> to make this happen. This will set up a call\nsimilar to <code>gp(time, by = 'temp', c = 5/4, k = 40)</code>.</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">out</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"../reference/dynamic.html\">dynamic</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, k <span class=\"op\">=</span> <span class=\"fl\">40</span><span class=\"op\">)</span>,</span>\n<span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>             data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span>\n<span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>This model summary now contains estimates for the marginal deviation\nand length scale parameters of the underlying Gaussian Process\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; out ~ gp(time, by = temp, c = 5/4, k = 40, scale = TRUE)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; gaussian</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; identity</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; None</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 190 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[1] 0.24 0.26   0.3    1  1709</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)    4   4   4.1    1  2286</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM gp term marginal deviation (alpha) and length scale (rho) estimates:</span></span>\n<span><span class=\"co\">#&gt;                      2.5%   50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; alpha_gp(time):temp 0.640 0.890 1.400    1   681</span></span>\n<span><span class=\"co\">#&gt; rho_gp(time):temp   0.026 0.052 0.069    1   765</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:14:42 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod) to get started describing this model</span></span></code></pre></div>\n<p>Effects for <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> terms can also be plotted as\nsmooths:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, smooth <span class=\"op\">=</span> <span class=\"fl\">1</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>v <span class=\"op\">=</span> <span class=\"fl\">190</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">beta_temp</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2.5</span>, col <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">beta_temp</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-16-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"salmon-survival-example\">Salmon survival example<a class=\"anchor\" aria-label=\"anchor\" href=\"#salmon-survival-example\"></a>\n</h2>\n<p>Here we will use openly available data on marine survival of Chinook\nsalmon to illustrate how time-varying effects can be used to improve\necological time series models. <a href=\"https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1365-2419.2005.00346.x\" class=\"external-link\">Scheuerell\nand Williams (2005)</a> used a dynamic linear model to examine the\nrelationship between marine survival of Chinook salmon and an index of\nocean upwelling strength along the west coast of the USA. The authors\nhypothesized that stronger upwelling in April should create better\ngrowing conditions for phytoplankton, which would then translate into\nmore zooplankton and provide better foraging opportunities for juvenile\nsalmon entering the ocean. The data on survival is measured as a\nproportional variable over 42 years (1964–2005) and is available in the\n<code>MARSS</code> package:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/load.html\" class=\"external-link\">load</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/connections.html\" class=\"external-link\">url</a></span><span class=\"op\">(</span><span class=\"st\">'https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda'</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">SalmonSurvCUI</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 42</span></span>\n<span><span class=\"co\">#&gt; Columns: 3</span></span>\n<span><span class=\"co\">#&gt; $ year    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 19…</span></span>\n<span><span class=\"co\">#&gt; $ logit.s <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82,…</span></span>\n<span><span class=\"co\">#&gt; $ CUI.apr <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 57, 5, 43, 11, 47, -21, 25, -2, -1, 43, 2, 35, 0, 1, -1, 6, -7…</span></span></code></pre></div>\n<p>First we need to prepare the data for modelling. The variable\n<code>CUI.apr</code> will be standardized to make it easier for the\nsampler to estimate underlying GP parameters for the time-varying\neffect. We also need to convert the survival back to a proportion, as in\nits current form it has been logit-transformed (this is because most\ntime series packages cannot handle proportional data). As usual, we also\nneed to create a <code>time</code> indicator and a <code>series</code>\nindicator for working in <code>mvgam</code>:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">SalmonSurvCUI</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"co\"># create a time variable</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/row_number.html\" class=\"external-link\">row_number</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span></span>\n<span>  <span class=\"co\"># create a series variable</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"st\">'salmon'</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span></span>\n<span>  <span class=\"co\"># z-score the covariate CUI.apr</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>CUI.apr <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">as.vector</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/scale.html\" class=\"external-link\">scale</a></span><span class=\"op\">(</span><span class=\"va\">CUI.apr</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span></span>\n<span>  <span class=\"co\"># convert logit-transformed survival back to proportional</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>survival <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Logistic.html\" class=\"external-link\">plogis</a></span><span class=\"op\">(</span><span class=\"va\">logit.s</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">model_data</span></span></code></pre></div>\n<p>Inspect the data</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">model_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 42</span></span>\n<span><span class=\"co\">#&gt; Columns: 6</span></span>\n<span><span class=\"co\">#&gt; $ year     <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1…</span></span>\n<span><span class=\"co\">#&gt; $ logit.s  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82…</span></span>\n<span><span class=\"co\">#&gt; $ CUI.apr  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 2.37949804, 0.03330223, 1.74782994, 0.30401713, 1.92830654, -…</span></span>\n<span><span class=\"co\">#&gt; $ time     <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18…</span></span>\n<span><span class=\"co\">#&gt; $ series   <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> salmon, salmon, salmon, salmon, salmon, salmon, salmon, salmo…</span></span>\n<span><span class=\"co\">#&gt; $ survival <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 0.030472033, 0.034891409, 0.027119717, 0.046088827, 0.0263393…</span></span></code></pre></div>\n<p>Plot features of the outcome variable, which shows that it is a\nproportional variable with particular restrictions that we want to\nmodel:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">model_data</span>, y <span class=\"op\">=</span> <span class=\"st\">'survival'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-20-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"section level3\">\n<h3 id=\"a-state-space-beta-regression\">A State-Space Beta regression<a class=\"anchor\" aria-label=\"anchor\" href=\"#a-state-space-beta-regression\"></a>\n</h3>\n<p><code>mvgam</code> can easily handle data that are bounded at 0 and 1\nwith a Beta observation model (using the <code>mgcv</code> function\n<code><a href=\"../reference/mvgam_families.html\">betar()</a></code>, see <code><a href=\"https://rdrr.io/pkg/mgcv/man/Beta.html\" class=\"external-link\">?mgcv::betar</a></code> for details). First\nwe will fit a simple State-Space model that uses an AR1 dynamic process\nmodel with no predictors and a Beta observation model:</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod0</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">survival</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>              noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>              priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">3.5</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">Intercept</span><span class=\"op\">)</span>,</span>\n<span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>              data <span class=\"op\">=</span> <span class=\"va\">model_data</span>,</span>\n<span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The summary of this model shows good behaviour of the Hamiltonian\nMonte Carlo sampler and provides useful summaries on the Beta\nobservation model parameters:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod0</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM formula:</span></span>\n<span><span class=\"co\">#&gt; survival ~ 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; beta</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; logit</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; AR()</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 42 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Observation precision parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; phi[1]   80 240   550 1.04   144</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept) -4.6 -4.3    -4    1   224</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Latent trend parameter AR estimates:</span></span>\n<span><span class=\"co\">#&gt;            2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ar1[1]   -0.370 0.68  0.98 1.01   321</span></span>\n<span><span class=\"co\">#&gt; sigma[1]  0.047 0.44  0.70 1.03   132</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 71 of 2000 iterations ended with a divergence (3.55%)</span></span>\n<span><span class=\"co\">#&gt;  *Try running with larger adapt_delta to remove the divergences</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:15:33 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod0) to get started describing this model</span></span></code></pre></div>\n<p>A plot of the underlying dynamic component shows how it has easily\nhandled the temporal evolution of the time series:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod0</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-24-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"including-time-varying-upwelling-effects\">Including time-varying upwelling effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#including-time-varying-upwelling-effects\"></a>\n</h3>\n<p>Now we can increase the complexity of our model by constructing and\nfitting a State-Space model with a time-varying effect of the coastal\nupwelling index in addition to the autoregressive dynamics. We again use\na Beta observation model to capture the restrictions of our proportional\nobservations, but this time will include a <code><a href=\"../reference/dynamic.html\">dynamic()</a></code> effect\nof <code>CUI.apr</code> in the latent process model. We do not specify\nthe <span class=\"math inline\">\\(\\rho\\)</span> parameter, instead opting\nto estimate it using a Hilbert space approximate GP:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">survival</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span>\n<span>              trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"../reference/dynamic.html\">dynamic</a></span><span class=\"op\">(</span><span class=\"va\">CUI.apr</span>, k <span class=\"op\">=</span> <span class=\"fl\">25</span>, scale <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>              noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>              priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">3.5</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">Intercept</span><span class=\"op\">)</span>,</span>\n<span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>              data <span class=\"op\">=</span> <span class=\"va\">model_data</span>,</span>\n<span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The summary for this model now includes estimates for the\ntime-varying GP parameters:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span><span class=\"co\">#&gt; survival ~ 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span><span class=\"co\">#&gt; ~dynamic(CUI.apr, k = 25, scale = FALSE) - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; beta</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; logit</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; AR()</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N process models:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 1 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 42 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Observation precision parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; phi[1]  170 350   670    1   653</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept) -4.4 -3.8  -2.9 1.01   677</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process model AR parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; ar1[1] 0.55 0.92  0.99 1.01   468</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma[1] 0.19 0.34  0.56    1   630</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process model gp term marginal deviation (alpha) and length scale (rho) estimates:</span></span>\n<span><span class=\"co\">#&gt;                         2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; alpha_gp(time):CUI.apr 0.018 0.3   1.2    1   520</span></span>\n<span><span class=\"co\">#&gt; rho_gp(time):CUI.apr   1.300 5.7  37.0    1   351</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhat looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; 83 of 2000 iterations ended with a divergence (4.15%)</span></span>\n<span><span class=\"co\">#&gt;  *Try running with larger adapt_delta to remove the divergences</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:17:08 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(mod1) to get started describing this model</span></span></code></pre></div>\n<p>The estimates for the underlying dynamic process, and for the\nhindcasts, haven’t changed much:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-28-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-29-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>But the process error parameter <span class=\"math inline\">\\(\\sigma\\)</span> is slightly smaller for this model\nthan for the first model:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># Extract estimates of the process error 'sigma' for each model</span></span>\n<span><span class=\"va\">mod0_sigma</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.data.frame.html\" class=\"external-link\">as.data.frame</a></span><span class=\"op\">(</span><span class=\"va\">mod0</span>, variable <span class=\"op\">=</span> <span class=\"st\">'sigma'</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>model <span class=\"op\">=</span> <span class=\"st\">'Mod0'</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">mod1_sigma</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.data.frame.html\" class=\"external-link\">as.data.frame</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, variable <span class=\"op\">=</span> <span class=\"st\">'sigma'</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>model <span class=\"op\">=</span> <span class=\"st\">'Mod1'</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">sigmas</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">rbind</a></span><span class=\"op\">(</span><span class=\"va\">mod0_sigma</span>, <span class=\"va\">mod1_sigma</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Plot using ggplot2</span></span>\n<span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">require</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://ggplot2.tidyverse.org\" class=\"external-link\">ggplot2</a></span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></span><span class=\"op\">(</span><span class=\"va\">sigmas</span>, <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">`sigma[1]`</span>, fill <span class=\"op\">=</span> <span class=\"va\">model</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_density.html\" class=\"external-link\">geom_density</a></span><span class=\"op\">(</span>alpha <span class=\"op\">=</span> <span class=\"fl\">0.3</span>, colour <span class=\"op\">=</span> <span class=\"cn\">NA</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/coord_flip.html\" class=\"external-link\">coord_flip</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-30-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>Why does the process error not need to be as flexible in the second\nmodel? Because the estimates of this dynamic process are now informed\npartly by the time-varying effect of upwelling, which we can visualise\non the link scale using <code><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooths'</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-31-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"comparing-model-predictive-performances\">Comparing model predictive performances<a class=\"anchor\" aria-label=\"anchor\" href=\"#comparing-model-predictive-performances\"></a>\n</h3>\n<p>A key question when fitting multiple time series models is whether\none of them provides better predictions than the other. There are\nseveral options in <code>mvgam</code> for exploring this quantitatively.\nFirst, we can compare models based on in-sample approximate\nleave-one-out cross-validation as implemented in the popular\n<code>loo</code> package:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo_compare.html\" class=\"external-link\">loo_compare</a></span><span class=\"op\">(</span><span class=\"va\">mod0</span>, <span class=\"va\">mod1</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;      elpd_diff se_diff</span></span>\n<span><span class=\"co\">#&gt; mod1  0.0       0.0   </span></span>\n<span><span class=\"co\">#&gt; mod0 -8.3       2.9</span></span></code></pre></div>\n<p>The second model has the larger Expected Log Predictive Density\n(ELPD), meaning that it is slightly favoured over the simpler model that\ndid not include the time-varying upwelling effect. However, the two\nmodels certainly do not differ by much. But this metric only compares\nin-sample performance, and we are hoping to use our models to produce\nreasonable forecasts. Luckily, <code>mvgam</code> also has routines for\ncomparing models using approximate leave-future-out cross-validation.\nHere we refit both models to a reduced training set (starting at time\npoint 30) and produce approximate 1-step ahead forecasts. These\nforecasts are used to estimate forecast ELPD before expanding the\ntraining set one time point at a time. We use Pareto-smoothed importance\nsampling to reweight posterior predictions, acting as a kind of particle\nfilter so that we don’t need to refit the model too often (you can read\nmore about how this process works in Bürkner et al. 2020).</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">lfo_mod0</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/lfo_cv.mvgam.html\">lfo_cv</a></span><span class=\"op\">(</span><span class=\"va\">mod0</span>, min_t <span class=\"op\">=</span> <span class=\"fl\">30</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">lfo_mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/lfo_cv.mvgam.html\">lfo_cv</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, min_t <span class=\"op\">=</span> <span class=\"fl\">30</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The model with the time-varying upwelling effect tends to provides\nbetter 1-step ahead forecasts, with a higher total forecast ELPD</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">lfo_mod0</span><span class=\"op\">$</span><span class=\"va\">elpds</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] 35.85707</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">lfo_mod1</span><span class=\"op\">$</span><span class=\"va\">elpds</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] 37.15718</span></span></code></pre></div>\n<p>We can also plot the ELPDs for each model as a contrast. Here, values\nless than zero suggest the time-varying predictor model (Mod1) gives\nbetter 1-step ahead forecasts:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">lfo_mod0</span><span class=\"op\">$</span><span class=\"va\">elpds</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">30</span>,</span>\n<span>     y <span class=\"op\">=</span> <span class=\"va\">lfo_mod0</span><span class=\"op\">$</span><span class=\"va\">elpds</span> <span class=\"op\">-</span> <span class=\"va\">lfo_mod1</span><span class=\"op\">$</span><span class=\"va\">elpds</span>,</span>\n<span>     ylab <span class=\"op\">=</span> <span class=\"st\">'ELPDmod0 - ELPDmod1'</span>,</span>\n<span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Evaluation time point'</span>,</span>\n<span>     pch <span class=\"op\">=</span> <span class=\"fl\">16</span>,</span>\n<span>     col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span>,</span>\n<span>     bty <span class=\"op\">=</span> <span class=\"st\">'l'</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>h <span class=\"op\">=</span> <span class=\"fl\">0</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"time_varying_effects_files/figure-html/unnamed-chunk-36-1.png\" alt=\"Comparing forecast skill for dynamic beta regression models in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>A useful exercise to further expand this model would be to think\nabout what kinds of predictors might impact measurement error, which\ncould easily be implemented into the observation formula in\n<code><a href=\"../reference/mvgam.html\">mvgam()</a></code>. But for now, we will leave the model as-is.</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"further-reading\">Further reading<a class=\"anchor\" aria-label=\"anchor\" href=\"#further-reading\"></a>\n</h2>\n<p>The following papers and resources offer a lot of useful material\nabout dynamic linear models and how they can be applied / evaluated in\npractice:</p>\n<p>Bürkner, PC, Gabry, J and Vehtari, A <a href=\"https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262\" class=\"external-link\">Approximate\nleave-future-out cross-validation for Bayesian time series models</a>.\n<em>Journal of Statistical Computation and Simulation</em>. 90:14 (2020)\n2499-2523.</p>\n<p>Herrero, Asier, et al. <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/1365-2745.12527\" class=\"external-link\">From\nthe individual to the landscape and back: time‐varying effects of\nclimate and herbivory on tree sapling growth at distribution limits</a>.\n<em>Journal of Ecology</em> 104.2 (2016): 430-442.</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. “<a href=\"https://journal.r-project.org/archive/2012/RJ-2012-002/index.html\" class=\"external-link\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata.</a>” <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Scheuerell, Mark D., and John G. Williams. <a href=\"https://onlinelibrary.wiley.com/doi/10.1111/j.1365-2419.2005.00346.x\" class=\"external-link\">Forecasting\nclimate induced changes in the survival of Snake River Spring/Summer\nChinook Salmon (<em>Oncorhynchus Tshawytscha</em>)</a> <em>Fisheries\nOceanography</em> 14 (2005): 448–57.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\" class=\"external-link\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p>\n<p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p>\n<p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer>\n</div>\n\n  \n\n  \n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/trend_formulas.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<meta name=\"description\" content=\"mvgam\">\n<title>State-Space models in mvgam • mvgam</title>\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\">\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\">\n<!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"State-Space models in mvgam\">\n<meta property=\"og:description\" content=\"mvgam\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n<!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"active nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul>\n<form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\">\n</form>\n\n      <ul class=\"navbar-nav\">\n<li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n</div>\n\n    \n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>State-Space models in mvgam</h1>\n                        <h4 data-toc-skip class=\"author\">Nicholas J\nClark</h4>\n            \n            <h4 data-toc-skip class=\"date\">2025-02-06</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/vignettes/trend_formulas.Rmd\" class=\"external-link\"><code>vignettes/trend_formulas.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>trend_formulas.Rmd</code></div>\n    </div>\n\n    \n    \n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to fit and interrogate State-Space models with\nnonlinear effects.</p>\n<div class=\"section level2\">\n<h2 id=\"state-space-models\">State-Space Models<a class=\"anchor\" aria-label=\"anchor\" href=\"#state-space-models\"></a>\n</h2>\n<div class=\"float\">\n<img src=\"https://raw.githubusercontent.com/nicholasjclark/mvgam/refs/heads/master/vignettes/SS_model.svg\" style=\"width:85.0%\" alt=\"Illustration of a basic State-Space model, which assumes that a latent dynamic process (X) can evolve independently from the way we take observations (Y) of that process\"><div class=\"figcaption\">Illustration of a basic State-Space model, which\nassumes that a latent dynamic <em>process</em> (X) can evolve\nindependently from the way we take <em>observations</em> (Y) of that\nprocess</div>\n</div>\n<p><br></p>\n<p>State-Space models allow us to separately make inferences about the\nunderlying dynamic <em>process model</em> that we are interested in\n(i.e. the evolution of a time series or a collection of time series) and\nthe <em>observation model</em> (i.e. the way that we survey / measure\nthis underlying process). This is extremely useful in ecology because\nour observations are always imperfect / noisy measurements of the thing\nwe are interested in measuring. It is also helpful because we often know\nthat some covariates will impact our ability to measure accurately\n(i.e. we cannot take accurate counts of rodents if there is a\nthunderstorm happening) while other covariate impact the underlying\nprocess (it is highly unlikely that rodent abundance responds to one\nstorm, but instead probably responds to longer-term weather and climate\nvariation). A State-Space model allows us to model both components in a\nsingle unified modelling framework. A major advantage of\n<code>mvgam</code> is that it can include nonlinear effects and random\neffects in BOTH model components while also capturing dynamic\nprocesses.</p>\n<div class=\"section level3\">\n<h3 id=\"lake-washington-plankton-data\">Lake Washington plankton data<a class=\"anchor\" aria-label=\"anchor\" href=\"#lake-washington-plankton-data\"></a>\n</h3>\n<p>The data we will use to illustrate how we can fit State-Space models\nin <code>mvgam</code> are from a long-term monitoring study of plankton\ncounts (cells per mL) taken from Lake Washington in Washington, USA. The\ndata are available as part of the <code>MARSS</code> package and can be\ndownloaded using the following:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/load.html\" class=\"external-link\">load</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/connections.html\" class=\"external-link\">url</a></span><span class=\"op\">(</span><span class=\"st\">'https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda'</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>We will work with five different groups of plankton:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">outcomes</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'Greens'</span>, <span class=\"st\">'Bluegreens'</span>, <span class=\"st\">'Diatoms'</span>, <span class=\"st\">'Unicells'</span>, <span class=\"st\">'Other.algae'</span><span class=\"op\">)</span></span></code></pre></div>\n<p>As usual, preparing the data into the correct format for\n<code>mvgam</code> modelling takes a little bit of wrangling in\n<code>dplyr</code>:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># loop across each plankton group to create the long datframe</span></span>\n<span><span class=\"va\">plankton_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/do.call.html\" class=\"external-link\">do.call</a></span><span class=\"op\">(</span><span class=\"va\">rbind</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/lapply.html\" class=\"external-link\">lapply</a></span><span class=\"op\">(</span><span class=\"va\">outcomes</span>, <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  </span>\n<span>  <span class=\"co\"># create a group-specific dataframe with counts labelled 'y'</span></span>\n<span>  <span class=\"co\"># and the group name in the 'series' variable</span></span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>year <span class=\"op\">=</span> <span class=\"va\">lakeWAplanktonTrans</span><span class=\"op\">[</span>, <span class=\"st\">'Year'</span><span class=\"op\">]</span>,</span>\n<span>             month <span class=\"op\">=</span> <span class=\"va\">lakeWAplanktonTrans</span><span class=\"op\">[</span>, <span class=\"st\">'Month'</span><span class=\"op\">]</span>,</span>\n<span>             y <span class=\"op\">=</span> <span class=\"va\">lakeWAplanktonTrans</span><span class=\"op\">[</span>, <span class=\"va\">x</span><span class=\"op\">]</span>,</span>\n<span>             series <span class=\"op\">=</span> <span class=\"va\">x</span>,</span>\n<span>             temp <span class=\"op\">=</span> <span class=\"va\">lakeWAplanktonTrans</span><span class=\"op\">[</span>, <span class=\"st\">'Temp'</span><span class=\"op\">]</span><span class=\"op\">)</span><span class=\"op\">}</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># change the 'series' label to a factor</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># filter to only include some years in the data</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">year</span> <span class=\"op\">&gt;=</span> <span class=\"fl\">1965</span> <span class=\"op\">&amp;</span> <span class=\"va\">year</span> <span class=\"op\">&lt;</span> <span class=\"fl\">1975</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">year</span>, <span class=\"va\">month</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">group_by</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># z-score the counts so they are approximately standard normal</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">as.vector</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/scale.html\" class=\"external-link\">scale</a></span><span class=\"op\">(</span><span class=\"va\">y</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  </span>\n<span>  <span class=\"co\"># add the time indicator</span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>time <span class=\"op\">=</span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/row_number.html\" class=\"external-link\">row_number</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">ungroup</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Inspect the data structure</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">plankton_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #949494;\"># A tibble: 6 × 6</span></span></span>\n<span><span class=\"co\">#&gt;    year month       y series       temp  time</span></span>\n<span><span class=\"co\">#&gt;   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span>   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span>       <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span></span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">1</span>  <span style=\"text-decoration: underline;\">1</span>965     1 -<span style=\"color: #BB0000;\">0.542</span>  Greens      -<span style=\"color: #BB0000;\">1.23</span>     1</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">2</span>  <span style=\"text-decoration: underline;\">1</span>965     1 -<span style=\"color: #BB0000;\">0.344</span>  Bluegreens  -<span style=\"color: #BB0000;\">1.23</span>     1</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">3</span>  <span style=\"text-decoration: underline;\">1</span>965     1 -<span style=\"color: #BB0000;\">0.076</span><span style=\"color: #BB0000; text-decoration: underline;\">8</span> Diatoms     -<span style=\"color: #BB0000;\">1.23</span>     1</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">4</span>  <span style=\"text-decoration: underline;\">1</span>965     1 -<span style=\"color: #BB0000;\">1.52</span>   Unicells    -<span style=\"color: #BB0000;\">1.23</span>     1</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">5</span>  <span style=\"text-decoration: underline;\">1</span>965     1 -<span style=\"color: #BB0000;\">0.491</span>  Other.algae -<span style=\"color: #BB0000;\">1.23</span>     1</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">6</span>  <span style=\"text-decoration: underline;\">1</span>965     2 <span style=\"color: #BB0000;\">NA</span>      Greens      -<span style=\"color: #BB0000;\">1.32</span>     2</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pillar.r-lib.org/reference/glimpse.html\" class=\"external-link\">glimpse</a></span><span class=\"op\">(</span><span class=\"va\">plankton_data</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Rows: 600</span></span>\n<span><span class=\"co\">#&gt; Columns: 6</span></span>\n<span><span class=\"co\">#&gt; $ year   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 196…</span></span>\n<span><span class=\"co\">#&gt; $ month  <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, …</span></span>\n<span><span class=\"co\">#&gt; $ y      <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -0.54241769, -0.34410776, -0.07684901, -1.52243490, -0.49055442…</span></span>\n<span><span class=\"co\">#&gt; $ series <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span> Greens, Bluegreens, Diatoms, Unicells, Other.algae, Greens, Blu…</span></span>\n<span><span class=\"co\">#&gt; $ temp   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.…</span></span>\n<span><span class=\"co\">#&gt; $ time   <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, …</span></span></code></pre></div>\n<p>Note that we have z-scored the counts in this example as that will\nmake it easier to specify priors (though this is not completely\nnecessary; it is often better to build a model that respects the\nproperties of the actual outcome variables)</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">plankton_data</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-7-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>We have some missing observations, but this isn’t an issue for\nmodelling in <code>mvgam</code>. A useful property to understand about\nthese counts is that they tend to be highly seasonal. Below are some\nplots of z-scored counts against the z-scored temperature measurements\nin the lake for each month:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">plankton_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"st\">'Other.algae'</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">time</span>, y <span class=\"op\">=</span> <span class=\"va\">temp</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_path.html\" class=\"external-link\">geom_line</a></span><span class=\"op\">(</span>size <span class=\"op\">=</span> <span class=\"fl\">1.1</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_path.html\" class=\"external-link\">geom_line</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">y</span><span class=\"op\">)</span>, col <span class=\"op\">=</span> <span class=\"st\">'white'</span>,</span>\n<span>            size <span class=\"op\">=</span> <span class=\"fl\">1.3</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_path.html\" class=\"external-link\">geom_line</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">y</span><span class=\"op\">)</span>, col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span>,</span>\n<span>            size <span class=\"op\">=</span> <span class=\"fl\">1.1</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'z-score'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">xlab</a></span><span class=\"op\">(</span><span class=\"st\">'Time'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ggtitle</a></span><span class=\"op\">(</span><span class=\"st\">'Temperature (black) vs Other algae (red)'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-8-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">plankton_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"st\">'Diatoms'</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">time</span>, y <span class=\"op\">=</span> <span class=\"va\">temp</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_path.html\" class=\"external-link\">geom_line</a></span><span class=\"op\">(</span>size <span class=\"op\">=</span> <span class=\"fl\">1.1</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_path.html\" class=\"external-link\">geom_line</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">y</span><span class=\"op\">)</span>, col <span class=\"op\">=</span> <span class=\"st\">'white'</span>,</span>\n<span>            size <span class=\"op\">=</span> <span class=\"fl\">1.3</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_path.html\" class=\"external-link\">geom_line</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">y</span><span class=\"op\">)</span>, col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span>,</span>\n<span>            size <span class=\"op\">=</span> <span class=\"fl\">1.1</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'z-score'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">xlab</a></span><span class=\"op\">(</span><span class=\"st\">'Time'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ggtitle</a></span><span class=\"op\">(</span><span class=\"st\">'Temperature (black) vs Diatoms (red)'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-9-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>We will have to try and capture this seasonality in our process\nmodel, which should be easy to do given the flexibility of GAMs. Next we\nwill split the data into training and testing splits:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">plankton_train</span> <span class=\"op\">&lt;-</span> <span class=\"va\">plankton_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">time</span> <span class=\"op\">&lt;=</span> <span class=\"fl\">112</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">plankton_test</span> <span class=\"op\">&lt;-</span> <span class=\"va\">plankton_data</span> <span class=\"op\"><a href=\"../reference/pipe.html\">%&gt;%</a></span></span>\n<span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">filter</a></span><span class=\"op\">(</span><span class=\"va\">time</span> <span class=\"op\">&gt;</span> <span class=\"fl\">112</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Now time to fit some models. This requires a bit of thinking about\nhow we can best tackle the seasonal variation and the likely dependence\nstructure in the data. These algae are interacting as part of a complex\nsystem within the same lake, so we certainly expect there to be some\nlagged cross-dependencies underling their dynamics. But if we do not\ncapture the seasonal variation, our multivariate dynamic model will be\nforced to try and capture it, which could lead to poor convergence and\nunstable results (we could feasibly capture cyclic dynamics with a more\ncomplex multi-species Lotka-Volterra model, but ordinary differential\nequation approaches are beyond the scope of <code>mvgam</code>).</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"capturing-seasonality\">Capturing seasonality<a class=\"anchor\" aria-label=\"anchor\" href=\"#capturing-seasonality\"></a>\n</h3>\n<p>First we will fit a model that does not include a dynamic component,\njust to see if it can reproduce the seasonal variation in the\nobservations. This model introduces hierarchical multidimensional\nsmooths, where all time series share a “global” tensor product of the\n<code>month</code> and <code>temp</code> variables, capturing our\nexpectation that algal seasonality responds to temperature variation.\nBut this response should depend on when in the year these temperatures\nare recorded (i.e. a response to warm temperatures in Spring should be\ndifferent to a response to warm temperatures in Autumn). The model also\nfits series-specific deviation smooths (i.e. one tensor product per\nseries) to capture how each algal group’s seasonality differs from the\noverall “global” seasonality. Note that we do not include\nseries-specific intercepts in this model because each series was\nz-scored to have a mean of 0.</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">notrend_mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> </span>\n<span>                       <span class=\"co\"># tensor of temp and month to capture</span></span>\n<span>                       <span class=\"co\"># \"global\" seasonality</span></span>\n<span>                       <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>                       </span>\n<span>                       <span class=\"co\"># series-specific deviation tensor products</span></span>\n<span>                       <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>                     family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>                     data <span class=\"op\">=</span> <span class=\"va\">plankton_train</span>,</span>\n<span>                     newdata <span class=\"op\">=</span> <span class=\"va\">plankton_test</span>,</span>\n<span>                     trend_model <span class=\"op\">=</span> <span class=\"st\">'None'</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The “global” tensor product smooth function can be quickly\nvisualized:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, smooth <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-12-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>On this plot, red indicates below-average linear predictors and white\nindicates above-average. We can then plot the deviation smooths for a\nfew algal groups to see how they vary from the “global” pattern:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, smooth <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-13-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, smooth <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-14-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>These multidimensional smooths have done a good job of capturing the\nseasonal variation in our observations:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-15-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-16-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-17-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>This basic model gives us confidence that we can capture the seasonal\nvariation in the observations. But the model has not captured the\nremaining temporal dynamics, which is obvious when we inspect Dunn-Smyth\nresiduals for a few series:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-18-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">notrend_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-19-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"multiseries-dynamics\">Multiseries dynamics<a class=\"anchor\" aria-label=\"anchor\" href=\"#multiseries-dynamics\"></a>\n</h3>\n<p>Now it is time to get into multivariate State-Space models. We will\nfit two models that can both incorporate lagged cross-dependencies in\nthe latent process models. The first model assumes that the process\nerrors operate independently from one another, while the second assumes\nthat there may be contemporaneous correlations in the process errors.\nBoth models include a Vector Autoregressive component for the process\nmeans, and so both can model complex community dynamics. The models can\nbe described mathematically as follows:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Normal}(\\mu_{obs[t]},\n\\sigma_{obs}) \\\\\n\\mu_{obs[t]} &amp; = process_t \\\\\nprocess_t &amp; \\sim \\text{MVNormal}(\\mu_{process[t]}, \\Sigma_{process})\n\\\\\n\\mu_{process[t]} &amp; = A * process_{t-1} +\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp})_t +\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp})_t \\\\\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp}) &amp; =\n\\sum_{k=1}^{K}b_{global} * \\beta_{global} \\\\\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp}) &amp; =\n\\sum_{k=1}^{K}b_{series} * \\beta_{series} \\end{align*}\\]</span></p>\n<p>Here you can see that there are no terms in the observation model\napart from the underlying process model. But we could easily add\ncovariates into the observation model if we felt that they could explain\nsome of the systematic observation errors. We also assume independent\nobservation processes (there is no covariance structure in the\nobservation errors <span class=\"math inline\">\\(\\sigma_{obs}\\)</span>).\nAt present, <code>mvgam</code> does not support multivariate observation\nmodels. But this feature will be added in future versions. However the\nunderlying process model is multivariate, and there is a lot going on\nhere. This component has a Vector Autoregressive part, where the process\nmean at time <span class=\"math inline\">\\(t\\)</span> <span class=\"math inline\">\\((\\mu_{process[t]})\\)</span> is a vector that\nevolves as a function of where the vector-valued process model was at\ntime <span class=\"math inline\">\\(t-1\\)</span>. The <span class=\"math inline\">\\(A\\)</span> matrix captures these dynamics with\nself-dependencies on the diagonal and possibly asymmetric\ncross-dependencies on the off-diagonals, while also incorporating the\nnonlinear smooth functions that capture seasonality for each series. The\ncontemporaneous process errors are modeled by <span class=\"math inline\">\\(\\Sigma_{process}\\)</span>, which can be\nconstrained so that process errors are independent (i.e. setting the\noff-diagonals to 0) or can be fully parameterized using a Cholesky\ndecomposition (using <code>Stan</code>’s <span class=\"math inline\">\\(LKJcorr\\)</span> distribution to place a prior on\nthe strength of inter-species correlations). For those that are\ninterested in the inner-workings, <code>mvgam</code> makes use of a\nrecent breakthrough by <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\" class=\"external-link\">Sarah\nHeaps to enforce stationarity of Bayesian VAR processes</a>. This is\nadvantageous as we often don’t expect forecast variance to increase\nwithout bound forever into the future, but many estimated VARs tend to\nbehave this way.</p>\n<p><br> Ok that was a lot to take in. Let’s fit some models to try and\ninspect what is going on and what they assume. But first, we need to\nupdate <code>mvgam</code>’s default priors for the observation and\nprocess errors. By default, <code>mvgam</code> uses a fairly wide\nStudent-T prior on these parameters to avoid being overly informative.\nBut our observations are z-scored and so we do not expect very large\nprocess or observation errors. However, we also do not expect very small\nobservation errors either as we know these measurements are not perfect.\nSo let’s update the priors for these parameters. In doing so, you will\nget to see how the formula for the latent process (i.e. trend) model is\nused in <code>mvgam</code>:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">priors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"co\"># observation formula, which has no terms in it</span></span>\n<span>  <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"fl\">1</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span>  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># VAR1 model with uncorrelated process errors</span></span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">VAR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">plankton_train</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Get names of all parameters whose priors can be modified:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">priors</span><span class=\"op\">[</span>, <span class=\"fl\">3</span><span class=\"op\">]</span></span>\n<span><span class=\"co\">#&gt;  [1] \"(Intercept)\"                                                                                                                                                                                                                                                           </span></span>\n<span><span class=\"co\">#&gt;  [2] \"process error sd\"                                                                                                                                                                                                                                                      </span></span>\n<span><span class=\"co\">#&gt;  [3] \"diagonal autocorrelation population mean\"                                                                                                                                                                                                                              </span></span>\n<span><span class=\"co\">#&gt;  [4] \"off-diagonal autocorrelation population mean\"                                                                                                                                                                                                                          </span></span>\n<span><span class=\"co\">#&gt;  [5] \"diagonal autocorrelation population variance\"                                                                                                                                                                                                                          </span></span>\n<span><span class=\"co\">#&gt;  [6] \"off-diagonal autocorrelation population variance\"                                                                                                                                                                                                                      </span></span>\n<span><span class=\"co\">#&gt;  [7] \"shape1 for diagonal autocorrelation precision\"                                                                                                                                                                                                                         </span></span>\n<span><span class=\"co\">#&gt;  [8] \"shape1 for off-diagonal autocorrelation precision\"                                                                                                                                                                                                                     </span></span>\n<span><span class=\"co\">#&gt;  [9] \"shape2 for diagonal autocorrelation precision\"                                                                                                                                                                                                                         </span></span>\n<span><span class=\"co\">#&gt; [10] \"shape2 for off-diagonal autocorrelation precision\"                                                                                                                                                                                                                     </span></span>\n<span><span class=\"co\">#&gt; [11] \"observation error sd\"                                                                                                                                                                                                                                                  </span></span>\n<span><span class=\"co\">#&gt; [12] \"te(temp,month) smooth parameters, te(temp,month):trendtrend1 smooth parameters, te(temp,month):trendtrend2 smooth parameters, te(temp,month):trendtrend3 smooth parameters, te(temp,month):trendtrend4 smooth parameters, te(temp,month):trendtrend5 smooth parameters\"</span></span></code></pre></div>\n<p>And their default prior distributions:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">priors</span><span class=\"op\">[</span>, <span class=\"fl\">4</span><span class=\"op\">]</span></span>\n<span><span class=\"co\">#&gt;  [1] \"(Intercept) ~ student_t(3, -0.1, 2.5);\"</span></span>\n<span><span class=\"co\">#&gt;  [2] \"sigma ~ student_t(3, 0, 2.5);\"         </span></span>\n<span><span class=\"co\">#&gt;  [3] \"es[1] = 0;\"                            </span></span>\n<span><span class=\"co\">#&gt;  [4] \"es[2] = 0;\"                            </span></span>\n<span><span class=\"co\">#&gt;  [5] \"fs[1] = sqrt(0.455);\"                  </span></span>\n<span><span class=\"co\">#&gt;  [6] \"fs[2] = sqrt(0.455);\"                  </span></span>\n<span><span class=\"co\">#&gt;  [7] \"gs[1] = 1.365;\"                        </span></span>\n<span><span class=\"co\">#&gt;  [8] \"gs[2] = 1.365;\"                        </span></span>\n<span><span class=\"co\">#&gt;  [9] \"hs[1] = 0.071175;\"                     </span></span>\n<span><span class=\"co\">#&gt; [10] \"hs[2] = 0.071175;\"                     </span></span>\n<span><span class=\"co\">#&gt; [11] \"sigma_obs ~ student_t(3, 0, 2.5);\"     </span></span>\n<span><span class=\"co\">#&gt; [12] \"lambda_trend ~ normal(5, 30);\"</span></span></code></pre></div>\n<p>Setting priors is easy in <code>mvgam</code> as you can use\n<code>brms</code> routines. Here we use more informative Normal priors\nfor both error components, but we impose a lower bound of 0.2 for the\nobservation errors:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">priors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0.5</span>, <span class=\"fl\">0.1</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">sigma_obs</span>, lb <span class=\"op\">=</span> <span class=\"fl\">0.2</span><span class=\"op\">)</span>,</span>\n<span>            <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0.5</span>, <span class=\"fl\">0.25</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">sigma</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>You may have noticed something else unique about this model: there is\nno intercept term in the observation formula. This is because a shared\nintercept parameter can sometimes be unidentifiable with respect to the\nlatent VAR process, particularly if our series have similar long-run\naverages (which they do in this case because they were z-scored). We\nwill often get better convergence in these State-Space models if we drop\nthis parameter. <code>mvgam</code> accomplishes this by fixing the\ncoefficient for the intercept to zero. Now we can fit the first model,\nwhich assumes that process errors are contemporaneously uncorrelated</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">var_mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span>  </span>\n<span>  <span class=\"co\"># observation formula, which is empty</span></span>\n<span>  <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"fl\">1</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span>  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># VAR1 model with uncorrelated process errors</span></span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">VAR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">plankton_train</span>,</span>\n<span>  newdata <span class=\"op\">=</span> <span class=\"va\">plankton_test</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># include the updated priors</span></span>\n<span>  priors <span class=\"op\">=</span> <span class=\"va\">priors</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"inspecting-ss-models\">Inspecting SS models<a class=\"anchor\" aria-label=\"anchor\" href=\"#inspecting-ss-models\"></a>\n</h3>\n<p>This model’s summary is a bit different to other <code>mvgam</code>\nsummaries. It separates parameters based on whether they belong to the\nobservation model or to the latent process model. This is because we may\noften have covariates that impact the observations but not the latent\nprocess, so we can have fairly complex models for each component. You\nwill notice that some parameters have not fully converged, particularly\nfor the VAR coefficients (called <code>A</code> in the output) and for\nthe process errors (<code>Sigma</code>). Note that we set\n<code>include_betas = FALSE</code> to stop the summary from printing\noutput for all of the spline coefficients, which can be dense and hard\nto interpret:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">var_mod</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span><span class=\"co\">#&gt; y ~ 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span><span class=\"co\">#&gt; ~te(temp, month, k = c(4, 4)) + te(temp, month, k = c(4, 4), </span></span>\n<span><span class=\"co\">#&gt;     by = trend) - 1</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Family:</span></span>\n<span><span class=\"co\">#&gt; gaussian</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Link function:</span></span>\n<span><span class=\"co\">#&gt; identity</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Trend model:</span></span>\n<span><span class=\"co\">#&gt; VAR()</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N process models:</span></span>\n<span><span class=\"co\">#&gt; 5 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N series:</span></span>\n<span><span class=\"co\">#&gt; 5 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; N timepoints:</span></span>\n<span><span class=\"co\">#&gt; 120 </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Status:</span></span>\n<span><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span><span class=\"co\">#&gt; 4 chains, each with iter = 1500; warmup = 1000; thin = 1 </span></span>\n<span><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[1] 0.20 0.25  0.34 1.02   277</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[2] 0.25 0.40  0.53 1.01   214</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[3] 0.42 0.63  0.80 1.10    45</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[4] 0.25 0.37  0.50 1.02   205</span></span>\n<span><span class=\"co\">#&gt; sigma_obs[5] 0.31 0.43  0.55 1.01   207</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; (Intercept)    0   0     0  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process model VAR parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;          2.5%     50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; A[1,1]  0.620  0.7900 0.920 1.01   331</span></span>\n<span><span class=\"co\">#&gt; A[1,2] -0.370 -0.1300 0.037 1.01   428</span></span>\n<span><span class=\"co\">#&gt; A[1,3] -0.140  0.0150 0.180 1.00   621</span></span>\n<span><span class=\"co\">#&gt; A[1,4] -0.054  0.0600 0.200 1.00   813</span></span>\n<span><span class=\"co\">#&gt; A[1,5] -0.042  0.1100 0.350 1.00   311</span></span>\n<span><span class=\"co\">#&gt; A[2,1] -0.530 -0.1900 0.034 1.03   174</span></span>\n<span><span class=\"co\">#&gt; A[2,2]  0.070  0.4300 0.730 1.01   249</span></span>\n<span><span class=\"co\">#&gt; A[2,3] -0.340  0.0064 0.330 1.06    74</span></span>\n<span><span class=\"co\">#&gt; A[2,4] -0.059  0.1300 0.390 1.01   220</span></span>\n<span><span class=\"co\">#&gt; A[2,5] -0.043  0.2200 0.630 1.03   175</span></span>\n<span><span class=\"co\">#&gt; A[3,1] -0.380 -0.0230 0.210 1.02   317</span></span>\n<span><span class=\"co\">#&gt; A[3,2] -0.500 -0.0340 0.340 1.02   228</span></span>\n<span><span class=\"co\">#&gt; A[3,3] -0.073  0.4700 0.850 1.07    63</span></span>\n<span><span class=\"co\">#&gt; A[3,4] -0.087  0.1400 0.570 1.03   134</span></span>\n<span><span class=\"co\">#&gt; A[3,5] -0.280  0.0310 0.460 1.02   418</span></span>\n<span><span class=\"co\">#&gt; A[4,1] -0.450 -0.1300 0.069 1.03   175</span></span>\n<span><span class=\"co\">#&gt; A[4,2] -0.690 -0.1700 0.140 1.03   161</span></span>\n<span><span class=\"co\">#&gt; A[4,3] -0.210  0.0650 0.410 1.03   166</span></span>\n<span><span class=\"co\">#&gt; A[4,4]  0.530  0.7400 0.960 1.02   268</span></span>\n<span><span class=\"co\">#&gt; A[4,5] -0.058  0.1900 0.650 1.02   189</span></span>\n<span><span class=\"co\">#&gt; A[5,1] -0.099  0.0550 0.250 1.00   424</span></span>\n<span><span class=\"co\">#&gt; A[5,2] -0.410 -0.1100 0.130 1.01   337</span></span>\n<span><span class=\"co\">#&gt; A[5,3] -0.150  0.0510 0.300 1.01   468</span></span>\n<span><span class=\"co\">#&gt; A[5,4] -0.210 -0.0340 0.110 1.01   682</span></span>\n<span><span class=\"co\">#&gt; A[5,5]  0.490  0.7500 0.940 1.01   283</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Process error parameter estimates:</span></span>\n<span><span class=\"co\">#&gt;             2.5%  50% 97.5% Rhat n_eff</span></span>\n<span><span class=\"co\">#&gt; Sigma[1,1] 0.064 0.11  0.18 1.01   357</span></span>\n<span><span class=\"co\">#&gt; Sigma[1,2] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[1,3] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[1,4] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[1,5] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[2,1] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[2,2] 0.058 0.16  0.30 1.02   194</span></span>\n<span><span class=\"co\">#&gt; Sigma[2,3] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[2,4] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[2,5] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[3,1] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[3,2] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[3,3] 0.062 0.29  0.65 1.12    37</span></span>\n<span><span class=\"co\">#&gt; Sigma[3,4] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[3,5] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[4,1] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[4,2] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[4,3] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[4,4] 0.096 0.21  0.35 1.02   176</span></span>\n<span><span class=\"co\">#&gt; Sigma[4,5] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[5,1] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[5,2] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[5,3] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[5,4] 0.000 0.00  0.00  NaN   NaN</span></span>\n<span><span class=\"co\">#&gt; Sigma[5,5] 0.048 0.13  0.27 1.01   127</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span><span class=\"co\">#&gt;                              edf Ref.df Chi.sq p-value</span></span>\n<span><span class=\"co\">#&gt; te(temp,month)              3.90     15  53.86    0.44</span></span>\n<span><span class=\"co\">#&gt; te(temp,month):seriestrend1 1.08     15   7.28    1.00</span></span>\n<span><span class=\"co\">#&gt; te(temp,month):seriestrend2 5.18     15  41.73    0.47</span></span>\n<span><span class=\"co\">#&gt; te(temp,month):seriestrend3 2.20     15   1.66    1.00</span></span>\n<span><span class=\"co\">#&gt; te(temp,month):seriestrend4 2.77     15   4.18    1.00</span></span>\n<span><span class=\"co\">#&gt; te(temp,month):seriestrend5 2.40     15   6.66    0.96</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span><span class=\"co\">#&gt; n_eff / iter looks reasonable for all parameters</span></span>\n<span><span class=\"co\">#&gt; Rhats above 1.05 found for 13 parameters</span></span>\n<span><span class=\"co\">#&gt;  *Diagnose further to investigate why the chains have not mixed</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations ended with a divergence (0%)</span></span>\n<span><span class=\"co\">#&gt; 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span></span>\n<span><span class=\"co\">#&gt; E-FMI indicated no pathological behavior</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Samples were drawn using NUTS(diag_e) at Thu Feb 06 12:21:10 PM 2025.</span></span>\n<span><span class=\"co\">#&gt; For each parameter, n_eff is a crude measure of effective sample size,</span></span>\n<span><span class=\"co\">#&gt; and Rhat is the potential scale reduction factor on split MCMC chains</span></span>\n<span><span class=\"co\">#&gt; (at convergence, Rhat = 1)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Use how_to_cite(var_mod) to get started describing this model</span></span></code></pre></div>\n<p>The convergence of this model isn’t fabulous (more on this in a\nmoment). But we can again plot the smooth functions, which this time\noperate on the process model. We can see the same plot using\n<code>trend_effects = TRUE</code> in the plotting functions:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">var_mod</span>, <span class=\"st\">'smooths'</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-26-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"trend_formulas_files/figure-html/unnamed-chunk-26-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The VAR matrix is of particular interest here, as it captures lagged\ndependencies and cross-dependencies in the latent process model.\nUnfortunately <code>bayesplot</code> doesn’t know this is a matrix of\nparameters so what we see is actually the transpose of the VAR matrix. A\nlittle bit of wrangling gives us these histograms in the correct\norder:</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">A_pars</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"cn\">NA</span>, nrow <span class=\"op\">=</span> <span class=\"fl\">5</span>, ncol <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span></span>\n<span><span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  <span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">j</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>    <span class=\"va\">A_pars</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">j</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'A['</span>, <span class=\"va\">i</span>, <span class=\"st\">','</span>, <span class=\"va\">j</span>, <span class=\"st\">']'</span><span class=\"op\">)</span></span>\n<span>  <span class=\"op\">}</span></span>\n<span><span class=\"op\">}</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">var_mod</span>, </span>\n<span>          variable <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">as.vector</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/t.html\" class=\"external-link\">t</a></span><span class=\"op\">(</span><span class=\"va\">A_pars</span><span class=\"op\">)</span><span class=\"op\">)</span>, </span>\n<span>          type <span class=\"op\">=</span> <span class=\"st\">'hist'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-27-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>There is a lot happening in this matrix. Each cell captures the\nlagged effect of the process in the column on the process in the row in\nthe next timestep. So for example, the effect in cell [1,3] shows how an\n<em>increase</em> in the process for series 3 (Greens) at time <span class=\"math inline\">\\(t\\)</span> is expected to impact the process for\nseries 1 (Bluegreens) at time <span class=\"math inline\">\\(t+1\\)</span>.\nThe latent process model is now capturing these effects and the smooth\nseasonal effects.</p>\n<p>The process error <span class=\"math inline\">\\((\\Sigma)\\)</span>\ncaptures unmodelled variation in the process models. Again, we fixed the\noff-diagonals to 0, so the histograms for these will look like flat\nboxes:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">Sigma_pars</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"cn\">NA</span>, nrow <span class=\"op\">=</span> <span class=\"fl\">5</span>, ncol <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span></span>\n<span><span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  <span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">j</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>    <span class=\"va\">Sigma_pars</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">j</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'Sigma['</span>, <span class=\"va\">i</span>, <span class=\"st\">','</span>, <span class=\"va\">j</span>, <span class=\"st\">']'</span><span class=\"op\">)</span></span>\n<span>  <span class=\"op\">}</span></span>\n<span><span class=\"op\">}</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">var_mod</span>, </span>\n<span>          variable <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">as.vector</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/t.html\" class=\"external-link\">t</a></span><span class=\"op\">(</span><span class=\"va\">Sigma_pars</span><span class=\"op\">)</span><span class=\"op\">)</span>, </span>\n<span>          type <span class=\"op\">=</span> <span class=\"st\">'hist'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-28-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The observation error estimates <span class=\"math inline\">\\((\\sigma_{obs})\\)</span> represent how much the\nmodel thinks we might miss the true count when we take our imperfect\nmeasurements:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">var_mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'sigma_obs'</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, type <span class=\"op\">=</span> <span class=\"st\">'hist'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-29-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>These are still a bit hard to identify overall, especially when\ntrying to estimate both process and observation error. Often we need to\nmake some strong assumptions about which of these is more important for\ndetermining unexplained variation in our observations.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"correlated-process-errors\">Correlated process errors<a class=\"anchor\" aria-label=\"anchor\" href=\"#correlated-process-errors\"></a>\n</h3>\n<p>Let’s see if these estimates improve when we allow the process errors\nto be correlated. Once again, we need to first update the priors for the\nobservation errors:</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">priors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0.5</span>, <span class=\"fl\">0.1</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">sigma_obs</span>, lb <span class=\"op\">=</span> <span class=\"fl\">0.2</span><span class=\"op\">)</span>,</span>\n<span>            <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0.5</span>, <span class=\"fl\">0.25</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">sigma</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>And now we can fit the correlated process error model</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">varcor_mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span>  </span>\n<span>  <span class=\"co\"># observation formula, which remains empty</span></span>\n<span>  <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"fl\">1</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span>  trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>, <span class=\"va\">month</span>, k <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># VAR1 model with correlated process errors</span></span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">plankton_train</span>,</span>\n<span>  newdata <span class=\"op\">=</span> <span class=\"va\">plankton_test</span>,</span>\n<span>  </span>\n<span>  <span class=\"co\"># include the updated priors</span></span>\n<span>  priors <span class=\"op\">=</span> <span class=\"va\">priors</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></code></pre></div>\n<p>The <span class=\"math inline\">\\((\\Sigma)\\)</span> matrix now captures\nany evidence of contemporaneously correlated process error:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">Sigma_pars</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"cn\">NA</span>, nrow <span class=\"op\">=</span> <span class=\"fl\">5</span>, ncol <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span></span>\n<span><span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>  <span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">j</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">{</span></span>\n<span>    <span class=\"va\">Sigma_pars</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">j</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'Sigma['</span>, <span class=\"va\">i</span>, <span class=\"st\">','</span>, <span class=\"va\">j</span>, <span class=\"st\">']'</span><span class=\"op\">)</span></span>\n<span>  <span class=\"op\">}</span></span>\n<span><span class=\"op\">}</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">varcor_mod</span>, </span>\n<span>          variable <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">as.vector</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/t.html\" class=\"external-link\">t</a></span><span class=\"op\">(</span><span class=\"va\">Sigma_pars</span><span class=\"op\">)</span><span class=\"op\">)</span>, </span>\n<span>          type <span class=\"op\">=</span> <span class=\"st\">'hist'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-32-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>This symmetric matrix tells us there is support for correlated\nprocess errors, as several of the off-diagonal entries are strongly\nnon-zero. But it is easier to interpret these estimates if we convert\nthe covariance matrix to a correlation matrix. Here we compute the\nposterior median process error correlations:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">Sigma_post</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">as.matrix</a></span><span class=\"op\">(</span><span class=\"va\">varcor_mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'Sigma'</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">median_correlations</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/cor.html\" class=\"external-link\">cov2cor</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/apply.html\" class=\"external-link\">apply</a></span><span class=\"op\">(</span><span class=\"va\">Sigma_post</span>, <span class=\"fl\">2</span>, <span class=\"va\">median</span><span class=\"op\">)</span>,</span>\n<span>                                      nrow <span class=\"op\">=</span> <span class=\"fl\">5</span>, ncol <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/colnames.html\" class=\"external-link\">rownames</a></span><span class=\"op\">(</span><span class=\"va\">median_correlations</span><span class=\"op\">)</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/colnames.html\" class=\"external-link\">colnames</a></span><span class=\"op\">(</span><span class=\"va\">median_correlations</span><span class=\"op\">)</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/levels.html\" class=\"external-link\">levels</a></span><span class=\"op\">(</span><span class=\"va\">plankton_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Round.html\" class=\"external-link\">round</a></span><span class=\"op\">(</span><span class=\"va\">median_correlations</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;             Bluegreens Diatoms Greens Other.algae Unicells</span></span>\n<span><span class=\"co\">#&gt; Bluegreens        1.00   -0.22  -0.04        0.16     0.47</span></span>\n<span><span class=\"co\">#&gt; Diatoms          -0.22    1.00   0.16        0.47     0.16</span></span>\n<span><span class=\"co\">#&gt; Greens           -0.04    0.16   1.00        0.34    -0.03</span></span>\n<span><span class=\"co\">#&gt; Other.algae       0.16    0.47   0.34        1.00     0.28</span></span>\n<span><span class=\"co\">#&gt; Unicells          0.47    0.16  -0.03        0.28     1.00</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"impulse-response-functions\">Impulse response functions<a class=\"anchor\" aria-label=\"anchor\" href=\"#impulse-response-functions\"></a>\n</h3>\n<p>Because Vector Autoregressions can capture complex lagged\ndependencies, it is often difficult to understand how the member time\nseries are thought to interact with one another. A method that is\ncommonly used to directly test for possible interactions is to compute\nan <a href=\"https://www.mathworks.com/help/econ/varm.irf.html\" class=\"external-link\">Impulse\nResponse Function</a> (IRF). If <span class=\"math inline\">\\(h\\)</span>\nrepresents the simulated forecast horizon, an IRF asks how each of the\nremaining series might respond over times <span class=\"math inline\">\\((t+1):h\\)</span> if a focal series is given an\ninnovation “shock” at time <span class=\"math inline\">\\(t = 0\\)</span>.\n<code>mvgam</code> can compute Generalized and Orthogonalized IRFs from\nmodels that included latent VAR dynamics. We simply feed the fitted\nmodel to the <code><a href=\"../reference/irf.mvgam.html\">irf()</a></code> function and then use the S3\n<code><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot()</a></code> function to view the estimated responses. By\ndefault, <code><a href=\"../reference/irf.mvgam.html\">irf()</a></code> will compute IRFs by separately imposing\npositive shocks of one standard deviation to each series in the VAR\nprocess. Here we compute Generalized IRFs over a horizon of 12\ntimesteps:</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">irfs</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/irf.mvgam.html\">irf</a></span><span class=\"op\">(</span><span class=\"va\">varcor_mod</span>, h <span class=\"op\">=</span> <span class=\"fl\">12</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Plot the expected responses of the remaining series to a positive\nshock for series 3 (Greens)</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">irfs</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-35-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"><img src=\"trend_formulas_files/figure-html/unnamed-chunk-35-2.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>This series of plots makes it clear that some of the other series\nwould be expected to show both instantaneous responses to a shock for\nthe Greens (due to their correlated process errors) as well as delayed\nand nonlinear responses over time (due to the complex lagged dependence\nstructure captured by the <span class=\"math inline\">\\(A\\)</span>\nmatrix). This hopefully makes it clear why IRFs are an important tool in\nthe analysis of multivariate autoregressive models.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"comparing-forecast-scores\">Comparing forecast scores<a class=\"anchor\" aria-label=\"anchor\" href=\"#comparing-forecast-scores\"></a>\n</h3>\n<p>But which model is better? We can compute the variogram score for out\nof sample forecasts to get a sense of which model does a better job of\ncapturing the dependence structure in the true evaluation set:</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># create forecast objects for each model</span></span>\n<span><span class=\"va\">fcvar</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">var_mod</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">fcvarcor</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">varcor_mod</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better</span></span>\n<span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fcvarcor</span>, score <span class=\"op\">=</span> <span class=\"st\">'variogram'</span><span class=\"op\">)</span><span class=\"op\">$</span><span class=\"va\">all_series</span><span class=\"op\">$</span><span class=\"va\">score</span> <span class=\"op\">-</span></span>\n<span>  <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fcvar</span>, score <span class=\"op\">=</span> <span class=\"st\">'variogram'</span><span class=\"op\">)</span><span class=\"op\">$</span><span class=\"va\">all_series</span><span class=\"op\">$</span><span class=\"va\">score</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>, pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, cex <span class=\"op\">=</span> <span class=\"fl\">1.25</span>, col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span>, </span>\n<span>     ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">1</span><span class=\"op\">*</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>              <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>     bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>,</span>\n<span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Forecast horizon'</span>,</span>\n<span>     ylab <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/expression.html\" class=\"external-link\">expression</a></span><span class=\"op\">(</span><span class=\"va\">variogram</span><span class=\"op\">[</span><span class=\"va\">VAR1cor</span><span class=\"op\">]</span><span class=\"op\">~</span><span class=\"op\">-</span><span class=\"op\">~</span><span class=\"va\">variogram</span><span class=\"op\">[</span><span class=\"va\">VAR1</span><span class=\"op\">]</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>h <span class=\"op\">=</span> <span class=\"fl\">0</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-36-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>And we can also compute the energy score for out of sample forecasts\nto get a sense of which model provides forecasts that are better\ncalibrated:</p>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better</span></span>\n<span><span class=\"va\">diff_scores</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fcvarcor</span>, score <span class=\"op\">=</span> <span class=\"st\">'energy'</span><span class=\"op\">)</span><span class=\"op\">$</span><span class=\"va\">all_series</span><span class=\"op\">$</span><span class=\"va\">score</span> <span class=\"op\">-</span></span>\n<span>  <span class=\"fu\"><a href=\"../reference/score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fcvar</span>, score <span class=\"op\">=</span> <span class=\"st\">'energy'</span><span class=\"op\">)</span><span class=\"op\">$</span><span class=\"va\">all_series</span><span class=\"op\">$</span><span class=\"va\">score</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span>, pch <span class=\"op\">=</span> <span class=\"fl\">16</span>, cex <span class=\"op\">=</span> <span class=\"fl\">1.25</span>, col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span>, </span>\n<span>     ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">1</span><span class=\"op\">*</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span>\n<span>              <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">diff_scores</span><span class=\"op\">)</span>, na.rm <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>     bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>,</span>\n<span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Forecast horizon'</span>,</span>\n<span>     ylab <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/expression.html\" class=\"external-link\">expression</a></span><span class=\"op\">(</span><span class=\"va\">energy</span><span class=\"op\">[</span><span class=\"va\">VAR1cor</span><span class=\"op\">]</span><span class=\"op\">~</span><span class=\"op\">-</span><span class=\"op\">~</span><span class=\"va\">energy</span><span class=\"op\">[</span><span class=\"va\">VAR1</span><span class=\"op\">]</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>h <span class=\"op\">=</span> <span class=\"fl\">0</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"trend_formulas_files/figure-html/unnamed-chunk-37-1.png\" width=\"60%\" style=\"display: block; margin: auto;\"></p>\n<p>The models tend to provide similar forecasts, though the correlated\nerror model does slightly better overall. We would probably need to use\na more extensive rolling forecast evaluation exercise if we felt like we\nneeded to only choose one for production. <code>mvgam</code> offers some\nutilities for doing this (i.e. see <code><a href=\"../reference/lfo_cv.mvgam.html\">?lfo_cv</a></code> for guidance).\nAlternatively, we could use forecasts from <em>both</em> models by\ncreating an evenly-weighted ensemble forecast distribution. This\ncapability is available using the <code><a href=\"../reference/ensemble.mvgam_forecast.html\">ensemble()</a></code> function in\n<code>mvgam</code> (see <code><a href=\"../reference/ensemble.mvgam_forecast.html\">?ensemble</a></code> for guidance).</p>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"further-reading\">Further reading<a class=\"anchor\" aria-label=\"anchor\" href=\"#further-reading\"></a>\n</h2>\n<p>The following papers and resources offer a lot of useful material\nabout multivariate State-Space models and how they can be applied in\npractice:</p>\n<p>Auger‐Méthé, Marie, et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470\" class=\"external-link\">“A\nguide to state–space modeling of ecological time series.</a>”\n<em>Ecological Monographs</em> 91.4 (2021): e01470.</p>\n<p>Heaps, Sarah E. “<a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\" class=\"external-link\">Enforcing\nstationarity through the prior in vector autoregressions.</a>”\n<em>Journal of Computational and Graphical Statistics</em> 32.1 (2023):\n74-83.</p>\n<p>Hannaford, Naomi E., et al. “<a href=\"https://doi.org/10.1016/j.csda.2022.107659\" class=\"external-link\">A sparse Bayesian\nhierarchical vector autoregressive model for microbial dynamics in a\nwastewater treatment plant.</a>” <em>Computational Statistics &amp; Data\nAnalysis</em> 179 (2023): 107659.</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. “<a href=\"https://journal.r-project.org/archive/2012/RJ-2012-002/index.html\" class=\"external-link\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata.</a>” <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Ward, Eric J., et al. “<a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x\" class=\"external-link\">Inferring\nspatial structure from time‐series data: using multivariate state‐space\nmodels to detect metapopulation structure of California sea lions in the\nGulf of California, Mexico.</a>” <em>Journal of Applied Ecology</em>\n47.1 (2010): 47-56.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\" class=\"external-link\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p>\n<p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p>\n<p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer>\n</div>\n\n  \n\n  \n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/authors.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Authors and Citation • mvgam</title><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Authors and Citation\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5002</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-citation-authors\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>Authors and Citation</h1>\n    </div>\n\n    <div class=\"section level2\">\n      <h2>Authors</h2>\n\n      <ul class=\"list-unstyled\"><li>\n          <p><strong><a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a></strong>. Author, maintainer. <a href=\"https://orcid.org/0000-0001-7131-3301\" target=\"orcid.widget\" aria-label=\"ORCID\" class=\"external-link\"><span class=\"fab fa-orcid orcid\" aria-hidden=\"true\"></span></a>\n          </p>\n        </li>\n        <li>\n          <p><strong>Sarah Heaps</strong>. Contributor. <a href=\"https://orcid.org/0000-0002-5543-037X\" target=\"orcid.widget\" aria-label=\"ORCID\" class=\"external-link\"><span class=\"fab fa-orcid orcid\" aria-hidden=\"true\"></span></a>\n          <br><small>VARMA parameterisations</small></p>\n        </li>\n        <li>\n          <p><strong>Scott Pease</strong>. Contributor. <a href=\"https://orcid.org/0009-0006-8977-9285\" target=\"orcid.widget\" aria-label=\"ORCID\" class=\"external-link\"><span class=\"fab fa-orcid orcid\" aria-hidden=\"true\"></span></a>\n          <br><small>broom enhancements</small></p>\n        </li>\n        <li>\n          <p><strong>Matthijs Hollanders</strong>. Contributor. <a href=\"https://orcid.org/0000-0003-0796-1018\" target=\"orcid.widget\" aria-label=\"ORCID\" class=\"external-link\"><span class=\"fab fa-orcid orcid\" aria-hidden=\"true\"></span></a>\n          <br><small>ggplot visualizations</small></p>\n        </li>\n      </ul></div>\n\n    <div class=\"section level2\">\n      <h2 id=\"citation\">Citation</h2>\n      <p><small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/inst/CITATION\" class=\"external-link\"><code>inst/CITATION</code></a></small></p>\n\n      <p>Clark &amp; Wells (2023). Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series. Methods in Ecology and Evolution, 14, 771-784. doi.org/10.1111/2041-210X.13974</p>\n      <pre>@Article{,\n  title = {Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series},\n  author = {Nicholas J Clark and Konstans Wells},\n  journal = {Methods in Ecology and Evolution},\n  year = {2023},\n  volume = {14},\n  pages = {771-784},\n  doi = {10.18637/jss.v100.i05},\n  encoding = {UTF-8},\n}</pre>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/deps/bootstrap-5.2.2/font.css",
    "content": "@font-face {\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/KFOmCnqEu92Fr1Me5g.woff) format('woff');\n}\n@font-face {\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(fonts/KFOlCnqEu92Fr1MmEU9vAA.woff) format('woff');\n}\n@font-face {\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(fonts/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff');\n}\n"
  },
  {
    "path": "docs/deps/bootstrap-5.3.1/font.css",
    "content": "@font-face {\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/KFOmCnqEu92Fr1Me5g.woff) format('woff');\n}\n@font-face {\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 500;\n  font-display: swap;\n  src: url(fonts/KFOlCnqEu92Fr1MmEU9vAA.woff) format('woff');\n}\n@font-face {\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(fonts/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff');\n}\n"
  },
  {
    "path": "docs/deps/data-deps.txt",
    "content": "<script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\" />\n<link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\" />\n<script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script>\n"
  },
  {
    "path": "docs/deps/jquery-3.6.0/jquery-3.6.0.js",
    "content": "/*!\n * jQuery JavaScript Library v3.6.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2021-03-02T17:08Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.6\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2021-02-16\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur as it's already being fired\n\t\t// in leverageNative.\n\t\t_default: function() {\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<title>Multivariate (Dynamic) Generalized Additive Models • mvgam</title>\n<script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\">\n<meta property=\"og:title\" content=\"Multivariate (Dynamic) Generalized Additive Models\">\n<meta name=\"description\" content=\"Fit Bayesian Dynamic Generalized Additive Models to multivariate observations. Users can build nonlinear State-Space models that can incorporate semiparametric effects in observation and process components, using a wide range of observation families. Estimation is performed using Markov Chain Monte Carlo with Hamiltonian Monte Carlo in the software Stan. References: Clark &amp; Wells (2022) &lt;doi:10.1111/2041-210X.13974&gt;.\">\n<meta property=\"og:description\" content=\"Fit Bayesian Dynamic Generalized Additive Models to multivariate observations. Users can build nonlinear State-Space models that can incorporate semiparametric effects in observation and process components, using a wide range of observation families. Estimation is performed using Markov Chain Monte Carlo with Hamiltonian Monte Carlo in the software Stan. References: Clark &amp; Wells (2022) &lt;doi:10.1111/2041-210X.13974&gt;.\">\n<meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\">\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5002</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n<li><a class=\"dropdown-item\" href=\"articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\n<li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\">\n</form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-home\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><p><br><br></p>\n<p><img src=\"reference/figures/mvgam_logo.png\" width=\"120\" alt=\"mvgam R package logo\"><a href=\"https://mc-stan.org/\" class=\"external-link\"><img src=\"https://raw.githubusercontent.com/stan-dev/logos/master/logo_tm.png\" align=\"right\" width=\"120\" alt=\"Stan Logo\"></a></p>\n<div class=\"section level1\">\n<div class=\"page-header\">\n<img src=\"logo.png\" class=\"logo\" alt=\"\"><h1 id=\"mvgam\">mvgam<a class=\"anchor\" aria-label=\"anchor\" href=\"#mvgam\"></a>\n</h1>\n</div>\n<blockquote>\n<p><strong>M</strong>ulti<strong>V</strong>ariate (Dynamic) <strong>G</strong>eneralized <strong>A</strong>ddivite <strong>M</strong>odels</p>\n</blockquote>\n<p>The goal of <code>mvgam</code> is to fit Bayesian Dynamic Generalized Additive Models (DGAMs) that can include highly flexible nonlinear predictor effects for both process and observation components. The package does this by relying on functionalities from the impressive <a href=\"https://paulbuerkner.com/brms/\" target=\"_blank\" class=\"external-link\"><code>brms</code></a> and <a href=\"https://cran.r-project.org/package=mgcv\" target=\"_blank\" class=\"external-link\"><code>mgcv</code></a> packages. This allows <code>mvgam</code> to fit a wide range of models, including:</p>\n<ul>\n<li><a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\" target=\"_blank\">Multivariate State-Space Time Series models</a></li>\n<li><a href=\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\" target=\"_blank\">Hierarchical N-mixture models</a></li>\n<li><a href=\"https://www.youtube.com/watch?v=2POK_FVwCHk\" target=\"_blank\" class=\"external-link\">Hierarchical Generalized Additive Models</a></li>\n<li><a href=\"https://nicholasjclark.github.io/mvgam/reference/jsdgam.html\" target=\"_blank\">Joint Species Distribution Models</a></li>\n</ul>\n<div class=\"section level2\">\n<h2 id=\"installation\">Installation<a class=\"anchor\" aria-label=\"anchor\" href=\"#installation\"></a>\n</h2>\n<p>Install the stable version from CRAN using: <code>install.packages('mvgam')</code>, or install the development version from <code>GitHub</code> using: <code>devtools::install_github(\"nicholasjclark/mvgam\")</code>. Note that to actually condition models with MCMC sampling, the <code>Stan</code> software must be installed (along with either <code>rstan</code> and/or <code>cmdstanr</code>). Only <code>rstan</code> is listed as a dependency of <code>mvgam</code> to ensure that installation is less difficult. If users wish to fit the models using <code>mvgam</code>, please refer to installation links for <code>Stan</code> with <code>rstan</code> <a href=\"https://mc-stan.org/users/interfaces/rstan\" class=\"external-link\">here</a>, or for <code>Stan</code> with <code>cmdstandr</code> <a href=\"https://mc-stan.org/cmdstanr/\" class=\"external-link\">here</a>. You will need a fairly recent version of <code>Stan</code> (preferably 2.29 or above) to ensure all the model syntax is recognized. We highly recommend you use <code>Cmdstan</code> through the <code>cmdstanr</code> interface as the backend. This is because <code>Cmdstan</code> is easier to install, is more up to date with new features, and uses less memory than <code>Rstan</code>. See <a href=\"http://mc-stan.org/cmdstanr/articles/cmdstanr.html#comparison-with-rstan\" class=\"external-link\">this documentation from the <code>Cmdstan</code> team for more information</a>.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"introductory-seminar\">Introductory seminar<a class=\"anchor\" aria-label=\"anchor\" href=\"#introductory-seminar\"></a>\n</h2>\n<center>\n<div style=\"display: flex; justify-content: center;\">\n<iframe style=\"aspect-ratio: 16 / 9; width: 100% !important;\" src=\"https://www.youtube.com/embed/0zZopLlomsQ?si=fWBVTPRDMi9TXcIy\" data-external=\"1\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\n</iframe>\n\n</div>\n</center>\n</div>\n<div class=\"section level2\">\n<h2 id=\"cheatsheet\">Cheatsheet<a class=\"anchor\" aria-label=\"anchor\" href=\"#cheatsheet\"></a>\n</h2>\n<p><a href=\"https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf\" class=\"external-link\"><img src=\"https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.png\" alt=\"mvgam usage cheatsheet\"></a></p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"getting-started\">Getting started<a class=\"anchor\" aria-label=\"anchor\" href=\"#getting-started\"></a>\n</h2>\n<p><code>mvgam</code> was originally designed to analyse and forecast non-negative integer-valued data (counts). These data are traditionally challenging to analyse with existing time-series analysis packages. But further development of <code>mvgam</code> has resulted in support for a growing number of observation families that extend to other types of data. Currently, the package can handle data for the following families:</p>\n<ul>\n<li>\n<code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code> for real-valued data</li>\n<li>\n<code><a href=\"reference/mvgam_families.html\">student_t()</a></code> for heavy-tailed real-valued data</li>\n<li>\n<code><a href=\"reference/mvgam_families.html\">lognormal()</a></code> for non-negative real-valued data</li>\n<li>\n<code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma()</a></code> for non-negative real-valued data</li>\n<li>\n<code><a href=\"reference/mvgam_families.html\">betar()</a></code> for proportional data on <code>(0,1)</code>\n</li>\n<li>\n<code><a href=\"reference/mvgam_families.html\">bernoulli()</a></code> for binary data</li>\n<li>\n<code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code> for count data</li>\n<li>\n<code><a href=\"reference/mvgam_families.html\">nb()</a></code> for overdispersed count data</li>\n<li>\n<code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> for count data with known number of trials</li>\n<li>\n<code><a href=\"reference/mvgam_families.html\">beta_binomial()</a></code> for overdispersed count data with known number of trials</li>\n<li>\n<code><a href=\"reference/mvgam_families.html\">nmix()</a></code> for count data with imperfect detection (unknown number of trials)</li>\n</ul>\n<p>See <code><a href=\"reference/mvgam_families.html\">?mvgam_families</a></code> for more information. Below is a simple example for simulating and modelling proportional data with <code>Beta</code> observations over a set of seasonal series with independent Gaussian Process dynamic trends:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">100</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"reference/sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span></span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"reference/mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  T <span class=\"op\">=</span> <span class=\"fl\">80</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"reference/GP.html\">GP</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.5</span>, </span>\n<span>  seasonality <span class=\"op\">=</span> <span class=\"st\">'shared'</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p>Plot the series to see how they evolve over time</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"reference/plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span></span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, </span>\n<span>  series <span class=\"op\">=</span> <span class=\"st\">'all'</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<figure><img src=\"reference/figures/README-beta_sim-1.png\" alt=\"Visualizing multivariate proportional time series using the mvgam R package #rstats\"><figcaption aria-hidden=\"true\">\nVisualizing multivariate proportional time series using the mvgam R package #rstats\n</figcaption></figure><p>Fit a State-Space GAM to these series that uses a hierarchical cyclic seasonal smooth term to capture variation in seasonality among series. The model also includes series-specific latent Gaussian Processes with squared exponential covariance functions to capture temporal dynamics</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"reference/mvgam.html\">mvgam</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">7</span><span class=\"op\">)</span> <span class=\"op\">+</span></span>\n<span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span>, m <span class=\"op\">=</span> <span class=\"fl\">1</span>, k <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"reference/GP.html\">GP</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span>\n<span>  newdata <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"reference/mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<p>Plot the estimated posterior hindcast and forecast distributions for each series</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://patchwork.data-imaginist.com\" class=\"external-link\">patchwork</a></span><span class=\"op\">)</span></span>\n<span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"reference/forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://patchwork.data-imaginist.com/reference/wrap_plots.html\" class=\"external-link\">wrap_plots</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span>, </span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>, </span>\n<span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span>, </span>\n<span>  ncol <span class=\"op\">=</span> <span class=\"fl\">2</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n<figure><img src=\"reference/figures/README-beta_fc-1.png\" alt=\"Forecasting multivariate time series with Dynamic Generalized Additive Models\"><figcaption aria-hidden=\"true\">\nForecasting multivariate time series with Dynamic Generalized Additive Models\n</figcaption></figure><p>Various <code>S3</code> functions can be used to inspect parameter estimates, plot smooth functions and residuals, and evaluate models through posterior predictive checks or forecast comparisons. Please see <a href=\"https://nicholasjclark.github.io/mvgam/reference/index.html\">the package documentation</a> for more detailed examples.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"vignettes\">Vignettes<a class=\"anchor\" aria-label=\"anchor\" href=\"#vignettes\"></a>\n</h2>\n<p>You can set <code>build_vignettes = TRUE</code> when installing but be aware this will slow down the installation drastically. Instead, you can always access the vignette htmls online at <a href=\"https://nicholasjclark.github.io/mvgam/articles/\" class=\"uri\">https://nicholasjclark.github.io/mvgam/articles/</a></p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"citing-mvgam-and-related-software\">Citing <code>mvgam</code> and related software<a class=\"anchor\" aria-label=\"anchor\" href=\"#citing-mvgam-and-related-software\"></a>\n</h2>\n<p>When using any software please make sure to appropriately acknowledge the hard work that developers and maintainers put into making these packages available. Citations are currently the best way to formally acknowledge this work (but feel free to ⭐ <a href=\"https://github.com/nicholasjclark/mvgam\" class=\"external-link\">the repo</a> as well), so we highly encourage you to cite any packages that you rely on for your research.</p>\n<p>When using <code>mvgam</code>, please cite the following:</p>\n<blockquote>\n<p>Clark, N.J. and Wells, K. (2023). Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series. <em>Methods in Ecology and Evolution</em>. DOI: <a href=\"https://doi.org/10.1111/2041-210X.13974\" class=\"external-link uri\">https://doi.org/10.1111/2041-210X.13974</a></p>\n</blockquote>\n<p>As <code>mvgam</code> acts as an interface to <code>Stan</code>, please additionally cite:</p>\n<blockquote>\n<p>Carpenter B., Gelman A., Hoffman M. D., Lee D., Goodrich B., Betancourt M., Brubaker M., Guo J., Li P., and Riddell A. (2017). Stan: A probabilistic programming language. <em>Journal of Statistical Software</em>. 76(1). DOI: <a href=\"https://doi.org/10.18637/jss.v076.i01\" class=\"external-link uri\">https://doi.org/10.18637/jss.v076.i01</a></p>\n</blockquote>\n<p><code>mvgam</code> relies on several other <code>R</code> packages and, of course, on <code>R</code> itself. To find out how to cite <code>R</code> and its packages, use <code><a href=\"https://rdrr.io/r/utils/citation.html\" class=\"external-link\">citation()</a></code>. There are some features of <code>mvgam</code> which specifically rely on certain packages. The most important of these is the generation of data necessary to estimate smoothing splines and Gaussian Processes, which rely on the <code>mgcv</code>, <code>brms</code> and <code>splines2</code> packages. The <code>rstan</code> and <code>cmdstanr</code> packages together with <code>Rcpp</code> makes <code>Stan</code> conveniently accessible in <code>R</code>. If you use some of these features, please also consider citing the related packages.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"other-resources\">Other resources<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-resources\"></a>\n</h2>\n<p>A number of case studies and step-by-step webinars have been compiled to highlight how GAMs and DGAMs can be useful for analysing multivariate data:</p>\n<ul>\n<li><a href=\"https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3\" target=\"_blank\" class=\"external-link\">Time series in R and Stan using the <code>mvgam</code> package</a></li>\n<li><a href=\"https://www.youtube.com/watch?v=0zZopLlomsQ\" target=\"_blank\" class=\"external-link\">Ecological Forecasting with Dynamic Generalized Additive Models</a></li>\n<li><a href=\"https://ecogambler.netlify.app/blog/vector-autoregressions/\" target=\"_blank\" class=\"external-link\">State-Space Vector Autoregressions in <code>mvgam</code></a></li>\n<li><a href=\"https://ecogambler.netlify.app/blog/interpreting-gams/\" target=\"_blank\" class=\"external-link\">How to interpret and report nonlinear effects from Generalized Additive Models</a></li>\n<li><a href=\"https://ecogambler.netlify.app/blog/phylogenetic-smooths-mgcv/\" target=\"_blank\" class=\"external-link\">Phylogenetic smoothing using mgcv</a></li>\n<li><a href=\"https://ecogambler.netlify.app/blog/distributed-lags-mgcv/\" target=\"_blank\" class=\"external-link\">Distributed lags (and hierarchical distributed lags) using mgcv and mvgam</a></li>\n<li><a href=\"https://ecogambler.netlify.app/blog/time-varying-seasonality/\" target=\"_blank\" class=\"external-link\">Incorporating time-varying seasonality in forecast models</a></li>\n</ul>\n</div>\n<div class=\"section level2\">\n<h2 id=\"getting-help\">Getting help<a class=\"anchor\" aria-label=\"anchor\" href=\"#getting-help\"></a>\n</h2>\n<p>If you encounter a clear bug, please file an issue with a minimal reproducible example on <a href=\"https://github.com/nicholasjclark/mvgam/issues\" class=\"external-link\">GitHub</a>. Please also feel free to use the <a href=\"https://github.com/nicholasjclark/mvgam/discussions\" class=\"external-link\"><code>mvgam</code> Discussion Board</a> to hunt for or post other discussion topics related to the package, and do check out the <a href=\"https://nicholasjclark.github.io/mvgam/news/index.html\"><code>mvgam</code> changelog</a> for any updates about recent upgrades that the package has incorporated.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"interested-in-contributing\">Interested in contributing?<a class=\"anchor\" aria-label=\"anchor\" href=\"#interested-in-contributing\"></a>\n</h2>\n<p>I’m actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of <code>mvgam</code>. Please reach out if you are interested (n.clark’at’uq.edu.au). Other contributions are also very welcome, but please see <a href=\"https://github.com/nicholasjclark/mvgam/blob/master/.github/CONTRIBUTING.md\" class=\"external-link\">The Contributor Instructions</a> for general guidelines. Note that by participating in this project you agree to abide by the terms of its <a href=\"https://dplyr.tidyverse.org/CODE_OF_CONDUCT\" class=\"external-link\">Contributor Code of Conduct</a>.</p>\n</div>\n</div>\n\n  </main><aside class=\"col-md-3\"><div class=\"links\">\n<h2 data-toc-skip>Links</h2>\n<ul class=\"list-unstyled\">\n<li><a href=\"https://cloud.r-project.org/package=mvgam\" class=\"external-link\">View on CRAN</a></li>\n<li><a href=\"https://github.com/nicholasjclark/mvgam/\" class=\"external-link\">Browse source code</a></li>\n<li><a href=\"https://github.com/nicholasjclark/mvgam/issues\" class=\"external-link\">Report a bug</a></li>\n</ul>\n</div>\n\n<div class=\"license\">\n<h2 data-toc-skip>License</h2>\n<ul class=\"list-unstyled\">\n<li><a href=\"LICENSE.html\">Full license</a></li>\n<li><small><a href=\"https://opensource.org/licenses/mit-license.php\" class=\"external-link\">MIT</a> + file <a href=\"LICENSE-text.html\">LICENSE</a></small></li>\n</ul>\n</div>\n\n<div class=\"community\">\n<h2 data-toc-skip>Community</h2>\n<ul class=\"list-unstyled\">\n<li><a href=\"CONTRIBUTING.html\">Contributing guide</a></li>\n<li><a href=\"CODE_OF_CONDUCT.html\">Code of conduct</a></li>\n</ul>\n</div>\n\n<div class=\"citation\">\n<h2 data-toc-skip>Citation</h2>\n<ul class=\"list-unstyled\">\n<li><a href=\"authors.html#citation\">Citing mvgam</a></li>\n</ul>\n</div>\n\n<div class=\"developers\">\n<h2 data-toc-skip>Developers</h2>\n<ul class=\"list-unstyled\">\n<li>\n<a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a> <br><small class=\"roles\"> Author, maintainer </small> <a href=\"https://orcid.org/0000-0001-7131-3301\" target=\"orcid.widget\" aria-label=\"ORCID\" class=\"external-link\"><span class=\"fab fa-orcid orcid\" aria-hidden=\"true\"></span></a> </li>\n<li><a href=\"authors.html\">More about authors...</a></li>\n</ul>\n</div>\n\n\n\n  </aside>\n</div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/news/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Changelog • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Changelog\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"active nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-news\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Changelog</h1>\n      <small>Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/NEWS.md\" class=\"external-link\"><code>NEWS.md</code></a></small>\n    </div>\n\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.1.5\" id=\"mvgam-115-not-yet-on-cran\">mvgam 1.1.5 (not yet on CRAN)<a class=\"anchor\" aria-label=\"anchor\" href=\"#mvgam-115-not-yet-on-cran\"></a></h2>\n<div class=\"section level3\">\n<h3 id=\"new-functionalities-1-1-5\">New functionalities<a class=\"anchor\" aria-label=\"anchor\" href=\"#new-functionalities-1-1-5\"></a></h3>\n<ul><li>Converted several more plotting functions to return <code>ggplot</code> objects in place of base R plots</li>\n<li>Added four new <code>type</code>s to the <code><a href=\"../reference/pp_check.mvgam.html\">pp_check()</a></code> function to allow more targeted investigations of randomized quantile residual distributions</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"bug-fixes-1-1-5\">Bug fixes<a class=\"anchor\" aria-label=\"anchor\" href=\"#bug-fixes-1-1-5\"></a></h3>\n<ul><li>Bug fix to ensure piecewise trends are extrapolated the correct number of timepoints when forecasting using the <code><a href=\"../reference/forecast.mvgam.html\">forecast()</a></code> function</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.1.4\" id=\"mvgam-114\">mvgam 1.1.4<a class=\"anchor\" aria-label=\"anchor\" href=\"#mvgam-114\"></a></h2><p class=\"text-muted\">CRAN release: 2025-02-19</p>\n<div class=\"section level3\">\n<h3 id=\"new-functionalities-1-1-4\">New functionalities<a class=\"anchor\" aria-label=\"anchor\" href=\"#new-functionalities-1-1-4\"></a></h3>\n<ul><li>Added the <code><a href=\"../reference/how_to_cite.mvgam.html\">how_to_cite.mvgam()</a></code> function to generate a scaffold methods description of fitted models, which can hopefully make it easier for users to fully describe their programming environment</li>\n<li>Improved various plotting functions by returning <code>ggplot</code> objects in place of base plots (thanks to <a href=\"https://github.com/mhollanders\" class=\"external-link\">@mhollanders</a> <a href=\"https://github.com/nicholasjclark/mvgam/issues/38\" class=\"external-link\">#38</a>)</li>\n<li>Added the brier score (<code>score = 'brier'</code>) as an option in <code><a href=\"../reference/score.mvgam_forecast.html\">score.mvgam_forecast()</a></code> for scoring forecasts of binary variables when using <code>family = bernoulli()</code> (<a href=\"https://github.com/nicholasjclark/mvgam/issues/80\" class=\"external-link\">#80</a>)</li>\n<li>Added <code><a href=\"https://generics.r-lib.org/reference/augment.html\" class=\"external-link\">augment()</a></code> function to add residuals and fitted values to an mvgam object’s observed data (thanks to <a href=\"https://github.com/swpease\" class=\"external-link\">@swpease</a> <a href=\"https://github.com/nicholasjclark/mvgam/issues/83\" class=\"external-link\">#83</a>)</li>\n<li>Added support for approximate <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> effects with more than one covariate and with different kernel functions (<a href=\"https://github.com/nicholasjclark/mvgam/issues/79\" class=\"external-link\">#79</a>)</li>\n<li>Added function <code><a href=\"../reference/jsdgam.html\">jsdgam()</a></code> to estimate Joint Species Distribution Models in which both the latent factors and the observation model components can include any of mvgam’s complex linear predictor effects. Also added a function <code><a href=\"../reference/residual_cor.jsdgam.html\">residual_cor()</a></code> to compute residual correlation, covariance and precision matrices from <code>jsdgam</code> models. See <code><a href=\"../reference/jsdgam.html\">?mvgam::jsdgam</a></code> and <code><a href=\"../reference/residual_cor.jsdgam.html\">?mvgam::residual_cor</a></code> for details</li>\n<li>Added a <code><a href=\"../reference/stability.mvgam.html\">stability.mvgam()</a></code> method to compute stability metrics from models fit with Vector Autoregressive dynamics (<a href=\"https://github.com/nicholasjclark/mvgam/issues/21\" class=\"external-link\">#21</a> and <a href=\"https://github.com/nicholasjclark/mvgam/issues/76\" class=\"external-link\">#76</a>)</li>\n<li>Added functionality to estimate hierarchical error correlations when using multivariate latent process models and when the data are nested among levels of a relevant grouping factor (<a href=\"https://github.com/nicholasjclark/mvgam/issues/75\" class=\"external-link\">#75</a>); see <code><a href=\"../reference/RW.html\">?mvgam::AR</a></code> for an example</li>\n<li>Added <code><a href=\"../reference/ZMVN.html\">ZMVN()</a></code> error models for estimating Zero-Mean Multivariate Normal errors; convenient for working with non time-series data where latent residuals are expected to be correlated (such as when fitting Joint Species Distribution Models); see <code><a href=\"../reference/ZMVN.html\">?mvgam::ZMVN</a></code> for examples</li>\n<li>Added a <code><a href=\"../reference/fevd.mvgam.html\">fevd.mvgam()</a></code> method to compute forecast error variance decompositions from models fit with Vector Autoregressive dynamics (<a href=\"https://github.com/nicholasjclark/mvgam/issues/21\" class=\"external-link\">#21</a> and <a href=\"https://github.com/nicholasjclark/mvgam/issues/76\" class=\"external-link\">#76</a>)</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"deprecations-1-1-4\">Deprecations<a class=\"anchor\" aria-label=\"anchor\" href=\"#deprecations-1-1-4\"></a></h3>\n<ul><li>Arguments <code>use_stan</code>, <code>jags_path</code>, <code>data_train</code>, <code>data_test</code>, <code>adapt_delta</code>, <code>max_treedepth</code> and <code>drift</code> have been removed from primary functions to streamline documentation and reflect the package’s mission to deprecate ‘JAGS’ as a suitable backend. Both <code>adapt_delta</code> and <code>max_treedepth</code> should now be supplied in a named <code><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list()</a></code> to the new argument <code>control</code>\n</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"bug-fixes-1-1-4\">Bug fixes<a class=\"anchor\" aria-label=\"anchor\" href=\"#bug-fixes-1-1-4\"></a></h3>\n<ul><li>Bug fix to ensure <code><a href=\"https://marginaleffects.com/man/r/comparisons.html\" class=\"external-link\">marginaleffects::comparisons</a></code> functions appropriately recognise internal <code>rowid</code> variables</li>\n<li>Updates to ensure <code>ensemble</code> provides appropriate weighting of forecast draws (<a href=\"https://github.com/nicholasjclark/mvgam/issues/98\" class=\"external-link\">#98</a>)</li>\n<li>Not necessarily a “bug fix”, but this update removes several dependencies to lighten installation and improve efficiency of the workflow (<a href=\"https://github.com/nicholasjclark/mvgam/issues/93\" class=\"external-link\">#93</a>)</li>\n<li>Fixed a minor bug in the way <code>trend_map</code> recognises levels of the <code>series</code> factor</li>\n<li>Bug fix to ensure <code>lfo_cv</code> recognises the actual times in <code>time</code>, just in case the user supplies data that doesn’t start at <code>t = 1</code>. Also updated documentation to better reflect this</li>\n<li>Bug fix to ensure <code>update.mvgam</code> captures any <code>knots</code> or <code>trend_knots</code> arguments that were passed to the original model call</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.1.3\" id=\"mvgam-113\">mvgam 1.1.3<a class=\"anchor\" aria-label=\"anchor\" href=\"#mvgam-113\"></a></h2><p class=\"text-muted\">CRAN release: 2024-09-04</p>\n<div class=\"section level3\">\n<h3 id=\"new-functionalities-1-1-3\">New functionalities<a class=\"anchor\" aria-label=\"anchor\" href=\"#new-functionalities-1-1-3\"></a></h3>\n<ul><li>Allow intercepts to be included in process models when <code>trend_formula</code> is supplied. This breaks the assumption that the process has to be zero-centred, adding more modelling flexibility but also potentially inducing nonidentifiabilities with respect to any observation model intercepts. Thoughtful priors are a must for these models</li>\n<li>Added <code>standata.mvgam_prefit</code>, <code>stancode.mvgam</code> and <code>stancode.mvgam_prefit</code> methods for better alignment with ‘brms’ workflows</li>\n<li>Added ‘gratia’ to <em>Enhancements</em> to allow popular methods such as <code>draw()</code> to be used for ‘mvgam’ models if ‘gratia’ is already installed</li>\n<li>Added an <code><a href=\"../reference/ensemble.mvgam_forecast.html\">ensemble.mvgam_forecast()</a></code> method to generate evenly weighted combinations of probabilistic forecast distributions</li>\n<li>Added an <code><a href=\"../reference/irf.mvgam.html\">irf.mvgam()</a></code> method to compute Generalized and Orthogonalized Impulse Response Functions (IRFs) from models fit with Vector Autoregressive dynamics</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"deprecations-1-1-3\">Deprecations<a class=\"anchor\" aria-label=\"anchor\" href=\"#deprecations-1-1-3\"></a></h3>\n<ul><li>The <code>drift</code> argument has been deprecated. It is now recommended for users to include parametric fixed effects of “time” in their respective GAM formulae to capture any expected drift effects</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"bug-fixes-1-1-3\">Bug fixes<a class=\"anchor\" aria-label=\"anchor\" href=\"#bug-fixes-1-1-3\"></a></h3>\n<ul><li>Added a new check to ensure that exception messages are only suppressed by the <code>silent</code> argument if the user’s version of ‘cmdstanr’ is adequate</li>\n<li>Updated dependency for ‘brms’ to version &gt;= ‘2.21.0’ so that <code>read_csv_as_stanfit</code> can be imported, which should future-proof the conversion of ‘cmdstanr’ models to <code>stanfit</code> objects (<a href=\"https://github.com/nicholasjclark/mvgam/issues/70\" class=\"external-link\">#70</a>)</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.1.2\" id=\"mvgam-112\">mvgam 1.1.2<a class=\"anchor\" aria-label=\"anchor\" href=\"#mvgam-112\"></a></h2><p class=\"text-muted\">CRAN release: 2024-07-01</p>\n<div class=\"section level3\">\n<h3 id=\"new-functionalities-1-1-2\">New functionalities<a class=\"anchor\" aria-label=\"anchor\" href=\"#new-functionalities-1-1-2\"></a></h3>\n<ul><li>Added options for silencing some of the ‘Stan’ compiler and modeling messages using the <code>silent</code> argument in <code><a href=\"../reference/mvgam.html\">mvgam()</a></code>\n</li>\n<li>Moved a number of packages from ‘Depends’ to ‘Imports’ for simpler package loading and fewer potential masking conflicts</li>\n<li>Improved efficiency of the model initialisation by tweaking parameters of the underlying ‘mgcv’ <code>gam</code> object’s convergence criteria, resulting in much faster model setups</li>\n<li>Added an option to use <code>trend_model = 'None'</code> in State-Space models, increasing flexibility by ensuring the process error evolves as white noise (<a href=\"https://github.com/nicholasjclark/mvgam/issues/51\" class=\"external-link\">#51</a>)</li>\n<li>Added an option to use the non-centred parameterisation for some autoregressive trend models, which speeds up mixing most of the time</li>\n<li>Updated support for multithreading so that all observation families (apart from <code><a href=\"../reference/mvgam_families.html\">nmix()</a></code>) can now be modeled with multiple threads</li>\n<li>Changed default priors on autoregressive coefficients (AR1, AR2, AR3) to enforce stationarity, which is a much more sensible prior in the majority of contexts</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"bug-fixes-1-1-2\">Bug fixes<a class=\"anchor\" aria-label=\"anchor\" href=\"#bug-fixes-1-1-2\"></a></h3>\n<ul><li>Fixed a small bug that prevented <code><a href=\"../reference/conditional_effects.mvgam.html\">conditional_effects.mvgam()</a></code> from handling effects with three-way interactions</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.1.1\" id=\"mvgam-111\">mvgam 1.1.1<a class=\"anchor\" aria-label=\"anchor\" href=\"#mvgam-111\"></a></h2><p class=\"text-muted\">CRAN release: 2024-05-10</p>\n<div class=\"section level3\">\n<h3 id=\"new-functionalities-1-1-1\">New functionalities<a class=\"anchor\" aria-label=\"anchor\" href=\"#new-functionalities-1-1-1\"></a></h3>\n<ul><li>Changed indexing of an internal c++ function after Prof Brian Ripley’s<br>\nemail: Dear maintainer, Please see the problems shown on <a href=\"https://cran.r-project.org/web/checks/check_results_mvgam.html\" class=\"external-link uri\">https://cran.r-project.org/web/checks/check_results_mvgam.html</a>. Please correct before 2024-05-22 to safely retain your package on CRAN. The CRAN Team</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.1.0\" id=\"mvgam-110\">mvgam 1.1.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#mvgam-110\"></a></h2><p class=\"text-muted\">CRAN release: 2024-05-06</p>\n<ul><li>First release of <code>mvgam</code> to CRAN</li>\n</ul></div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/pkgdown.js",
    "content": "/* http://gregfranko.com/blog/jquery-best-practices/ */\n(function($) {\n  $(function() {\n\n    $('nav.navbar').headroom();\n\n    Toc.init({\n      $nav: $(\"#toc\"),\n      $scope: $(\"main h2, main h3, main h4, main h5, main h6\")\n    });\n\n    if ($('#toc').length) {\n      $('body').scrollspy({\n        target: '#toc',\n        offset: $(\"nav.navbar\").outerHeight() + 1\n      });\n    }\n\n    // Activate popovers\n    $('[data-bs-toggle=\"popover\"]').popover({\n      container: 'body',\n      html: true,\n      trigger: 'focus',\n      placement: \"top\",\n      sanitize: false,\n    });\n\n    $('[data-bs-toggle=\"tooltip\"]').tooltip();\n\n  /* Clipboard --------------------------*/\n\n  function changeTooltipMessage(element, msg) {\n    var tooltipOriginalTitle=element.getAttribute('data-original-title');\n    element.setAttribute('data-original-title', msg);\n    $(element).tooltip('show');\n    element.setAttribute('data-original-title', tooltipOriginalTitle);\n  }\n\n  if(ClipboardJS.isSupported()) {\n    $(document).ready(function() {\n      var copyButton = \"<button type='button' class='btn btn-primary btn-copy-ex' title='Copy to clipboard' aria-label='Copy to clipboard' data-toggle='tooltip' data-placement='left' data-trigger='hover' data-clipboard-copy><i class='fa fa-copy'></i></button>\";\n\n      $(\"div.sourceCode\").addClass(\"hasCopyButton\");\n\n      // Insert copy buttons:\n      $(copyButton).prependTo(\".hasCopyButton\");\n\n      // Initialize tooltips:\n      $('.btn-copy-ex').tooltip({container: 'body'});\n\n      // Initialize clipboard:\n      var clipboard = new ClipboardJS('[data-clipboard-copy]', {\n        text: function(trigger) {\n          return trigger.parentNode.textContent.replace(/\\n#>[^\\n]*/g, \"\");\n        }\n      });\n\n      clipboard.on('success', function(e) {\n        changeTooltipMessage(e.trigger, 'Copied!');\n        e.clearSelection();\n      });\n\n      clipboard.on('error', function() {\n        changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy');\n      });\n\n    });\n  }\n\n    /* Search marking --------------------------*/\n    var url = new URL(window.location.href);\n    var toMark = url.searchParams.get(\"q\");\n    var mark = new Mark(\"main#main\");\n    if (toMark) {\n      mark.mark(toMark, {\n        accuracy: {\n          value: \"complementary\",\n          limiters: [\",\", \".\", \":\", \"/\"],\n        }\n      });\n    }\n\n  /* Search --------------------------*/\n  /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */\n    // Initialise search index on focus\n  var fuse;\n  $(\"#search-input\").focus(async function(e) {\n    if (fuse) {\n      return;\n    }\n\n    $(e.target).addClass(\"loading\");\n    var response = await fetch($(\"#search-input\").data(\"search-index\"));\n    var data = await response.json();\n\n    var options = {\n      keys: [\"what\", \"text\", \"code\"],\n      ignoreLocation: true,\n      threshold: 0.1,\n      includeMatches: true,\n      includeScore: true,\n    };\n    fuse = new Fuse(data, options);\n\n    $(e.target).removeClass(\"loading\");\n  });\n\n  // Use algolia autocomplete\n  var options = {\n    autoselect: true,\n    debug: true,\n    hint: false,\n    minLength: 2,\n  };\n  var q;\nasync function searchFuse(query, callback) {\n  await fuse;\n\n  var items;\n  if (!fuse) {\n    items = [];\n  } else {\n    q = query;\n    var results = fuse.search(query, { limit: 20 });\n    items = results\n      .filter((x) => x.score <= 0.75)\n      .map((x) => x.item);\n    if (items.length === 0) {\n      items = [{dir:\"Sorry 😿\",previous_headings:\"\",title:\"No results found.\",what:\"No results found.\",path:window.location.href}];\n    }\n  }\n  callback(items);\n}\n  $(\"#search-input\").autocomplete(options, [\n    {\n      name: \"content\",\n      source: searchFuse,\n      templates: {\n        suggestion: (s) => {\n          if (s.title == s.what) {\n            return `${s.dir} >\t<div class=\"search-details\"> ${s.title}</div>`;\n          } else if (s.previous_headings == \"\") {\n            return `${s.dir} >\t<div class=\"search-details\"> ${s.title}</div> > ${s.what}`;\n          } else {\n            return `${s.dir} >\t<div class=\"search-details\"> ${s.title}</div> > ${s.previous_headings} > ${s.what}`;\n          }\n        },\n      },\n    },\n  ]).on('autocomplete:selected', function(event, s) {\n    window.location.href = s.path + \"?q=\" + q + \"#\" + s.id;\n  });\n  });\n})(window.jQuery || window.$)\n\n\n"
  },
  {
    "path": "docs/pkgdown.yml",
    "content": "pandoc: 3.1.1\npkgdown: 2.0.7\npkgdown_sha: ~\narticles:\n  data_in_mvgam: data_in_mvgam.html\n  forecast_evaluation: forecast_evaluation.html\n  mvgam_overview: mvgam_overview.html\n  nmixtures: nmixtures.html\n  shared_states: shared_states.html\n  time_varying_effects: time_varying_effects.html\n  trend_formulas: trend_formulas.html\nlast_built: 2024-03-12T03:54Z\nurls:\n  reference: https://nicholasjclark.github.io/mvgam/reference\n  article: https://nicholasjclark.github.io/mvgam/articles\n\n"
  },
  {
    "path": "docs/reference/GP.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Specify dynamic Gaussian process trends in mvgam models — GP • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Specify dynamic Gaussian process trends in mvgam models — GP\"><meta name=\"description\" content=\"Set up low-rank approximate Gaussian Process trend models using Hilbert\nbasis expansions in mvgam. This function does not evaluate its arguments –\nit exists purely to help set up a model with particular GP\ntrend models.\"><meta property=\"og:description\" content=\"Set up low-rank approximate Gaussian Process trend models using Hilbert\nbasis expansions in mvgam. This function does not evaluate its arguments –\nit exists purely to help set up a model with particular GP\ntrend models.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Specify dynamic Gaussian process trends in <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_trend_types.R\" class=\"external-link\"><code>R/mvgam_trend_types.R</code></a></small>\n      <div class=\"d-none name\"><code>GP.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Set up low-rank approximate Gaussian Process trend models using Hilbert\nbasis expansions in <span class=\"pkg\">mvgam</span>. This function does not evaluate its arguments –\nit exists purely to help set up a model with particular GP\ntrend models.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">GP</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>unused</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>mvgam_trend</code>, which contains a list of\narguments to be interpreted by the parsing functions in <span class=\"pkg\">mvgam</span></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A GP trend is estimated for each series using\n<a href=\"https://arxiv.org/abs/2004.11408\" class=\"external-link\">Hilbert space approximate Gaussian Processes</a>.\nIn <code>mvgam</code>, latent squared exponential GP trends are approximated using by\ndefault <code>20</code> basis functions and using a multiplicative factor of <code>c = 5/4</code>,\nwhich saves computational costs compared to fitting full GPs while adequately estimating\nGP <code>alpha</code> and <code>rho</code> parameters.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></code></p></div>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/RW.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Specify autoregressive dynamic processes in mvgam — RW • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Specify autoregressive dynamic processes in mvgam — RW\"><meta name=\"description\" content=\"Set up autoregressive or autoregressive moving average trend models\nin mvgam. These functions do not evaluate their arguments –\nthey exist purely to help set up a model with particular autoregressive\ntrend models.\"><meta property=\"og:description\" content=\"Set up autoregressive or autoregressive moving average trend models\nin mvgam. These functions do not evaluate their arguments –\nthey exist purely to help set up a model with particular autoregressive\ntrend models.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Specify autoregressive dynamic processes in <span class=\"pkg\">mvgam</span></h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_trend_types.R\" class=\"external-link\"><code>R/mvgam_trend_types.R</code></a></small>\n      <div class=\"d-none name\"><code>RW.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Set up autoregressive or autoregressive moving average trend models\nin <span class=\"pkg\">mvgam</span>. These functions do not evaluate their arguments –\nthey exist purely to help set up a model with particular autoregressive\ntrend models.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">RW</span><span class=\"op\">(</span>ma <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, cor <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, gr <span class=\"op\">=</span> <span class=\"cn\">NA</span>, subgr <span class=\"op\">=</span> <span class=\"cn\">NA</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">AR</span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">1</span>, ma <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, cor <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, gr <span class=\"op\">=</span> <span class=\"cn\">NA</span>, subgr <span class=\"op\">=</span> <span class=\"cn\">NA</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">CAR</span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">VAR</span><span class=\"op\">(</span>ma <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, cor <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, gr <span class=\"op\">=</span> <span class=\"cn\">NA</span>, subgr <span class=\"op\">=</span> <span class=\"cn\">NA</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-ma\">ma<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ma\"></a></dt>\n<dd><p><code>Logical</code> Include moving average terms of order <code>1</code>?\nDefault is <code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg-cor\">cor<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-cor\"></a></dt>\n<dd><p><code>Logical</code> Include correlated process errors as part of a\nmultivariate normal process model? If <code>TRUE</code> and if <code>n_series &gt; 1</code>\nin the supplied data, a fully structured covariance matrix will be estimated\nfor the process errors. Default is <code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg-gr\">gr<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-gr\"></a></dt>\n<dd><p>An optional grouping variable, which must be a <code>factor</code> in the supplied <code>data</code>,\nfor setting up hierarchical residual correlation structures. If specified,\nthis will automatically set <code>cor = TRUE</code> and set up a model where the\nresidual correlations for a specific level of <code>gr</code> are modelled hierarchically:\n\\(\\Omega_{group} = \\alpha_{cor}\\Omega_{global} + (1 - \\alpha_{cor})\\Omega_{group, local}\\),\nwhere \\(\\Omega_{global}\\) is a <em>global</em> correlation\nmatrix, \\(\\Omega_{group, local}\\) is a <em>local deviation</em> correlation matrix\nand \\(\\alpha_{cor}\\) is a weighting parameter\ncontrolling how strongly the local correlation matrix \\(\\Omega_{group}\\)\nis shrunk towards the global\ncorrelation matrix \\(\\Omega_{global}\\) (larger values of \\(\\alpha_{cor}\\) indicate\na greater degree of shrinkage, i.e. a greater degree of partial pooling).\nIf <code>gr</code> is supplied then <code>subgr</code> <em>must</em> also be supplied</p></dd>\n\n\n<dt id=\"arg-subgr\">subgr<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-subgr\"></a></dt>\n<dd><p>A subgrouping <code>factor</code> variable specifying which element in <code>data</code> represents the\ndifferent time series. Defaults to <code>series</code>, but note that\nmodels that use the hierarchical correlations, where the <code>subgr</code> time series are measured in each level of <code>gr</code>,\n<em>should not</em> include a <code>series</code> element in <code>data</code>. Rather, this element will be created internally based\non the supplied variables for <code>gr</code> and <code>subgr</code>. For example, if you are modelling\ntemporal counts for a group of species (labelled as <code>species</code> in <code>data</code>) across three\ndifferent geographical regions (labelled as <code>region</code>),\nand you would like the residuals to be correlated within regions,\nthen you should specify <code>gr = region</code> and <code>subgr = species</code>. Internally, <code><a href=\"mvgam.html\">mvgam()</a></code> will create\nthe <code>series</code> element for the data using: <code>series = interaction(group, subgroup, drop = TRUE))</code></p></dd>\n\n\n<dt id=\"arg-p\">p<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-p\"></a></dt>\n<dd><p>A non-negative integer specifying the autoregressive (AR) order.\nDefault is <code>1</code>. Cannot currently be larger than <code>3</code> for <code>AR</code> terms,\nand cannot be anything other than <code>1</code> for continuous time AR (<code>CAR</code>) terms</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>mvgam_trend</code>, which contains a list of\narguments to be interpreted by the parsing functions in <span class=\"pkg\">mvgam</span></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># A short example to illustrate CAR(1) models</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Function to simulate CAR1 data with seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim_corcar1</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">n</span> <span class=\"op\">=</span> <span class=\"fl\">120</span>,</span></span>\n<span class=\"r-in\"><span>                      <span class=\"va\">phi</span> <span class=\"op\">=</span> <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>                      <span class=\"va\">sigma</span> <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>                      <span class=\"va\">sigma_obs</span> <span class=\"op\">=</span> <span class=\"fl\">0.75</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Sample irregularly spaced time intervals</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">time_dis</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"va\">n</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>, <span class=\"op\">-</span><span class=\"fl\">0.1</span>, <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">time_dis</span><span class=\"op\">[</span><span class=\"va\">time_dis</span> <span class=\"op\">&lt;</span> <span class=\"fl\">0</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">0</span>; <span class=\"va\">time_dis</span> <span class=\"op\">&lt;-</span> <span class=\"va\">time_dis</span> <span class=\"op\">*</span> <span class=\"fl\">5</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Set up the latent dynamic process</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">vector</a></span><span class=\"op\">(</span>length <span class=\"op\">=</span> <span class=\"va\">n</span><span class=\"op\">)</span>; <span class=\"va\">x</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"op\">-</span><span class=\"fl\">0.3</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"va\">n</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span> <span class=\"co\"># zero-distances will cause problems in sampling, so mvgam uses a</span></span></span>\n<span class=\"r-in\"><span> <span class=\"co\"># minimum threshold; this simulation function emulates that process</span></span></span>\n<span class=\"r-in\"><span> <span class=\"kw\">if</span><span class=\"op\">(</span><span class=\"va\">time_dis</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span> <span class=\"op\">==</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>   <span class=\"va\">x</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, mean <span class=\"op\">=</span> <span class=\"op\">(</span><span class=\"va\">phi</span> <span class=\"op\">^</span> <span class=\"fl\">1e-12</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">[</span><span class=\"va\">i</span> <span class=\"op\">-</span> <span class=\"fl\">1</span><span class=\"op\">]</span>, sd <span class=\"op\">=</span> <span class=\"va\">sigma</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"op\">}</span> <span class=\"kw\">else</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"va\">x</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, mean <span class=\"op\">=</span> <span class=\"op\">(</span><span class=\"va\">phi</span> <span class=\"op\">^</span> <span class=\"va\">time_dis</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">[</span><span class=\"va\">i</span> <span class=\"op\">-</span> <span class=\"fl\">1</span><span class=\"op\">]</span>, sd <span class=\"op\">=</span> <span class=\"va\">sigma</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Add 12-month seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">cov1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Trig.html\" class=\"external-link\">sin</a></span><span class=\"op\">(</span><span class=\"fl\">2</span> <span class=\"op\">*</span> <span class=\"va\">pi</span> <span class=\"op\">*</span> <span class=\"op\">(</span><span class=\"fl\">1</span> <span class=\"op\">:</span> <span class=\"va\">n</span><span class=\"op\">)</span> <span class=\"op\">/</span> <span class=\"fl\">12</span><span class=\"op\">)</span>; <span class=\"va\">cov2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Trig.html\" class=\"external-link\">cos</a></span><span class=\"op\">(</span><span class=\"fl\">2</span> <span class=\"op\">*</span> <span class=\"va\">pi</span> <span class=\"op\">*</span> <span class=\"op\">(</span><span class=\"fl\">1</span> <span class=\"op\">:</span> <span class=\"va\">n</span><span class=\"op\">)</span> <span class=\"op\">/</span> <span class=\"fl\">12</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">beta1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">0.3</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>; <span class=\"va\">beta2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">0.2</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">seasonality</span> <span class=\"op\">&lt;-</span> <span class=\"va\">beta1</span> <span class=\"op\">*</span> <span class=\"va\">cov1</span> <span class=\"op\">+</span> <span class=\"va\">beta2</span> <span class=\"op\">*</span> <span class=\"va\">cov2</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Take Gaussian observations with error and return</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">n</span>, mean <span class=\"op\">=</span> <span class=\"va\">x</span> <span class=\"op\">+</span> <span class=\"va\">seasonality</span>, sd <span class=\"op\">=</span> <span class=\"va\">sigma_obs</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>           season <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">12</span>, <span class=\"fl\">20</span><span class=\"op\">)</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"va\">n</span><span class=\"op\">]</span>,</span></span>\n<span class=\"r-in\"><span>           time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cumsum.html\" class=\"external-link\">cumsum</a></span><span class=\"op\">(</span><span class=\"va\">time_dis</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Sample two time series</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">rbind</a></span><span class=\"op\">(</span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/bind_cols.html\" class=\"external-link\">bind_cols</a></span><span class=\"op\">(</span><span class=\"fu\">sim_corcar1</span><span class=\"op\">(</span>phi <span class=\"op\">=</span> <span class=\"fl\">0.65</span>,</span></span>\n<span class=\"r-in\"><span>                                         sigma_obs <span class=\"op\">=</span> <span class=\"fl\">0.55</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                             <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"st\">'series1'</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/bind_cols.html\" class=\"external-link\">bind_cols</a></span><span class=\"op\">(</span><span class=\"fu\">sim_corcar1</span><span class=\"op\">(</span>phi <span class=\"op\">=</span> <span class=\"fl\">0.8</span>,</span></span>\n<span class=\"r-in\"><span>                             sigma_obs <span class=\"op\">=</span> <span class=\"fl\">0.35</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                             <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"st\">'series2'</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>      <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># mvgam with CAR(1) trends and series-level seasonal smooths; the</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># State-Space representation (using trend_formula) will be more efficient</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>            trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>,</span></span>\n<span class=\"r-in\"><span>                                k <span class=\"op\">=</span> <span class=\"fl\">5</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\">CAR</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            samples <span class=\"op\">=</span> <span class=\"fl\">300</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c3e2173a3.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># View usual summaries and plots</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM observation formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001d61abb4b00&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM process formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ~s(season, bs = \"cc\", k = 5, by = trend)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001d61abb4b00&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gaussian</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> identity</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> CAR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N process models:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 120 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 800; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 600</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Observation error parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              2.5%  50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma_obs[1] 0.32 0.61  0.93 1.02    25</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma_obs[2] 0.17 0.30  0.54 1.08    21</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM observation model coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             2.5%   50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept) -2.1 -0.86 -0.026 2.18     3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Process model AR parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        2.5%  50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[1] 0.20 0.56  0.85 1.03    61</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[2] 0.69 0.80  0.89 1.00   183</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Process error parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          2.5%  50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[1] 0.64 0.95   1.2 1.01    39</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[2] 0.73 0.89   1.1 1.02    87</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM process model coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                2.5%   50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)_trend             -0.14  0.71  2.000  2.1     3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):trendtrend1.1_trend -0.17  0.18  0.560  1.0   423</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):trendtrend1.2_trend -0.75 -0.30  0.120  1.0   522</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):trendtrend1.3_trend -0.86 -0.46 -0.044  1.0   488</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):trendtrend2.1_trend -0.13  0.24  0.700  1.0   388</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):trendtrend2.2_trend -0.95 -0.41  0.076  1.0   398</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):trendtrend2.3_trend -1.00 -0.50 -0.094  1.0   491</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM process smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                         edf Ref.df Chi.sq p-value  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):seriestrend1 2.29      3   10.5   0.061 .</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season):seriestrend2 2.19      3   15.1   0.051 .</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhats above 1.05 found for 485 parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  *Diagnose further to investigate why the chains have not mixed</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 of 600 iterations ended with a divergence (1.8333%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  *Try running with larger adapt_delta to remove the divergences</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 600 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1: E-FMI = 0.1507</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2: E-FMI = 0.1239</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  *E-FMI below 0.2 indicates you may need to reparameterize your model</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 19 11:59:08 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'expected'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"RW-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"RW-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"RW-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"RW-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"RW-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now an example illustrating hierarchical dynamics</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">123</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate three species monitored in three different</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># regions, where dynamics can potentially vary across regions</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>trend_model <span class=\"op\">=</span> <span class=\"fu\">VAR</span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.95</span>,</span></span>\n<span class=\"r-in\"><span>                    n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                    mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">2</span>, <span class=\"fl\">3</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>trend_model <span class=\"op\">=</span> <span class=\"fu\">VAR</span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.95</span>,</span></span>\n<span class=\"r-in\"><span>                    n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                    mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">2</span>, <span class=\"fl\">3</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat3</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>trend_model <span class=\"op\">=</span> <span class=\"fu\">VAR</span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.95</span>,</span></span>\n<span class=\"r-in\"><span>                    n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                    mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">2</span>, <span class=\"fl\">3</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Set up the data but DO NOT include 'series'</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">all_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">rbind</a></span><span class=\"op\">(</span><span class=\"va\">simdat1</span><span class=\"op\">$</span><span class=\"va\">data_train</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>region <span class=\"op\">=</span> <span class=\"st\">'qld'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                <span class=\"va\">simdat2</span><span class=\"op\">$</span><span class=\"va\">data_train</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>region <span class=\"op\">=</span> <span class=\"st\">'nsw'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                <span class=\"va\">simdat3</span><span class=\"op\">$</span><span class=\"va\">data_train</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>region <span class=\"op\">=</span> <span class=\"st\">'vic'</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/grep.html\" class=\"external-link\">gsub</a></span><span class=\"op\">(</span><span class=\"st\">'series'</span>, <span class=\"st\">'species'</span>, <span class=\"va\">series</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">species</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              region <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">region</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, <span class=\"va\">time</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"va\">series</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Check priors for a hierarchical AR1 model</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>                trend_model <span class=\"op\">=</span> <span class=\"fu\">AR</span><span class=\"op\">(</span>gr <span class=\"op\">=</span> <span class=\"va\">region</span>, subgr <span class=\"op\">=</span> <span class=\"va\">species</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                data <span class=\"op\">=</span> <span class=\"va\">all_dat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                param_name param_length                    param_info</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1                             (Intercept)            1                   (Intercept)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2                        speciesspecies_2            1 speciesspecies_2 fixed effect</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3                        speciesspecies_3            1 speciesspecies_3 fixed effect</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4 vector&lt;lower=-1,upper=1&gt;[n_series] ar1;            9         trend AR1 coefficient</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5        vector&lt;lower=0&gt;[n_series] sigma;            9                      trend sd</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                    prior                   example_change new_lowerbound new_upperbound</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  (Intercept) ~ student_t(3, 1.9, 2.5);      (Intercept) ~ normal(0, 1);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 speciesspecies_2 ~ student_t(3, 0, 2); speciesspecies_2 ~ normal(0, 1);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3 speciesspecies_3 ~ student_t(3, 0, 2); speciesspecies_3 ~ normal(0, 1);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4                    ar1 ~ std_normal();       ar1 ~ normal(-0.79, 0.86);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5          sigma ~ student_t(3, 0, 2.5);       sigma ~ exponential(0.37);             NA             NA</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit the model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\">AR</span><span class=\"op\">(</span>gr <span class=\"op\">=</span> <span class=\"va\">region</span>, subgr <span class=\"op\">=</span> <span class=\"va\">species</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">all_dat</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c48444ff2.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Check standard outputs</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ species</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001d61abb4b00&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> poisson</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> log</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> AR(gr = region, subgr = species)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                  2.5%  50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)      0.90 1.10   1.3 1.00   175</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> speciesspecies_2 0.79 0.99   1.2 1.02   332</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> speciesspecies_3 1.60 1.90   2.1 1.01   125</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Latent trend parameter AR estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            2.5%    50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[1]    0.220  0.480  0.700 1.01   202</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[2]    0.120  0.330  0.550 1.02   157</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[3]   -0.017  0.370  0.680 1.03    54</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[4]    0.230  0.640  0.870 1.02   136</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[5]   -0.190  0.074  0.300 1.00   146</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[6]   -0.430 -0.220 -0.015 1.00   120</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[7]   -0.034  0.290  0.610 1.00   168</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[8]    0.570  0.730  0.890 1.00   178</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[9]    0.330  0.560  0.780 1.00   111</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[1]  0.810  1.000  1.300 1.00   531</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[2]  0.650  0.800  0.970 1.00   613</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[3]  0.820  0.970  1.200 1.00   358</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[4]  0.310  0.480  0.710 1.03   117</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[5]  0.630  0.760  0.900 1.00   495</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[6]  0.680  0.790  0.960 1.00   666</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[7]  0.610  0.790  1.000 1.00   256</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[8]  0.560  0.700  0.910 1.00   556</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[9]  0.690  0.820  1.000 1.00  1267</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Hierarchical correlation weighting parameter (alpha_cor) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            2.5%   50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> alpha_cor 0.016 0.075  0.21    1   447</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 19 12:00:03 PM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"RW-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect posterior estimates for the correlation weighting parameter</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'alpha_cor'</span>, type <span class=\"op\">=</span> <span class=\"st\">'hist'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"RW-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/ZMVN.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Specify correlated residual processes in mvgam — ZMVN • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Specify correlated residual processes in mvgam — ZMVN\"><meta name=\"description\" content=\"Set up latent correlated multivariate Gaussian residual processes\nin mvgam. This function does not evaluate it's arguments –\nit exists purely to help set up a model with particular error processes.\"><meta property=\"og:description\" content=\"Set up latent correlated multivariate Gaussian residual processes\nin mvgam. This function does not evaluate it's arguments –\nit exists purely to help set up a model with particular error processes.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Specify correlated residual processes in <span class=\"pkg\">mvgam</span></h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_trend_types.R\" class=\"external-link\"><code>R/mvgam_trend_types.R</code></a></small>\n      <div class=\"d-none name\"><code>ZMVN.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Set up latent correlated multivariate Gaussian residual processes\nin <span class=\"pkg\">mvgam</span>. This function does not evaluate it's arguments –\nit exists purely to help set up a model with particular error processes.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">ZMVN</span><span class=\"op\">(</span>unit <span class=\"op\">=</span> <span class=\"va\">time</span>, gr <span class=\"op\">=</span> <span class=\"cn\">NA</span>, subgr <span class=\"op\">=</span> <span class=\"va\">series</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-unit\">unit<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-unit\"></a></dt>\n<dd><p>The unquoted name of the variable that represents the unit of analysis in <code>data</code> over\nwhich latent residuals should be correlated. This variable should be either a\n<code>numeric</code> or <code>integer</code> variable in the supplied <code>data</code>.\nDefaults to <code>time</code> to be consistent with other functionalities\nin <span class=\"pkg\">mvgam</span>, though note that the data need not be time series in this case. See examples below\nfor further details and explanations</p></dd>\n\n\n<dt id=\"arg-gr\">gr<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-gr\"></a></dt>\n<dd><p>An optional grouping variable, which must be a <code>factor</code> in the supplied <code>data</code>,\nfor setting up hierarchical residual correlation structures. If specified,\nthis will automatically set up a model where the\nresidual correlations for a specific level of <code>gr</code> are modelled hierarchically:\n\\(\\Omega_{group} = p\\Omega_{global} + (1 - p)\\Omega_{group, local}\\),\nwhere \\(\\Omega_{global}\\) is a <em>global</em> correlation\nmatrix, \\(\\Omega_{group, local}\\) is a <em>local deviation</em> correlation matrix\nand \\(p\\) is a weighting parameter\ncontrolling how strongly the local correlation matrix \\(\\Omega_{group}\\) is shrunk towards the global\ncorrelation matrix \\(\\Omega_{global}\\). If <code>gr</code> is supplied then <code>subgr</code> <em>must</em> also be supplied</p></dd>\n\n\n<dt id=\"arg-subgr\">subgr<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-subgr\"></a></dt>\n<dd><p>A subgrouping <code>factor</code> variable specifying which element in <code>data</code> represents the\ndifferent observational units. Defaults to <code>series</code> to be consistent with other functionalities\nin <span class=\"pkg\">mvgam</span>, though note that the data need not be time series in this case.\nBut note that models that use the hierarchical correlations (by supplying a value for <code>gr</code>)\n<em>should not</em> include a <code>series</code> element in <code>data</code>. Rather, this element will be created internally based\non the supplied variables for <code>gr</code> and <code>subgr</code>. For example, if you are modelling\ncounts for a group of species (labelled as <code>species</code> in the data) across sampling sites\n(labelled as <code>site</code> in the data) in three\ndifferent geographical regions (labelled as <code>region</code>), and you would like the residuals to be correlated\nwithin regions, then you should specify\n<code>unit = site</code>,  <code>gr = region</code>, and <code>subgr = species</code>. Internally, <code><a href=\"mvgam.html\">mvgam()</a></code> will appropriately order\nthe data by <code>unit</code> (in this case, by <code>site</code>) and create\nthe <code>series</code> element for the data using something like: <code>series = as.factor(paste0(group, '_', subgroup))</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>mvgam_trend</code>, which contains a list of\narguments to be interpreted by the parsing functions in <span class=\"pkg\">mvgam</span></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate counts of four species over ten sampling locations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">site_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>site <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">4</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                      species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"va\">letters</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">4</span><span class=\"op\">]</span>, <span class=\"fl\">10</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                      y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"cn\">NA</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Poisson.html\" class=\"external-link\">rpois</a></span><span class=\"op\">(</span><span class=\"fl\">39</span>, <span class=\"fl\">3</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">site_dat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   site species  y</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1    1       a NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2    2       a  2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3    3       a  0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4    4       a  1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5    5       a  3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6    6       a  4</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Set up a correlated residual (i.e. Joint Species Distribution) model,</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># where 'site' represents the unit of analysis</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">trend_model</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">ZMVN</span><span class=\"op\">(</span>unit <span class=\"op\">=</span> <span class=\"va\">site</span>, subgr <span class=\"op\">=</span> <span class=\"va\">species</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\">ZMVN</span><span class=\"op\">(</span>unit <span class=\"op\">=</span> <span class=\"va\">site</span>,</span></span>\n<span class=\"r-in\"><span>                               subgr <span class=\"op\">=</span> <span class=\"va\">species</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">site_dat</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c7aea2ba7.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect the estimated species-species residual covariances</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'Sigma'</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, type <span class=\"op\">=</span> <span class=\"st\">'hist'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"ZMVN-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># A hierarchical correlation example; set up correlated counts</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># for three species across two sampling locations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">Sigma</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"op\">-</span><span class=\"fl\">0.4</span>, <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>                 <span class=\"op\">-</span><span class=\"fl\">0.4</span>, <span class=\"fl\">1</span>, <span class=\"fl\">0.3</span>,</span></span>\n<span class=\"r-in\"><span>                 <span class=\"fl\">0.5</span>, <span class=\"fl\">0.3</span>, <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               byrow <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>               nrow <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>               <span class=\"va\">Sigma</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      [,1] [,2] [,3]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1,]  1.0 -0.4  0.5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2,] -0.4  1.0  0.3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3,]  0.5  0.3  1.0</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">make_site_dat</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span> <span class=\"va\">errors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/rmvn.html\" class=\"external-link\">rmvn</a></span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">30</span>,</span></span>\n<span class=\"r-in\"><span>                      mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.6</span>, <span class=\"fl\">0.8</span>, <span class=\"fl\">1.8</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                      V <span class=\"op\">=</span> <span class=\"va\">Sigma</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span> <span class=\"va\">site_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/do.call.html\" class=\"external-link\">do.call</a></span><span class=\"op\">(</span><span class=\"va\">rbind</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/lapply.html\" class=\"external-link\">lapply</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">spec</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>   <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Poisson.html\" class=\"external-link\">rpois</a></span><span class=\"op\">(</span><span class=\"fl\">30</span>,</span></span>\n<span class=\"r-in\"><span>                        lambda <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"va\">errors</span><span class=\"op\">[</span>, <span class=\"va\">spec</span><span class=\"op\">]</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'species'</span>,</span></span>\n<span class=\"r-in\"><span>                               <span class=\"va\">spec</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              site <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">30</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">site_dat</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">site_dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">rbind</a></span><span class=\"op\">(</span><span class=\"fu\">make_site_dat</span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>group <span class=\"op\">=</span> <span class=\"st\">'group1'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 <span class=\"fu\">make_site_dat</span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>group <span class=\"op\">=</span> <span class=\"st\">'group2'</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">species</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 group <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">group</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit the hierarchical correlated residual model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\">ZMVN</span><span class=\"op\">(</span>unit <span class=\"op\">=</span> <span class=\"va\">site</span>,</span></span>\n<span class=\"r-in\"><span>                               gr <span class=\"op\">=</span> <span class=\"va\">group</span>,</span></span>\n<span class=\"r-in\"><span>                               subgr <span class=\"op\">=</span> <span class=\"va\">species</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">site_dat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c51c52b08.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 4 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 2.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 finished in 2.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 2.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 finished in 2.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> All 4 chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 2.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 2.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect the estimated species-species residual covariances</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'Sigma'</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, type <span class=\"op\">=</span> <span class=\"st\">'hist'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"ZMVN-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/add_residuals.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Calculate randomized quantile residuals for mvgam objects — add_residuals.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Calculate randomized quantile residuals for mvgam objects — add_residuals.mvgam\"><meta name=\"description\" content=\"Calculate randomized quantile residuals for mvgam objects\"><meta property=\"og:description\" content=\"Calculate randomized quantile residuals for mvgam objects\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Calculate randomized quantile residuals for <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/add_residuals.R\" class=\"external-link\"><code>R/add_residuals.R</code></a></small>\n      <div class=\"d-none name\"><code>add_residuals.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Calculate randomized quantile residuals for <span class=\"pkg\">mvgam</span> objects</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">add_residuals</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">add_residuals</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>unused</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A list object of class <code>mvgam</code> with residuals included in the <code>'resids'</code> slot</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>For each series, randomized quantile (i.e. Dunn-Smyth) residuals are calculated for inspecting model diagnostics\nIf the fitted model is appropriate then Dunn-Smyth residuals will be standard normal in distribution and no\nautocorrelation will be evident. When a particular observation is missing, the residual is calculated by comparing independent\ndraws from the model's posterior distribution</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/add_tweedie_lines.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Tweedie JAGS modifications\"><title>Tweedie JAGS modifications — add_tweedie_lines • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Tweedie JAGS modifications — add_tweedie_lines\"><meta property=\"og:description\" content=\"Tweedie JAGS modifications\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.0.91</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Tweedie JAGS modifications</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/add_tweedie_lines.R\" class=\"external-link\"><code>R/add_tweedie_lines.R</code></a></small>\n      <div class=\"d-none name\"><code>add_tweedie_lines.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Tweedie JAGS modifications</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">add_tweedie_lines</span><span class=\"op\">(</span><span class=\"va\">model_file</span>, <span class=\"va\">upper_bounds</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>model_file</dt>\n<dd><p>A template <code>JAGS</code> model file to be modified</p></dd>\n\n\n<dt>upper_bounds</dt>\n<dd><p>Optional upper bounds for the truncated observation likelihood</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>A modified <code>JAGS</code> model file</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/all_neon_tick_data.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"A dataset containing timeseries of Amblyomma americanum and Ixodes scapularis nymph abundances at NEON sites\"><title>NEON Amblyomma and Ixodes tick abundance survey data — all_neon_tick_data • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"NEON Amblyomma and Ixodes tick abundance survey data — all_neon_tick_data\"><meta property=\"og:description\" content=\"A dataset containing timeseries of Amblyomma americanum and Ixodes scapularis nymph abundances at NEON sites\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.3</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>NEON Amblyomma and Ixodes tick abundance survey data</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/all_neon_tick_data.R\" class=\"external-link\"><code>R/all_neon_tick_data.R</code></a></small>\n      <div class=\"d-none name\"><code>all_neon_tick_data.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>A dataset containing timeseries of Amblyomma americanum and Ixodes scapularis nymph abundances at NEON sites</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"va\">all_neon_tick_data</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"format\">Format<a class=\"anchor\" aria-label=\"anchor\" href=\"#format\"></a></h2>\n    <p>A tibble/dataframe containing covariate information alongside the main fields of:</p><dl><dt>Year</dt>\n<dd><p>Year of sampling</p></dd>\n\n<dt>epiWeek</dt>\n<dd><p>Epidemiological week of sampling</p></dd>\n\n<dt>plot_ID</dt>\n<dd><p>NEON plot ID for survey location</p></dd>\n\n<dt>siteID</dt>\n<dd><p>NEON site ID for survey location</p></dd>\n\n<dt>amblyomma_americanum</dt>\n<dd><p>Counts of A. americanum nymphs</p></dd>\n\n<dt>ixodes_scapularis</dt>\n<dd><p>Counts of I. scapularis nymphs</p></dd>\n\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"source\">Source<a class=\"anchor\" aria-label=\"anchor\" href=\"#source\"></a></h2>\n    <p><a href=\"https://www.neonscience.org/data\" class=\"external-link\">https://www.neonscience.org/data</a></p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/augment.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Augment an mvgam object's data — augment.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Augment an mvgam object's data — augment.mvgam\"><meta name=\"description\" content=\"Add fits and residuals to the data, implementing the generic augment from\nthe package broom.\"><meta property=\"og:description\" content=\"Add fits and residuals to the data, implementing the generic augment from\nthe package broom.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Augment an <span class=\"pkg\">mvgam</span> object's data</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/tidier_methods.R\" class=\"external-link\"><code>R/tidier_methods.R</code></a></small>\n      <div class=\"d-none name\"><code>augment.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Add fits and residuals to the data, implementing the generic <code>augment</code> from\nthe package <span class=\"pkg\">broom</span>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://generics.r-lib.org/reference/augment.html\" class=\"external-link\">augment</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, robust <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.025</span>, <span class=\"fl\">0.975</span><span class=\"op\">)</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>An object of class <code>mvgam</code>.</p></dd>\n\n\n<dt id=\"arg-robust\">robust<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-robust\"></a></dt>\n<dd><p>If <code>FALSE</code> (the default) the mean is used as the measure of\ncentral tendency and the standard deviation as the measure of variability.\nIf <code>TRUE</code>, the median and the median absolute deviation (MAD)\nare applied instead.</p></dd>\n\n\n<dt id=\"arg-probs\">probs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-probs\"></a></dt>\n<dd><p>The percentiles to be computed by the quantile function.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Unused, included for generic consistency only.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> or <code>tibble</code> (see details) combining:</p><ul><li><p>The data supplied to <code><a href=\"mvgam.html\">mvgam()</a></code>.</p></li>\n<li><p>The outcome variable, named as <code>.observed</code>.</p></li>\n<li><p>The fitted backcasts, along with their variability and credible bounds.</p></li>\n<li><p>The residuals, along with their variability and credible bounds.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A <code>list</code> is returned if <code>class(x$obs_data) == 'list'</code>, otherwise a <code>tibble</code> is\nreturned, but the contents of either object is the same.</p>\n<p>The arguments <code>robust</code> and <code>probs</code> are applied to both the fit and\nresiduals calls (see <code><a href=\"fitted.mvgam.html\">fitted.mvgam()</a></code> and <code><a href=\"residuals.mvgam.html\">residuals.mvgam()</a></code> for details).</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"residuals.mvgam.html\">residuals.mvgam</a></code>, <code><a href=\"fitted.mvgam.html\">fitted.mvgam</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>T <span class=\"op\">=</span> <span class=\"fl\">80</span>,</span></span>\n<span class=\"r-in\"><span>                 n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                 mu <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>                 trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 prop_missing <span class=\"op\">=</span> <span class=\"fl\">0.1</span>,</span></span>\n<span class=\"r-in\"><span>                 prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>              chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c7eb7bd2.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://generics.r-lib.org/reference/augment.html\" class=\"external-link\">augment</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, robust <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.25</span>, <span class=\"fl\">0.75</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># A tibble: 180 × 14</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        y season  year series    time .observed .fitted .fit.variability</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>  <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>     <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span>            <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 1</span>     4      1     1 series_1     1         4    4.47             2.91</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 2</span>    <span style=\"color: #BB0000;\">NA</span>      1     1 series_2     1        <span style=\"color: #BB0000;\">NA</span>    6.00             3.72</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 3</span>     4      1     1 series_3     1         4    4.38             2.99</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 4</span>     5      2     1 series_1     2         5    4.59             2.89</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 5</span>     2      2     1 series_2     2         2    3.53             3.42</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 6</span>    <span style=\"color: #BB0000;\">NA</span>      2     1 series_3     2        <span style=\"color: #BB0000;\">NA</span>    4.46             3.69</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 7</span>     7      3     1 series_1     3         7    8.11             3.87</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 8</span>    12      3     1 series_2     3        12   11.2              5.49</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 9</span>     4      3     1 series_3     3         4    5.14             2.89</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\">10</span>    39      4     1 series_1     4        39   36.0             28.1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># ℹ 170 more rows</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># ℹ 6 more variables: .fit.cred.low &lt;dbl&gt;, .fit.cred.high &lt;dbl&gt;, .resid &lt;dbl&gt;,</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\">#   .resid.variability &lt;dbl&gt;, .resid.cred.low &lt;dbl&gt;, .resid.cred.high &lt;dbl&gt;</span></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/code.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Stan code and data objects for mvgam models — code • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Stan code and data objects for mvgam models — code\"><meta name=\"description\" content=\"Generate Stan code and data objects for mvgam models\"><meta property=\"og:description\" content=\"Generate Stan code and data objects for mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Stan code and data objects for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/stan_utils.R\" class=\"external-link\"><code>R/stan_utils.R</code></a></small>\n      <div class=\"d-none name\"><code>code.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Generate Stan code and data objects for <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">code</span><span class=\"op\">(</span><span class=\"va\">object</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_prefit'</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/stancode.html\" class=\"external-link\">stancode</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/stancode.html\" class=\"external-link\">stancode</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_prefit'</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/standata.html\" class=\"external-link\">standata</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>An object of class <code>mvgam</code> or <code>mvgam_prefit</code>,\nreturned from a call to <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>Either a character string containing the fully commented <span class=\"pkg\">Stan</span> code\nto fit a <span class=\"pkg\">mvgam</span> model or a named list containing the data objects needed\nto fit the model in Stan.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>               <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># View Stan model code</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/stancode.html\" class=\"external-link\">stancode</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S2; // mgcv smooth penalty matrix S2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S3; // mgcv smooth penalty matrix S3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S4; // mgcv smooth penalty matrix S4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : num_basis] = b_raw[1 : num_basis];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for (Intercept)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1] ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[2 : 10] ~ multi_normal_prec(zero[2 : 10],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     S1[1 : 9, 1 : 9] * lambda[1]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     + S1[1 : 9, 10 : 18] * lambda[2]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(time):seriesseries_1...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[11 : 19] ~ multi_normal_prec(zero[11 : 19],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      S2[1 : 9, 1 : 9] * lambda[3]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      + S2[1 : 9, 10 : 18] * lambda[4]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(time):seriesseries_2...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[20 : 28] ~ multi_normal_prec(zero[20 : 28],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      S3[1 : 9, 1 : 9] * lambda[5]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      + S3[1 : 9, 10 : 18] * lambda[6]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(time):seriesseries_3...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[29 : 37] ~ multi_normal_prec(zero[29 : 37],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      S4[1 : 9, 1 : 9] * lambda[7]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      + S4[1 : 9, 10 : 18] * lambda[8]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># View Stan model data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sdata</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/standata.html\" class=\"external-link\">standata</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">sdata</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 21</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ y           : num [1:75, 1:3] 1 0 0 1 1 2 0 0 1 3 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n           : int 75</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ X           : num [1:225, 1:37] 1 1 1 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : chr [1:37] \"X.Intercept.\" \"V2\" \"V3\" \"V4\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ S1          : num [1:9, 1:18] 3.819 0.796 1.727 -0.323 2.686 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ zero        : num [1:37] 0 0 0 0 0 0 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ S2          : num [1:9, 1:18] 8.555 -1.22 4.352 0.822 -5.594 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ S3          : num [1:9, 1:18] 8.555 -1.22 4.352 0.822 -5.594 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ S4          : num [1:9, 1:18] 8.555 -1.22 4.352 0.822 -5.594 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ p_coefs     : Named num 0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"names\")= chr \"(Intercept)\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ p_taus      : num 1.33</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ ytimes      : int [1:75, 1:3] 1 4 7 10 13 16 19 22 25 28 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n_series    : int 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ sp          : Named num [1:8] 0.368 0.368 0.368 0.368 0.368 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"names\")= chr [1:8] \"s(season)1\" \"s(season)2\" \"s(time):seriesseries_11\" \"s(time):seriesseries_12\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ y_observed  : num [1:75, 1:3] 1 1 1 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ total_obs   : int 225</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ num_basis   : int 37</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n_sp        : num 8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n_nonmissing: int 225</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ obs_ind     : int [1:225] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ flat_ys     : num [1:225] 1 0 0 1 1 2 0 0 1 3 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ flat_xs     : num [1:225, 1:37] 1 1 1 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : chr [1:37] \"X.Intercept.\" \"V2\" \"V3\" \"V4\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"trend_model\")= chr \"None\"</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/conditional_effects.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Display conditional effects of predictors for mvgam models — conditional_effects.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Display conditional effects of predictors for mvgam models — conditional_effects.mvgam\"><meta name=\"description\" content=\"Display conditional effects of one or more numeric and/or categorical\npredictors in models of class mvgam and jsdgam, including two-way interaction effects.\"><meta property=\"og:description\" content=\"Display conditional effects of one or more numeric and/or categorical\npredictors in models of class mvgam and jsdgam, including two-way interaction effects.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Display conditional effects of predictors for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/conditional_effects.R\" class=\"external-link\"><code>R/conditional_effects.R</code></a></small>\n      <div class=\"d-none name\"><code>conditional_effects.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Display conditional effects of one or more numeric and/or categorical\npredictors in models of class <code>mvgam</code> and <code>jsdgam</code>, including two-way interaction effects.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  effects <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  type <span class=\"op\">=</span> <span class=\"st\">\"response\"</span>,</span>\n<span>  points <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  rug <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_conditional_effects'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, plot <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, ask <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_conditional_effects'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/print.html\" class=\"external-link\">print</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>Object of class <code>mvgam</code>, <code>jsdgam</code> or <code>mvgam_conditional_effects</code></p></dd>\n\n\n<dt id=\"arg-effects\">effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-effects\"></a></dt>\n<dd><p>An optional character vector naming effects (main effects or\ninteractions) for which to compute conditional plots. Interactions are\nspecified by a <code>:</code> between variable names. If <code>NULL</code> (the\ndefault), plots are generated for all main effects and two-way interactions\nestimated in the model. When specifying <code>effects</code> manually, <em>all</em>\ntwo-way interactions (including grouping variables) may be plotted\neven if not originally modeled.</p></dd>\n\n\n<dt id=\"arg-type\">type<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-type\"></a></dt>\n<dd><p><code>character</code> specifying the scale of predictions.\nWhen this has the value <code>link</code> (default) the linear predictor is calculated on the link scale.\nIf <code>expected</code> is used, predictions reflect the expectation of the response (the mean)\nbut ignore uncertainty in the observation process. When <code>response</code> is used,\nthe predictions take uncertainty in the observation process into account to return\npredictions on the outcome scale. Two special cases are also allowed:\ntype <code>latent_N</code> will return the estimated latent abundances from an N-mixture distribution,\nwhile type <code>detection</code> will return the estimated detection probability from an N-mixture distribution</p></dd>\n\n\n<dt id=\"arg-points\">points<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-points\"></a></dt>\n<dd><p><code>Logical</code>. Indicates if the original data points should be added,\nbut only if <code>type == 'response'</code>. Default is <code>TRUE</code>.</p></dd>\n\n\n<dt id=\"arg-rug\">rug<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-rug\"></a></dt>\n<dd><p><code>Logical</code>. Indicates if displays tick marks should be plotted on the\naxes to mark the distribution of raw data, but only if <code>type == 'response'</code>.\nDefault is <code>TRUE</code>.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>other arguments to pass to <code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></code></p></dd>\n\n\n<dt id=\"arg-plot\">plot<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-plot\"></a></dt>\n<dd><p>Logical; indicates if plots should be\nplotted directly in the active graphic device.\nDefaults to <code>TRUE</code>.</p></dd>\n\n\n<dt id=\"arg-ask\">ask<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ask\"></a></dt>\n<dd><p><code>Logical</code>. Indicates if the user is prompted before a new page is plotted.\nOnly used if plot is <code>TRUE</code>. Default is <code>FALSE</code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>conditional_effects</code> returns an object of class\n<code>mvgam_conditional_effects</code> which is a\nnamed list with one slot per effect containing a <code><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></code> object,\nwhich can be further customized using the <span class=\"pkg\">ggplot2</span> package.\nThe corresponding <code>plot</code> method will draw these plots in the active graphic device</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>This function acts as a wrapper to the more\nflexible <code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></code>.\nWhen creating <code>conditional_effects</code> for a particular predictor\n(or interaction of two predictors), one has to choose the values of all\nother predictors to condition on. By default, the mean is used for\ncontinuous variables and the reference category is used for factors. Use\n<code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></code> to change these\nand create more bespoke conditional effects plots.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></code>, <code><a href=\"https://marginaleffects.com/man/r/plot_slopes.html\" class=\"external-link\">plot_slopes</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    seasonality <span class=\"op\">=</span> <span class=\"st\">'hierarchical'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span>, k <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"va\">year</span><span class=\"op\">:</span><span class=\"va\">series</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-16186d0b7d25.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                           </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 0.7 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 0.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 0.7 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 1.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot all main effects on the response scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Change the prediction interval to 70% using plot_predictions() argument</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># 'conf_level'</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, conf_level <span class=\"op\">=</span> <span class=\"fl\">0.7</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot all main effects on the link scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Works the same for smooth terms, including smooth interactions</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, n <span class=\"op\">=</span> <span class=\"fl\">200</span>, scale <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Gu &amp; Wahba 4 term additive model</span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">x0</span>, <span class=\"va\">x1</span>, k <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x2</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x3</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-16185a69130a.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                           </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 2.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 2.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 2.7 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 2.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, conf_level <span class=\"op\">=</span> <span class=\"fl\">0.5</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-10.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-11.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-12.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># ggplot objects can be modified and combined with the help of many</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># additional packages. Here is an example using the patchwork package</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some nonlinear data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, n <span class=\"op\">=</span> <span class=\"fl\">200</span>, scale <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Gu &amp; Wahba 4 term additive model</span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x1</span>, bs <span class=\"op\">=</span> <span class=\"st\">'moi'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>               <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">x0</span>, <span class=\"va\">x2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-1618244b33d7.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):      </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                                         \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract the list of ggplot conditional_effect plots</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">m</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span>, plot <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Add custom labels and arrange plots together using patchwork::wrap_plots()</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://patchwork.data-imaginist.com\" class=\"external-link\">patchwork</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘patchwork’ was built under R version 4.4.2</span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://ggplot2.tidyverse.org\" class=\"external-link\">ggplot2</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘ggplot2’ was built under R version 4.4.2</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://patchwork.data-imaginist.com/reference/wrap_plots.html\" class=\"external-link\">wrap_plots</a></span><span class=\"op\">(</span><span class=\"va\">m</span><span class=\"op\">[[</span><span class=\"fl\">1</span><span class=\"op\">]</span><span class=\"op\">]</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">labs</a></span><span class=\"op\">(</span>title <span class=\"op\">=</span> <span class=\"st\">'s(x1, bs = \"moi\")'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>           <span class=\"va\">m</span><span class=\"op\">[[</span><span class=\"fl\">2</span><span class=\"op\">]</span><span class=\"op\">]</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">labs</a></span><span class=\"op\">(</span>title <span class=\"op\">=</span> <span class=\"st\">'te(x0, x2)'</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"conditional_effects.mvgam-13.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/dynamic.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Defining dynamic coefficients in mvgam formulae — dynamic • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Defining dynamic coefficients in mvgam formulae — dynamic\"><meta name=\"description\" content=\"Set up time-varying (dynamic) coefficients for use in mvgam models. Currently, only\nlow-rank Gaussian Process smooths are available for estimating the dynamics of the\ntime-varying coefficient.\"><meta property=\"og:description\" content=\"Set up time-varying (dynamic) coefficients for use in mvgam models. Currently, only\nlow-rank Gaussian Process smooths are available for estimating the dynamics of the\ntime-varying coefficient.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Defining dynamic coefficients in <span class=\"pkg\">mvgam</span> formulae</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/dynamic.R\" class=\"external-link\"><code>R/dynamic.R</code></a></small>\n      <div class=\"d-none name\"><code>dynamic.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Set up time-varying (dynamic) coefficients for use in <span class=\"pkg\">mvgam</span> models. Currently, only\nlow-rank Gaussian Process smooths are available for estimating the dynamics of the\ntime-varying coefficient.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">dynamic</span><span class=\"op\">(</span><span class=\"va\">variable</span>, <span class=\"va\">k</span>, rho <span class=\"op\">=</span> <span class=\"fl\">5</span>, stationary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, scale <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-variable\">variable<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-variable\"></a></dt>\n<dd><p>The variable that the dynamic smooth will be a function of</p></dd>\n\n\n<dt id=\"arg-k\">k<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-k\"></a></dt>\n<dd><p>Optional number of basis functions for computing approximate GPs. If missing,\n<code>k</code> will be set as large as possible to accurately estimate the nonlinear function</p></dd>\n\n\n<dt id=\"arg-rho\">rho<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-rho\"></a></dt>\n<dd><p>Either a positive numeric stating the length scale to be used for approximating the\nsquared exponential Gaussian Process smooth (see <code><a href=\"https://rdrr.io/pkg/mgcv/man/smooth.construct.gp.smooth.spec.html\" class=\"external-link\">gp.smooth</a></code> for details)\nor missing, in which case the length scale will be estimated by setting up a Hilbert space approximate\nGP</p></dd>\n\n\n<dt id=\"arg-stationary\">stationary<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-stationary\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code> (the default) and <code>rho</code> is supplied,\nthe latent Gaussian Process smooth will not have a linear trend component. If <code>FALSE</code>,\na linear trend in the covariate is added to the Gaussian Process smooth. Leave at <code>TRUE</code>\nif you do not believe the coefficient is evolving with much trend, as the linear component of the\nbasis functions can be hard to penalize to zero. This sometimes causes divergence issues in <code>Stan</code>.\nSee <code><a href=\"https://rdrr.io/pkg/mgcv/man/smooth.construct.gp.smooth.spec.html\" class=\"external-link\">gp.smooth</a></code> for details. Ignored if <code>rho</code> is missing (in which case a\nHilbert space approximate GP is used)</p></dd>\n\n\n<dt id=\"arg-scale\">scale<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-scale\"></a></dt>\n<dd><p>Logical; If <code>TRUE</code> (the default) and <code>rho</code> is missing, predictors\nare scaled so that the maximum Euclidean distance between two points is <code>1</code>. This\noften improves sampling speed and convergence. Scaling also affects the estimated\nlength-scale parameters in that they resemble those of scaled predictors\n(not of the original predictors) if scale is <code>TRUE</code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>a <code>list</code> object for internal usage in 'mvgam'</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>mvgam</code> currently sets up dynamic coefficients as low-rank\nsquared exponential Gaussian Process smooths via\nthe call <code>s(time, by = variable, bs = \"gp\", m = c(2, rho, 2))</code>. These smooths, if specified with\nreasonable values for the length scale parameter, will give more realistic out of sample forecasts\nthan standard splines such as thin plate or cubic. But the user must set the\nvalue for <code>rho</code>, as there is currently no support for estimating this value in <code>mgcv</code>.\nThis may not be too big of a problem, as estimating latent length scales is often difficult anyway. The\n<code>rho</code> parameter should be thought of as a prior on the smoothness of the latent dynamic coefficient\nfunction (where higher values of <code>rho</code> lead to smoother functions with more temporal covariance structure.\nValues of <code>k</code> are\nset automatically to ensure enough basis functions are used to approximate the expected\nwiggliness of the underlying dynamic function (<code>k</code> will increase as <code>rho</code> decreases)</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate a time-varying coefficient</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># (as a Gaussian Process with length scale = 10)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">1111</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">N</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">200</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># A function to simulate from a squared exponential Gaussian Process</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim_gp</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">N</span>, <span class=\"va\">c</span>, <span class=\"va\">alpha</span>, <span class=\"va\">rho</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span> <span class=\"va\">Sigma</span> <span class=\"op\">&lt;-</span> <span class=\"va\">alpha</span> <span class=\"op\">^</span> <span class=\"fl\">2</span> <span class=\"op\">*</span></span></span>\n<span class=\"r-in\"><span>          <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">0.5</span> <span class=\"op\">*</span> <span class=\"op\">(</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/outer.html\" class=\"external-link\">outer</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"va\">N</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"va\">N</span>, <span class=\"st\">\"-\"</span><span class=\"op\">)</span> <span class=\"op\">/</span> <span class=\"va\">rho</span><span class=\"op\">)</span> <span class=\"op\">^</span> <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>          <span class=\"fu\"><a href=\"https://rdrr.io/r/base/diag.html\" class=\"external-link\">diag</a></span><span class=\"op\">(</span><span class=\"fl\">1e-9</span>, <span class=\"va\">N</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">c</span> <span class=\"op\">+</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/rmvn.html\" class=\"external-link\">rmvn</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>               mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"va\">N</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               V <span class=\"op\">=</span> <span class=\"va\">Sigma</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">beta</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">sim_gp</span><span class=\"op\">(</span>alpha <span class=\"op\">=</span> <span class=\"fl\">0.75</span>,</span></span>\n<span class=\"r-in\"><span>              rho <span class=\"op\">=</span> <span class=\"fl\">10</span>,</span></span>\n<span class=\"r-in\"><span>              c <span class=\"op\">=</span> <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>              N <span class=\"op\">=</span> <span class=\"va\">N</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">beta</span>, type <span class=\"op\">=</span> <span class=\"st\">'l'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>    bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>, xlab <span class=\"op\">=</span> <span class=\"st\">'Time'</span>,</span></span>\n<span class=\"r-in\"><span>    ylab <span class=\"op\">=</span> <span class=\"st\">'Coefficient'</span>,</span></span>\n<span class=\"r-in\"><span>    col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"dynamic-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate the predictor as a standard normal</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">predictor</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">N</span>, sd <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate a Gaussian outcome variable</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">out</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">N</span>, mean <span class=\"op\">=</span> <span class=\"fl\">4</span> <span class=\"op\">+</span> <span class=\"va\">beta</span> <span class=\"op\">*</span> <span class=\"va\">predictor</span>,</span></span>\n<span class=\"r-in\"><span>            sd <span class=\"op\">=</span> <span class=\"fl\">0.25</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">time</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq_along</a></span><span class=\"op\">(</span><span class=\"va\">predictor</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">out</span>,  type <span class=\"op\">=</span> <span class=\"st\">'l'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>    bty <span class=\"op\">=</span> <span class=\"st\">'l'</span>, xlab <span class=\"op\">=</span> <span class=\"st\">'Time'</span>, ylab <span class=\"op\">=</span> <span class=\"st\">'Outcome'</span>,</span></span>\n<span class=\"r-in\"><span>    col <span class=\"op\">=</span> <span class=\"st\">'darkred'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"dynamic-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Gather into a data.frame and fit a dynamic coefficient model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">out</span>, <span class=\"va\">predictor</span>, <span class=\"va\">time</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Split into training and testing</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data_train</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">190</span>,<span class=\"op\">]</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data_test</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data</span><span class=\"op\">[</span><span class=\"fl\">191</span><span class=\"op\">:</span><span class=\"fl\">200</span>,<span class=\"op\">]</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model using the dynamic function</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">out</span> <span class=\"op\">~</span></span></span>\n<span class=\"r-in\"><span>             <span class=\"co\"># mis-specify the length scale slightly as this</span></span></span>\n<span class=\"r-in\"><span>             <span class=\"co\"># won't be known in practice</span></span></span>\n<span class=\"r-in\"><span>             <span class=\"fu\">dynamic</span><span class=\"op\">(</span><span class=\"va\">predictor</span>, rho <span class=\"op\">=</span> <span class=\"fl\">8</span>, stationary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c3e562719.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 0.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 0.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 0.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 1.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect the summary</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> out ~ s(time, by = predictor, bs = \"gp\", m = c(-2, 8, 2), k = 27)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001d631e8b030&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gaussian</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> identity</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> None</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 190 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Observation error parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              2.5%  50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma_obs[1] 0.22 0.24  0.27    1   717</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                         2.5%    50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)           3.9000  4.000  4.000 1.00   789</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.1  -0.5100 -0.022  0.520 1.02   145</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.2   0.6200  0.660  0.710 1.01   501</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.3   0.1600  0.340  0.540 1.02   158</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.4  -0.3400 -0.290 -0.240 1.00   862</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.5   0.0130  0.130  0.250 1.02   150</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.6  -0.7200 -0.670 -0.620 1.00   851</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.7  -0.3600 -0.270 -0.170 1.01   182</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.8  -0.2300 -0.170 -0.120 1.00   835</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.9   0.1500  0.250  0.340 1.02   193</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.10 -0.1900 -0.130 -0.069 1.01   721</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.11  0.0120  0.100  0.200 1.01   232</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.12 -0.4300 -0.360 -0.280 1.00   884</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.13  0.0080  0.110  0.220 1.01   274</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.14 -0.2600 -0.160 -0.081 1.00   725</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.15 -0.0730  0.051  0.170 1.02   212</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.16  0.0095  0.130  0.230 1.00   669</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.17  0.0820  0.220  0.380 1.00   451</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.18 -0.0870  0.042  0.180 1.00   904</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.19  0.0150  0.200  0.380 1.00   591</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.20 -0.2400 -0.050  0.150 1.01   715</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.21 -0.1900  0.039  0.280 1.00   506</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.22 -0.4300 -0.180  0.120 1.00   788</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.23 -0.0550  0.260  0.560 1.00   689</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.24 -0.4200 -0.100  0.250 1.00   752</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.25 -0.2300  0.180  0.620 1.01   890</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.26 -0.7000 -0.230  0.220 1.00   825</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor.27 -0.1000  0.470  1.100 1.02   144</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                    edf Ref.df Chi.sq p-value    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):predictor 14.1     27    272  &lt;2e-16 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 19 11:28:07 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot the time-varying coefficient estimates</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooths'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"dynamic-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extrapolate the coefficient forward in time</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, smooth <span class=\"op\">=</span> <span class=\"fl\">1</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>v <span class=\"op\">=</span> <span class=\"fl\">190</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Overlay the true simulated time-varying coefficient</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">beta</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2.5</span>, col <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">beta</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"dynamic-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/ensemble.mvgam_forecast.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Combine forecasts from mvgam models into evenly weighted ensembles — ensemble.mvgam_forecast • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Combine forecasts from mvgam models into evenly weighted ensembles — ensemble.mvgam_forecast\"><meta name=\"description\" content=\"Generate evenly weighted ensemble forecast distributions from mvgam_forecast objects\"><meta property=\"og:description\" content=\"Generate evenly weighted ensemble forecast distributions from mvgam_forecast objects\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Combine forecasts from <span class=\"pkg\">mvgam</span> models into evenly weighted ensembles</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/ensemble.R\" class=\"external-link\"><code>R/ensemble.R</code></a></small>\n      <div class=\"d-none name\"><code>ensemble.mvgam_forecast.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Generate evenly weighted ensemble forecast distributions from <code>mvgam_forecast</code> objects</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">ensemble</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_forecast'</span></span>\n<span><span class=\"fu\">ensemble</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span>, ndraws <span class=\"op\">=</span> <span class=\"fl\">5000</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam_forecast</code>. See <code><a href=\"forecast.mvgam.html\">forecast.mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>More <code>mvgam_forecast</code> objects.</p></dd>\n\n\n<dt id=\"arg-ndraws\">ndraws<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ndraws\"></a></dt>\n<dd><p>Positive integer specifying the number of draws to use from each\nforecast distribution for creating the ensemble. If some of the ensemble members have\nfewer draws than <code>ndraws</code>, their forecast distributions will be resampled with replacement\nto achieve the correct number of draws</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>mvgam_forecast</code> containing the ensemble predictions. This\nobject can be readily used with the supplied S3 functions <code>plot</code> and <code>score</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>It is widely recognised in the forecasting literature that combining forecasts\nfrom different models often results in improved forecast accuracy. The simplest way to create\nan ensemble is to use evenly weighted combinations of forecasts from the different models.\nThis is straightforward to do in a Bayesian setting with <code>mvgam</code> as the posterior MCMC draws\ncontained in each <code>mvgam_forecast</code> object will already implicitly capture correlations among\nthe temporal posterior predictions.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"plot_mvgam_forecasts.html\">plot.mvgam_forecast</a></code>, <code><a href=\"score.mvgam_forecast.html\">score.mvgam_forecast</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some series and fit a few competing dynamic models</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span>,</span></span>\n<span class=\"r-in\"><span>                    mu <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>                 newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"ensemble.mvgam_forecast-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">m1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>            trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"va\">time</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">9</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c74e52e4c.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">m2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">time</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c1777634c.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Calculate forecast distributions for each model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">m1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">m2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Generate the ensemble forecast</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">ensemble_fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">ensemble</span><span class=\"op\">(</span><span class=\"va\">fc1</span>, <span class=\"va\">fc2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot forecasts</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 42.791261</span>\n<span class=\"r-plt img\"><img src=\"ensemble.mvgam_forecast-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 48.658331</span>\n<span class=\"r-plt img\"><img src=\"ensemble.mvgam_forecast-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">ensemble_fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 44.3088696</span>\n<span class=\"r-plt img\"><img src=\"ensemble.mvgam_forecast-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Score forecasts</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $series_1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       score in_interval interval_width eval_horizon score_type</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  3.433228           1            0.9            1       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  1.105110           1            0.9            2       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  1.995765           1            0.9            3       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  1.447371           1            0.9            4       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  0.977251           1            0.9            5       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  1.419407           1            0.9            6       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  2.022923           1            0.9            7       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  1.727456           1            0.9            8       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  1.147758           1            0.9            9       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1.200552           1            0.9           10       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 1.318235           1            0.9           11       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 1.700447           1            0.9           12       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 1.018621           1            0.9           13       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 0.988125           1            0.9           14       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 0.896207           1            0.9           15       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 1.007965           1            0.9           16       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 1.042871           1            0.9           17       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 4.183073           1            0.9           18       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 1.335348           1            0.9           19       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 2.246848           1            0.9           20       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 1.614939           1            0.9           21       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 1.568674           1            0.9           22       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 4.672876           1            0.9           23       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 1.362186           1            0.9           24       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 1.358025           1            0.9           25       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $all_series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       score eval_horizon score_type</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  3.433228            1   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  1.105110            2   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  1.995765            3   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  1.447371            4   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  0.977251            5   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  1.419407            6   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  2.022923            7   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  1.727456            8   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  1.147758            9   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1.200552           10   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 1.318235           11   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 1.700447           12   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 1.018621           13   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 0.988125           14   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 0.896207           15   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 1.007965           16   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 1.042871           17   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 4.183073           18   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 1.335348           19   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 2.246848           20   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 1.614939           21   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 1.568674           22   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 4.672876           23   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 1.362186           24   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 1.358025           25   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $series_1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       score in_interval interval_width eval_horizon score_type</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  4.171226           1            0.9            1       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  1.547056           1            0.9            2       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  3.124789           0            0.9            3       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  0.999647           1            0.9            4       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  2.435121           1            0.9            5       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  2.610246           1            0.9            6       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  1.928458           1            0.9            7       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  0.961976           1            0.9            8       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  1.625352           1            0.9            9       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1.302485           1            0.9           10       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 1.584327           1            0.9           11       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 1.754281           1            0.9           12       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 1.051481           1            0.9           13       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 1.081281           1            0.9           14       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 1.217669           1            0.9           15       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 1.177959           1            0.9           16       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 1.259938           1            0.9           17       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 2.725221           1            0.9           18       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 1.230060           1            0.9           19       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 3.820228           1            0.9           20       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 2.635251           1            0.9           21       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 1.648463           1            0.9           22       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 4.030445           1            0.9           23       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 1.360764           1            0.9           24       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 1.374607           1            0.9           25       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $all_series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       score eval_horizon score_type</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  4.171226            1   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  1.547056            2   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  3.124789            3   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  0.999647            4   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  2.435121            5   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  2.610246            6   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  1.928458            7   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  0.961976            8   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  1.625352            9   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1.302485           10   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 1.584327           11   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 1.754281           12   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 1.051481           13   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 1.081281           14   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 1.217669           15   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 1.177959           16   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 1.259938           17   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 2.725221           18   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 1.230060           19   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 3.820228           20   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 2.635251           21   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 1.648463           22   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 4.030445           23   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 1.360764           24   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 1.374607           25   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">ensemble_fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $series_1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        score in_interval interval_width eval_horizon score_type</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  3.8263402           1            0.9            1       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  1.3036929           1            0.9            2       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  2.5519035           1            0.9            3       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  1.0739452           1            0.9            4       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  1.6133805           1            0.9            5       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  1.9180633           1            0.9            6       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  1.9954492           1            0.9            7       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  1.2471014           1            0.9            8       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  1.2738834           1            0.9            9       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1.1792346           1            0.9           10       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 1.4541516           1            0.9           11       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 1.6823855           1            0.9           12       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 1.0212761           1            0.9           13       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 1.0489788           1            0.9           14       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 0.9839557           1            0.9           15       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 0.9631836           1            0.9           16       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 0.9966610           1            0.9           17       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 3.4294286           1            0.9           18       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 1.2707383           1            0.9           19       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 2.9218745           1            0.9           20       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 2.0465904           1            0.9           21       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 1.4433498           1            0.9           22       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 4.2497062           1            0.9           23       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 1.3876704           1            0.9           24       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 1.4259249           1            0.9           25       crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $all_series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        score eval_horizon score_type</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  3.8263402            1   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  1.3036929            2   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  2.5519035            3   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  1.0739452            4   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  1.6133805            5   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  1.9180633            6   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  1.9954492            7   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  1.2471014            8   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  1.2738834            9   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1.1792346           10   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 1.4541516           11   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 1.6823855           12   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 1.0212761           13   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 1.0489788           14   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 0.9839557           15   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 0.9631836           16   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 0.9966610           17   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 3.4294286           18   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 1.2707383           19   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 2.9218745           20   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 2.0465904           21   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 1.4433498           22   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 4.2497062           23   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 1.3876704           24   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 1.4259249           25   sum_crps</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/evaluate_mvgams.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Evaluate forecasts from fitted mvgam objects — evaluate_mvgams • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\"><meta name=\"description\" content=\"Evaluate forecasts from fitted mvgam objects\"><meta property=\"og:description\" content=\"Evaluate forecasts from fitted mvgam objects\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Evaluate forecasts from fitted <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/evaluate_mvgams.R\" class=\"external-link\"><code>R/evaluate_mvgams.R</code></a></small>\n      <div class=\"d-none name\"><code>evaluate_mvgams.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Evaluate forecasts from fitted <span class=\"pkg\">mvgam</span> objects</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">eval_mvgam</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  n_samples <span class=\"op\">=</span> <span class=\"fl\">5000</span>,</span>\n<span>  eval_timepoint <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span>\n<span>  fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  score <span class=\"op\">=</span> <span class=\"st\">\"drps\"</span>,</span>\n<span>  log <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">weights</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">roll_eval_mvgam</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  n_evaluations <span class=\"op\">=</span> <span class=\"fl\">5</span>,</span>\n<span>  <span class=\"va\">evaluation_seq</span>,</span>\n<span>  n_samples <span class=\"op\">=</span> <span class=\"fl\">5000</span>,</span>\n<span>  fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  score <span class=\"op\">=</span> <span class=\"st\">\"drps\"</span>,</span>\n<span>  log <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">weights</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">compare_mvgams</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">model1</span>,</span>\n<span>  <span class=\"va\">model2</span>,</span>\n<span>  n_samples <span class=\"op\">=</span> <span class=\"fl\">1000</span>,</span>\n<span>  fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span>\n<span>  n_evaluations <span class=\"op\">=</span> <span class=\"fl\">10</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  score <span class=\"op\">=</span> <span class=\"st\">\"drps\"</span>,</span>\n<span>  log <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">weights</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-n-samples\">n_samples<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-samples\"></a></dt>\n<dd><p><code>integer</code> specifying the number of samples to generate from the model's\nposterior distribution</p></dd>\n\n\n<dt id=\"arg-eval-timepoint\">eval_timepoint<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-eval-timepoint\"></a></dt>\n<dd><p><code>integer</code> indexing the timepoint that represents our last 'observed'\nset of outcome data</p></dd>\n\n\n<dt id=\"arg-fc-horizon\">fc_horizon<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fc-horizon\"></a></dt>\n<dd><p><code>integer</code> specifying the length of the forecast horizon for evaluating forecasts</p></dd>\n\n\n<dt id=\"arg-n-cores\">n_cores<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-cores\"></a></dt>\n<dd><p>Deprecated. Parallel processing is no longer supported</p></dd>\n\n\n<dt id=\"arg-score\">score<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-score\"></a></dt>\n<dd><p><code>character</code> specifying the type of ranked probability score to use for evaluation. Options are:\n<code>variogram</code>, <code>drps</code> or <code>crps</code></p></dd>\n\n\n<dt id=\"arg-log\">log<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-log\"></a></dt>\n<dd><p><code>logical</code>. Should the forecasts and truths be logged prior to scoring?\nThis is often appropriate for comparing\nperformance of models when series vary in their observation ranges</p></dd>\n\n\n<dt id=\"arg-weights\">weights<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-weights\"></a></dt>\n<dd><p>optional <code>vector</code> of weights (where <code>length(weights) == n_series</code>)\nfor weighting pairwise correlations when evaluating the variogram score for multivariate\nforecasts. Useful for down-weighting series that have larger magnitude observations or that\nare of less interest when forecasting. Ignored if <code>score != 'variogram'</code></p></dd>\n\n\n<dt id=\"arg-n-evaluations\">n_evaluations<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-evaluations\"></a></dt>\n<dd><p><code>integer</code> specifying the total number of evaluations to perform</p></dd>\n\n\n<dt id=\"arg-evaluation-seq\">evaluation_seq<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-evaluation-seq\"></a></dt>\n<dd><p>Optional <code>integer sequence</code> specifying the exact set of timepoints for\nevaluating the model's forecasts. This sequence cannot have values\n<code>&lt;3</code> or <code>&gt; max(training timepoints) - fc_horizon</code></p></dd>\n\n\n<dt id=\"arg-model-\">model1<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-model-\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code> representing the first model to be\nevaluated</p></dd>\n\n\n<dt id=\"arg-model-\">model2<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-model-\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code> representing the second model to be\nevaluated</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>For <code>eval_mvgam</code>, a <code>list</code> object containing information on specific evaluations for each series\n(if using <code>drps</code> or <code>crps</code> as the score) or a vector of scores when using <code>variogram</code>.</p>\n<p>For <code>roll_eval_mvgam</code>, a <code>list</code> object containing information on specific evaluations for each series as well as\na total evaluation summary (taken by summing the forecast score for each series at each evaluation and averaging\nthe coverages at each evaluation)</p>\n<p>For <code>compare_mvgams</code>, a series of plots comparing forecast Rank Probability Scores for each competing\nmodel. A lower score is preferred. Note however that it is possible to select a model that ultimately\nwould perform poorly in true out-of-sample forecasting. For example if a wiggly smooth function of 'year'\nis included in the model then this function will be learned prior to evaluating rolling window forecasts,\nand the model could generate very tight predictions as a result. But when forecasting ahead to timepoints\nthat the model has not seen (i.e. next year), the smooth function will end up extrapolating, sometimes\nin very strange and unexpected ways. It is therefore recommended to only use smooth functions for\ncovariates that are adequately measured in the data (i.e. 'seasonality', for example) to reduce possible\nextrapolation of smooths and let the latent trends in the <code>mvgam</code> model capture any\ntemporal dependencies in the data. These trends are time series models and so will provide much more\nstable forecasts</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>eval_mvgam</code> may be useful when both repeated fitting of a model using <code><a href=\"update.mvgam.html\">update.mvgam</a></code>\nfor exact leave-future-out cross-validation and approximate\nleave-future-out cross-validation using <code><a href=\"lfo_cv.mvgam.html\">lfo_cv</a></code> are impractical. The function generates a set of samples representing fixed parameters estimated from the full\n<code>mvgam</code> model and latent trend states at a given point in time. The trends are rolled forward\na total of <code>fc_horizon</code> timesteps according to their estimated state space dynamics to\ngenerate an 'out-of-sample' forecast that is evaluated against the true observations in the horizon window.\nThis function therefore simulates a situation where the model's parameters had already been estimated but\nwe have only observed data up to the evaluation timepoint and would like to generate forecasts from the\nlatent trends that have been observed up to that timepoint. Evaluation involves calculating an\nappropriate Rank Probability Score and a binary indicator\nfor whether or not the true value lies within the forecast's 90% prediction interval</p>\n<p><code>roll_eval_mvgam</code> sets up a sequence of evaluation timepoints along a rolling window and iteratively\ncalls <code>eval_mvgam</code> to evaluate 'out-of-sample' forecasts.\nEvaluation involves calculating the Rank Probability Scores and a binary indicator\nfor whether or not the true value lies within the forecast's 90% prediction interval</p>\n<p><code>compare_mvgams</code> automates the evaluation to compare two fitted models using rolling window forecast evaluation and\nprovides a series of summary plots to facilitate model selection. It is essentially a wrapper for\n<code>roll_eval_mvgam</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"forecast.mvgam.html\">forecast</a></code>, <code><a href=\"score.mvgam_forecast.html\">score</a></code>, <code><a href=\"lfo_cv.mvgam.html\">lfo_cv</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate from a Poisson-AR2 model with a seasonal smooth</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>T <span class=\"op\">=</span> <span class=\"fl\">75</span>,</span></span>\n<span class=\"r-in\"><span>                n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>                prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.75</span>,</span></span>\n<span class=\"r-in\"><span>                trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit an appropriate model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>                newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>                chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>                silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c18ee5221.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a less appropriate model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>               trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>               newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>               chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>               silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c440561df.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compare Discrete Ranked Probability Scores for the testing period</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod_ar2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod_rw</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">score_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_ar2</span>, score <span class=\"op\">=</span> <span class=\"st\">'drps'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">score_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_rw</span>, score <span class=\"op\">=</span> <span class=\"st\">'drps'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">score_ar2</span><span class=\"op\">$</span><span class=\"va\">series_1</span><span class=\"op\">$</span><span class=\"va\">score</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 19.81778</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">score_rw</span><span class=\"op\">$</span><span class=\"va\">series_1</span><span class=\"op\">$</span><span class=\"va\">score</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 145.5815</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Use rolling evaluation for approximate comparisons of 3-step ahead</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># forecasts across the training period</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">compare_mvgams</span><span class=\"op\">(</span><span class=\"va\">mod_ar2</span>,</span></span>\n<span class=\"r-in\"><span>              <span class=\"va\">mod_rw</span>,</span></span>\n<span class=\"r-in\"><span>              fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>              n_samples <span class=\"op\">=</span> <span class=\"fl\">1000</span>,</span></span>\n<span class=\"r-in\"><span>              n_evaluations <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> RPS summaries per model (lower is better)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             Min.  1st Qu.   Median     Mean  3rd Qu.     Max.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Model 1 0.990209 1.546376 2.102542 2.439294 3.163837 4.225131</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Model 2 1.883123 2.212336 2.541548 2.692843 3.097704 3.653859</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 90% interval coverages per model (closer to 0.9 is better)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Model 1 0.9333333 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Model 2 1</span>\n<span class=\"r-plt img\"><img src=\"evaluate_mvgams-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"evaluate_mvgams-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"evaluate_mvgams-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now use approximate leave-future-out CV to compare</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># rolling forecasts; start at time point 40 to reduce</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># computational time and to ensure enough data is available</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># for estimating model parameters</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"lfo_cv.mvgam.html\">lfo_cv</a></span><span class=\"op\">(</span><span class=\"va\">mod_ar2</span>,</span></span>\n<span class=\"r-in\"><span>                 min_t <span class=\"op\">=</span> <span class=\"fl\">40</span>,</span></span>\n<span class=\"r-in\"><span>                 fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                 silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c4eb121c4.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8cc7665f6.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"lfo_cv.mvgam.html\">lfo_cv</a></span><span class=\"op\">(</span><span class=\"va\">mod_rw</span>,</span></span>\n<span class=\"r-in\"><span>                min_t <span class=\"op\">=</span> <span class=\"fl\">40</span>,</span></span>\n<span class=\"r-in\"><span>                fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c3d242b0.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c52257764.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c4b652e6f.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot Pareto-K values and ELPD estimates</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">lfo_ar2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"evaluate_mvgams-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">lfo_rw</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"evaluate_mvgams-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Proportion of timepoints in which AR2 model gives</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># better forecasts</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"op\">(</span><span class=\"va\">lfo_ar2</span><span class=\"op\">$</span><span class=\"va\">elpds</span> <span class=\"op\">-</span> <span class=\"va\">lfo_rw</span><span class=\"op\">$</span><span class=\"va\">elpds</span><span class=\"op\">)</span> <span class=\"op\">&gt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">/</span></span></span>\n<span class=\"r-in\"><span>      <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">lfo_ar2</span><span class=\"op\">$</span><span class=\"va\">elpds</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 0.6923077</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># A higher total ELPD is preferred</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_ar2</span><span class=\"op\">$</span><span class=\"va\">sum_ELPD</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] -59.60248</span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_rw</span><span class=\"op\">$</span><span class=\"va\">sum_ELPD</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] -76.47689</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/fevd.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Calculate latent VAR forecast error variance decompositions — fevd.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Calculate latent VAR forecast error variance decompositions — fevd.mvgam\"><meta name=\"description\" content=\"Compute forecast error variance decompositions from\nmvgam models with Vector Autoregressive dynamics\"><meta property=\"og:description\" content=\"Compute forecast error variance decompositions from\nmvgam models with Vector Autoregressive dynamics\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Calculate latent VAR forecast error variance decompositions</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/fevd.mvgam.R\" class=\"external-link\"><code>R/fevd.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>fevd.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute forecast error variance decompositions from\n<code>mvgam</code> models with Vector Autoregressive dynamics</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">fevd</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">fevd</span><span class=\"op\">(</span><span class=\"va\">object</span>, h <span class=\"op\">=</span> <span class=\"fl\">1</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> resulting from a call to <code><a href=\"mvgam.html\">mvgam()</a></code>\nthat used a Vector Autoregressive latent process model (either as <code>VAR(cor = FALSE)</code> or\n<code>VAR(cor = TRUE)</code>)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n\n<dt id=\"arg-h\">h<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-h\"></a></dt>\n<dd><p>Positive <code>integer</code> specifying the forecast horizon over which to calculate\nthe IRF</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>mvgam_fevd</code> containing the posterior forecast error\nvariance decompositions. This\nobject can be used with the supplied S3 functions <code>plot</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A forecast error variance decomposition is useful for quantifying the amount\nof information each series that in a Vector Autoregression contributes to the forecast\ndistributions of the other series in the autoregression. This function calculates\nthe forecast error variance decomposition using the\northogonalised impulse response coefficient matrices \\(\\Psi_h\\), which can be used to\nquantify the contribution of series \\(j\\) to the\nh-step forecast error variance of series \\(k\\):\n$$\n\\sigma_k^2(h) = \\sum_{j=1}^K(\\psi_{kj, 0}^2 + \\ldots + \\psi_{kj,\nh-1}^2) \\quad\n$$\nIf the orthogonalised impulse reponses \\((\\psi_{kj, 0}^2 + \\ldots + \\psi_{kj, h-1}^2)\\)\nare divided by the variance of the forecast error \\(\\sigma_k^2(h)\\),\nthis yields an interpretable percentage representing how much of the\nforecast error variance for \\(k\\) can be explained by an exogenous shock to \\(j\\).</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Lütkepohl, H (2006).\nNew Introduction to Multiple Time Series Analysis. Springer, New York.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"RW.html\">VAR</a></code>, <code><a href=\"irf.mvgam.html\">irf</a></code>, <code><a href=\"stability.mvgam.html\">stability</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some time series that follow a latent VAR(1) process</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    n_series <span class=\"op\">=</span> <span class=\"fl\">4</span>,</span></span>\n<span class=\"r-in\"><span>                    trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"fevd.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model that uses a latent VAR(1)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>             trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c280a7c3f.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Calulate forecast error variance decompositions for each series</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fevds</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">fevd</span><span class=\"op\">(</span><span class=\"va\">mod</span>, h <span class=\"op\">=</span> <span class=\"fl\">12</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot median contributions to forecast error variance</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fevds</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"fevd.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/fitted.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Expected values of the posterior predictive distribution for mvgam objects — fitted.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Expected values of the posterior predictive distribution for mvgam objects — fitted.mvgam\"><meta name=\"description\" content=\"This method extracts posterior estimates of the fitted values\n(i.e. the actual predictions, included estimates for any trend states,\nthat were obtained when fitting the model). It also includes an option\nfor obtaining summaries of the computed draws.\"><meta property=\"og:description\" content=\"This method extracts posterior estimates of the fitted values\n(i.e. the actual predictions, included estimates for any trend states,\nthat were obtained when fitting the model). It also includes an option\nfor obtaining summaries of the computed draws.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Expected values of the posterior predictive distribution for <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/posterior_epred.mvgam.R\" class=\"external-link\"><code>R/posterior_epred.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>fitted.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This method extracts posterior estimates of the fitted values\n(i.e. the actual predictions, included estimates for any trend states,\nthat were obtained when fitting the model). It also includes an option\nfor obtaining summaries of the computed draws.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/fitted.values.html\" class=\"external-link\">fitted</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  process_error <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  scale <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"response\"</span>, <span class=\"st\">\"linear\"</span><span class=\"op\">)</span>,</span>\n<span>  summary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  robust <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.025</span>, <span class=\"fl\">0.975</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>An object of class <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-process-error\">process_error<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-process-error\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code> and a dynamic trend model was fit,\nexpected uncertainty in the process model is accounted for by using draws\nfrom the latent trend SD parameters. If <code>FALSE</code>, uncertainty in the latent trend\ncomponent is ignored when calculating predictions</p></dd>\n\n\n<dt id=\"arg-scale\">scale<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-scale\"></a></dt>\n<dd><p>Either <code>\"response\"</code> or <code>\"linear\"</code>.\nIf <code>\"response\"</code>, results are returned on the scale\nof the response variable. If <code>\"linear\"</code>,\nresults are returned on the scale of the linear predictor term,\nthat is without applying the inverse link function or\nother transformations.</p></dd>\n\n\n<dt id=\"arg-summary\">summary<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-summary\"></a></dt>\n<dd><p>Should summary statistics be returned\ninstead of the raw values? Default is <code>TRUE</code>..</p></dd>\n\n\n<dt id=\"arg-robust\">robust<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-robust\"></a></dt>\n<dd><p>If <code>FALSE</code> (the default) the mean is used as\nthe measure of central tendency and the standard deviation as\nthe measure of variability. If <code>TRUE</code>, the median and the\nmedian absolute deviation (MAD) are applied instead.\nOnly used if <code>summary</code> is <code>TRUE</code>.</p></dd>\n\n\n<dt id=\"arg-probs\">probs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-probs\"></a></dt>\n<dd><p>The percentiles to be computed by the <code>quantile</code>\nfunction. Only used if <code>summary</code> is <code>TRUE</code>.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Further arguments passed to <code><a href=\"https://paulbuerkner.com/brms/reference/prepare_predictions.html\" class=\"external-link\">prepare_predictions</a></code>\nthat control several aspects of data validation and prediction.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An <code>array</code> of predicted <em>mean</em> response values.\nIf <code>summary = FALSE</code> the output resembles those of\n<code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code> and <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code>.</p>\n<p>If <code>summary = TRUE</code> the output is an <code>n_observations</code> x <code>E</code>\nmatrix. The number of summary statistics <code>E</code> is equal to <code>2 +\n  length(probs)</code>: The <code>Estimate</code> column contains point estimates (either\nmean or median depending on argument <code>robust</code>), while the\n<code>Est.Error</code> column contains uncertainty estimates (either standard\ndeviation or median absolute deviation depending on argument\n<code>robust</code>). The remaining columns starting with <code>Q</code> contain\nquantile estimates as specified via argument <code>probs</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>This method gives the actual fitted values from the model (i.e. what you\nwill see if you generate hindcasts from the fitted model using <code><a href=\"hindcast.mvgam.html\">hindcast.mvgam</a></code>\nwith <code>type = 'expected'</code>). These\npredictions can be overly precise if a flexible dynamic trend component was included\nin the model. This is in contrast to the set of predict functions (i.e.\n<code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code> or <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code>), which will assume\nany dynamic trend component has reached stationarity when returning hypothetical predictions</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"hindcast.mvgam.html\">hindcast.mvgam</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data and fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c198135d6.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract fitted values (posterior expectations)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">expectations</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/fitted.values.html\" class=\"external-link\">fitted</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">expectations</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  num [1:75, 1:4] 0.264 0.254 0.467 0.498 1.066 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ : chr [1:4] \"Estimate\" \"Est.Error\" \"Q2.5\" \"Q97.5\"</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/forecast.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Extract or compute hindcasts and forecasts for a fitted mvgam object\"><title>Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\"><meta property=\"og:description\" content=\"Extract or compute hindcasts and forecasts for a fitted mvgam object\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract or compute hindcasts and forecasts for a fitted <code>mvgam</code> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/forecast.mvgam.R\" class=\"external-link\"><code>R/forecast.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>forecast.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Extract or compute hindcasts and forecasts for a fitted <code>mvgam</code> object</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">forecast</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for mvgam</span></span>\n<span><span class=\"fu\">forecast</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">newdata</span>, <span class=\"va\">data_test</span>, n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"response\"</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>object</dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> or <code>jsdgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt>...</dt>\n<dd><p>Ignored</p></dd>\n\n\n<dt>newdata</dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing the same variables\nthat were included in the original <code>data</code> used to fit the model. If included, the\ncovariate information in <code>newdata</code> will be used to generate forecasts from the fitted model equations. If\nthis same <code>newdata</code> was originally included in the call to <code>mvgam</code>, then forecasts have already been\nproduced by the generative model and these will simply be extracted and plotted. However if no <code>newdata</code> was\nsupplied to the original model call, an assumption is made that the <code>newdata</code> supplied here comes sequentially\nafter the data supplied in the original model (i.e. we assume there is no time gap between the last\nobservation of series 1 in the original data and the first observation for series 1 in <code>newdata</code>)</p></dd>\n\n\n<dt>data_test</dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt>n_cores</dt>\n<dd><p>Deprecated. Parallel processing is no longer supported</p></dd>\n\n\n<dt>type</dt>\n<dd><p>When this has the value <code>link</code> (default) the linear predictor is\ncalculated on the link scale.\nIf <code>expected</code> is used, predictions reflect the expectation of the response (the mean)\nbut ignore uncertainty in the observation process. When <code>response</code> is used,\nthe predictions take uncertainty in the observation process into account to return\npredictions on the outcome scale. When <code>variance</code> is used, the variance of the response\nwith respect to the mean (mean-variance relationship) is returned.\nWhen <code>type = \"terms\"</code>, each component of the linear predictor is\nreturned separately in the form of a <code>list</code> (possibly with standard\nerrors, if <code>summary = TRUE</code>): this includes parametric model components,\nfollowed by each smooth component, but excludes any offset and any intercept.\nTwo special cases are also allowed:\ntype <code>latent_N</code> will return the estimated latent abundances from an\nN-mixture distribution, while type <code>detection</code> will return the estimated\ndetection probability from an N-mixture distribution</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>An object of class <code>mvgam_forecast</code> containing hindcast and forecast distributions.\nSee <code><a href=\"mvgam_forecast-class.html\">mvgam_forecast-class</a></code> for details.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Posterior predictions are drawn from the fitted <code>mvgam</code> and used to simulate a forecast distribution</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"hindcast.mvgam.html\">hindcast</a></code>, <code><a href=\"score.mvgam_forecast.html\">score</a></code>, <code><a href=\"ensemble.mvgam_forecast.html\">ensemble</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Hindcasts on response scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"hindcast.mvgam.html\">hindcast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">hc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\", k = 6)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x000002e052d652a8&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"response\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : chr [1:3] \"series_1\" \"series_2\" \"series_3\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:75] 1 0 0 0 0 1 0 1 0 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:75] 5 1 0 0 0 0 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:75] 3 1 0 0 0 0 2 0 0 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:75] 2 1 4 0 1 2 2 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:75] 3 1 2 2 3 0 0 2 3 6 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,2]\" \"ypred[2,2]\" \"ypred[3,2]\" \"ypred[4,2]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:75] 2 0 1 1 0 5 1 2 3 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,3]\" \"ypred[2,3]\" \"ypred[3,3]\" \"ypred[4,3]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Forecasts on response scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">forecast</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>               newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 16</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\", k = 6)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x000002e052d652a8&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family_pars       : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"response\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : Factor w/ 3 levels \"series_1\",\"series_2\",..: 1 2 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:75] 1 0 0 0 0 1 0 1 0 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:75] 5 1 0 0 0 0 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:75] 3 1 0 0 0 0 2 0 0 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:25] 1 0 0 0 0 1 0 1 3 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:25] 0 2 0 1 1 0 1 1 2 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:25] 1 0 2 3 1 1 2 3 15 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:75] 2 1 4 0 1 2 2 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:75] 3 1 2 2 3 0 0 2 3 6 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,2]\" \"ypred[2,2]\" \"ypred[3,2]\" \"ypred[4,2]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:75] 2 0 1 1 0 5 1 2 3 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,3]\" \"ypred[2,3]\" \"ypred[3,3]\" \"ypred[4,3]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:1000, 1:25] 0 0 0 0 0 0 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:1000, 1:25] 1 1 0 0 0 0 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:1000, 1:25] 0 0 2 0 1 1 0 3 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 9.396333</span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 7.449717</span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 31.423124</span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Forecasts as expectations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">forecast</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>               newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>               type <span class=\"op\">=</span> <span class=\"st\">'expected'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Dynamic trend extrapolations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">forecast</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>               newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>               type <span class=\"op\">=</span> <span class=\"st\">'trend'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-10.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-11.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"forecast.mvgam-12.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/formula.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Extract formulae from mvgam objects — formula.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract formulae from mvgam objects — formula.mvgam\"><meta name=\"description\" content=\"Extract formulae from mvgam objects\"><meta property=\"og:description\" content=\"Extract formulae from mvgam objects\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract formulae from <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/formula.mvgam.R\" class=\"external-link\"><code>R/formula.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>formula.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Extract formulae from <span class=\"pkg\">mvgam</span> objects</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/formula.html\" class=\"external-link\">formula</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_prefit'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/formula.html\" class=\"external-link\">formula</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p><code>mvgam</code>, <code>jsdgam</code> or <code>mvgam_prefit</code> object</p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p><code>logical</code>, return the formula from the\nobservation model (if <code>FALSE</code>) or from the underlying process\nmodel (if<code>TRUE</code>)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>formula</code> object</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/get_monitor_pars.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Return parameters to monitor during modelling\"><title>Return parameters to monitor during modelling — get_monitor_pars • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Return parameters to monitor during modelling — get_monitor_pars\"><meta property=\"og:description\" content=\"Return parameters to monitor during modelling\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.0.91</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Return parameters to monitor during modelling</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/get_monitor_pars.R\" class=\"external-link\"><code>R/get_monitor_pars.R</code></a></small>\n      <div class=\"d-none name\"><code>get_monitor_pars.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Return parameters to monitor during modelling</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">get_monitor_pars</span><span class=\"op\">(</span><span class=\"va\">family</span>, smooths_included <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">use_lv</span>, <span class=\"va\">trend_model</span>, <span class=\"va\">drift</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>family</dt>\n<dd><p><code>character</code></p></dd>\n\n\n<dt>smooths_included</dt>\n<dd><p>Logical. Are smooth terms included in the model formula?</p></dd>\n\n\n<dt>use_lv</dt>\n<dd><p>Logical (use latent variable trends or not)</p></dd>\n\n\n<dt>trend_model</dt>\n<dd><p>The type of trend model used</p></dd>\n\n\n<dt>drift</dt>\n<dd><p>Logical (was a drift term estimated or not)</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>A string of parameters to monitor</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/get_mvgam_priors.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Extract information on default prior distributions for an mvgam model — get_mvgam_priors • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\"><meta name=\"description\" content=\"This function lists the parameters that can have their prior distributions\nchanged for a given model, as well listing their default distributions\"><meta property=\"og:description\" content=\"This function lists the parameters that can have their prior distributions\nchanged for a given model, as well listing their default distributions\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract information on default prior distributions for an <span class=\"pkg\">mvgam</span> model</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/get_mvgam_priors.R\" class=\"external-link\"><code>R/get_mvgam_priors.R</code></a></small>\n      <div class=\"d-none name\"><code>get_mvgam_priors.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function lists the parameters that can have their prior distributions\nchanged for a given model, as well listing their default distributions</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">get_mvgam_priors</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">formula</span>,</span>\n<span>  <span class=\"va\">trend_formula</span>,</span>\n<span>  <span class=\"va\">factor_formula</span>,</span>\n<span>  <span class=\"va\">knots</span>,</span>\n<span>  <span class=\"va\">trend_knots</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"st\">\"None\"</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"va\">data</span>,</span>\n<span>  unit <span class=\"op\">=</span> <span class=\"va\">time</span>,</span>\n<span>  species <span class=\"op\">=</span> <span class=\"va\">series</span>,</span>\n<span>  use_lv <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">n_lv</span>,</span>\n<span>  <span class=\"va\">trend_map</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-formula\">formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-formula\"></a></dt>\n<dd><p>A <code>formula</code> object specifying the GAM observation model\nformula. These are exactly like the formula\nfor a GLM except that smooth terms, <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/t2.html\" class=\"external-link\">t2()</a></code>, as well\nas time-varying <code><a href=\"dynamic.html\">dynamic()</a></code> terms, nonparametric <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> terms and offsets using <code><a href=\"https://rdrr.io/r/stats/offset.html\" class=\"external-link\">offset()</a></code>,\ncan be added to the right hand side to specify that the linear predictor\ndepends on smooth functions of predictors (or linear functionals of these).\nIn <code><a href=\"mvgam_families.html\">nmix()</a></code> family models, the <code>formula</code> is used to set up a linear predictor\nfor the detection probability. Details of the formula\nsyntax used by <span class=\"pkg\">mvgam</span> can be found in <code><a href=\"mvgam_formulae.html\">mvgam_formulae</a></code></p></dd>\n\n\n<dt id=\"arg-trend-formula\">trend_formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-formula\"></a></dt>\n<dd><p>An optional <code>formula</code> object specifying the GAM\nprocess model formula. If\nsupplied, a linear predictor will be modelled for the latent trends to capture\nprocess model evolution\nseparately from the observation model. Should not have a response variable\nspecified on the left-hand side\nof the formula (i.e. a valid option would be <code>~ season + s(year)</code>). Also note\nthat you should not use\nthe identifier <code>series</code> in this formula to specify effects that vary across\ntime series. Instead you should use\n<code>trend</code>. This will ensure that models in which a <code>trend_map</code> is supplied will\nstill work consistently\n(i.e. by allowing effects to vary across process models, even when some time\nseries share the same underlying\nprocess model). This feature is only currently available for <code><a href=\"RW.html\">RW()</a></code>, <code><a href=\"RW.html\">AR()</a></code>\nand <code><a href=\"RW.html\">VAR()</a></code> trend models.\nIn <code><a href=\"mvgam_families.html\">nmix()</a></code> family models, the <code>trend_formula</code> is used to set up a linear\npredictor for the underlying\nlatent abundance. Be aware that it can be very challenging to simultaneously\nestimate intercept parameters\nfor both the observation mode (captured by <code>formula</code>) and the process model\n(captured by <code>trend_formula</code>).\nUsers are recommended to drop one of these using the <code>- 1</code> convention in the\nformula right hand side.</p></dd>\n\n\n<dt id=\"arg-factor-formula\">factor_formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-factor-formula\"></a></dt>\n<dd><p>Can be supplied instead <code>trend_formula</code> to match syntax from\n<a href=\"jsdgam.html\">jsdgam</a></p></dd>\n\n\n<dt id=\"arg-knots\">knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-knots\"></a></dt>\n<dd><p>An optional <code>list</code> containing user specified knot values to\nbe used for basis construction.\nFor most bases the user simply supplies the knots to be used, which must match\nup with the <code>k</code> value supplied\n(note that the number of knots is not always just <code>k</code>). Different terms can\nuse different numbers of knots,\nunless they share a covariate</p></dd>\n\n\n<dt id=\"arg-trend-knots\">trend_knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-knots\"></a></dt>\n<dd><p>As for <code>knots</code> above, this is an optional <code>list</code> of\nknot values for smooth\nfunctions within the <code>trend_formula</code></p></dd>\n\n\n<dt id=\"arg-trend-model\">trend_model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-model\"></a></dt>\n<dd><p><code>character</code> or  <code>function</code> specifying the time\nseries dynamics for the latent trend. Options are:</p><ul><li><p><code>None</code> (no latent trend component; i.e. the GAM component is all that\ncontributes to the linear predictor, and the observation process is the only\nsource of error; similarly to what is estimated by <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code>)</p></li>\n<li><p><code>ZMVN</code> or <code><a href=\"ZMVN.html\">ZMVN()</a></code> (Zero-Mean Multivariate Normal; only available in\n<code>Stan</code>)</p></li>\n<li><p><code>'RW'</code> or <code><a href=\"RW.html\">RW()</a></code></p></li>\n<li><p><code>'AR1'</code> or <code>AR(p = 1)</code></p></li>\n<li><p><code>'AR2'</code> or <code>AR(p = 2)</code></p></li>\n<li><p><code>'AR3'</code> or <code>AR(p = 3)</code></p></li>\n<li><p><code>'CAR1'</code> or <code>CAR(p = 1)</code></p></li>\n<li><p><code>'VAR1'</code>  or <code><a href=\"RW.html\">VAR()</a></code>(only available in <code>Stan</code>)</p></li>\n<li><p><code>'PWlogistic</code>, <code>'PWlinear'</code> or <code><a href=\"piecewise_trends.html\">PW()</a></code> (only available in <code>Stan</code>)</p></li>\n<li><p><code>'GP'</code> or <code><a href=\"GP.html\">GP()</a></code> (Gaussian Process with squared exponential kernel;\nonly available in <code>Stan</code>)</p></li>\n</ul><p>For all trend types apart from <code><a href=\"ZMVN.html\">ZMVN()</a></code>, <code><a href=\"GP.html\">GP()</a></code>, <code><a href=\"RW.html\">CAR()</a></code> and <code><a href=\"piecewise_trends.html\">PW()</a></code>, moving\naverage and/or correlated process error terms can also be estimated (for\nexample, <code>RW(cor = TRUE)</code> will set up a multivariate Random Walk if <code>n_series &gt; 1</code>).\nIt is also possible for many multivariate trends to estimate hierarchical\ncorrelations if the data are structured among levels of a relevant grouping\nfactor. See <a href=\"mvgam_trends.html\">mvgam_trends</a> for more details and see <a href=\"ZMVN.html\">ZMVN</a> for an example.</p></dd>\n\n\n<dt id=\"arg-family\">family<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-family\"></a></dt>\n<dd><p><code>family</code> specifying the exponential observation family for\nthe series. Currently supported\nfamilies are:</p><ul><li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">betar()</a></code> for proportional data on <code>(0,1)</code></p></li>\n<li><p><code><a href=\"mvgam_families.html\">lognormal()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">student_t()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">bernoulli()</a></code> for binary data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code> for count data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">nb()</a></code> for overdispersed count data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> for count data with imperfect detection when the number\nof trials is known;\nnote that the <code><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind()</a></code> function must be used to bind the discrete\nobservations and the discrete number\nof trials</p></li>\n<li><p><code><a href=\"mvgam_families.html\">beta_binomial()</a></code> as for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> but allows for overdispersion</p></li>\n<li><p><code><a href=\"mvgam_families.html\">nmix()</a></code> for count data with imperfect detection when the number of\ntrials is unknown and should be modeled via a State-Space N-Mixture model.\nThe latent states are Poisson, capturing the 'true' latent\nabundance, while the observation process is Binomial to account for\nimperfect detection.\nSee <code><a href=\"mvgam_families.html\">mvgam_families</a></code> for an example of how to use this family</p></li>\n</ul><p>Default is <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code>.\nSee <code><a href=\"mvgam_families.html\">mvgam_families</a></code> for more details</p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> containing the model response\nvariable and covariates\nrequired by the GAM <code>formula</code> and optional <code>trend_formula</code>. Most\nmodels should include columns:</p><ul><li><p><code>series</code> (a <code>factor</code> index of the series IDs; the number of\nlevels should be identical\nto the number of unique series labels (i.e. <code>n_series = length(levels(data$series))</code>))</p></li>\n<li><p><code>time</code> (<code>numeric</code> or <code>integer</code> index of the time point for\neach observation).\nFor most dynamic trend types available in <code>mvgam</code> (see argument <code>trend_model</code>),\ntime should be\nmeasured in discrete, regularly spaced intervals (i.e. <code>c(1, 2, 3, ...)</code>).\nHowever you can\nuse irregularly spaced intervals if using <code>trend_model = CAR(1)</code>, though\nnote that any\ntemporal intervals that are exactly <code>0</code> will be adjusted to a very small number\n(<code>1e-12</code>) to prevent sampling errors. See an example of <code><a href=\"RW.html\">CAR()</a></code> trends in\n<code><a href=\"RW.html\">CAR</a></code></p></li>\n</ul><p>Note however that there are special cases where these identifiers are not\nneeded. For\nexample, models with hierarchical temporal correlation processes (e.g.\n<code>AR(gr = region, subgr = species)</code>)\nshould NOT include a <code>series</code> identifier, as this will be constructed\ninternally (see\n<code><a href=\"mvgam_trends.html\">mvgam_trends</a></code> and <code><a href=\"RW.html\">AR</a></code> for details). <code>mvgam</code> can also\nfit models that do not\ninclude a <code>time</code> variable if there are no temporal dynamic structures included\n(i.e. <code>trend_model = 'None'</code> or\n<code>trend_model = ZMVN()</code>). <code>data</code> should also include any other variables to be\nincluded in\nthe linear predictor of <code>formula</code></p></dd>\n\n\n<dt id=\"arg-unit\">unit<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-unit\"></a></dt>\n<dd><p>The unquoted name of the variable that represents the unit of analysis in <code>data</code> over\nwhich latent residuals should be correlated. This variable should be either a\n<code>numeric</code> or <code>integer</code> variable in the supplied <code>data</code>.\nDefaults to <code>time</code> to be consistent with other functionalities\nin <span class=\"pkg\">mvgam</span>, though note that the data need not be time series in this case. See examples below\nfor further details and explanations</p></dd>\n\n\n<dt id=\"arg-species\">species<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-species\"></a></dt>\n<dd><p>The unquoted name of the <code>factor</code> variable that indexes\nthe different response units in <code>data</code> (usually <code>'species'</code> in a JSDM).\nDefaults to <code>series</code> to be consistent with other <code>mvgam</code> models</p></dd>\n\n\n<dt id=\"arg-use-lv\">use_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-use-lv\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, use dynamic factors to estimate series'\nlatent trends in a reduced dimension format. Only available for\n<code><a href=\"RW.html\">RW()</a></code>, <code><a href=\"RW.html\">AR()</a></code> and <code><a href=\"GP.html\">GP()</a></code> trend models. Defaults to <code>FALSE</code></p></dd>\n\n\n<dt id=\"arg-n-lv\">n_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-lv\"></a></dt>\n<dd><p><code>integer</code> the number of latent dynamic factors to use if\n<code>use_lv == TRUE</code>. Cannot be <code>&gt; n_series</code>. Defaults arbitrarily to\n<code>min(2, floor(n_series / 2))</code></p></dd>\n\n\n<dt id=\"arg-trend-map\">trend_map<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-map\"></a></dt>\n<dd><p>Optional <code>data.frame</code> specifying which series should depend\non which latent trends. Useful for allowing multiple series to depend on the\nsame latent trend process, but with different observation processes. If\nsupplied, a latent factor model is set up by setting <code>use_lv = TRUE</code> and\nusing the mapping to set up the shared trends. Needs to have column names\n<code>series</code> and <code>trend</code>, with integer values in the <code>trend</code> column to state which\ntrend each series should depend on. The <code>series</code> column should have a single\nunique entry for each series in the data (names should perfectly match factor\nlevels of the <code>series</code> variable in <code>data</code>). Note that if this is supplied,\nthe intercept parameter in the process model will NOT be automatically suppressed.\nNot yet supported for models in wich the latent factors evolve in continuous time (<code><a href=\"RW.html\">CAR()</a></code>).\nSee examples for details</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Not currently used</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>either a <code>data.frame</code> containing the prior definitions (if any suitable\npriors can be altered by the user) or <code>NULL</code>, indicating that no priors in the model\ncan be modified through the <code>mvgam</code> interface</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Users can supply a model formula, prior to fitting the model, so that default priors can be inspected and\naltered. To make alterations, change the contents of the <code>prior</code> column and supplying this\n<code>data.frame</code> to the <code>mvgam</code> function using the argument <code>priors</code>. If using <code>Stan</code> as the backend,\nusers can also modify the parameter bounds by modifying the <code>new_lowerbound</code> and/or <code>new_upperbound</code> columns.\nThis will be necessary if using restrictive distributions on some parameters, such as a Beta distribution\nfor the trend sd parameters for example (Beta only has support on  <code>(0,1)</code>), so the upperbound cannot\nbe above <code>1</code>. Another option is to make use of the prior modification functions in <code>brms</code>\n(i.e. <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></code>) to change prior distributions and bounds (just use the name of the parameter that\nyou'd like to change as the <code>class</code> argument; see examples below)</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"note\">Note<a class=\"anchor\" aria-label=\"anchor\" href=\"#note\"></a></h2>\n    <p>Only the <code>prior</code>, <code>new_lowerbound</code> and/or <code>new_upperbound</code> columns of the output\nshould be altered when defining the user-defined priors for the <code>mvgam</code> model. Use only if you are\nfamiliar with the underlying probabilistic programming language. There are no sanity checks done to\nensure that the code is legal (i.e. to check that lower bounds are smaller than upper bounds, for\nexample)</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"mvgam.html\">mvgam</a></code>, <code><a href=\"mvgam_formulae.html\">mvgam_formulae</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate three integer-valued time series</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://github.com/nicholasjclark/mvgam\" class=\"external-link\">mvgam</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>trend_rel <span class=\"op\">=</span> <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Get a model file that uses default mvgam priors for inspection (not always necessary,</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># but this can be useful for testing whether your updated priors are written correctly)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_default</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">nb</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect the model file with default mvgam priors</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod_default</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> functions {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector rep_each(vector x, int K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int N = rows(x);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[N * K] y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int pos = 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     for (n in 1 : N) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       for (k in 1 : K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         y[pos] = x[n];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         pos += 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     return y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[1] sigma_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[1] mu_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // negative binomial overdispersion</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] phi_inv;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR2 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar2;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : 8] = b_raw[1 : 8];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma_raw ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   mu_raw ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior (non-centred) for s(series)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[9 : 11] ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar2 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for overdispersion parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi_inv ~ student_t(3, 0, 0.1);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // trend estimates</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[1, 1 : n_series] ~ normal(0, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     array[n_nonmissing] real flat_phis;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                  * append_row(b, 1.0)),</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              inv(flat_phis));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] tau;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] phi_vec;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] phi;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi = inv(phi_inv);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     phi_vec[1 : n, s] = rep_vector(phi[s], n);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     tau[s] = pow(sigma[s], -2.0);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Look at which priors can be updated in mvgam</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">test_priors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">get_mvgam_priors</span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>                              <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>                              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">nb</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                              data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>                              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">test_priors</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                param_name param_length</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1           vector&lt;lower=0&gt;[n_sp] lambda;            2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2                       vector[1] mu_raw;            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3           vector&lt;lower=0&gt;[1] sigma_raw;            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4 vector&lt;lower=-1,upper=1&gt;[n_series] ar1;            3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5 vector&lt;lower=-1,upper=1&gt;[n_series] ar2;            3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6        vector&lt;lower=0&gt;[n_series] sigma;            3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7      vector&lt;lower=0&gt;[n_series] phi_inv;            3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                    param_info                             prior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 s(season) smooth parameters           lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2          s(series) pop mean            mu_raw ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3            s(series) pop sd sigma_raw ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4       trend AR1 coefficient               ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5       trend AR2 coefficient               ar2 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6                    trend sd     sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7   inverse of NB dispsersion   phi_inv ~ student_t(3, 0, 0.1);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                  example_change new_lowerbound new_upperbound</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1   lambda ~ exponential(0.78);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  mu_raw ~ normal(0.08, 0.87);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3 sigma_raw ~ exponential(0.5);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4      ar1 ~ normal(0.17, 0.9);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5    ar2 ~ normal(-0.21, 0.98);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6    sigma ~ exponential(0.11);             NA             NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7 phi_inv ~ normal(-0.98, 0.7);             NA             NA</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Make a few changes; first, change the population mean for the series-level</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># random intercepts</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">test_priors</span><span class=\"op\">$</span><span class=\"va\">prior</span><span class=\"op\">[</span><span class=\"fl\">2</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"st\">'mu_raw ~ normal(0.2, 0.5);'</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now use stronger regularisation for the series-level AR2 coefficients</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">test_priors</span><span class=\"op\">$</span><span class=\"va\">prior</span><span class=\"op\">[</span><span class=\"fl\">5</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"st\">'ar2 ~ normal(0, 0.25);'</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Check that the changes are made to the model file without any warnings by</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># setting 'run_model = FALSE'</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>            <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">nb</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            priors <span class=\"op\">=</span> <span class=\"va\">test_priors</span>,</span></span>\n<span class=\"r-in\"><span>            run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> functions {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector rep_each(vector x, int K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int N = rows(x);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[N * K] y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int pos = 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     for (n in 1 : N) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       for (k in 1 : K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         y[pos] = x[n];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         pos += 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     return y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[1] sigma_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[1] mu_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // negative binomial overdispersion</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] phi_inv;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR2 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar2;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : 8] = b_raw[1 : 8];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma_raw ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   mu_raw ~ normal(0.2, 0.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior (non-centred) for s(series)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[9 : 11] ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar2 ~ normal(0, 0.25);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for overdispersion parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi_inv ~ student_t(3, 0, 0.1);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // trend estimates</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[1, 1 : n_series] ~ normal(0, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     array[n_nonmissing] real flat_phis;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                  * append_row(b, 1.0)),</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              inv(flat_phis));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] tau;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] phi_vec;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] phi;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi = inv(phi_inv);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     phi_vec[1 : n, s] = rep_vector(phi[s], n);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     tau[s] = pow(sigma[s], -2.0);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># No warnings, the model is ready for fitting now in the usual way with the addition</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># of the 'priors' argument</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The same can be done using 'brms' functions; here we will also change the ar1 prior</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and put some bounds on the ar coefficients to enforce stationarity; we set the</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># prior using the 'class' argument in all brms prior functions</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">brmsprior</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0.2</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">mu_raw</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">0.25</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">ar1</span>, lb <span class=\"op\">=</span> <span class=\"op\">-</span><span class=\"fl\">1</span>, ub <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">0.25</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">ar2</span>, lb <span class=\"op\">=</span> <span class=\"op\">-</span><span class=\"fl\">1</span>, ub <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">brmsprior</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             prior  class coef group resp dpar nlpar   lb   ub source</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  normal(0.2, 0.5) mu_raw                            &lt;NA&gt; &lt;NA&gt;   user</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   normal(0, 0.25)    ar1                              -1    1   user</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   normal(0, 0.25)    ar2                              -1    1   user</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>            <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>          family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">nb</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>          data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>          trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>          priors <span class=\"op\">=</span> <span class=\"va\">brmsprior</span>,</span></span>\n<span class=\"r-in\"><span>          run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> functions {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector rep_each(vector x, int K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int N = rows(x);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[N * K] y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int pos = 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     for (n in 1 : N) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       for (k in 1 : K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         y[pos] = x[n];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         pos += 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     return y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[1] sigma_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[1] mu_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // negative binomial overdispersion</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] phi_inv;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR2 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar2;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : 8] = b_raw[1 : 8];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma_raw ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   mu_raw ~ normal(0.2, 0.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior (non-centred) for s(series)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[9 : 11] ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ normal(0, 0.25);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar2 ~ normal(0, 0.25);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for overdispersion parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi_inv ~ student_t(3, 0, 0.1);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // trend estimates</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[1, 1 : n_series] ~ normal(0, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     array[n_nonmissing] real flat_phis;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                  * append_row(b, 1.0)),</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              inv(flat_phis));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] tau;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] phi_vec;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] phi;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi = inv(phi_inv);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     phi_vec[1 : n, s] = rep_vector(phi[s], n);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     tau[s] = pow(sigma[s], -2.0);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Look at what is returned when an incorrect spelling is used</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">test_priors</span><span class=\"op\">$</span><span class=\"va\">prior</span><span class=\"op\">[</span><span class=\"fl\">5</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"st\">'ar2_bananas ~ normal(0, 0.25);'</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>            <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">nb</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            priors <span class=\"op\">=</span> <span class=\"va\">test_priors</span>,</span></span>\n<span class=\"r-in\"><span>            run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>no match found in model_file for parameter: ar2_bananas</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> functions {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector rep_each(vector x, int K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int N = rows(x);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[N * K] y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int pos = 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     for (n in 1 : N) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       for (k in 1 : K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         y[pos] = x[n];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         pos += 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     return y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[1] sigma_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[1] mu_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // negative binomial overdispersion</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] phi_inv;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR2 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar2;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : 8] = b_raw[1 : 8];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma_raw ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   mu_raw ~ normal(0.2, 0.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior (non-centred) for s(series)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[9 : 11] ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar2 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for overdispersion parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi_inv ~ student_t(3, 0, 0.1);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // trend estimates</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[1, 1 : n_series] ~ normal(0, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     array[n_nonmissing] real flat_phis;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                  * append_row(b, 1.0)),</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                              inv(flat_phis));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] tau;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] phi_vec;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] phi;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   phi = inv(phi_inv);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     phi_vec[1 : n, s] = rep_vector(phi[s], n);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     tau[s] = pow(sigma[s], -2.0);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example of changing parametric (fixed effect) priors</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Add a fake covariate</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">cov</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">priors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">get_mvgam_priors</span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">cov</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                          data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>                          family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                          trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Change priors for the intercept and fake covariate effects</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">priors</span><span class=\"op\">$</span><span class=\"va\">prior</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"st\">'(Intercept) ~ normal(0, 1);'</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">priors</span><span class=\"op\">$</span><span class=\"va\">prior</span><span class=\"op\">[</span><span class=\"fl\">2</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"st\">'cov ~ normal(0, 0.1);'</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">cov</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             priors <span class=\"op\">=</span> <span class=\"va\">priors</span>,</span></span>\n<span class=\"r-in\"><span>             run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : num_basis] = b_raw[1 : num_basis];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for (Intercept)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1] ~ normal(0, 1);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for cov...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[2] ~ normal(0, 0.1);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[3 : 11] ~ multi_normal_prec(zero[3 : 11],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     S1[1 : 9, 1 : 9] * lambda[1]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     + S1[1 : 9, 10 : 18] * lambda[2]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // trend estimates</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[1, 1 : n_series] ~ normal(0, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                               append_row(b, 1.0));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] tau;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     tau[s] = pow(sigma[s], -2.0);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Likewise using 'brms' utilities (note that you can use</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Intercept rather than `(Intercept)`) to change priors on the intercept</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">brmsprior</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0.2</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">cov</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">0.25</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">Intercept</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">brmsprior</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             prior     class coef group resp dpar nlpar   lb   ub source</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  normal(0.2, 0.5)       cov                            &lt;NA&gt; &lt;NA&gt;   user</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   normal(0, 0.25) Intercept                            &lt;NA&gt; &lt;NA&gt;   user</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">cov</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             priors <span class=\"op\">=</span> <span class=\"va\">brmsprior</span>,</span></span>\n<span class=\"r-in\"><span>             run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : num_basis] = b_raw[1 : num_basis];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for (Intercept)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1] ~ normal(0, 0.25);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for cov...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[2] ~ normal(0.2, 0.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[3 : 11] ~ multi_normal_prec(zero[3 : 11],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     S1[1 : 9, 1 : 9] * lambda[1]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     + S1[1 : 9, 10 : 18] * lambda[2]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // trend estimates</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend[1, 1 : n_series] ~ normal(0, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                               append_row(b, 1.0));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] tau;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     tau[s] = pow(sigma[s], -2.0);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The \"class = 'b'\" shortcut can be used to put the same prior on all</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># 'fixed' effect coefficients (apart from any intercepts)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, n <span class=\"op\">=</span> <span class=\"fl\">200</span>, scale <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Gu &amp; Wahba 4 term additive model</span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">time</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">dat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">x0</span> <span class=\"op\">+</span> <span class=\"va\">x1</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x2</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x3</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">0.75</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"st\">'b'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> functions {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector rep_each(vector x, int K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int N = rows(x);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[N * K] y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     int pos = 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     for (n in 1 : N) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       for (k in 1 : K) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         y[pos] = x[n];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         pos += 1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     return y;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[9, 18] S2; // mgcv smooth penalty matrix S2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_nonmissing] flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // gaussian observation error</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma_obs;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : num_basis] = b_raw[1 : num_basis];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for (Intercept)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1] ~ student_t(3, 7.4, 3.7);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for x0...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[2] ~ normal(0, 0.75);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for x1...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[3] ~ normal(0, 0.75);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(x2)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[4 : 12] ~ multi_normal_prec(zero[4 : 12],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     S1[1 : 9, 1 : 9] * lambda[1]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                     + S1[1 : 9, 10 : 18] * lambda[2]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(x3)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[13 : 21] ~ multi_normal_prec(zero[13 : 21],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      S2[1 : 9, 1 : 9] * lambda[3]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      + S2[1 : 9, 10 : 18] * lambda[4]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for observation error parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma_obs ~ student_t(3, 0, 3.7);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_sigma_obs;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ normal_id_glm(flat_xs, 0.0, b, flat_sigma_obs);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] sigma_obs_vec;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] real ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     sigma_obs_vec[1 : n, s] = rep_vector(sigma_obs[s], n);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = normal_rng(mus[1 : n, s], sigma_obs_vec[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/gratia_mvgam_enhancements.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Enhance post-processing of mvgam models using gratia functionality — gratia_mvgam_enhancements • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Enhance post-processing of mvgam models using gratia functionality — gratia_mvgam_enhancements\"><meta name=\"description\" content=\"These evaluation and plotting functions exist to allow some popular gratia\nmethods to work with mvgam or jsdgam models\"><meta property=\"og:description\" content=\"These evaluation and plotting functions exist to allow some popular gratia\nmethods to work with mvgam or jsdgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Enhance post-processing of <span class=\"pkg\">mvgam</span> models using <span class=\"pkg\">gratia</span> functionality</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/gratia_methods.R\" class=\"external-link\"><code>R/gratia_methods.R</code></a></small>\n      <div class=\"d-none name\"><code>gratia_mvgam_enhancements.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>These evaluation and plotting functions exist to allow some popular <code>gratia</code>\nmethods to work with <code>mvgam</code> or <code>jsdgam</code> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">drawDotmvgam</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  select <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  parametric <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  terms <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  residuals <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  scales <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"free\"</span>, <span class=\"st\">\"fixed\"</span><span class=\"op\">)</span>,</span>\n<span>  ci_level <span class=\"op\">=</span> <span class=\"fl\">0.95</span>,</span>\n<span>  n <span class=\"op\">=</span> <span class=\"fl\">100</span>,</span>\n<span>  n_3d <span class=\"op\">=</span> <span class=\"fl\">16</span>,</span>\n<span>  n_4d <span class=\"op\">=</span> <span class=\"fl\">4</span>,</span>\n<span>  unconditional <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  overall_uncertainty <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  constant <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  fun <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  dist <span class=\"op\">=</span> <span class=\"fl\">0.1</span>,</span>\n<span>  rug <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  contour <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  grouped_by <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  ci_alpha <span class=\"op\">=</span> <span class=\"fl\">0.2</span>,</span>\n<span>  ci_col <span class=\"op\">=</span> <span class=\"st\">\"black\"</span>,</span>\n<span>  smooth_col <span class=\"op\">=</span> <span class=\"st\">\"black\"</span>,</span>\n<span>  resid_col <span class=\"op\">=</span> <span class=\"st\">\"steelblue3\"</span>,</span>\n<span>  contour_col <span class=\"op\">=</span> <span class=\"st\">\"black\"</span>,</span>\n<span>  n_contour <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  partial_match <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  discrete_colour <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  discrete_fill <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  continuous_colour <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  continuous_fill <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  position <span class=\"op\">=</span> <span class=\"st\">\"identity\"</span>,</span>\n<span>  angle <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  ncol <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  nrow <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  guides <span class=\"op\">=</span> <span class=\"st\">\"keep\"</span>,</span>\n<span>  widths <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  heights <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  crs <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  default_crs <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  lims_method <span class=\"op\">=</span> <span class=\"st\">\"cross\"</span>,</span>\n<span>  wrap <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  envir <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/environment.html\" class=\"external-link\">environment</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/formula.html\" class=\"external-link\">formula</a></span><span class=\"op\">(</span><span class=\"va\">object</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">eval_smoothDothilbertDotsmooth</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">smooth</span>,</span>\n<span>  <span class=\"va\">model</span>,</span>\n<span>  n <span class=\"op\">=</span> <span class=\"fl\">100</span>,</span>\n<span>  n_3d <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  n_4d <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  unconditional <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  overall_uncertainty <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  dist <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">eval_smoothDotmodDotsmooth</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">smooth</span>,</span>\n<span>  <span class=\"va\">model</span>,</span>\n<span>  n <span class=\"op\">=</span> <span class=\"fl\">100</span>,</span>\n<span>  n_3d <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  n_4d <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  unconditional <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  overall_uncertainty <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  dist <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">eval_smoothDotmoiDotsmooth</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">smooth</span>,</span>\n<span>  <span class=\"va\">model</span>,</span>\n<span>  n <span class=\"op\">=</span> <span class=\"fl\">100</span>,</span>\n<span>  n_3d <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  n_4d <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  data <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  unconditional <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  overall_uncertainty <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  dist <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>a fitted mvgam, the result of a call to <code><a href=\"mvgam.html\">mvgam()</a></code>.</p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p>logical specifying whether smooth terms from the <code>trend_formula</code> should\nbe drawn. If <code>FALSE</code>, only terms from the observation formula are drawn. If <code>TRUE</code>, only\nterms from the <code>trend_formula</code> are drawn.</p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>a data frame of covariate values at which to evaluate the\nmodel's smooth functions.</p></dd>\n\n\n<dt id=\"arg-select\">select<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-select\"></a></dt>\n<dd><p>character, logical, or numeric; which smooths to plot. If\n<code>NULL</code>, the default, then all model smooths are drawn.\nCharacter <code>select</code> matches the labels for smooths\nas shown for example in the output from <code>summary(object)</code>. Logical\n<code>select</code> operates as per numeric <code>select</code> in the order that smooths are\nstored.</p></dd>\n\n\n<dt id=\"arg-parametric\">parametric<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-parametric\"></a></dt>\n<dd><p>logical; plot parametric terms also? Note that <code>select</code> is\nused for selecting which smooths to plot. The <code>terms</code> argument is used to\nselect which parametric effects are plotted. The default, as with\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/plot.gam.html\" class=\"external-link\">mgcv::plot.gam()</a></code>, is to not draw parametric effects.</p></dd>\n\n\n<dt id=\"arg-terms\">terms<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-terms\"></a></dt>\n<dd><p>character; which model parametric terms should be drawn? The\nDefault of <code>NULL</code> will plot all parametric terms that can be drawn.</p></dd>\n\n\n<dt id=\"arg-residuals\">residuals<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-residuals\"></a></dt>\n<dd><p>currently ignored for <code>mvgam</code> models.</p></dd>\n\n\n<dt id=\"arg-scales\">scales<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-scales\"></a></dt>\n<dd><p>character; should all univariate smooths be plotted with the\nsame y-axis scale? If <code>scales = \"free\"</code>, the default, each univariate\nsmooth has its own y-axis scale. If <code>scales = \"fixed\"</code>, a common y axis\nscale is used for all univariate smooths.</p>\n<p>Currently does not affect the y-axis scale of plots of the parametric\nterms.</p></dd>\n\n\n<dt id=\"arg-ci-level\">ci_level<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ci-level\"></a></dt>\n<dd><p>numeric between 0 and 1; the coverage of credible interval.</p></dd>\n\n\n<dt id=\"arg-n\">n<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n\"></a></dt>\n<dd><p>numeric; the number of points over the range of the covariate at\nwhich to evaluate the smooth.</p></dd>\n\n\n<dt id=\"arg-n-d-n-d\">n_3d, n_4d<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-d-n-d\"></a></dt>\n<dd><p>numeric; the number of points over the range of last\ncovariate in a 3D or 4D smooth. The default is <code>NULL</code> which achieves the\nstandard behaviour of using <code>n</code> points over the range of all covariate,\nresulting in <code>n^d</code> evaluation points, where <code>d</code> is the dimension of the\nsmooth. For <code>d &gt; 2</code> this can result in very many evaluation points and slow\nperformance. For smooths of <code>d &gt; 4</code>, the value of <code>n_4d</code> will be used for\nall dimensions <code>&gt; 4</code>, unless this is <code>NULL</code>, in which case the default\nbehaviour (using <code>n</code> for all dimensions) will be observed.</p></dd>\n\n\n<dt id=\"arg-unconditional\">unconditional<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-unconditional\"></a></dt>\n<dd><p>ignored for <code>mvgam</code> models as all appropriate\nuncertainties are already included in the posterior estimates.</p></dd>\n\n\n<dt id=\"arg-overall-uncertainty\">overall_uncertainty<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-overall-uncertainty\"></a></dt>\n<dd><p>ignored for <code>mvgam</code> models as all appropriate\nuncertainties are already included in the posterior estimates.</p></dd>\n\n\n<dt id=\"arg-constant\">constant<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-constant\"></a></dt>\n<dd><p>numeric; a constant to add to the estimated values of the\nsmooth. <code>constant</code>, if supplied, will be added to the estimated value\nbefore the confidence band is computed.</p></dd>\n\n\n<dt id=\"arg-fun\">fun<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fun\"></a></dt>\n<dd><p>function; a function that will be applied to the estimated values\nand confidence interval before plotting. Can be a function or the name of a\nfunction. Function <code>fun</code> will be applied after adding any <code>constant</code>, if\nprovided.</p></dd>\n\n\n<dt id=\"arg-dist\">dist<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-dist\"></a></dt>\n<dd><p>numeric; if greater than 0, this is used to determine when\na location is too far from data to be plotted when plotting 2-D smooths.\nThe data are scaled into the unit square before deciding what to exclude,\nand <code>dist</code> is a distance within the unit square. See\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/exclude.too.far.html\" class=\"external-link\">mgcv::exclude.too.far()</a></code> for further details.</p></dd>\n\n\n<dt id=\"arg-rug\">rug<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-rug\"></a></dt>\n<dd><p>logical; draw a rug plot at the bottom of each plot for 1-D\nsmooths or plot locations of data for higher dimensions.</p></dd>\n\n\n<dt id=\"arg-contour\">contour<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-contour\"></a></dt>\n<dd><p>logical; should contours be draw on the plot using\n<code><a href=\"https://ggplot2.tidyverse.org/reference/geom_contour.html\" class=\"external-link\">ggplot2::geom_contour()</a></code>.</p></dd>\n\n\n<dt id=\"arg-grouped-by\">grouped_by<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-grouped-by\"></a></dt>\n<dd><p>logical; should factor by smooths be drawn as one panel\nper level of the factor (<code>FALSE</code>, the default), or should the individual\nsmooths be combined into a single panel containing all levels (<code>TRUE</code>)?</p></dd>\n\n\n<dt id=\"arg-ci-alpha\">ci_alpha<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ci-alpha\"></a></dt>\n<dd><p>numeric; alpha transparency for confidence or simultaneous\ninterval.</p></dd>\n\n\n<dt id=\"arg-ci-col\">ci_col<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ci-col\"></a></dt>\n<dd><p>colour specification for the confidence/credible intervals\nband. Affects the fill of the interval.</p></dd>\n\n\n<dt id=\"arg-smooth-col\">smooth_col<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-smooth-col\"></a></dt>\n<dd><p>colour specification for the smooth line.</p></dd>\n\n\n<dt id=\"arg-resid-col\">resid_col<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-resid-col\"></a></dt>\n<dd><p>colour specification for residual points. Ignored.</p></dd>\n\n\n<dt id=\"arg-contour-col\">contour_col<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-contour-col\"></a></dt>\n<dd><p>colour specification for contour lines.</p></dd>\n\n\n<dt id=\"arg-n-contour\">n_contour<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-contour\"></a></dt>\n<dd><p>numeric; the number of contour bins. Will result in\n<code>n_contour - 1</code> contour lines being drawn. See <code><a href=\"https://ggplot2.tidyverse.org/reference/geom_contour.html\" class=\"external-link\">ggplot2::geom_contour()</a></code>.</p></dd>\n\n\n<dt id=\"arg-partial-match\">partial_match<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-partial-match\"></a></dt>\n<dd><p>logical; should smooths be selected by partial matches\nwith <code>select</code>? If <code>TRUE</code>, <code>select</code> can only be a single string to match\nagainst.</p></dd>\n\n\n<dt id=\"arg-discrete-colour\">discrete_colour<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-discrete-colour\"></a></dt>\n<dd><p>a suitable colour scale to be used when plotting\ndiscrete variables.</p></dd>\n\n\n<dt id=\"arg-discrete-fill\">discrete_fill<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-discrete-fill\"></a></dt>\n<dd><p>a suitable fill scale to be used when plotting\ndiscrete variables.</p></dd>\n\n\n<dt id=\"arg-continuous-colour\">continuous_colour<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-continuous-colour\"></a></dt>\n<dd><p>a suitable colour scale to be used when plotting\ncontinuous variables.</p></dd>\n\n\n<dt id=\"arg-continuous-fill\">continuous_fill<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-continuous-fill\"></a></dt>\n<dd><p>a suitable fill scale to be used when plotting\ncontinuous variables.</p></dd>\n\n\n<dt id=\"arg-position\">position<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-position\"></a></dt>\n<dd><p>Position adjustment, either as a string, or the result of a\ncall to a position adjustment function.</p></dd>\n\n\n<dt id=\"arg-angle\">angle<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-angle\"></a></dt>\n<dd><p>numeric; the angle at which the x axis tick labels are to be\ndrawn passed to the <code>angle</code> argument of <code><a href=\"https://ggplot2.tidyverse.org/reference/guide_axis.html\" class=\"external-link\">ggplot2::guide_axis()</a></code>.</p></dd>\n\n\n<dt id=\"arg-ncol-nrow\">ncol, nrow<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ncol-nrow\"></a></dt>\n<dd><p>numeric; the numbers of rows and columns over which to\nspread the plots</p></dd>\n\n\n<dt id=\"arg-guides\">guides<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-guides\"></a></dt>\n<dd><p>character; one of <code>\"keep\"</code> (the default), <code>\"collect\"</code>, or\n<code>\"auto\"</code>. Passed to <code><a href=\"https://patchwork.data-imaginist.com/reference/plot_layout.html\" class=\"external-link\">patchwork::plot_layout()</a></code></p></dd>\n\n\n<dt id=\"arg-widths-heights\">widths, heights<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-widths-heights\"></a></dt>\n<dd><p>The relative widths and heights of each column and\nrow in the grid. Will get repeated to match the dimensions of the grid. If\nthere is more than 1 plot and <code>widths = NULL</code>, the value of <code>widths</code> will\nbe set internally to <code>widths = 1</code> to accommodate plots of smooths that\nuse a fixed aspect ratio.</p></dd>\n\n\n<dt id=\"arg-crs\">crs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-crs\"></a></dt>\n<dd><p>the coordinate reference system (CRS) to use for the plot. All\ndata will be projected into this CRS. See <code><a href=\"https://ggplot2.tidyverse.org/reference/ggsf.html\" class=\"external-link\">ggplot2::coord_sf()</a></code> for\ndetails.</p></dd>\n\n\n<dt id=\"arg-default-crs\">default_crs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-default-crs\"></a></dt>\n<dd><p>the coordinate reference system (CRS) to use for the\nnon-sf layers in the plot. If left at the default <code>NULL</code>, the CRS used is\n4326 (WGS84), which is appropriate for spline-on-the-sphere smooths, which\nare parameterized in terms of latitude and longitude as coordinates. See\n<code><a href=\"https://ggplot2.tidyverse.org/reference/ggsf.html\" class=\"external-link\">ggplot2::coord_sf()</a></code> for more details.</p></dd>\n\n\n<dt id=\"arg-lims-method\">lims_method<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-lims-method\"></a></dt>\n<dd><p>character; affects how the axis limits are determined. See\n<code><a href=\"https://ggplot2.tidyverse.org/reference/ggsf.html\" class=\"external-link\">ggplot2::coord_sf()</a></code>. Be careful; in testing of some examples, changing\nthis to <code>\"orthogonal\"</code> for example with the chlorophyll-a example from\nSimon Wood's GAM book quickly used up all the RAM in my test system and the\nOS killed R. This could be incorrect usage on my part; right now the grid\nof points at which SOS smooths are evaluated (if not supplied by the user)\ncan produce invalid coordinates for the corners of tiles as the grid is\ngenerated for tile centres without respect to the spacing of those tiles.</p></dd>\n\n\n<dt id=\"arg-wrap\">wrap<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-wrap\"></a></dt>\n<dd><p>logical; wrap plots as a patchwork? If <code>FALSE</code>, a list of\nggplot objects is returned, 1 per term plotted.</p></dd>\n\n\n<dt id=\"arg-envir\">envir<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-envir\"></a></dt>\n<dd><p>an environment to look up the data within.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>additional arguments passed to other methods.</p></dd>\n\n\n<dt id=\"arg-smooth\">smooth<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-smooth\"></a></dt>\n<dd><p>a smooth object of class <code>\"gp.smooth\"</code> (returned from a model using either the\n<code><a href=\"dynamic.html\">dynamic()</a></code> function or the <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> function) or of class <code>\"moi.smooth\"</code> or <code>\"mod.smooth\"</code>\n(returned from a model using the 'moi' or 'mod' basis).</p></dd>\n\n\n<dt id=\"arg-model\">model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-model\"></a></dt>\n<dd><p>a fitted <code>mgcv</code> model of clas <code>gam</code> or <code>bam</code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>These methods allow <code>mvgam</code> models to be <em>Enhanced</em> if users have the <code>gratia</code>\npackage installed, making available the popular <code><a href=\"https://gavinsimpson.github.io/gratia/reference/draw.html\" class=\"external-link\">draw()</a></code> function to plot partial effects\nof <code>mvgam</code> smooth functions using <code><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot2::ggplot()</a></code> utilities</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a simple GAM and draw partial effects of smooths using gratia</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, n <span class=\"op\">=</span> <span class=\"fl\">200</span>, scale <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Gu &amp; Wahba 4 term additive model</span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x1</span>, bs <span class=\"op\">=</span> <span class=\"st\">'moi'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">x0</span>, <span class=\"va\">x2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c4cff7578.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">if</span><span class=\"op\">(</span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">require</a></span><span class=\"op\">(</span><span class=\"st\"><a href=\"https://gavinsimpson.github.io/gratia/\" class=\"external-link\">\"gratia\"</a></span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span> <span class=\"fu\">gratia</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://gavinsimpson.github.io/gratia/reference/draw.html\" class=\"external-link\">draw</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Loading required package: gratia</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘gratia’ was built under R version 4.3.3</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Attaching package: ‘gratia’</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> The following object is masked from ‘package:mvgam’:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     add_residuals</span>\n<span class=\"r-plt img\"><img src=\"gratia_mvgam_enhancements-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/hindcast.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Extract hindcasts for a fitted mvgam object\"><title>Extract hindcasts for a fitted mvgam object — hindcast.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\"><meta property=\"og:description\" content=\"Extract hindcasts for a fitted mvgam object\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract hindcasts for a fitted <code>mvgam</code> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/hindcast.mvgam.R\" class=\"external-link\"><code>R/hindcast.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>hindcast.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Extract hindcasts for a fitted <code>mvgam</code> object</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">hindcast</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for mvgam</span></span>\n<span><span class=\"fu\">hindcast</span><span class=\"op\">(</span><span class=\"va\">object</span>, type <span class=\"op\">=</span> <span class=\"st\">\"response\"</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>object</dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> or <code>jsdgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt>...</dt>\n<dd><p>Ignored</p></dd>\n\n\n<dt>type</dt>\n<dd><p>When this has the value <code>link</code> (default) the linear predictor is\ncalculated on the link scale.\nIf <code>expected</code> is used, predictions reflect the expectation of the response (the mean)\nbut ignore uncertainty in the observation process. When <code>response</code> is used,\nthe predictions take uncertainty in the observation process into account to return\npredictions on the outcome scale. When <code>variance</code> is used, the variance of the response\nwith respect to the mean (mean-variance relationship) is returned.\nWhen <code>type = \"terms\"</code>, each component of the linear predictor is\nreturned separately in the form of a <code>list</code> (possibly with standard\nerrors, if <code>summary = TRUE</code>): this includes parametric model components,\nfollowed by each smooth component, but excludes any offset and any intercept.\nTwo special cases are also allowed:\ntype <code>latent_N</code> will return the estimated latent abundances from an\nN-mixture distribution, while type <code>detection</code> will return the estimated\ndetection probability from an N-mixture distribution</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>An object of class <code>mvgam_forecast</code> containing hindcast distributions.\nSee <code><a href=\"mvgam_forecast-class.html\">mvgam_forecast-class</a></code> for details.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Posterior retrodictions are drawn from the fitted <code>mvgam</code> and\norganized into a convenient format</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Hindcasts on response scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">hindcast</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">hc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\")</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x000002e05bda8280&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"response\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : chr [1:3] \"series_1\" \"series_2\" \"series_3\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:75] 10 3 2 1 0 0 1 2 1 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:75] 0 0 0 2 0 1 1 0 0 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:75] 6 0 2 0 0 0 0 2 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:75] 9 5 3 10 9 11 7 5 14 9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:75] 4 1 1 3 3 4 7 0 5 4 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,2]\" \"ypred[2,2]\" \"ypred[3,2]\" \"ypred[4,2]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:75] 4 3 1 5 3 1 2 1 2 4 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,3]\" \"ypred[2,3]\" \"ypred[3,3]\" \"ypred[4,3]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Hindcasts as expectations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">hindcast</span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'expected'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">hc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\")</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x000002e05bda8280&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"expected\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : chr [1:3] \"series_1\" \"series_2\" \"series_3\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:75] 10 3 2 1 0 0 1 2 1 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:75] 0 0 0 2 0 1 1 0 0 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:75] 6 0 2 0 0 0 0 2 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:75] 6.61 5.21 3.68 7.64 6.25 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:75] 1.93 1.59 3.11 2.15 3.29 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:75] 6.29 2.44 3.93 4.99 2.72 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Estimated latent trends</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">hindcast</span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">hc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\")</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x000002e05bda8280&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : chr [1:3] \"series_1\" \"series_2\" \"series_3\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:75] 10 3 2 1 0 0 1 2 1 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:75] 0 0 0 2 0 1 1 0 0 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:75] 6 0 2 0 0 0 0 2 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:75] 0.641 0.5 0.232 0.923 0.622 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"trend[1,1]\" \"trend[2,1]\" \"trend[3,1]\" \"trend[4,1]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:75] -0.5912 -0.6872 0.0625 -0.3461 -0.0187 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"trend[1,2]\" \"trend[2,2]\" \"trend[3,2]\" \"trend[4,2]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:75] 0.591 -0.26 0.298 0.497 -0.212 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"trend[1,3]\" \"trend[2,3]\" \"trend[3,3]\" \"trend[4,3]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"hindcast.mvgam-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/how_to_cite.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Generate a methods description for mvgam models — how_to_cite.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Generate a methods description for mvgam models — how_to_cite.mvgam\"><meta name=\"description\" content=\"Create a brief but fully referenced methods description, along with a useful list of references,\nfor fitted mvgam and jsdgam models\"><meta property=\"og:description\" content=\"Create a brief but fully referenced methods description, along with a useful list of references,\nfor fitted mvgam and jsdgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Generate a methods description for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/how_to_cite.R\" class=\"external-link\"><code>R/how_to_cite.R</code></a></small>\n      <div class=\"d-none name\"><code>how_to_cite.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Create a brief but fully referenced methods description, along with a useful list of references,\nfor fitted <code>mvgam</code> and <code>jsdgam</code> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">how_to_cite</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">how_to_cite</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> resulting from a call to <code><a href=\"mvgam.html\">mvgam()</a></code>\nor <code><a href=\"jsdgam.html\">jsdgam()</a></code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>how_to_cite</code> containing a text description of the\nmethods as well as lists of both primary and additional references</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>This function uses the model's structure to come up with a very basic\nbut hopefully useful methods description that can help users to appropriately acknowledge\nthe hard work of developers and champion open science. Please do not consider the\ntext returned by this function to be a completely adequate methods section, it is only\nmeant to get you started.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"https://rdrr.io/r/utils/citation.html\" class=\"external-link\">citation</a></code>, <code><a href=\"mvgam.html\">mvgam</a></code>, <code><a href=\"jsdgam.html\">jsdgam</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate 4 time series with hierarchical seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and a VAR(1) dynamic process</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>seasonality <span class=\"op\">=</span> <span class=\"st\">'hierarchical'</span>,</span></span>\n<span class=\"r-in\"><span>                    trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit an appropriate model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c5856225c.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"fu\">how_to_cite</span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Methods text skeleton</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> We used the R package mvgam (version 1.1.4; Clark &amp; Wells, 2023) to construct, fit and interrogate the model. mvgam fits Bayesian State-Space models that can include flexible predictor effects in both the process and observation components by incorporating functionalities from the brms (Burkner 2017), mgcv (Wood 2017) and splines2 (Wang &amp; Yan, 2023) packages. To encourage stability and prevent forecast variance from increasing indefinitely, we enforced stationarity of the Vector Autoregressive process following methods described by Heaps (2023). The mvgam-constructed model and observed data were passed to the probabilistic programming environment Stan (version 2.34.1; Carpenter et al. 2017, Stan Development Team 2025), specifically through the cmdstanr interface (Gabry &amp; Cesnovar, 2021). We ran 2 Hamiltonian Monte Carlo chains for 500 warmup iterations and 500 sampling iterations for joint posterior estimation. Rank normalized split Rhat (Vehtari et al. 2021) and effective sample sizes were used to monitor convergence.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Primary references</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"Clark, NJ and Wells K (2022). Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series. Methods in Ecology and Evolution, 14, 771-784. doi.org/10.1111/2041-210X.13974\"                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2] \"Burkner, PC (2017). brms: An R Package for Bayesian Multilevel Models Using Stan. Journal of Statistical Software, 80(1), 1-28. doi:10.18637/jss.v080.i01\"                                                                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3] \"Wood, SN (2017). Generalized Additive Models: An Introduction with R (2nd edition). Chapman and Hall/CRC.\"                                                                                                                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4] \"Wang W and Yan J (2021). Shape-Restricted Regression Splines with R Package splines2. Journal of Data Science, 19(3), 498-517. doi:10.6339/21-JDS1020 https://doi.org/10.6339/21-JDS1020.\"                                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [5] \"Heaps, SE (2023). Enforcing stationarity through the prior in vector autoregressions. Journal of Computational and Graphical Statistics 32, 74-83.\"                                                                                                         </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [6] \"Carpenter, B, Gelman, A, Hoffman, MD, Lee, D, Goodrich, B, Betancourt, M, Brubaker, M, Guo, J, Li, P and Riddell, A (2017). Stan: A probabilistic programming language. Journal of Statistical Software 76.\"                                                </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [7] \"Gabry J, Cesnovar R, Johnson A, and Bronder S (2025). cmdstanr: R Interface to 'CmdStan'. https://mc-stan.org/cmdstanr/, https://discourse.mc-stan.org.\"                                                                                                    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [8] \"Vehtari A, Gelman A, Simpson D, Carpenter B, and Burkner P (2021). Rank-normalization, folding, and localization: An improved Rhat for assessing convergence of MCMC (with discussion). Bayesian Analysis 16(2) 667-718. https://doi.org/10.1214/20-BA1221.\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Other useful references</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"Arel-Bundock, V, Greifer, N, and Heiss, A (2024). How to interpret statistical models using marginaleffects for R and Python. Journal of Statistical Software, 111(9), 1-32. https://doi.org/10.18637/jss.v111.i09\"                               </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2] \"Gabry J, Simpson D, Vehtari A, Betancourt M, and Gelman A (2019). Visualization in Bayesian workflow. Journal of the Royal Statatistical Society A, 182, 389-402. doi:10.1111/rssa.12378.\"                                                        </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3] \"Vehtari A, Gelman A, and Gabry J (2017). Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC. Statistics and Computing, 27, 1413-1432. doi:10.1007/s11222-016-9696-4.\"                                              </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4] \"Burkner, PC, Gabry, J, and Vehtari, A. (2020). Approximate leave-future-out cross-validation for Bayesian time series models. Journal of Statistical Computation and Simulation, 90(14), 2499-2523. https://doi.org/10.1080/00949655.2020.1783262\"</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># For a GP example, simulate data using the mgcv package</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, n <span class=\"op\">=</span> <span class=\"fl\">30</span>, scale <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Gu &amp; Wahba 4 term additive model</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model that uses an approximate GP from the brms package</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></span><span class=\"op\">(</span><span class=\"va\">x2</span>, k <span class=\"op\">=</span> <span class=\"fl\">12</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>gp effects in mvgam cannot yet handle autogrouping</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> resetting all instances of 'gr = TRUE' to 'gr = FALSE'</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once per session.</span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c3596eb6.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"fu\">how_to_cite</span><span class=\"op\">(</span><span class=\"va\">mod2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Methods text skeleton</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> We used the R package mvgam (version 1.1.4; Clark &amp; Wells, 2023) to construct, fit and interrogate the model. mvgam fits Bayesian State-Space models that can include flexible predictor effects in both the process and observation components by incorporating functionalities from the brms (Burkner 2017), mgcv (Wood 2017) and splines2 (Wang &amp; Yan, 2023) packages. Gaussian Process functional effects were estimated using a low-rank Hilbert space approximation following methods described by Riutort-Mayol et al. (2023). The mvgam-constructed model and observed data were passed to the probabilistic programming environment Stan (version 2.34.1; Carpenter et al. 2017, Stan Development Team 2025), specifically through the cmdstanr interface (Gabry &amp; Cesnovar, 2021). We ran 2 Hamiltonian Monte Carlo chains for 500 warmup iterations and 500 sampling iterations for joint posterior estimation. Rank normalized split Rhat (Vehtari et al. 2021) and effective sample sizes were used to monitor convergence.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Primary references</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"Clark, NJ and Wells K (2022). Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series. Methods in Ecology and Evolution, 14, 771-784. doi.org/10.1111/2041-210X.13974\"                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2] \"Burkner, PC (2017). brms: An R Package for Bayesian Multilevel Models Using Stan. Journal of Statistical Software, 80(1), 1-28. doi:10.18637/jss.v080.i01\"                                                                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3] \"Wood, SN (2017). Generalized Additive Models: An Introduction with R (2nd edition). Chapman and Hall/CRC.\"                                                                                                                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4] \"Wang W and Yan J (2021). Shape-Restricted Regression Splines with R Package splines2. Journal of Data Science, 19(3), 498-517. doi:10.6339/21-JDS1020 https://doi.org/10.6339/21-JDS1020.\"                                                                  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [5] \"Riutort-Mayol, G, Burkner, PC, Andersen, MR, Solin, A and Vehtari, A (2023). Practical Hilbert space approximate Bayesian Gaussian processes for probabilistic programming. Statistics and Computing 33, 1. https://doi.org/10.1007/s11222-022-10167-2\"     </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [6] \"Carpenter, B, Gelman, A, Hoffman, MD, Lee, D, Goodrich, B, Betancourt, M, Brubaker, M, Guo, J, Li, P and Riddell, A (2017). Stan: A probabilistic programming language. Journal of Statistical Software 76.\"                                                </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [7] \"Gabry J, Cesnovar R, Johnson A, and Bronder S (2025). cmdstanr: R Interface to 'CmdStan'. https://mc-stan.org/cmdstanr/, https://discourse.mc-stan.org.\"                                                                                                    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [8] \"Vehtari A, Gelman A, Simpson D, Carpenter B, and Burkner P (2021). Rank-normalization, folding, and localization: An improved Rhat for assessing convergence of MCMC (with discussion). Bayesian Analysis 16(2) 667-718. https://doi.org/10.1214/20-BA1221.\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Other useful references</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"Arel-Bundock, V, Greifer, N, and Heiss, A (2024). How to interpret statistical models using marginaleffects for R and Python. Journal of Statistical Software, 111(9), 1-32. https://doi.org/10.18637/jss.v111.i09\"                               </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2] \"Gabry J, Simpson D, Vehtari A, Betancourt M, and Gelman A (2019). Visualization in Bayesian workflow. Journal of the Royal Statatistical Society A, 182, 389-402. doi:10.1111/rssa.12378.\"                                                        </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3] \"Vehtari A, Gelman A, and Gabry J (2017). Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC. Statistics and Computing, 27, 1413-1432. doi:10.1007/s11222-016-9696-4.\"                                              </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4] \"Burkner, PC, Gabry, J, and Vehtari, A. (2020). Approximate leave-future-out cross-validation for Bayesian time series models. Journal of Statistical Computation and Simulation, 90(14), 2499-2523. https://doi.org/10.1080/00949655.2020.1783262\"</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/index-mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Index mvgam objects — index-mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Index mvgam objects — index-mvgam\"><meta name=\"description\" content=\"Index mvgam objects\"><meta property=\"og:description\" content=\"Index mvgam objects\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Index <code>mvgam</code> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/index-mvgam.R\" class=\"external-link\"><code>R/index-mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>index-mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Index <code>mvgam</code> objects</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">variables</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Arguments passed to individual methods (if applicable).</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>a <code>list</code> object of the variables that can be extracted, along\nwith their aliases</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c7d5b7631.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"fu\">variables</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $observation_pars</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $observation_linpreds</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    orig_name alias</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1   mus[1,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2   mus[2,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3   mus[3,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4   mus[4,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5   mus[5,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6   mus[6,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7   mus[7,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8   mus[8,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9   mus[9,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 mus[10,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 mus[11,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 mus[12,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 mus[13,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 mus[14,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 mus[15,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 mus[16,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 mus[17,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 mus[18,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 mus[19,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 mus[20,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 mus[21,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 mus[22,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 mus[23,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 mus[24,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 mus[25,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 26 mus[26,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 27 mus[27,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 28 mus[28,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 29 mus[29,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 30 mus[30,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 31 mus[31,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 32 mus[32,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 33 mus[33,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 34 mus[34,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 35 mus[35,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 36 mus[36,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 37 mus[37,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 38 mus[38,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 39 mus[39,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 40 mus[40,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 41 mus[41,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 42 mus[42,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 43 mus[43,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 44 mus[44,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 45 mus[45,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 46 mus[46,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 47 mus[47,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 48 mus[48,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 49 mus[49,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50 mus[50,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 51 mus[51,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 52 mus[52,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 53 mus[53,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 54 mus[54,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 55 mus[55,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 56 mus[56,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 57 mus[57,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 58 mus[58,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 59 mus[59,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 60 mus[60,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 61 mus[61,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 62 mus[62,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 63 mus[63,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 64 mus[64,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 65 mus[65,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 66 mus[66,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 67 mus[67,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 68 mus[68,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 69 mus[69,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 70 mus[70,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 71 mus[71,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 72 mus[72,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 73 mus[73,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 74 mus[74,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75 mus[75,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $observation_betas</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   orig_name       alias</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1      b[1] (Intercept)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2      b[2] s(season).1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3      b[3] s(season).2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4      b[4] s(season).3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5      b[5] s(season).4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $observation_smoothpars</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   orig_name         alias</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1    rho[1] s(season)_rho</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $observation_re_params</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $posterior_preds</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      orig_name alias</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1   ypred[1,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2   ypred[2,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3   ypred[3,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4   ypred[4,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5   ypred[5,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6   ypred[6,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7   ypred[7,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8   ypred[8,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9   ypred[9,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 ypred[10,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 ypred[11,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 ypred[12,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 ypred[13,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 ypred[14,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 ypred[15,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 ypred[16,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 ypred[17,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 ypred[18,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 ypred[19,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 ypred[20,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 ypred[21,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 ypred[22,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 ypred[23,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 ypred[24,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 ypred[25,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 26 ypred[26,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 27 ypred[27,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 28 ypred[28,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 29 ypred[29,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 30 ypred[30,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 31 ypred[31,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 32 ypred[32,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 33 ypred[33,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 34 ypred[34,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 35 ypred[35,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 36 ypred[36,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 37 ypred[37,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 38 ypred[38,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 39 ypred[39,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 40 ypred[40,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 41 ypred[41,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 42 ypred[42,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 43 ypred[43,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 44 ypred[44,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 45 ypred[45,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 46 ypred[46,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 47 ypred[47,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 48 ypred[48,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 49 ypred[49,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50 ypred[50,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 51 ypred[51,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 52 ypred[52,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 53 ypred[53,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 54 ypred[54,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 55 ypred[55,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 56 ypred[56,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 57 ypred[57,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 58 ypred[58,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 59 ypred[59,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 60 ypred[60,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 61 ypred[61,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 62 ypred[62,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 63 ypred[63,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 64 ypred[64,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 65 ypred[65,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 66 ypred[66,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 67 ypred[67,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 68 ypred[68,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 69 ypred[69,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 70 ypred[70,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 71 ypred[71,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 72 ypred[72,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 73 ypred[73,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 74 ypred[74,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75 ypred[75,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $trend_pars</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   orig_name alias</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1    ar1[1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  sigma[1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $trend_linpreds</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $trend_betas</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $trend_smoothpars</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $trend_re_params</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      orig_name alias</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1   trend[1,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2   trend[2,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3   trend[3,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4   trend[4,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5   trend[5,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6   trend[6,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7   trend[7,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8   trend[8,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9   trend[9,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 trend[10,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 trend[11,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 trend[12,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 trend[13,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 trend[14,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 trend[15,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 trend[16,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 trend[17,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 trend[18,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 trend[19,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 trend[20,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 trend[21,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 trend[22,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 trend[23,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 trend[24,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 trend[25,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 26 trend[26,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 27 trend[27,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 28 trend[28,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 29 trend[29,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 30 trend[30,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 31 trend[31,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 32 trend[32,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 33 trend[33,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 34 trend[34,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 35 trend[35,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 36 trend[36,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 37 trend[37,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 38 trend[38,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 39 trend[39,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 40 trend[40,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 41 trend[41,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 42 trend[42,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 43 trend[43,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 44 trend[44,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 45 trend[45,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 46 trend[46,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 47 trend[47,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 48 trend[48,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 49 trend[49,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50 trend[50,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 51 trend[51,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 52 trend[52,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 53 trend[53,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 54 trend[54,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 55 trend[55,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 56 trend[56,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 57 trend[57,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 58 trend[58,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 59 trend[59,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 60 trend[60,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 61 trend[61,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 62 trend[62,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 63 trend[63,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 64 trend[64,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 65 trend[65,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 66 trend[66,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 67 trend[67,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 68 trend[68,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 69 trend[69,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 70 trend[70,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 71 trend[71,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 72 trend[72,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 73 trend[73,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 74 trend[74,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75 trend[75,1]    NA</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Package index • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Package index\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-index\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Package index</h1>\n    </div>\n\n    <div class=\"section level2\">\n      <h2 id=\"all-functions\">All functions<a class=\"anchor\" aria-label=\"anchor\" href=\"#all-functions\"></a></h2>\n\n\n\n\n    </div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"add_residuals.mvgam.html\">add_residuals()</a></code>\n\n        </dt>\n        <dd>Calculate randomized quantile residuals for <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"all_neon_tick_data.html\">all_neon_tick_data</a></code>\n\n        </dt>\n        <dd>NEON Amblyomma and Ixodes tick abundance survey data</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"augment.mvgam.html\">augment(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Augment an <span class=\"pkg\">mvgam</span> object's data</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"code.html\">code()</a></code> <code><a href=\"code.html\">stancode(<i>&lt;mvgam_prefit&gt;</i>)</a></code> <code><a href=\"code.html\">stancode(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"code.html\">standata(<i>&lt;mvgam_prefit&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Stan code and data objects for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"conditional_effects.mvgam.html\">conditional_effects(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"conditional_effects.mvgam.html\">plot(<i>&lt;mvgam_conditional_effects&gt;</i>)</a></code> <code><a href=\"conditional_effects.mvgam.html\">print(<i>&lt;mvgam_conditional_effects&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Display conditional effects of predictors for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"dynamic.html\">dynamic()</a></code>\n\n        </dt>\n        <dd>Defining dynamic coefficients in <span class=\"pkg\">mvgam</span> formulae</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"ensemble.mvgam_forecast.html\">ensemble()</a></code>\n\n        </dt>\n        <dd>Combine forecasts from <span class=\"pkg\">mvgam</span> models into evenly weighted ensembles</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"evaluate_mvgams.html\">eval_mvgam()</a></code> <code><a href=\"evaluate_mvgams.html\">roll_eval_mvgam()</a></code> <code><a href=\"evaluate_mvgams.html\">compare_mvgams()</a></code>\n\n        </dt>\n        <dd>Evaluate forecasts from fitted <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"fevd.mvgam.html\">fevd()</a></code>\n\n        </dt>\n        <dd>Calculate latent VAR forecast error variance decompositions</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"fitted.mvgam.html\">fitted(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Expected values of the posterior predictive distribution for <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"forecast.mvgam.html\">forecast()</a></code>\n\n        </dt>\n        <dd>Extract or compute hindcasts and forecasts for a fitted <code>mvgam</code> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"formula.mvgam.html\">formula(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"formula.mvgam.html\">formula(<i>&lt;mvgam_prefit&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Extract formulae from <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"get_mvgam_priors.html\">get_mvgam_priors()</a></code>\n\n        </dt>\n        <dd>Extract information on default prior distributions for an <span class=\"pkg\">mvgam</span> model</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"GP.html\">GP()</a></code>\n\n        </dt>\n        <dd>Specify dynamic Gaussian process trends in <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"gratia_mvgam_enhancements.html\">drawDotmvgam()</a></code> <code><a href=\"gratia_mvgam_enhancements.html\">eval_smoothDothilbertDotsmooth()</a></code> <code><a href=\"gratia_mvgam_enhancements.html\">eval_smoothDotmodDotsmooth()</a></code> <code><a href=\"gratia_mvgam_enhancements.html\">eval_smoothDotmoiDotsmooth()</a></code>\n\n        </dt>\n        <dd>Enhance post-processing of <span class=\"pkg\">mvgam</span> models using <span class=\"pkg\">gratia</span> functionality</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"hindcast.mvgam.html\">hindcast()</a></code>\n\n        </dt>\n        <dd>Extract hindcasts for a fitted <code>mvgam</code> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"how_to_cite.mvgam.html\">how_to_cite()</a></code>\n\n        </dt>\n        <dd>Generate a methods description for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"index-mvgam.html\">variables(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Index <code>mvgam</code> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"irf.mvgam.html\">irf()</a></code>\n\n        </dt>\n        <dd>Calculate latent VAR impulse response functions</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"jsdgam.html\">jsdgam()</a></code>\n\n        </dt>\n        <dd>Fit Joint Species Distribution Models in <span class=\"pkg\">mvgam</span></dd>\n      </dl><dl><dt>\n\n          <code><a href=\"lfo_cv.mvgam.html\">lfo_cv()</a></code>\n\n        </dt>\n        <dd>Approximate leave-future-out cross-validation of fitted <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"logLik.mvgam.html\">logLik(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Compute pointwise Log-Likelihoods from fitted <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"loo.mvgam.html\">loo(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"loo.mvgam.html\">loo_compare(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>LOO information criteria for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"lv_correlations.html\">lv_correlations()</a></code>\n\n        </dt>\n        <dd>Calculate trend correlations based on latent factor loadings for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mcmc_plot.mvgam.html\">mcmc_plot(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>MCMC plots of <span class=\"pkg\">mvgam</span> parameters, as implemented in <span class=\"pkg\">bayesplot</span></dd>\n      </dl><dl><dt>\n\n          <code><a href=\"model.frame.mvgam.html\">model.frame(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"model.frame.mvgam.html\">model.frame(<i>&lt;mvgam_prefit&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Extract model.frame from a fitted <span class=\"pkg\">mvgam</span> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"monotonic.html\">smooth.construct(<i>&lt;moi.smooth.spec&gt;</i>)</a></code> <code><a href=\"monotonic.html\">smooth.construct(<i>&lt;mod.smooth.spec&gt;</i>)</a></code> <code><a href=\"monotonic.html\">Predict.matrix(<i>&lt;moi.smooth&gt;</i>)</a></code> <code><a href=\"monotonic.html\">Predict.matrix(<i>&lt;mod.smooth&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Monotonic splines in <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam-class.html\">mvgam-class</a></code>\n\n        </dt>\n        <dd>Fitted <code>mvgam</code> object description</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam.html\">mvgam()</a></code>\n\n        </dt>\n        <dd>Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_diagnostics.html\">nuts_params(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_diagnostics.html\">log_posterior(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_diagnostics.html\">rhat(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_diagnostics.html\">neff_ratio(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Extract diagnostic quantities of <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_draws.html\">as.data.frame(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as.matrix(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as.array(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as_draws(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as_draws_matrix(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as_draws_df(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as_draws_array(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as_draws_list(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_draws.html\">as_draws_rvars(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Extract posterior draws from fitted <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_families.html\">tweedie()</a></code> <code><a href=\"mvgam_families.html\">student_t()</a></code> <code><a href=\"mvgam_families.html\">betar()</a></code> <code><a href=\"mvgam_families.html\">nb()</a></code> <code><a href=\"mvgam_families.html\">lognormal()</a></code> <code><a href=\"mvgam_families.html\">student()</a></code> <code><a href=\"mvgam_families.html\">bernoulli()</a></code> <code><a href=\"mvgam_families.html\">beta_binomial()</a></code> <code><a href=\"mvgam_families.html\">nmix()</a></code>\n\n        </dt>\n        <dd>Supported <span class=\"pkg\">mvgam</span> families</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_fevd-class.html\">mvgam_fevd-class</a></code>\n\n        </dt>\n        <dd><code>mvgam_fevd</code> object description</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_forecast-class.html\">mvgam_forecast-class</a></code>\n\n        </dt>\n        <dd><code>mvgam_forecast</code> object description</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_formulae.html\">mvgam_formulae</a></code>\n\n        </dt>\n        <dd>Details of formula specifications in <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_irf-class.html\">mvgam_irf-class</a></code>\n\n        </dt>\n        <dd><code>mvgam_irf</code> object description</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_marginaleffects.html\">get_coef(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_marginaleffects.html\">set_coef(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_marginaleffects.html\">get_vcov(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_marginaleffects.html\">get_predict(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_marginaleffects.html\">get_data(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_marginaleffects.html\">get_data(<i>&lt;mvgam_prefit&gt;</i>)</a></code> <code><a href=\"mvgam_marginaleffects.html\">find_predictors(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"mvgam_marginaleffects.html\">find_predictors(<i>&lt;mvgam_prefit&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Helper functions for <span class=\"pkg\">marginaleffects</span> calculations in <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"mvgam_trends.html\">mvgam_trends</a></code>\n\n        </dt>\n        <dd>Supported latent trend models in <span class=\"pkg\">mvgam</span></dd>\n      </dl><dl><dt>\n\n          <code><a href=\"pairs.mvgam.html\">pairs(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Create a matrix of output plots from a <code>mvgam</code> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"piecewise_trends.html\">PW()</a></code>\n\n        </dt>\n        <dd>Specify piecewise linear or logistic trends in <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot.mvgam.html\">plot(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Default plots for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot.mvgam_fevd.html\">plot(<i>&lt;mvgam_fevd&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Plot forecast error variance decompositions from an <code>mvgam_fevd</code> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot.mvgam_irf.html\">plot(<i>&lt;mvgam_irf&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Plot impulse responses from an <code>mvgam_irf</code> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot.mvgam_lfo.html\">plot(<i>&lt;mvgam_lfo&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Plot Pareto-k and ELPD values from a <code>mvgam_lfo</code> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_factors.html\">plot_mvgam_factors()</a></code>\n\n        </dt>\n        <dd>Latent factor summaries for a fitted <span class=\"pkg\">mvgam</span> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_forecasts.html\">plot_mvgam_fc()</a></code> <code><a href=\"plot_mvgam_forecasts.html\">plot(<i>&lt;mvgam_forecast&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Plot posterior forecast predictions from <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_pterms.html\">plot_mvgam_pterms()</a></code>\n\n        </dt>\n        <dd>Plot parametric term partial effects for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_randomeffects.html\">plot_mvgam_randomeffects()</a></code>\n\n        </dt>\n        <dd>Plot random effect terms from <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_resids.html\">plot_mvgam_resids()</a></code>\n\n        </dt>\n        <dd>Residual diagnostics for a fitted <span class=\"pkg\">mvgam</span> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_series.html\">plot_mvgam_series()</a></code>\n\n        </dt>\n        <dd>Plot observed time series used for <span class=\"pkg\">mvgam</span> modelling</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_smooth.html\">plot_mvgam_smooth()</a></code>\n\n        </dt>\n        <dd>Plot smooth terms from <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_trend.html\">plot_mvgam_trend()</a></code>\n\n        </dt>\n        <dd>Plot latent trend predictions from <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"plot_mvgam_uncertainty.html\">plot_mvgam_uncertainty()</a></code>\n\n        </dt>\n        <dd>Plot forecast uncertainty contributions from <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"portal_data.html\">portal_data</a></code>\n\n        </dt>\n        <dd>Portal Project rodent capture survey data</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"posterior_epred.mvgam.html\">posterior_epred(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Draws from the expected value of the posterior predictive distribution for <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"posterior_linpred.mvgam.html\">posterior_linpred(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Posterior draws of the linear predictor for <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"posterior_predict.mvgam.html\">posterior_predict(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Draws from the posterior predictive distribution for <span class=\"pkg\">mvgam</span> objects</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"ppc.mvgam.html\">ppc()</a></code>\n\n        </dt>\n        <dd>Plot conditional posterior predictive checks from <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"pp_check.mvgam.html\">pp_check(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Posterior Predictive Checks for <code>mvgam</code> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"predict.mvgam.html\">predict(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Predict from a fitted <span class=\"pkg\">mvgam</span> model</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"print.mvgam.html\">print(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Summary for a fitted <span class=\"pkg\">mvgam</span> object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"residuals.mvgam.html\">residuals(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Posterior draws of residuals from <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"residual_cor.jsdgam.html\">residual_cor()</a></code>\n\n        </dt>\n        <dd>Extract residual correlations based on latent factors from a fitted jsdgam</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"RW.html\">RW()</a></code> <code><a href=\"RW.html\">AR()</a></code> <code><a href=\"RW.html\">CAR()</a></code> <code><a href=\"RW.html\">VAR()</a></code>\n\n        </dt>\n        <dd>Specify autoregressive dynamic processes in <span class=\"pkg\">mvgam</span></dd>\n      </dl><dl><dt>\n\n          <code><a href=\"score.mvgam_forecast.html\">score()</a></code>\n\n        </dt>\n        <dd>Compute probabilistic forecast scores for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"series_to_mvgam.html\">series_to_mvgam()</a></code>\n\n        </dt>\n        <dd>Convert timeseries object to format necessary for <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"sim_mvgam.html\">sim_mvgam()</a></code>\n\n        </dt>\n        <dd>Simulate a set of time series for modelling in <span class=\"pkg\">mvgam</span></dd>\n      </dl><dl><dt>\n\n          <code><a href=\"stability.mvgam.html\">stability()</a></code>\n\n        </dt>\n        <dd>Calculate measures of latent VAR community stability</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"summary.mvgam.html\">summary(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"summary.mvgam.html\">summary(<i>&lt;mvgam_prefit&gt;</i>)</a></code> <code><a href=\"summary.mvgam.html\">coef(<i>&lt;mvgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Summary for a fitted <span class=\"pkg\">mvgam</span> models</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"update.mvgam.html\">update(<i>&lt;mvgam&gt;</i>)</a></code> <code><a href=\"update.mvgam.html\">update(<i>&lt;jsdgam&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Update an existing <span class=\"pkg\">mvgam</span> model object</dd>\n      </dl><dl><dt>\n\n          <code><a href=\"ZMVN.html\">ZMVN()</a></code>\n\n        </dt>\n        <dd>Specify correlated residual processes in <span class=\"pkg\">mvgam</span></dd>\n      </dl></div>\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/irf.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Calculate latent VAR impulse response functions — irf.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Calculate latent VAR impulse response functions — irf.mvgam\"><meta name=\"description\" content=\"Compute Generalized or Orthogonalized Impulse Response Functions (IRFs) from\nmvgam models with Vector Autoregressive dynamics\"><meta property=\"og:description\" content=\"Compute Generalized or Orthogonalized Impulse Response Functions (IRFs) from\nmvgam models with Vector Autoregressive dynamics\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Calculate latent VAR impulse response functions</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/irf.mvgam.R\" class=\"external-link\"><code>R/irf.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>irf.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute Generalized or Orthogonalized Impulse Response Functions (IRFs) from\n<code>mvgam</code> models with Vector Autoregressive dynamics</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">irf</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">irf</span><span class=\"op\">(</span><span class=\"va\">object</span>, h <span class=\"op\">=</span> <span class=\"fl\">1</span>, cumulative <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, orthogonal <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> resulting from a call to <code><a href=\"mvgam.html\">mvgam()</a></code>\nthat used a Vector Autoregressive latent process model (either as <code>VAR(cor = FALSE)</code> or\n<code>VAR(cor = TRUE)</code>)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n\n<dt id=\"arg-h\">h<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-h\"></a></dt>\n<dd><p>Positive <code>integer</code> specifying the forecast horizon over which to calculate\nthe IRF</p></dd>\n\n\n<dt id=\"arg-cumulative\">cumulative<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-cumulative\"></a></dt>\n<dd><p><code>Logical</code> flag indicating whether the IRF should be cumulative</p></dd>\n\n\n<dt id=\"arg-orthogonal\">orthogonal<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-orthogonal\"></a></dt>\n<dd><p><code>Logical</code> flag indicating whether orthogonalized IRFs should be\ncalculated. Note that the order of the variables matters when calculating these</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>mvgam_irf</code> containing the posterior IRFs. This\nobject can be used with the supplied S3 functions <code>plot</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Generalized or Orthogonalized Impulse Response Functions can be computed\nusing the posterior estimates of Vector Autoregressive parameters. This function\ngenerates a positive \"shock\" for a target process at time <code>t = 0</code> and then\ncalculates how  each of the remaining processes in the latent VAR are expected\nto respond over the forecast horizon <code>h</code>. The function computes IRFs for all\nprocesses in the object and returns them in an array that can be plotted using\nthe S3 <code>plot</code> function. To inspect community-level metrics of stability using latent\nVAR processes, you can use the related <code><a href=\"stability.mvgam.html\">stability</a></code> function.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>PH Pesaran &amp; Shin Yongcheol (1998).\nGeneralized impulse response analysis in linear multivariate models.\nEconomics Letters 58: 17–29.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"RW.html\">VAR</a></code>, <code><a href=\"plot.mvgam_irf.html\">plot.mvgam_irf</a></code>, <code><a href=\"stability.mvgam.html\">stability</a></code>,\n<code><a href=\"fevd.mvgam.html\">fevd</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some time series that follow a latent VAR(1) process</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    n_series <span class=\"op\">=</span> <span class=\"fl\">4</span>,</span></span>\n<span class=\"r-in\"><span>                    trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"irf.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model that uses a latent VAR(1)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>             trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c752de38.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Calulate Generalized IRFs for each series</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">irfs</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">irf</span><span class=\"op\">(</span><span class=\"va\">mod</span>, h <span class=\"op\">=</span> <span class=\"fl\">12</span>, cumulative <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot them</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">irfs</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"irf.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">irfs</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"irf.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">irfs</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"irf.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/jsdgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Fit Joint Species Distribution Models in mvgam — jsdgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Fit Joint Species Distribution Models in mvgam — jsdgam\"><meta name=\"description\" content=\"This function sets up a Joint Species Distribution Model whereby the residual associations among\nspecies can be modelled in a reduced-rank format using a set of latent factors. The factor\nspecification is extremely flexible, allowing users to include spatial, temporal or any other type\nof predictor effects to more efficiently capture unmodelled residual associations, while the\nobservation model can also be highly flexible (including all smooth, GP and other effects that\nmvgam can handle)\"><meta property=\"og:description\" content=\"This function sets up a Joint Species Distribution Model whereby the residual associations among\nspecies can be modelled in a reduced-rank format using a set of latent factors. The factor\nspecification is extremely flexible, allowing users to include spatial, temporal or any other type\nof predictor effects to more efficiently capture unmodelled residual associations, while the\nobservation model can also be highly flexible (including all smooth, GP and other effects that\nmvgam can handle)\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Fit Joint Species Distribution Models in <span class=\"pkg\">mvgam</span></h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/jsdgam.R\" class=\"external-link\"><code>R/jsdgam.R</code></a></small>\n      <div class=\"d-none name\"><code>jsdgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function sets up a Joint Species Distribution Model whereby the residual associations among\nspecies can be modelled in a reduced-rank format using a set of latent factors. The factor\nspecification is extremely flexible, allowing users to include spatial, temporal or any other type\nof predictor effects to more efficiently capture unmodelled residual associations, while the\nobservation model can also be highly flexible (including all smooth, GP and other effects that\n<span class=\"pkg\">mvgam</span> can handle)</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">jsdgam</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">formula</span>,</span>\n<span>  factor_formula <span class=\"op\">=</span> <span class=\"op\">~</span><span class=\"op\">-</span><span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">knots</span>,</span>\n<span>  <span class=\"va\">factor_knots</span>,</span>\n<span>  <span class=\"va\">data</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  unit <span class=\"op\">=</span> <span class=\"va\">time</span>,</span>\n<span>  species <span class=\"op\">=</span> <span class=\"va\">series</span>,</span>\n<span>  share_obs_params <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">priors</span>,</span>\n<span>  n_lv <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span>\n<span>  backend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">getOption</a></span><span class=\"op\">(</span><span class=\"st\">\"brms.backend\"</span>, <span class=\"st\">\"cmdstanr\"</span><span class=\"op\">)</span>,</span>\n<span>  algorithm <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">getOption</a></span><span class=\"op\">(</span><span class=\"st\">\"brms.algorithm\"</span>, <span class=\"st\">\"sampling\"</span><span class=\"op\">)</span>,</span>\n<span>  control <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>max_treedepth <span class=\"op\">=</span> <span class=\"fl\">10</span>, adapt_delta <span class=\"op\">=</span> <span class=\"fl\">0.8</span><span class=\"op\">)</span>,</span>\n<span>  chains <span class=\"op\">=</span> <span class=\"fl\">4</span>,</span>\n<span>  burnin <span class=\"op\">=</span> <span class=\"fl\">500</span>,</span>\n<span>  samples <span class=\"op\">=</span> <span class=\"fl\">500</span>,</span>\n<span>  thin <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  parallel <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  threads <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  run_model <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  return_model_data <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-formula\">formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-formula\"></a></dt>\n<dd><p>A <code>formula</code> object specifying the GAM observation model formula. These are exactly like the formula\nfor a GLM except that smooth terms, <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/t2.html\" class=\"external-link\">t2()</a></code>, as well as time-varying\n<code><a href=\"dynamic.html\">dynamic()</a></code> terms, nonparametric <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> terms and offsets using <code><a href=\"https://rdrr.io/r/stats/offset.html\" class=\"external-link\">offset()</a></code>, can be added to the right hand side\nto specify that the linear predictor depends on smooth functions of predictors\n(or linear functionals of these). Details of the formula syntax used by <span class=\"pkg\">mvgam</span>\ncan be found in <code><a href=\"mvgam_formulae.html\">mvgam_formulae</a></code></p></dd>\n\n\n<dt id=\"arg-factor-formula\">factor_formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-factor-formula\"></a></dt>\n<dd><p>A <code>formula</code> object specifying the linear predictor\neffects for the latent factors. Use <code>by = trend</code> within calls to functional terms\n(i.e. <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/t2.html\" class=\"external-link\">t2()</a></code>, <code><a href=\"dynamic.html\">dynamic()</a></code>, or <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code>) to ensure that each factor\ncaptures a different axis of variation. See the example below as an illustration</p></dd>\n\n\n<dt id=\"arg-knots\">knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-knots\"></a></dt>\n<dd><p>An optional <code>list</code> containing user specified knot values to\nbe used for basis construction.\nFor most bases the user simply supplies the knots to be used, which must match\nup with the <code>k</code> value supplied\n(note that the number of knots is not always just <code>k</code>). Different terms can\nuse different numbers of knots,\nunless they share a covariate</p></dd>\n\n\n<dt id=\"arg-factor-knots\">factor_knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-factor-knots\"></a></dt>\n<dd><p>An optional <code>list</code> containing user specified knot values to\nbe used for basis construction of any smooth terms in <code>factor_formula</code>.\nFor most bases the user simply supplies the knots to be used, which must match up with the <code>k</code> value supplied\n(note that the number of knots is not always just <code>k</code>). Different terms can use different numbers of knots,\nunless they share a covariate</p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> containing the model response variable and covariates\nrequired by the GAM <code>formula</code> and <code>factor_formula</code> objects</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing\nthe same variables\nas in <code>data</code>. If included, the\nobservations in variable <code>y</code> will be set to <code>NA</code> when fitting the\nmodel so that posterior\nsimulations can be obtained</p></dd>\n\n\n<dt id=\"arg-family\">family<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-family\"></a></dt>\n<dd><p><code>family</code> specifying the observation family for the outcomes. Currently supported\nfamilies are:</p><ul><li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">betar()</a></code> for proportional data on <code>(0,1)</code></p></li>\n<li><p><code><a href=\"mvgam_families.html\">lognormal()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">student_t()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">bernoulli()</a></code> for binary data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code> for count data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">nb()</a></code> for overdispersed count data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> for count data with imperfect detection when the number of trials is known;\nnote that the <code><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind()</a></code> function must be used to bind the discrete observations and the discrete number\nof trials</p></li>\n<li><p><code><a href=\"mvgam_families.html\">beta_binomial()</a></code> as for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> but allows for overdispersion</p></li>\n</ul><p>Default is <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code>. See <code><a href=\"mvgam_families.html\">mvgam_families</a></code> for more details</p></dd>\n\n\n<dt id=\"arg-unit\">unit<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-unit\"></a></dt>\n<dd><p>The unquoted name of the variable that represents the unit of analysis in <code>data</code> over\nwhich latent residuals should be correlated. This variable should be either a\n<code>numeric</code> or <code>integer</code> variable in the supplied <code>data</code>.\nDefaults to <code>time</code> to be consistent with other functionalities\nin <span class=\"pkg\">mvgam</span>, though note that the data need not be time series in this case. See examples below\nfor further details and explanations</p></dd>\n\n\n<dt id=\"arg-species\">species<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-species\"></a></dt>\n<dd><p>The unquoted name of the <code>factor</code> variable that indexes\nthe different response units in <code>data</code> (usually <code>'species'</code> in a JSDM).\nDefaults to <code>series</code> to be consistent with other <code>mvgam</code> models</p></dd>\n\n\n<dt id=\"arg-share-obs-params\">share_obs_params<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-share-obs-params\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code> and the <code>family</code>\nhas additional family-specific observation parameters (e.g. variance\ncomponents in\n<code><a href=\"mvgam_families.html\">student_t()</a></code> or <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code>, or dispersion parameters in <code><a href=\"mvgam_families.html\">nb()</a></code> or\n<code><a href=\"mvgam_families.html\">betar()</a></code>), these parameters will be shared across all outcome variables. This is handy\nif you have multiple outcomes (time series in most <code>mvgam</code> models) that you\nbelieve share some properties,\nsuch as being from the same species over different spatial units. Default is\n<code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg-priors\">priors<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-priors\"></a></dt>\n<dd><p>An optional <code>data.frame</code> with prior\ndefinitions (in Stan syntax) or, preferentially, a vector containing\nobjects of class <code>brmsprior</code> (see. <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></code> for details).\nSee <a href=\"get_mvgam_priors.html\">get_mvgam_priors</a> and for more information on changing default prior distributions</p></dd>\n\n\n<dt id=\"arg-n-lv\">n_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-lv\"></a></dt>\n<dd><p><code>integer</code> the number of latent factors to use for modelling\nresidual associations.\nCannot be <code>&gt; n_species</code>. Defaults arbitrarily to <code>2</code></p></dd>\n\n\n<dt id=\"arg-backend\">backend<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-backend\"></a></dt>\n<dd><p>Character string naming the package to use as the backend for fitting\nthe Stan model. Options are \"cmdstanr\" (the default) or \"rstan\". Can be set globally\nfor the current R session via the <code>\"brms.backend\"</code> option (see <code><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></code>). Details on\nthe rstan and cmdstanr packages are available at https://mc-stan.org/rstan/ and\nhttps://mc-stan.org/cmdstanr/, respectively</p></dd>\n\n\n<dt id=\"arg-algorithm\">algorithm<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-algorithm\"></a></dt>\n<dd><p>Character string naming the estimation approach to use.\nOptions are <code>\"sampling\"</code> for MCMC (the default), <code>\"meanfield\"</code> for\nvariational inference with factorized normal distributions,\n<code>\"fullrank\"</code> for variational inference with a multivariate normal\ndistribution, <code>\"laplace\"</code> for a Laplace approximation (only available\nwhen using cmdstanr as the backend) or <code>\"pathfinder\"</code> for the pathfinder\nalgorithm (only currently available when using cmdstanr as the backend).\nCan be set globally for the current <span style=\"R\">R</span> session via the\n<code>\"brms.algorithm\"</code> option (see <code><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></code>). Limited testing\nsuggests that <code>\"meanfield\"</code> performs best out of the non-MCMC approximations for\ndynamic GAMs, possibly because of the difficulties estimating covariances among the\nmany spline parameters and latent trend parameters. But rigorous testing has not\nbeen carried out</p></dd>\n\n\n<dt id=\"arg-control\">control<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-control\"></a></dt>\n<dd><p>A named <code>list</code> for controlling the sampler's behaviour. Valid\nelements include <code>max_treedepth</code>, <code>adapt_delta</code> and <code>init</code></p></dd>\n\n\n<dt id=\"arg-chains\">chains<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-chains\"></a></dt>\n<dd><p><code>integer</code> specifying the number of parallel chains for the model. Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-burnin\">burnin<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-burnin\"></a></dt>\n<dd><p><code>integer</code> specifying the number of warmup iterations of the Markov chain to run\nto tune sampling algorithms. Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-samples\">samples<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-samples\"></a></dt>\n<dd><p><code>integer</code> specifying the number of post-warmup iterations of the Markov chain to run for\nsampling the posterior distribution</p></dd>\n\n\n<dt id=\"arg-thin\">thin<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-thin\"></a></dt>\n<dd><p>Thinning interval for monitors.  Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-parallel\">parallel<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-parallel\"></a></dt>\n<dd><p><code>logical</code> specifying whether multiple cores should be used for\ngenerating MCMC simulations in parallel. If <code>TRUE</code>, the number of cores to use will be\n<code>min(c(chains, parallel::detectCores() - 1))</code></p></dd>\n\n\n<dt id=\"arg-threads\">threads<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-threads\"></a></dt>\n<dd><p><code>integer</code> Experimental option to use multithreading for within-chain\nparallelisation in <code>Stan</code>. We recommend its use only if you are experienced with\n<code>Stan</code>'s <code>reduce_sum</code> function and have a slow running model that cannot be sped\nup by any other means. Currently works for all families when using <code>Cmdstan</code>\nas the backend</p></dd>\n\n\n<dt id=\"arg-silent\">silent<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-silent\"></a></dt>\n<dd><p>Verbosity level between <code>0</code> and <code>2</code>. If <code>1</code> (the default), most\nof the informational messages of compiler and sampler are suppressed. If <code>2</code>,\neven more messages are suppressed. The actual sampling progress is still printed.\nSet <code>refresh = 0</code> to turn this off as well. If using <code>backend = \"rstan\"</code> you\ncan also set open_progress = FALSE to prevent opening additional progress bars.</p></dd>\n\n\n<dt id=\"arg-run-model\">run_model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-run-model\"></a></dt>\n<dd><p><code>logical</code>. If <code>FALSE</code>, the model is not fitted but\ninstead the function will\nreturn the model file and the data / initial values that are needed to fit the\nmodel outside of <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-return-model-data\">return_model_data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-return-model-data\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, the list of data that\nis needed to fit the\nmodel is returned, along with the initial values for smooth and AR parameters,\nonce the model is fitted.\nThis will be helpful if users wish to modify the model file to add\nother stochastic elements that are not currently available in <code>mvgam</code>.\nDefault is <code>FALSE</code> to reduce\nthe size of the returned object, unless <code>run_model == FALSE</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Other arguments to pass to <a href=\"mvgam.html\">mvgam</a></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> object of class <code>mvgam</code> containing model output,\nthe text representation of the model file,\nthe mgcv model output (for easily generating simulations at\nunsampled covariate values), Dunn-Smyth residuals for each species and key information needed\nfor other functions in the package. See <code><a href=\"mvgam-class.html\">mvgam-class</a></code> for details.\nUse <code>methods(class = \"mvgam\")</code> for an overview on available methods</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Joint Species Distribution Models allow for responses of multiple species to be\nlearned hierarchically, whereby responses to environmental variables in <code>formula</code> can be partially\npooled and any latent, unmodelled residual associations can also be learned. In <span class=\"pkg\">mvgam</span>, both of\nthese effects can be modelled with the full power of latent factor Hierarchical GAMs, providing unmatched\nflexibility to model full communities of species. When calling jsdgam, an initial State-Space model using\n<code>trend = 'None'</code> is set up and then modified to include the latent factors and their linear predictors.\nConsequently, you can inspect priors for these models using <a href=\"get_mvgam_priors.html\">get_mvgam_priors</a> by supplying the relevant\n<code>formula</code>, <code>factor_formula</code>, <code>data</code> and <code>family</code> arguments and keeping the default <code>trend = 'None'</code>.</p>\n<p>In a JSDGAM, the expectation of response \\(Y_{ij}\\) is modelled with</p>\n<p>$$g(\\mu_{ij}) = X_i\\beta + u_i\\theta_j,$$</p>\n<p>where \\(g(.)\\) is a known link function,\n\\(X\\) is a design matrix of linear predictors (with associated \\(\\beta\\) coefficients),\n\\(u\\) are \\(n_{lv}\\)-variate latent factors\n(\\(n_{lv}\\)&lt;&lt;\\(n_{species}\\)) and\n\\(\\theta_j\\) are species-specific loadings on the latent factors, respectively. The design matrix\n\\(X\\) and \\(\\beta\\) coefficients are constructed and modelled using <code>formula</code> and can contain\nany of <code>mvgam</code>'s predictor effects, including random intercepts and slopes, multidimensional penalized\nsmooths, GP effects etc... The factor loadings \\(\\theta_j\\) are constrained for identifiability but can\nbe used to reconstruct an estimate of the species' residual variance-covariance matrix\nusing \\(\\Theta \\Theta'\\) (see the example below and <code><a href=\"residual_cor.jsdgam.html\">residual_cor()</a></code> for details).\nThe latent factors are further modelled using:\n$$\nu_i \\sim \\text{Normal}(Q_i\\beta_{factor}, 1) \\quad\n$$\nwhere the second design matrix \\(Q\\) and associated \\(\\beta_{factor}\\) coefficients are\nconstructed and modelled using <code>factor_formula</code>. Again, the effects that make up this linear\npredictor can contain any of <code>mvgam</code>'s allowed predictor effects, providing enormous flexibility for\nmodelling species' communities.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Nicholas J Clark &amp; Konstans Wells (2020). Dynamic generalised additive models (DGAMs) for forecasting discrete ecological time series.\nMethods in Ecology and Evolution. 14:3, 771-784.\n<br><br>\nDavid I Warton, F Guillaume Blanchet, Robert B O’Hara, Otso Ovaskainen, Sara Taskinen, Steven C\nWalker &amp; Francis KC Hui (2015). So many variables: joint modeling in community ecology.\nTrends in Ecology &amp; Evolution 30:12, 766-779.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"mvgam.html\">mvgam()</a></code>, <code><a href=\"residual_cor.jsdgam.html\">residual_cor()</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate latent count data for 500 spatial locations and 10 species</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">N_points</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">500</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">N_species</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">10</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Species-level intercepts (on the log scale)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">alphas</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"va\">N_species</span>, <span class=\"fl\">2</span>, <span class=\"fl\">2.25</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate a covariate and species-level responses to it</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">temperature</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">N_points</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">betas</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"va\">N_species</span>, <span class=\"op\">-</span><span class=\"fl\">0.5</span>, <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate points uniformly over a space</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lon</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"va\">N_points</span>, min <span class=\"op\">=</span> <span class=\"fl\">150</span>, max <span class=\"op\">=</span> <span class=\"fl\">155</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"va\">N_points</span>, min <span class=\"op\">=</span> <span class=\"op\">-</span><span class=\"fl\">20</span>, max <span class=\"op\">=</span> <span class=\"op\">-</span><span class=\"fl\">19</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Set up spatial basis functions as a tensor product of lat and lon</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sm</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/smoothCon.html\" class=\"external-link\">smoothCon</a></span><span class=\"op\">(</span><span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></span><span class=\"op\">(</span><span class=\"va\">lon</span>, <span class=\"va\">lat</span>, k <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                      data <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">lon</span>, <span class=\"va\">lat</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                      knots <span class=\"op\">=</span> <span class=\"cn\">NULL</span><span class=\"op\">)</span><span class=\"op\">[[</span><span class=\"fl\">1</span><span class=\"op\">]</span><span class=\"op\">]</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The design matrix for this smooth is in the 'X' slot</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">des_mat</span> <span class=\"op\">&lt;-</span> <span class=\"va\">sm</span><span class=\"op\">$</span><span class=\"va\">X</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/dim.html\" class=\"external-link\">dim</a></span><span class=\"op\">(</span><span class=\"va\">des_mat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 500  25</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Function to generate a random covariance matrix where all variables</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># have unit variance (i.e. diagonals are all 1)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">random_Sigma</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">N</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">L_Omega</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"va\">N</span>, <span class=\"va\">N</span><span class=\"op\">)</span>;</span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">L_Omega</span><span class=\"op\">[</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">1</span>;</span></span>\n<span class=\"r-in\"><span>  <span class=\"kw\">for</span> <span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">2</span> <span class=\"op\">:</span> <span class=\"va\">N</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"va\">bound</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">1</span>;</span></span>\n<span class=\"r-in\"><span>    <span class=\"kw\">for</span> <span class=\"op\">(</span><span class=\"va\">j</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span> <span class=\"op\">:</span> <span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"op\">-</span> <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>      <span class=\"va\">L_Omega</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">j</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"op\">-</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">sqrt</a></span><span class=\"op\">(</span><span class=\"va\">bound</span><span class=\"op\">)</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">sqrt</a></span><span class=\"op\">(</span><span class=\"va\">bound</span><span class=\"op\">)</span><span class=\"op\">)</span>;</span></span>\n<span class=\"r-in\"><span>      <span class=\"va\">bound</span> <span class=\"op\">&lt;-</span> <span class=\"va\">bound</span> <span class=\"op\">-</span> <span class=\"va\">L_Omega</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">j</span><span class=\"op\">]</span> <span class=\"op\">^</span> <span class=\"fl\">2</span>;</span></span>\n<span class=\"r-in\"><span>    <span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"va\">L_Omega</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">i</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">sqrt</a></span><span class=\"op\">(</span><span class=\"va\">bound</span><span class=\"op\">)</span>;</span></span>\n<span class=\"r-in\"><span>  <span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">Sigma</span> <span class=\"op\">&lt;-</span> <span class=\"va\">L_Omega</span> <span class=\"op\"><a href=\"https://rdrr.io/r/base/matmult.html\" class=\"external-link\">%*%</a></span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/t.html\" class=\"external-link\">t</a></span><span class=\"op\">(</span><span class=\"va\">L_Omega</span><span class=\"op\">)</span>;</span></span>\n<span class=\"r-in\"><span>  <span class=\"kw\"><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">return</a></span><span class=\"op\">(</span><span class=\"va\">Sigma</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate a variance-covariance matrix for the correlations among</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># basis coefficients</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">Sigma</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">random_Sigma</span><span class=\"op\">(</span>N <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NCOL</a></span><span class=\"op\">(</span><span class=\"va\">des_mat</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now simulate the species-level basis coefficients hierarchically, where</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># spatial basis function correlations are a convex sum of a base correlation</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># matrix and a species-level correlation matrix</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">basis_coefs</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"cn\">NA</span>, nrow <span class=\"op\">=</span> <span class=\"va\">N_species</span>, ncol <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NCOL</a></span><span class=\"op\">(</span><span class=\"va\">Sigma</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">base_field</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/rmvn.html\" class=\"external-link\">rmvn</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NCOL</a></span><span class=\"op\">(</span><span class=\"va\">Sigma</span><span class=\"op\">)</span><span class=\"op\">)</span>, V <span class=\"op\">=</span> <span class=\"va\">Sigma</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">for</span><span class=\"op\">(</span><span class=\"va\">t</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"va\">N_species</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">corOmega</span> <span class=\"op\">&lt;-</span> <span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/cor.html\" class=\"external-link\">cov2cor</a></span><span class=\"op\">(</span><span class=\"va\">Sigma</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">0.7</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>                 <span class=\"op\">(</span><span class=\"fl\">0.3</span> <span class=\"op\">*</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/cor.html\" class=\"external-link\">cov2cor</a></span><span class=\"op\">(</span><span class=\"fu\">random_Sigma</span><span class=\"op\">(</span>N <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NCOL</a></span><span class=\"op\">(</span><span class=\"va\">des_mat</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">basis_coefs</span><span class=\"op\">[</span><span class=\"va\">t</span>, <span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/rmvn.html\" class=\"external-link\">rmvn</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NCOL</a></span><span class=\"op\">(</span><span class=\"va\">Sigma</span><span class=\"op\">)</span><span class=\"op\">)</span>, V <span class=\"op\">=</span> <span class=\"va\">corOmega</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate the latent spatial processes</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">st_process</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/do.call.html\" class=\"external-link\">do.call</a></span><span class=\"op\">(</span><span class=\"va\">rbind</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/lapply.html\" class=\"external-link\">lapply</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq_len</a></span><span class=\"op\">(</span><span class=\"va\">N_species</span><span class=\"op\">)</span>, <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">t</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>lat <span class=\"op\">=</span> <span class=\"va\">lat</span>,</span></span>\n<span class=\"r-in\"><span>             lon <span class=\"op\">=</span> <span class=\"va\">lon</span>,</span></span>\n<span class=\"r-in\"><span>             species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'species_'</span>, <span class=\"va\">t</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             temperature <span class=\"op\">=</span> <span class=\"va\">temperature</span>,</span></span>\n<span class=\"r-in\"><span>             process <span class=\"op\">=</span> <span class=\"va\">alphas</span><span class=\"op\">[</span><span class=\"va\">t</span><span class=\"op\">]</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>               <span class=\"va\">betas</span><span class=\"op\">[</span><span class=\"va\">t</span><span class=\"op\">]</span> <span class=\"op\">*</span> <span class=\"va\">temperature</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>               <span class=\"va\">des_mat</span> <span class=\"op\"><a href=\"https://rdrr.io/r/base/matmult.html\" class=\"external-link\">%*%</a></span> <span class=\"va\">basis_coefs</span><span class=\"op\">[</span><span class=\"va\">t</span>,<span class=\"op\">]</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now take noisy observations at some of the points (60)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">obs_points</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sample.html\" class=\"external-link\">sample</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"va\">N_points</span>, size <span class=\"op\">=</span> <span class=\"fl\">60</span>, replace <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">obs_points</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>lat <span class=\"op\">=</span> <span class=\"va\">lat</span><span class=\"op\">[</span><span class=\"va\">obs_points</span><span class=\"op\">]</span>,</span></span>\n<span class=\"r-in\"><span>                         lon <span class=\"op\">=</span> <span class=\"va\">lon</span><span class=\"op\">[</span><span class=\"va\">obs_points</span><span class=\"op\">]</span>,</span></span>\n<span class=\"r-in\"><span>                         site <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">60</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Keep only the process data at these points</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">st_process</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate-joins.html\" class=\"external-link\">inner_join</a></span><span class=\"op\">(</span><span class=\"va\">obs_points</span>, by <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'lat'</span>, <span class=\"st\">'lon'</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>  <span class=\"co\"># now take noisy Poisson observations of the process</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>count <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Poisson.html\" class=\"external-link\">rpois</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">.</span><span class=\"op\">)</span>, lambda <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"va\">process</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>                                 levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'species_'</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"va\">N_species</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">group_by</a></span><span class=\"op\">(</span><span class=\"va\">lat</span>, <span class=\"va\">lon</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">dat</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># View the count distributions for each species</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://ggplot2.tidyverse.org\" class=\"external-link\">ggplot2</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></span><span class=\"op\">(</span><span class=\"va\">dat</span>, <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">count</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_histogram.html\" class=\"external-link\">geom_histogram</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/facet_wrap.html\" class=\"external-link\">facet_wrap</a></span><span class=\"op\">(</span><span class=\"op\">~</span> <span class=\"va\">species</span>, scales <span class=\"op\">=</span> <span class=\"st\">'free'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"jsdgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></span><span class=\"op\">(</span><span class=\"va\">dat</span>, <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">lon</span>, y <span class=\"op\">=</span> <span class=\"va\">lat</span>, col <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">log</a></span><span class=\"op\">(</span><span class=\"va\">count</span> <span class=\"op\">+</span> <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_point.html\" class=\"external-link\">geom_point</a></span><span class=\"op\">(</span>size <span class=\"op\">=</span> <span class=\"fl\">2.25</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/facet_wrap.html\" class=\"external-link\">facet_wrap</a></span><span class=\"op\">(</span><span class=\"op\">~</span> <span class=\"va\">species</span>, scales <span class=\"op\">=</span> <span class=\"st\">'free'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/scale_viridis.html\" class=\"external-link\">scale_color_viridis_c</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggtheme.html\" class=\"external-link\">theme_classic</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect default priors for a joint species model with three spatial factors</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">priors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"get_mvgam_priors.html\">get_mvgam_priors</a></span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">count</span> <span class=\"op\">~</span></span></span>\n<span class=\"r-in\"><span>                            <span class=\"co\"># Environmental model includes random slopes for</span></span></span>\n<span class=\"r-in\"><span>                            <span class=\"co\"># a linear effect of temperature</span></span></span>\n<span class=\"r-in\"><span>                            <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">species</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span>, by <span class=\"op\">=</span> <span class=\"va\">temperature</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>                          <span class=\"co\"># Each factor estimates a different nonlinear spatial process, using</span></span></span>\n<span class=\"r-in\"><span>                          <span class=\"co\"># 'by = trend' as in other mvgam State-Space models</span></span></span>\n<span class=\"r-in\"><span>                          factor_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></span><span class=\"op\">(</span><span class=\"va\">lon</span>, <span class=\"va\">lat</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>                          n_lv <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>                          <span class=\"co\"># The data and grouping variables</span></span></span>\n<span class=\"r-in\"><span>                          data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>                          unit <span class=\"op\">=</span> <span class=\"va\">site</span>,</span></span>\n<span class=\"r-in\"><span>                          species <span class=\"op\">=</span> <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>                          <span class=\"co\"># Poisson observations</span></span></span>\n<span class=\"r-in\"><span>                          family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>gp effects in mvgam cannot yet handle autogrouping</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> resetting all instances of 'gr = TRUE' to 'gr = FALSE'</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once per session.</span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">priors</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                            param_name param_length</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1                                         (Intercept)            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2                                   vector[1] mu_raw;            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3                       vector&lt;lower=0&gt;[1] sigma_raw;            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4 real&lt;lower=0&gt; alpha_gp_trend(lon, lat):trendtrend1;            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5 real&lt;lower=0&gt; alpha_gp_trend(lon, lat):trendtrend2;            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6 real&lt;lower=0&gt; alpha_gp_trend(lon, lat):trendtrend3;            1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                    param_info</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1                                 (Intercept)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2             s(species):temperature pop mean</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3               s(species):temperature pop sd</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4 gp(lon, lat):trendtrend1 marginal deviation</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5 gp(lon, lat):trendtrend2 marginal deviation</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6 gp(lon, lat):trendtrend3 marginal deviation</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                                          prior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1                        (Intercept) ~ student_t(3, 2.1, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2                                       mu_raw ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3                            sigma_raw ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4 alpha_gp_trend(lon, lat):trendtrend1 ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5 alpha_gp_trend(lon, lat):trendtrend2 ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6 alpha_gp_trend(lon, lat):trendtrend3 ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                            example_change new_lowerbound</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1                             (Intercept) ~ normal(0, 1);           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2                            mu_raw ~ normal(0.65, 0.15);           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3                          sigma_raw ~ exponential(0.27);           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4 alpha_gp_trend(lon, lat):trendtrend1 ~ normal(0, 0.86);           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5 alpha_gp_trend(lon, lat):trendtrend2 ~ normal(0, 0.84);           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6 alpha_gp_trend(lon, lat):trendtrend3 ~ normal(0, 0.78);           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   new_upperbound</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5           &lt;NA&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6           &lt;NA&gt;</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a JSDM that estimates hierarchical temperature responses</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and that uses three latent spatial factors</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">jsdgam</span><span class=\"op\">(</span>formula <span class=\"op\">=</span> <span class=\"va\">count</span> <span class=\"op\">~</span></span></span>\n<span class=\"r-in\"><span>                <span class=\"co\"># Environmental model includes random slopes for a</span></span></span>\n<span class=\"r-in\"><span>                <span class=\"co\"># linear effect of temperature</span></span></span>\n<span class=\"r-in\"><span>                <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">species</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span>, by <span class=\"op\">=</span> <span class=\"va\">temperature</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>              <span class=\"co\"># Each factor estimates a different nonlinear spatial process, using</span></span></span>\n<span class=\"r-in\"><span>              <span class=\"co\"># 'by = trend' as in other mvgam State-Space models</span></span></span>\n<span class=\"r-in\"><span>              factor_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></span><span class=\"op\">(</span><span class=\"va\">lon</span>, <span class=\"va\">lat</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>              n_lv <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>              <span class=\"co\"># Change default priors for fixed random effect variances and</span></span></span>\n<span class=\"r-in\"><span>              <span class=\"co\"># factor P marginal deviations to standard normal</span></span></span>\n<span class=\"r-in\"><span>              priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                               class <span class=\"op\">=</span> <span class=\"va\">sigma_raw</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                         <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                               class <span class=\"op\">=</span> <span class=\"va\">`alpha_gp_trend(lon, lat):trendtrend1`</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                         <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                               class <span class=\"op\">=</span> <span class=\"va\">`alpha_gp_trend(lon, lat):trendtrend2`</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                         <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                               class <span class=\"op\">=</span> <span class=\"va\">`alpha_gp_trend(lon, lat):trendtrend3`</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>              <span class=\"co\"># The data and the grouping variables</span></span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>              unit <span class=\"op\">=</span> <span class=\"va\">site</span>,</span></span>\n<span class=\"r-in\"><span>              species <span class=\"op\">=</span> <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>              <span class=\"co\"># Poisson observations</span></span></span>\n<span class=\"r-in\"><span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-161822fb7bd.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):      </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                                         \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> sta</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> n/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>               \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot species-level intercept estimates</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"st\">'species'</span>,</span></span>\n<span class=\"r-in\"><span>                 type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot species' hierarchical responses to temperature</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'temperature'</span>, <span class=\"st\">'species'</span>, <span class=\"st\">'species'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot posterior median estimates of the latent spatial factors</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooths'</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Or using gratia, if you have it installed</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">if</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/ns-load.html\" class=\"external-link\">requireNamespace</a></span><span class=\"op\">(</span><span class=\"st\">'gratia'</span>, quietly <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\">gratia</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://gavinsimpson.github.io/gratia/reference/draw.html\" class=\"external-link\">draw</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Calculate residual spatial correlations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">post_cors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"residual_cor.jsdgam.html\">residual_cor</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Package `corpcor` required for this function to work.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Installing package into ‘C:/Users/uqnclar2/AppData/Local/R/win-library/4.4’</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> (as ‘lib’ is unspecified)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> package ‘corpcor’ successfully unpacked and MD5 sums checked</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> The downloaded binary packages are in</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> \tC:\\Users\\uqnclar2\\AppData\\Local\\Temp\\Rtmpodm0uo\\downloaded_packages</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"index-mvgam.html\">names</a></span><span class=\"op\">(</span><span class=\"va\">post_cors</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] \"cor\"        \"cor_lower\"  \"cor_upper\"  \"sig_cor\"    \"cov\"       </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [6] \"prec\"       \"prec_lower\" \"prec_upper\" \"sig_prec\"   \"trace\"     </span>\n<span class=\"r-in\"><span><span class=\"co\"># Look at lower and upper credible interval estimates for</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># some of the estimated correlations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">post_cors</span><span class=\"op\">$</span><span class=\"va\">cor</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">]</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            species_1  species_2   species_3  species_4   species_5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_1  1.0000000  0.7570458  0.69634691  0.7576608 -0.26420750</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_2  0.7570458  1.0000000  0.19415381  0.4180474 -0.49248276</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_3  0.6963469  0.1941538  1.00000000  0.8941231 -0.07249719</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_4  0.7576608  0.4180474  0.89412308  1.0000000 -0.47278141</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_5 -0.2642075 -0.4924828 -0.07249719 -0.4727814  1.00000000</span>\n<span class=\"r-in\"><span><span class=\"va\">post_cors</span><span class=\"op\">$</span><span class=\"va\">cor_upper</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">]</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>           species_1  species_2 species_3  species_4  species_5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_1 1.0000000  0.9999387 0.9718005  0.9585023  0.1490273</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_2 0.9999387  1.0000000 0.5509244  0.7210487 -0.2036591</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_3 0.9718005  0.5509244 1.0000000  0.9754868  0.2749775</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_4 0.9585023  0.7210487 0.9754868  1.0000000 -0.1509840</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_5 0.1490273 -0.2036591 0.2749775 -0.1509840  1.0000000</span>\n<span class=\"r-in\"><span><span class=\"va\">post_cors</span><span class=\"op\">$</span><span class=\"va\">cor_lower</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">]</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            species_1   species_2  species_3   species_4  species_5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_1  1.0000000  0.43440522  0.1996586  0.35785727 -0.6422784</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_2  0.4344052  1.00000000 -0.1869907  0.04720916 -0.7303211</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_3  0.1996586 -0.18699072  1.0000000  0.74860157 -0.4280180</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_4  0.3578573  0.04720916  0.7486016  1.00000000 -0.7389906</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> species_5 -0.6422784 -0.73032110 -0.4280180 -0.73899063  1.0000000</span>\n<span class=\"r-in\"><span><span class=\"co\"># A quick and dirty plot of the posterior median correlations</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/image.html\" class=\"external-link\">image</a></span><span class=\"op\">(</span><span class=\"va\">post_cors</span><span class=\"op\">$</span><span class=\"va\">cor</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Posterior predictive checks and ELPD-LOO can ascertain model fit</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"pit_ecdf_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>         group <span class=\"op\">=</span> <span class=\"st\">\"species\"</span>, ndraws <span class=\"op\">=</span> <span class=\"fl\">100</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Computed from 1000 by 600 log-likelihood matrix.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          Estimate    SE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> elpd_loo  -2194.9  50.4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> p_loo       426.8  26.0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> looic      4389.8 100.8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ------</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE of elpd_loo is NA.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE and ESS estimates assume MCMC draws (r_eff in [0.0, 1.5]).</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Pareto k diagnostic values:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                           Count Pct.    Min. ESS</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (-Inf, 0.67]   (good)     436   72.7%   1       </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    (0.67, 1]   (bad)      136   22.7%   &lt;NA&gt;    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     (1, Inf)   (very bad)  28    4.7%   &lt;NA&gt;    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Forecast log(counts) for entire region (site value doesn't matter as long</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># as each spatial location has a different and unique site identifier);</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># note this calculation takes a few minutes because of the need to calculate</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># draws from the stochastic latent factors</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">newdata</span> <span class=\"op\">&lt;-</span> <span class=\"va\">st_process</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>species <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>                                                  levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'species_'</span>,</span></span>\n<span class=\"r-in\"><span>                                                                  <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"va\">N_species</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">group_by</a></span><span class=\"op\">(</span><span class=\"va\">lat</span>, <span class=\"va\">lon</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>site <span class=\"op\">=</span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/context.html\" class=\"external-link\">cur_group_id</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                   <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/group_by.html\" class=\"external-link\">ungroup</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">preds</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/predict.html\" class=\"external-link\">predict</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">newdata</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot the median log(count) predictions on a grid</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">newdata</span><span class=\"op\">$</span><span class=\"va\">log_count</span> <span class=\"op\">&lt;-</span> <span class=\"va\">preds</span><span class=\"op\">[</span>,<span class=\"fl\">1</span><span class=\"op\">]</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></span><span class=\"op\">(</span><span class=\"va\">newdata</span>, <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/aes.html\" class=\"external-link\">aes</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">lon</span>, y <span class=\"op\">=</span> <span class=\"va\">lat</span>, col <span class=\"op\">=</span> <span class=\"va\">log_count</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/geom_point.html\" class=\"external-link\">geom_point</a></span><span class=\"op\">(</span>size <span class=\"op\">=</span> <span class=\"fl\">1.5</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/facet_wrap.html\" class=\"external-link\">facet_wrap</a></span><span class=\"op\">(</span><span class=\"op\">~</span> <span class=\"va\">species</span>, scales <span class=\"op\">=</span> <span class=\"st\">'free'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/scale_viridis.html\" class=\"external-link\">scale_color_viridis_c</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggtheme.html\" class=\"external-link\">theme_classic</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"jsdgam-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lfo_cv.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\"><meta name=\"description\" content=\"Approximate leave-future-out cross-validation of fitted mvgam objects\"><meta property=\"og:description\" content=\"Approximate leave-future-out cross-validation of fitted mvgam objects\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Approximate leave-future-out cross-validation of fitted <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/lfo_cv.mvgam.R\" class=\"external-link\"><code>R/lfo_cv.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>lfo_cv.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Approximate leave-future-out cross-validation of fitted <span class=\"pkg\">mvgam</span> objects</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lfo_cv</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">lfo_cv</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">data</span>,</span>\n<span>  <span class=\"va\">min_t</span>,</span>\n<span>  fc_horizon <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  pareto_k_threshold <span class=\"op\">=</span> <span class=\"fl\">0.7</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> containing the model response variable and covariates\nrequired by the GAM <code>formula</code>. Should include columns:\n'series' (character or factor index of the series IDs)\n'time' (numeric index of the time point for each observation).\nAny other variables to be included in the linear predictor of <code>formula</code> must also be present</p></dd>\n\n\n<dt id=\"arg-min-t\">min_t<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-min-t\"></a></dt>\n<dd><p>Integer specifying the minimum training time required before making predictions\nfrom the data. Default is either the <code>30</code>th timepoint in the observational data,\nor whatever training time allows for at least\n<code>10</code> lfo-cv calculations, if possible.\nThis value is essentially arbitrary so it is highly recommended to change it\nto something that is more suitable to the\ndata and models being evaluated.</p></dd>\n\n\n<dt id=\"arg-fc-horizon\">fc_horizon<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fc-horizon\"></a></dt>\n<dd><p>Integer specifying the number of time steps ahead for evaluating forecasts</p></dd>\n\n\n<dt id=\"arg-pareto-k-threshold\">pareto_k_threshold<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-pareto-k-threshold\"></a></dt>\n<dd><p>Proportion specifying the threshold over which the Pareto shape parameter\nis considered unstable, triggering a model refit. Default is <code>0.7</code></p></dd>\n\n\n<dt id=\"arg-silent\">silent<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-silent\"></a></dt>\n<dd><p>Verbosity level between <code>0</code> and <code>2</code>. If <code>1</code> (the default), most of the informational\nmessages of compiler and sampler are suppressed. If <code>2</code>, even more messages are suppressed. The\nactual sampling progress is still printed. Set <code>refresh = 0</code> to turn this off as well. If using\n<code>backend = \"rstan\"</code> you can also set open_progress = FALSE to prevent opening additional\nprogress bars.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> of class <code>mvgam_lfo</code> containing the approximate ELPD scores,\nthe Pareto-k shape values and 'the specified <code>pareto_k_threshold</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Approximate leave-future-out cross-validation uses an expanding training window scheme\nto evaluate a model on its forecasting ability. The steps used in this function mirror those laid out\nin the <a href=\"https://mc-stan.org/loo/articles/loo2-lfo.html\" class=\"external-link\">lfo vignette from the <code>loo</code> package</a>,\nwritten by Paul Bürkner, Jonah Gabry, Aki Vehtari. First, we refit the model using the first <code>min_t</code>\nobservations to perform a single exact <code>fc_horizon</code>-ahead forecast step. This forecast is evaluated against\nthe <code>min_t + fc_horizon</code> out of sample observations using the Expected Log Predictive Density (ELPD).\nNext, we approximate each successive round of\nexpanding window forecasts by moving forward one step at a time <code>for i in 1:N_evaluations</code> and re-weighting\ndraws from the model's posterior predictive distribution using Pareto Smoothed\nImportance Sampling (PSIS). In each iteration <code>i</code>, PSIS weights are obtained for the next observation\nthat would have been included in the model if we had re-fit (i.e. the last observation that would have\nbeen in the training data, or <code>min_t + i</code>). If these importance ratios are stable, we consider the\napproximation adequate and use the re-weighted posterior's forecast for evaluating the next holdout\nset of testing observations (<code>(min_t + i + 1):(min_t + i + fc_horizon)</code>). At some point the\nimportance ratio variability will become too large and importance sampling will fail. This is\nindicated by the estimated shape parameter <code>k</code> of the generalized Pareto distribution\ncrossing a certain threshold <code>pareto_k_threshold</code>. Only then do we refit the model using\nall of the observations up to the time of the failure. We then restart the process and iterate forward\nuntil the next refit is triggered (Bürkner et al. 2020).</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Paul-Christian Bürkner, Jonah Gabry &amp; Aki Vehtari (2020). Approximate leave-future-out cross-validation for Bayesian time series models\nJournal of Statistical Computation and Simulation. 90:14, 2499-2523.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"forecast.mvgam.html\">forecast</a></code>, <code><a href=\"score.mvgam_forecast.html\">score</a></code>, <code><a href=\"evaluate_mvgams.html\">compare_mvgams</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate from a Poisson-AR2 model with a seasonal smooth</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">100</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>T <span class=\"op\">=</span> <span class=\"fl\">75</span>,</span></span>\n<span class=\"r-in\"><span>                n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>                prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.75</span>,</span></span>\n<span class=\"r-in\"><span>                trend_model <span class=\"op\">=</span> <span class=\"st\">'AR2'</span>,</span></span>\n<span class=\"r-in\"><span>                family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot the time series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>                 newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>                 series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"lfo_cv.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit an appropriate model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>               newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>               chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>               silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8ce74417c.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a less appropriate model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>              newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>              chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c50f947c1.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compare Discrete Ranked Probability Scores for the testing period</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod_ar2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod_rw</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">score_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_ar2</span>, score <span class=\"op\">=</span> <span class=\"st\">'drps'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">score_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"score.mvgam_forecast.html\">score</a></span><span class=\"op\">(</span><span class=\"va\">fc_rw</span>, score <span class=\"op\">=</span> <span class=\"st\">'drps'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">score_ar2</span><span class=\"op\">$</span><span class=\"va\">series_1</span><span class=\"op\">$</span><span class=\"va\">score</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 23.30538</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"va\">score_rw</span><span class=\"op\">$</span><span class=\"va\">series_1</span><span class=\"op\">$</span><span class=\"va\">score</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 758.3094</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now use approximate leave-future-out CV to compare</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># rolling forecasts; start at time point 40 to reduce</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># computational time and to ensure enough data is available</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># for estimating model parameters</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_ar2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">lfo_cv</span><span class=\"op\">(</span><span class=\"va\">mod_ar2</span>,</span></span>\n<span class=\"r-in\"><span>                 min_t <span class=\"op\">=</span> <span class=\"fl\">40</span>,</span></span>\n<span class=\"r-in\"><span>                 fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                 silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_rw</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">lfo_cv</span><span class=\"op\">(</span><span class=\"va\">mod_rw</span>,</span></span>\n<span class=\"r-in\"><span>                min_t <span class=\"op\">=</span> <span class=\"fl\">40</span>,</span></span>\n<span class=\"r-in\"><span>                fc_horizon <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>                silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot Pareto-K values and ELPD estimates</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">lfo_ar2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"lfo_cv.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">lfo_rw</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"lfo_cv.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Proportion of timepoints in which AR2 model gives better forecasts</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"op\">(</span><span class=\"va\">lfo_ar2</span><span class=\"op\">$</span><span class=\"va\">elpds</span> <span class=\"op\">-</span> <span class=\"va\">lfo_rw</span><span class=\"op\">$</span><span class=\"va\">elpds</span><span class=\"op\">)</span> <span class=\"op\">&gt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">/</span></span></span>\n<span class=\"r-in\"><span>      <span class=\"fu\"><a href=\"https://rdrr.io/r/base/length.html\" class=\"external-link\">length</a></span><span class=\"op\">(</span><span class=\"va\">lfo_ar2</span><span class=\"op\">$</span><span class=\"va\">elpds</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 1</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># A higher total ELPD is preferred</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_ar2</span><span class=\"op\">$</span><span class=\"va\">sum_ELPD</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] -77.51777</span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_rw</span><span class=\"op\">$</span><span class=\"va\">sum_ELPD</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] -95.0276</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/logLik.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam\"><meta name=\"description\" content=\"Compute pointwise Log-Likelihoods from fitted mvgam objects\"><meta property=\"og:description\" content=\"Compute pointwise Log-Likelihoods from fitted mvgam objects\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Compute pointwise Log-Likelihoods from fitted <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/logLik.mvgam.R\" class=\"external-link\"><code>R/logLik.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>logLik.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute pointwise Log-Likelihoods from fitted <span class=\"pkg\">mvgam</span> objects</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/logLik.html\" class=\"external-link\">logLik</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">linpreds</span>, <span class=\"va\">newdata</span>, <span class=\"va\">family_pars</span>, include_forecast <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> or <code>jsdgam</code></p></dd>\n\n\n<dt id=\"arg-linpreds\">linpreds<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-linpreds\"></a></dt>\n<dd><p>Optional <code>matrix</code> of linear predictor draws to use for calculating\npointwise log-likelihoods</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>data.frame</code> or <code>list</code> object specifying which series each column\nin <code>linpreds</code> belongs to. If <code>linpreds</code> is supplied, then <code>newdata</code> must also be supplied</p></dd>\n\n\n<dt id=\"arg-family-pars\">family_pars<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-family-pars\"></a></dt>\n<dd><p>Optional <code>list</code> containing posterior draws of\nfamily-specific parameters (i.e. shape, scale or overdispersion parameters). Required if\n<code>linpreds</code> and <code>newdata</code> are supplied</p></dd>\n\n\n<dt id=\"arg-include-forecast\">include_forecast<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-include-forecast\"></a></dt>\n<dd><p>Logical. If <code>newdata</code> were fed to the model to compute\nforecasts, should the log-likelihood draws for these observations also be returned.\nDefaults to <code>TRUE</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>matrix</code> of dimension <code>n_samples x n_observations</code> containing the pointwise\nlog-likelihood draws for all observations in <code>newdata</code>. If no <code>newdata</code> is supplied,\nlog-likelihood draws are returned for all observations that were originally fed to\nthe model (training observations and, if supplied to the\noriginal model via the <code>newdata</code> argument in <code><a href=\"mvgam.html\">mvgam</a></code>,\ntesting observations)</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data and fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c3a1511b1.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract logLikelihood values</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">lls</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/logLik.html\" class=\"external-link\">logLik</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">lls</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  num [1:1000, 1:75] -0.263 -0.125 -0.205 -0.192 -0.318 ...</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/loo.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>LOO information criteria for mvgam models — loo.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"LOO information criteria for mvgam models — loo.mvgam\"><meta name=\"description\" content=\"Extract the LOOIC (leave-one-out information criterion) using\nloo::loo()\"><meta property=\"og:description\" content=\"Extract the LOOIC (leave-one-out information criterion) using\nloo::loo()\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>LOO information criteria for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/loo.mvgam.R\" class=\"external-link\"><code>R/loo.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>loo.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Extract the LOOIC (leave-one-out information criterion) using\n<code><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo::loo()</a></code></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, incl_dynamics <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo_compare.html\" class=\"external-link\">loo_compare</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span>, model_names <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, incl_dynamics <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>Object of class <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-incl-dynamics\">incl_dynamics<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-incl-dynamics\"></a></dt>\n<dd><p>Logical; indicates if any latent dynamic structures that\nwere included in the model should be considered when calculating in-sample\nlog-likelihoods. Defaults to <code>TRUE</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>More <code>mvgam</code> objects.</p></dd>\n\n\n<dt id=\"arg-model-names\">model_names<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-model-names\"></a></dt>\n<dd><p>If <code>NULL</code> (the default) will use model names derived\nfrom deparsing the call. Otherwise will use the passed values as model names.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>for <code>loo.mvgam</code>, an object of class <code>psis_loo</code> (see <code><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo::loo()</a></code>\nfor details). For <code>loo_compare.mvgam</code>, an object of class <code>compare.loo</code> (\n<code><a href=\"https://mc-stan.org/loo/reference/loo_compare.html\" class=\"external-link\">loo::loo_compare()</a></code> for details)</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>When comparing two (or more) fitted <code>mvgam</code> models, we can estimate the\ndifference in their in-sample predictive accuracies using the Expcted Log Predictive\nDensity (ELPD). This metric can be approximated using Pareto Smoothed Importance Sampling, which\nis a method to re-weight posterior draws to approximate what predictions the models might have\nmade for a given datapoint had that datapoint not been included in the original model fit (i.e.\nif we were to run a leave-one-out cross-validation and then made a prediction for the held-out\ndatapoint). See details from <code><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo::loo()</a></code> and <code><a href=\"https://mc-stan.org/loo/reference/loo_compare.html\" class=\"external-link\">loo::loo_compare()</a></code> for further information\non how this importance sampling works.</p>\n<p>There are two fundamentally different ways to calculate ELPD from <code>mvgam</code> models that included\ndynamic latent processes (i.e. \"trend_models\"). The first is to use the predictions that were\ngenerated when estimating these latent processes by setting <code>incl_dynamics = TRUE</code>. This works\nin the same way that setting <code>incl_autocor = TRUE</code> in <code><a href=\"https://paulbuerkner.com/brms/reference/prepare_predictions.html\" class=\"external-link\">brms::prepare_predictions()</a></code>. But it may\nalso be desirable to compare predictions by considering that the dynamic processes are nuisance\nparameters that we'd wish to account for when making inferences about other processes in the\nmodel (i.e. the linear predictor effects). Setting <code>incl_dynamics = FALSE</code> will accomplish\nthis by ignoring the dynamic processes when making predictions. This option matches up with\nwhat <code>mvgam</code>'s prediction functions return (i.e. <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code>, <code><a href=\"ppc.mvgam.html\">ppc</a></code>,\n<code><a href=\"pp_check.mvgam.html\">pp_check.mvgam</a></code>, <code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code>) and will be far less forgiving\nof models that may be overfitting the training data due to highly flexible dynamic processes\n(such as Random Walks, for example). However setting <code>incl_dynamics = FALSE</code> will often result\nin less stable Pareto k diagnostics for models with dynamic trends, making ELPD comparisons\ndifficult and unstable. It is therefore recommended to generally stick with\n<code>incl_dynamics = TRUE</code> when comparing models based on in-sample fits, and then to perhaps use\nforecast evaluations for further scrutiny of models (see for example <code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code>,\n<code><a href=\"score.mvgam_forecast.html\">score.mvgam_forecast</a></code> and <code><a href=\"lfo_cv.mvgam.html\">lfo_cv</a></code>)</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate 4 time series with hierarchical seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and independent AR1 dynamic processes</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">111</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>seasonality <span class=\"op\">=</span> <span class=\"st\">'hierarchical'</span>,</span></span>\n<span class=\"r-in\"><span>                   trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                   family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model with shared seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">rbind</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c31b655b3.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect the model and calculate LOO</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"loo.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"va\">mc.cores.def</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">getOption</a></span><span class=\"op\">(</span><span class=\"st\">'mc.cores'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></span><span class=\"op\">(</span>mc.cores <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Computed from 1000 by 300 log-likelihood matrix.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          Estimate   SE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> elpd_loo   -363.7 11.1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> p_loo         6.9  0.5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> looic       727.4 22.2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ------</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE of elpd_loo is 0.1.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE and ESS estimates assume MCMC draws (r_eff in [0.8, 2.1]).</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> All Pareto k estimates are good (k &lt; 0.67).</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now fit a model with hierarchical seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/update.html\" class=\"external-link\">update</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>,</span></span>\n<span class=\"r-in\"><span>              formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, <span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'fs'</span>,</span></span>\n<span class=\"r-in\"><span>              xt <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>, k <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c98114fa.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"loo.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"loo.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Computed from 1000 by 300 log-likelihood matrix.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          Estimate   SE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> elpd_loo   -308.9 11.4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> p_loo        12.4  1.0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> looic       617.7 22.7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ------</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE of elpd_loo is 0.1.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE and ESS estimates assume MCMC draws (r_eff in [0.8, 1.3]).</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> All Pareto k estimates are good (k &lt; 0.67).</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now add AR1 dynamic errors to mod2</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod3</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/update.html\" class=\"external-link\">update</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>,</span></span>\n<span class=\"r-in\"><span>              trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>              silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c14563ad8.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"loo.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"loo.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod3</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"loo.mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></span><span class=\"op\">(</span><span class=\"va\">mod3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Computed from 1000 by 300 log-likelihood matrix.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          Estimate   SE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> elpd_loo   -235.3  9.5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> p_loo       181.9  7.2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> looic       470.7 19.1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ------</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE of elpd_loo is NA.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE and ESS estimates assume MCMC draws (r_eff in [0.0, 0.1]).</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Pareto k diagnostic values:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                           Count Pct.    Min. ESS</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (-Inf, 0.67]   (good)     152   50.7%   1       </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    (0.67, 1]   (bad)      137   45.7%   &lt;NA&gt;    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     (1, Inf)   (very bad)  11    3.7%   &lt;NA&gt;    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compare models using LOO</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo_compare.html\" class=\"external-link\">loo_compare</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, <span class=\"va\">mod2</span>, <span class=\"va\">mod3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      elpd_diff se_diff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> mod3    0.0       0.0 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> mod2  -73.5       5.1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> mod1 -128.3       9.6 </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></span><span class=\"op\">(</span>mc.cores <span class=\"op\">=</span> <span class=\"va\">mc.cores.def</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compare forecast abilities using an expanding training window and</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># forecasting ahead 1 timepoint from each window; the first window by includes</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># the first 92 timepoints (of the 100 that were simulated)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span><span class=\"op\">$</span><span class=\"va\">obs_data</span><span class=\"op\">$</span><span class=\"va\">time</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 100</span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"lfo_cv.mvgam.html\">lfo_cv</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>, min_t <span class=\"op\">=</span> <span class=\"fl\">92</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c74ae7191.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 1.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 1.1 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 1.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 1.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"va\">lfo_mod3</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"lfo_cv.mvgam.html\">lfo_cv</a></span><span class=\"op\">(</span><span class=\"va\">mod3</span>, min_t <span class=\"op\">=</span> <span class=\"fl\">92</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c18c31528.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 16.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 16.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 16.6 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 17.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 7.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 16.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 12.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 17.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 8.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 16.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 12.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 16.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 10.1 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 29.7 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 19.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 29.7 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Take the difference in forecast ELPDs; a model with higher ELPD is preferred,</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># so negative values here indicate that mod3 gave better forecasts for a particular</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># out of sample timepoint</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">lfo_mod2</span><span class=\"op\">$</span><span class=\"va\">elpds</span> <span class=\"op\">-</span> <span class=\"va\">lfo_mod3</span><span class=\"op\">$</span><span class=\"va\">elpds</span>,</span></span>\n<span class=\"r-in\"><span>    x <span class=\"op\">=</span> <span class=\"va\">lfo_mod2</span><span class=\"op\">$</span><span class=\"va\">eval_timepoints</span>, pch <span class=\"op\">=</span> <span class=\"fl\">16</span>,</span></span>\n<span class=\"r-in\"><span>    ylab <span class=\"op\">=</span> <span class=\"st\">'ELPD_mod2 - ELPD_mod3'</span>,</span></span>\n<span class=\"r-in\"><span>    xlab <span class=\"op\">=</span> <span class=\"st\">'Evaluation timepoint'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>h <span class=\"op\">=</span> <span class=\"fl\">0</span>, lty <span class=\"op\">=</span> <span class=\"st\">'dashed'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"loo.mvgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lv_correlations.html",
    "content": "<!DOCTYPE html>\r\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Calculate trend correlations based on latent factor loadings for mvgam models — lv_correlations • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Calculate trend correlations based on latent factor loadings for mvgam models — lv_correlations\"><meta name=\"description\" content=\"This function uses samples of latent trends for each series from a fitted\r\nmvgam model to calculates correlations among series' trends\"><meta property=\"og:description\" content=\"This function uses samples of latent trends for each series from a fitted\r\nmvgam model to calculates correlations among series' trends\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\r\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\r\n\r\n\r\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\r\n\r\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\r\n\r\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\r\n\r\n\r\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n      <span class=\"navbar-toggler-icon\"></span>\r\n    </button>\r\n\r\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\r\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\r\n<li class=\"nav-item dropdown\">\r\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\r\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\r\n  </ul></li>\r\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\r\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\r\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\r\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\r\n      </ul></div>\r\n\r\n\r\n  </div>\r\n</nav><div class=\"container template-reference-topic\">\r\n<div class=\"row\">\r\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\r\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Calculate trend correlations based on latent factor loadings for <span class=\"pkg\">mvgam</span> models</h1>\r\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/lv_correlations.R\" class=\"external-link\"><code>R/lv_correlations.R</code></a></small>\r\n      <div class=\"d-none name\"><code>lv_correlations.Rd</code></div>\r\n    </div>\r\n\r\n    <div class=\"ref-description section level2\">\r\n    <p>This function uses samples of latent trends for each series from a fitted\r\nmvgam model to calculates correlations among series' trends</p>\r\n    </div>\r\n\r\n    <div class=\"section level2\">\r\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\r\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lv_correlations</span><span class=\"op\">(</span><span class=\"va\">object</span><span class=\"op\">)</span></span></code></pre></div>\r\n    </div>\r\n\r\n    <div class=\"section level2\">\r\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\r\n\r\n\r\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\r\n<dd><p><code>list</code> object of class <code>mvgam</code></p></dd>\r\n\r\n</dl></div>\r\n    <div class=\"section level2\">\r\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\r\n    <p>A <code>list</code> object containing the mean posterior correlations\r\nand the full array of posterior correlations</p>\r\n    </div>\r\n\r\n    <div class=\"section level2\">\r\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\r\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\r\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>,</span></span>\r\n<span class=\"r-in\"><span>                  k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\r\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\r\n<span class=\"r-in\"><span>            use_lv <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\r\n<span class=\"r-in\"><span>            n_lv <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\r\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\r\n<span class=\"r-in\"><span>            burnin <span class=\"op\">=</span> <span class=\"fl\">300</span>,</span></span>\r\n<span class=\"r-in\"><span>            samples <span class=\"op\">=</span> <span class=\"fl\">300</span>,</span></span>\r\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\r\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Warning in 'C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model_0f5e123adc47a9208b1c8eaa9e58906b.stan', line 23, column 31: Found\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     int division:\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       n_lv * (n_lv - 1) / 2\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     Values will be rounded towards zero. If rounding is not desired you can\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     write\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     the division as\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       n_lv * (n_lv - 1) / 2.0\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     If rounding is intended please use the integer division operator %/%.\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Warning in 'C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c633b5a5b.stan', line 23, column 33: Found\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     int division:\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       n_lv * (n_lv - 1) / 2\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     Values will be rounded towards zero. If rounding is not desired you can\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     write\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     the division as\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       n_lv * (n_lv - 1) / 2.0\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     If rounding is intended please use the integer division operator %/%.\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c633b5a5b.hpp:2:</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\r\n<span class=\"r-in\"><span><span class=\"va\">lvcors</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">lv_correlations</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"index-mvgam.html\">names</a></span><span class=\"op\">(</span><span class=\"va\">lvcors</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"mean_correlations\"      \"posterior_correlations\"</span>\r\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/lapply.html\" class=\"external-link\">lapply</a></span><span class=\"op\">(</span><span class=\"va\">lvcors</span>, <span class=\"va\">class</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $mean_correlations</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"matrix\" \"array\" </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $posterior_correlations</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"list\"</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\r\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\r\n</code></pre></div>\r\n    </div>\r\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\r\n    </nav></aside></div>\r\n\r\n\r\n    <footer><div class=\"pkgdown-footer-left\">\r\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\r\n</div>\r\n\r\n<div class=\"pkgdown-footer-right\">\r\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\r\n</div>\r\n\r\n    </footer></div>\r\n\r\n\r\n\r\n\r\n\r\n  </body></html>\r\n\r\n"
  },
  {
    "path": "docs/reference/mcmc_plot.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>MCMC plots of mvgam parameters, as implemented in bayesplot — mcmc_plot.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"MCMC plots of mvgam parameters, as implemented in bayesplot — mcmc_plot.mvgam\"><meta name=\"description\" content=\"Convenient way to call MCMC plotting functions\nimplemented in the bayesplot package for mvgam models\"><meta property=\"og:description\" content=\"Convenient way to call MCMC plotting functions\nimplemented in the bayesplot package for mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>MCMC plots of <span class=\"pkg\">mvgam</span> parameters, as implemented in <span class=\"pkg\">bayesplot</span></h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mcmc_plot.mvgam.R\" class=\"external-link\"><code>R/mcmc_plot.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>mcmc_plot.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Convenient way to call MCMC plotting functions\nimplemented in the <span class=\"pkg\">bayesplot</span> package for <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  type <span class=\"op\">=</span> <span class=\"st\">\"intervals\"</span>,</span>\n<span>  variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>An <span style=\"R\">R</span> object typically of class <code>brmsfit</code></p></dd>\n\n\n<dt id=\"arg-type\">type<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-type\"></a></dt>\n<dd><p>The type of the plot.\nSupported types are (as names) <code>hist</code>, <code>dens</code>,\n<code>hist_by_chain</code>, <code>dens_overlay</code>,\n<code>violin</code>, <code>intervals</code>, <code>areas</code>,\n<code>areas_ridges</code>, <code>combo</code>, <code>acf</code>,\n<code>acf_bar</code>, <code>trace</code>, <code>trace_highlight</code>,\n<code>scatter</code>, <code>hex</code>, <code>pairs</code>, <code>violin</code>,\n<code>rhat</code>, <code>rhat_hist</code>, <code>neff</code>, <code>neff_hist</code>\nand <code>nuts_energy</code>.\nFor an overview on the various plot types see\n<code><a href=\"https://mc-stan.org/bayesplot/reference/MCMC-overview.html\" class=\"external-link\">MCMC-overview</a></code>.</p></dd>\n\n\n<dt id=\"arg-variable\">variable<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-variable\"></a></dt>\n<dd><p>Names of the variables (parameters) to plot, as given by a\ncharacter vector or a regular expression (if <code>regex = TRUE</code>). By\ndefault, a hopefully not too large selection of variables is plotted.</p></dd>\n\n\n<dt id=\"arg-regex\">regex<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-regex\"></a></dt>\n<dd><p>Logical; Indicates whether <code>variable</code> should\nbe treated as regular expressions. Defaults to <code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg-use-alias\">use_alias<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-use-alias\"></a></dt>\n<dd><p>Logical. If more informative names for parameters are available\n(i.e. for beta coefficients <code>b</code> or for smoothing parameters <code>rho</code>), replace the uninformative\nnames with the more informative alias. Defaults to <code>TRUE</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Additional arguments passed to the plotting functions.\nSee <code><a href=\"https://mc-stan.org/bayesplot/reference/MCMC-overview.html\" class=\"external-link\">MCMC-overview</a></code> for\nmore details.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></code> object\nthat can be further customized using the <span class=\"pkg\">ggplot2</span> package.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"mvgam_draws.html\">mvgam_draws</a></code> for an overview of some of the shortcut strings\nthat can be used for argument <code>variable</code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mcmc_plot.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'neff_hist'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"mcmc_plot.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'betas'</span>, type <span class=\"op\">=</span> <span class=\"st\">'areas'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mcmc_plot.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'trend_params'</span>, type <span class=\"op\">=</span> <span class=\"st\">'combo'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mcmc_plot.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/model.frame.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Extract model.frame from a fitted mvgam object — model.frame.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract model.frame from a fitted mvgam object — model.frame.mvgam\"><meta name=\"description\" content=\"Extract model.frame from a fitted mvgam object\"><meta property=\"og:description\" content=\"Extract model.frame from a fitted mvgam object\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract model.frame from a fitted <span class=\"pkg\">mvgam</span> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/model.frame.mvgam.R\" class=\"external-link\"><code>R/model.frame.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>model.frame.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Extract model.frame from a fitted <span class=\"pkg\">mvgam</span> object</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/model.frame.html\" class=\"external-link\">model.frame</a></span><span class=\"op\">(</span><span class=\"va\">formula</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_prefit'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/model.frame.html\" class=\"external-link\">model.frame</a></span><span class=\"op\">(</span><span class=\"va\">formula</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-formula\">formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-formula\"></a></dt>\n<dd><p>a model <code><a href=\"https://rdrr.io/r/stats/formula.html\" class=\"external-link\">formula</a></code> or <code><a href=\"https://rdrr.io/r/stats/terms.html\" class=\"external-link\">terms</a></code>\n    object or an <span style=\"R\">R</span> object.</p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p><code>logical</code>, return the model.frame from the\nobservation model (if <code>FALSE</code>) or from the underlying process\nmodel (if<code>TRUE</code>)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>matrix</code> containing the fitted model frame</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/monotonic.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Monotonic splines in mvgam models — monotonic • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Monotonic splines in mvgam models — monotonic\"><meta name=\"description\" content=\"Uses constructors from package splines2 to build monotonically increasing\nor decreasing splines. Details also in Wang &amp;amp; Yan (2021).\"><meta property=\"og:description\" content=\"Uses constructors from package splines2 to build monotonically increasing\nor decreasing splines. Details also in Wang &amp;amp; Yan (2021).\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Monotonic splines in <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/monotonic.R\" class=\"external-link\"><code>R/monotonic.R</code></a></small>\n      <div class=\"d-none name\"><code>monotonic.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Uses constructors from package <span class=\"pkg\">splines2</span> to build monotonically increasing\nor decreasing splines. Details also in Wang &amp; Yan (2021).</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'moi.smooth.spec'</span></span>\n<span><span class=\"fu\">smooth.construct</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">data</span>, <span class=\"va\">knots</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mod.smooth.spec'</span></span>\n<span><span class=\"fu\">smooth.construct</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">data</span>, <span class=\"va\">knots</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'moi.smooth'</span></span>\n<span><span class=\"fu\">Predict.matrix</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">data</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mod.smooth'</span></span>\n<span><span class=\"fu\">Predict.matrix</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">data</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>A smooth specification object, usually generated by a term\n<code>s(x, bs = \"moi\", ...)</code> or <code>s(x, bs = \"mod\", ...)</code></p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>a list containing just the data (including any <code>by</code> variable) required by this term,\n            with names corresponding to <code>object$term</code> (and <code>object$by</code>). The <code>by</code> variable\n            is the last element.</p></dd>\n\n\n<dt id=\"arg-knots\">knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-knots\"></a></dt>\n<dd><p>a list containing any knots supplied for basis setup — in same order and with same names as <code>data</code>.\n             Can be <code>NULL</code>. See details for further information.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>\"moi.smooth\"</code> or <code>\"mod.smooth\"</code>. In addition to\nthe usual elements of a smooth class documented under <code><a href=\"https://rdrr.io/pkg/mgcv/man/smooth.construct.html\" class=\"external-link\">smooth.construct</a></code>,\nthis object will contain a slot called <code>boundary</code> that defines the endpoints beyond\nwhich the spline will begin extrapolating (extrapolation is flat due to the first\norder penalty placed on the smooth function)</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>The constructor is not normally called directly,\nbut is rather used internally by <a href=\"mvgam.html\">mvgam</a>. If they are not supplied then the\nknots of the spline are placed evenly throughout the covariate values to\nwhich the term refers: For example, if fitting 101 data with an 11\nknot spline of x then there would be a knot at every 10th (ordered) x value.\nThe spline is an implementation of the closed-form I-spline basis based\non the recursion formula given by Ramsay (1988), in which the basis coefficients\nmust be constrained to either be non-negative (for monotonically increasing\nfunctions) or non-positive (monotonically decreasing)\n<br><br>\nTake note that when using either monotonic basis, the number of basis functions\n<code>k</code> must be supplied as an even integer due to the manner in\nwhich monotonic basis functions are constructed</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"note\">Note<a class=\"anchor\" aria-label=\"anchor\" href=\"#note\"></a></h2>\n    <p>This constructor will result in a valid smooth if using a call to\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code> or <code><a href=\"https://rdrr.io/pkg/mgcv/man/bam.html\" class=\"external-link\">bam</a></code>, however the resulting\nfunctions will not be guaranteed to be monotonic because constraints on\nbasis coefficients will not be enforced</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Wang, Wenjie, and Jun Yan. \"Shape-Restricted Regression Splines with R Package splines2.\"\nJournal of Data Science 19.3 (2021).\n<br><br>\nRamsay, J. O. (1988). Monotone regression splines in action. Statistical Science, 3(4), 425–441.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate data from a monotonically increasing function</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">123123</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">80</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">4</span> <span class=\"op\">-</span> <span class=\"fl\">1</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">f</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"fl\">4</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"op\">/</span> <span class=\"op\">(</span><span class=\"fl\">1</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"fl\">4</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">y</span> <span class=\"op\">&lt;-</span> <span class=\"va\">f</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">80</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">0.1</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># A standard TRPS smooth doesn't capture monotonicity</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\">mgcv</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘mgcv’ was built under R version 4.3.3</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Loading required package: nlme</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘nlme’ was built under R version 4.3.3</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> This is mgcv 1.9-1. For overview type 'help(\"mgcv-package\")'.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Attaching package: ‘mgcv’</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> The following objects are masked from ‘package:mvgam’:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     betar, nb</span>\n<span class=\"r-in\"><span><span class=\"va\">mod_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">y</span>, x <span class=\"op\">=</span> <span class=\"va\">x</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, k <span class=\"op\">=</span> <span class=\"fl\">16</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>           data <span class=\"op\">=</span> <span class=\"va\">mod_data</span>,</span></span>\n<span class=\"r-in\"><span>           family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://marginaleffects.com/\" class=\"external-link\">marginaleffects</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘marginaleffects’ was built under R version 4.3.3</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Please cite the software developers who make your work possible.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> One package:             citation(\"package_name\")</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> All project packages:    softbib::softbib()</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>                 by <span class=\"op\">=</span> <span class=\"st\">'x'</span>,</span></span>\n<span class=\"r-in\"><span>                 newdata <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">min</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>                                              <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>                                              length.out <span class=\"op\">=</span> <span class=\"fl\">100</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 points <span class=\"op\">=</span> <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Using the 'moi' basis in mvgam rectifies this</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_data</span><span class=\"op\">$</span><span class=\"va\">time</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">mod_data</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, bs <span class=\"op\">=</span> <span class=\"st\">'moi'</span>, k <span class=\"op\">=</span> <span class=\"fl\">18</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">mod_data</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c66f12eaa.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>,</span></span>\n<span class=\"r-in\"><span>                 by <span class=\"op\">=</span> <span class=\"st\">'x'</span>,</span></span>\n<span class=\"r-in\"><span>                 newdata <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">min</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"op\">-</span> <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>                                              <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>                                              length.out <span class=\"op\">=</span> <span class=\"fl\">100</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 points <span class=\"op\">=</span> <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod2</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooth'</span>, realisations <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># 'by' terms that produce a different smooth for each level of the 'by'</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># factor are also allowed</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">123123</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">80</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">4</span> <span class=\"op\">-</span> <span class=\"fl\">1</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Two different monotonic smooths, one for each factor level</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">f</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"fl\">4</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"op\">/</span> <span class=\"op\">(</span><span class=\"fl\">1</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"fl\">4</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">f2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"fl\">3.5</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"op\">/</span> <span class=\"op\">(</span><span class=\"fl\">1</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Log.html\" class=\"external-link\">exp</a></span><span class=\"op\">(</span><span class=\"fl\">3</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fac</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"st\">'a'</span>, <span class=\"fl\">80</span><span class=\"op\">)</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"st\">'b'</span>, <span class=\"fl\">80</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">y</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"va\">f</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">80</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">0.1</span>,</span></span>\n<span class=\"r-in\"><span>       <span class=\"va\">f2</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">80</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">0.2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">80</span><span class=\"op\">]</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">[</span><span class=\"fl\">81</span><span class=\"op\">:</span><span class=\"fl\">160</span><span class=\"op\">]</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Gather all data into a data.frame, including the factor 'by' variable</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"va\">x</span>, fac <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">fac</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_data</span><span class=\"op\">$</span><span class=\"va\">time</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">mod_data</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model with different smooths per factor level</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, bs <span class=\"op\">=</span> <span class=\"st\">'moi'</span>, by <span class=\"op\">=</span> <span class=\"va\">fac</span>, k <span class=\"op\">=</span> <span class=\"fl\">8</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">mod_data</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c1ab9404d.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Visualise the different monotonic functions</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'x'</span>, <span class=\"st\">'fac'</span>, <span class=\"st\">'fac'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 points <span class=\"op\">=</span> <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooth'</span>, realisations <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"monotonic-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># First derivatives (on the link scale) should never be</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># negative for either factor level</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">(</span><span class=\"va\">derivs</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/slopes.html\" class=\"external-link\">slopes</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variables <span class=\"op\">=</span> <span class=\"st\">'x'</span>,</span></span>\n<span class=\"r-in\"><span>                 by <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'x'</span>, <span class=\"st\">'fac'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                 type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       x fac Estimate  2.5 % 97.5 %</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  -0.987   a    0.338 0.1067  0.856</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  -0.987   b    0.202 0.0298  0.690</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  -0.841   a    0.520 0.3206  0.787</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  -0.841   b    0.301 0.1358  0.584</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  -0.796   a    0.557 0.3633  0.795</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> --- 150 rows omitted. See ?print.marginaleffects --- </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   2.853   b    3.029 1.2324  4.742</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   2.870   a    0.227 0.0251  1.010</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   2.870   b    3.165 1.0940  5.140</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   2.879   a    0.229 0.0240  1.054</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   2.879   b    3.236 0.9982  5.321</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Term: x</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Type:  link </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Comparison: dY/dX</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/all.html\" class=\"external-link\">all</a></span><span class=\"op\">(</span><span class=\"va\">derivs</span><span class=\"op\">$</span><span class=\"va\">estimate</span> <span class=\"op\">&gt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] TRUE</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam-class.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content='A fitted mvgam object returned by function mvgam.\nRun methods(class = \"mvgam\") to see an overview of available methods.'><title>Fitted mvgam object description — mvgam-class • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Fitted mvgam object description — mvgam-class\"><meta property=\"og:description\" content='A fitted mvgam object returned by function mvgam.\nRun methods(class = \"mvgam\") to see an overview of available methods.'><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.3</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Fitted <code>mvgam</code> object description</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam-class.R\" class=\"external-link\"><code>R/mvgam-class.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam-class.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>A fitted <code>mvgam</code> object returned by function <code><a href=\"mvgam.html\">mvgam</a></code>.\nRun <code>methods(class = \"mvgam\")</code> to see an overview of available methods.</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A <code>mvgam</code> object contains the following elements:</p><ul><li><p><code>call</code> the original observation model formula</p></li>\n<li><p><code>trend_call</code> If a <code>trend_formula was supplied</code>, the original trend model formula is\nreturned. Otherwise <code>NULL</code></p></li>\n<li><p><code>family</code> <code>character</code> description of the observation distribution</p></li>\n<li><p><code>trend_model</code> <code>character</code> description of the latent trend model</p></li>\n<li><p><code>trend_map</code> <code>data.frame</code> describing the mapping of trend states to\nobservations, if supplied in the original model. Otherwise <code>NULL</code></p></li>\n<li><p><code>drift</code> Logical specifying whether a drift term was used in the trend model</p></li>\n<li><p><code>priors</code> If the model priors were updated from their defaults, the prior <code>dataframe</code>\nwill be returned. Otherwise <code>NULL</code></p></li>\n<li><p><code>model_output</code> The <code>MCMC</code> object returned by the fitting engine. If the model was fitted\nusing <code>Stan</code>, this will be an object of class <code>stanfit</code> (see <code><a href=\"https://mc-stan.org/rstan/reference/stanfit-class.html\" class=\"external-link\">stanfit-class</a></code> for details).\nIf <code>JAGS</code> was used as the backend, this will be an object of class <code>runjags</code>\n(see <code><a href=\"https://rdrr.io/pkg/runjags/man/runjags-class.html\" class=\"external-link\">runjags-class</a></code> for details)</p></li>\n<li><p><code>model_file</code> The <code>character</code> string model file used to describe the model in either\n<code>Stan</code> or <code>JAGS</code> syntax</p></li>\n<li><p><code>model_data</code> If <code>return_model_data</code> was set to <code>TRUE</code> when fitting the model, the <code>list</code> object\ncontaining all data objects needed to condition the model is returned. Each item in the <code>list</code> is described\nin detail at the top of the <code>model_file</code>. Otherwise <code>NULL</code></p></li>\n<li><p><code>inits</code> If <code>return_model_data</code> was set to <code>TRUE</code> when fitting the model, the initial value\nfunctions used to initialise the MCMC chains will be returned. Otherwise <code>NULL</code></p></li>\n<li><p><code>monitor_pars</code> The parameters\nthat were monitored during MCMC sampling are returned as a <code>character vector</code></p></li>\n<li><p><code>sp_names</code> A <code>character vector</code> specifying the names for each smoothing parameter</p></li>\n<li><p><code>mgcv_model</code> An object of class <code>gam</code> containing the <code>mgcv</code> version of the observation model.\nThis object is used for generating the linear predictor matrix when making predictions for new data. The\ncoefficients in this model object will contain the posterior median coefficients from the GAM linear predictor,\nbut these are only used if generating plots of smooth functions that <code>mvgam</code> currently cannot handle\n(such as plots for three-dimensional smooths). This model therefore should not be used for inference.\nSee <code><a href=\"https://rdrr.io/pkg/mgcv/man/gamObject.html\" class=\"external-link\">gamObject</a></code> for details</p></li>\n<li><p><code>trend_mgcv_model</code> If a <code>trend_formula was supplied</code>, an object of class <code>gam</code> containing\nthe <code>mgcv</code> version of the trend model. Otherwise <code>NULL</code></p></li>\n<li><p><code>ytimes</code> The <code>matrix</code> object used in model fitting for indexing which series and timepoints\nwere observed in each row of the supplied data. Used internally by some downstream plotting\nand prediction functions</p></li>\n<li><p><code>resids</code> A named <code>list</code> object containing posterior draws of Dunn-Smyth\nrandomized quantile residuals</p></li>\n<li><p><code>use_lv</code> Logical flag indicating whether latent dynamic factors were used in the model</p></li>\n<li><p><code>n_lv</code> If <code>use_lv == TRUE</code>, the number of latent dynamic factors used in the model</p></li>\n<li><p><code>upper_bounds</code> If bounds were supplied in the original model fit, they will be returned.\nOtherwise <code>NULL</code></p></li>\n<li><p><code>obs_data</code> The original data object (either a <code>list</code> or <code>dataframe</code>) supplied in model\nfitting.</p></li>\n<li><p><code>test_data</code> If test data were supplied (as argument <code>newdata</code> in the original model), it\nwill be returned. Othwerise <code>NULL</code></p></li>\n<li><p><code>fit_engine</code> <code>Character</code> describing the fit engine, either as <code>stan</code> or <code>jags</code></p></li>\n<li><p><code>backend</code> <code>Character</code> describing the backend used for modelling, either as <code>rstan</code>, <code>cmdstanr</code> or <code>rjags</code></p></li>\n<li><p><code>algorithm</code> <code>Character</code> describing the algorithm used for finding the posterior,\neither as <code>sampling</code>, <code>laplace</code>, <code>pathfinder</code>, <code>meanfield</code> or <code>fullrank</code></p></li>\n<li><p><code>max_treedepth</code> If the model was fitted using <code>Stan</code>, the value supplied for the maximum\ntreedepth tuning parameter is returned (see <code><a href=\"https://mc-stan.org/rstan/reference/stan.html\" class=\"external-link\">stan</a></code> for details).\nOtherwise <code>NULL</code></p></li>\n<li><p><code>adapt_delta</code> If the model was fitted using <code>Stan</code>, the value supplied for the adapt_delta\ntuning parameter is returned (see <code><a href=\"https://mc-stan.org/rstan/reference/stan.html\" class=\"external-link\">stan</a></code> for details).\nOtherwise <code>NULL</code></p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><a href=\"mvgam.html\">mvgam</a></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam-package.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"\nFit Bayesian Dynamic Generalized Additive Models to multivariate observations. Users can build nonlinear State-Space models that can incorporate semiparametric effects in observation and process components, using a wide range of observation families. Estimation is performed using Markov Chain Monte Carlo with Hamiltonian Monte Carlo in the software 'Stan'. References: Clark &amp;amp; Wells (2022) doi:10.1111/2041-210X.13974\n.\"><title>mvgam: Multivariate (Dynamic) Generalized Additive Models — mvgam-package • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"mvgam: Multivariate (Dynamic) Generalized Additive Models — mvgam-package\"><meta property=\"og:description\" content=\"\nFit Bayesian Dynamic Generalized Additive Models to multivariate observations. Users can build nonlinear State-Space models that can incorporate semiparametric effects in observation and process components, using a wide range of observation families. Estimation is performed using Markov Chain Monte Carlo with Hamiltonian Monte Carlo in the software 'Stan'. References: Clark &amp;amp; Wells (2022) doi:10.1111/2041-210X.13974\n.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>mvgam: Multivariate (Dynamic) Generalized Additive Models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam-package.R\" class=\"external-link\"><code>R/mvgam-package.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam-package.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p></p>\n<p>Fit Bayesian Dynamic Generalized Additive Models to multivariate observations. Users can build nonlinear State-Space models that can incorporate semiparametric effects in observation and process components, using a wide range of observation families. Estimation is performed using Markov Chain Monte Carlo with Hamiltonian Monte Carlo in the software 'Stan'. References: Clark &amp; Wells (2022) <a href=\"https://doi.org/10.1111/2041-210X.13974\" class=\"external-link\">doi:10.1111/2041-210X.13974</a>\n.</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Useful links:</p><ul><li><p><a href=\"https://github.com/nicholasjclark/mvgam\" class=\"external-link\">https://github.com/nicholasjclark/mvgam</a></p></li>\n<li><p><a href=\"https://nicholasjclark.github.io/mvgam/\">https://nicholasjclark.github.io/mvgam/</a></p></li>\n<li><p>Report bugs at <a href=\"https://github.com/nicholasjclark/mvgam/issues\" class=\"external-link\">https://github.com/nicholasjclark/mvgam/issues</a></p></li>\n</ul></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p><strong>Maintainer</strong>: Nicholas J Clark <a href=\"mailto:nicholas.j.clark1214@gmail.com\">nicholas.j.clark1214@gmail.com</a> (<a href=\"https://orcid.org/0000-0001-7131-3301\" class=\"external-link\">ORCID</a>)</p>\n<p>Other contributors:</p><ul><li><p>Sarah Heaps (<a href=\"https://orcid.org/0000-0002-5543-037X\" class=\"external-link\">ORCID</a>) (VARMA parameterisations) [contributor]</p></li>\n<li><p>Scott Pease (<a href=\"https://orcid.org/0009-0006-8977-9285\" class=\"external-link\">ORCID</a>) (broom enhancements) [contributor]</p></li>\n<li><p>Matthijs Hollanders (<a href=\"https://orcid.org/0000-0003-0796-1018\" class=\"external-link\">ORCID</a>) (ggplot visualizations) [contributor]</p></li>\n</ul></div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\"><meta name=\"description\" content=\"This function estimates the posterior distribution for Generalised Additive\nModels (GAMs) that can include smooth spline functions, specified in the GAM\nformula, as well as latent temporal processes, specified by trend_model.\nFurther modelling options include State-Space representations to allow covariates\nand dynamic processes to occur on the latent 'State' level while also capturing\nobservation-level effects. Prior specifications are flexible and explicitly\nencourage users to apply prior distributions that actually reflect their beliefs.\nIn addition, model fits can easily be assessed and\ncompared with posterior predictive checks, forecast comparisons and\nleave-one-out / leave-future-out cross-validation.\"><meta property=\"og:description\" content=\"This function estimates the posterior distribution for Generalised Additive\nModels (GAMs) that can include smooth spline functions, specified in the GAM\nformula, as well as latent temporal processes, specified by trend_model.\nFurther modelling options include State-Space representations to allow covariates\nand dynamic processes to occur on the latent 'State' level while also capturing\nobservation-level effects. Prior specifications are flexible and explicitly\nencourage users to apply prior distributions that actually reflect their beliefs.\nIn addition, model fits can easily be assessed and\ncompared with posterior predictive checks, forecast comparisons and\nleave-one-out / leave-future-out cross-validation.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam.R\" class=\"external-link\"><code>R/mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function estimates the posterior distribution for Generalised Additive\nModels (GAMs) that can include smooth spline functions, specified in the GAM\nformula, as well as latent temporal processes, specified by <code>trend_model</code>.\nFurther modelling options include State-Space representations to allow covariates\nand dynamic processes to occur on the latent 'State' level while also capturing\nobservation-level effects. Prior specifications are flexible and explicitly\nencourage users to apply prior distributions that actually reflect their beliefs.\nIn addition, model fits can easily be assessed and\ncompared with posterior predictive checks, forecast comparisons and\nleave-one-out / leave-future-out cross-validation.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">mvgam</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">formula</span>,</span>\n<span>  <span class=\"va\">trend_formula</span>,</span>\n<span>  <span class=\"va\">knots</span>,</span>\n<span>  <span class=\"va\">trend_knots</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"st\">\"None\"</span>,</span>\n<span>  noncentred <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  share_obs_params <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">data</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  use_lv <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">n_lv</span>,</span>\n<span>  <span class=\"va\">trend_map</span>,</span>\n<span>  <span class=\"va\">priors</span>,</span>\n<span>  run_model <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  prior_simulation <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  residuals <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  return_model_data <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  backend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">getOption</a></span><span class=\"op\">(</span><span class=\"st\">\"brms.backend\"</span>, <span class=\"st\">\"cmdstanr\"</span><span class=\"op\">)</span>,</span>\n<span>  algorithm <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">getOption</a></span><span class=\"op\">(</span><span class=\"st\">\"brms.algorithm\"</span>, <span class=\"st\">\"sampling\"</span><span class=\"op\">)</span>,</span>\n<span>  control <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>max_treedepth <span class=\"op\">=</span> <span class=\"fl\">10</span>, adapt_delta <span class=\"op\">=</span> <span class=\"fl\">0.8</span><span class=\"op\">)</span>,</span>\n<span>  chains <span class=\"op\">=</span> <span class=\"fl\">4</span>,</span>\n<span>  burnin <span class=\"op\">=</span> <span class=\"fl\">500</span>,</span>\n<span>  samples <span class=\"op\">=</span> <span class=\"fl\">500</span>,</span>\n<span>  thin <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  parallel <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  threads <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  save_all_pars <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  silent <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  autoformat <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  refit <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  lfo <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-formula\">formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-formula\"></a></dt>\n<dd><p>A <code>formula</code> object specifying the GAM observation model\nformula. These are exactly like the formula\nfor a GLM except that smooth terms, <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti()</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/t2.html\" class=\"external-link\">t2()</a></code>, as well\nas time-varying <code><a href=\"dynamic.html\">dynamic()</a></code> terms, nonparametric <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp()</a></code> terms and offsets using <code><a href=\"https://rdrr.io/r/stats/offset.html\" class=\"external-link\">offset()</a></code>,\ncan be added to the right hand side to specify that the linear predictor\ndepends on smooth functions of predictors (or linear functionals of these).\nIn <code><a href=\"mvgam_families.html\">nmix()</a></code> family models, the <code>formula</code> is used to set up a linear predictor\nfor the detection probability. Details of the formula\nsyntax used by <span class=\"pkg\">mvgam</span> can be found in <code><a href=\"mvgam_formulae.html\">mvgam_formulae</a></code></p></dd>\n\n\n<dt id=\"arg-trend-formula\">trend_formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-formula\"></a></dt>\n<dd><p>An optional <code>formula</code> object specifying the GAM\nprocess model formula. If\nsupplied, a linear predictor will be modelled for the latent trends to capture\nprocess model evolution\nseparately from the observation model. Should not have a response variable\nspecified on the left-hand side\nof the formula (i.e. a valid option would be <code>~ season + s(year)</code>). Also note\nthat you should not use\nthe identifier <code>series</code> in this formula to specify effects that vary across\ntime series. Instead you should use\n<code>trend</code>. This will ensure that models in which a <code>trend_map</code> is supplied will\nstill work consistently\n(i.e. by allowing effects to vary across process models, even when some time\nseries share the same underlying\nprocess model). This feature is only currently available for <code><a href=\"RW.html\">RW()</a></code>, <code><a href=\"RW.html\">AR()</a></code>\nand <code><a href=\"RW.html\">VAR()</a></code> trend models.\nIn <code><a href=\"mvgam_families.html\">nmix()</a></code> family models, the <code>trend_formula</code> is used to set up a linear\npredictor for the underlying\nlatent abundance. Be aware that it can be very challenging to simultaneously\nestimate intercept parameters\nfor both the observation mode (captured by <code>formula</code>) and the process model\n(captured by <code>trend_formula</code>).\nUsers are recommended to drop one of these using the <code>- 1</code> convention in the\nformula right hand side.</p></dd>\n\n\n<dt id=\"arg-knots\">knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-knots\"></a></dt>\n<dd><p>An optional <code>list</code> containing user specified knot values to\nbe used for basis construction.\nFor most bases the user simply supplies the knots to be used, which must match\nup with the <code>k</code> value supplied\n(note that the number of knots is not always just <code>k</code>). Different terms can\nuse different numbers of knots,\nunless they share a covariate</p></dd>\n\n\n<dt id=\"arg-trend-knots\">trend_knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-knots\"></a></dt>\n<dd><p>As for <code>knots</code> above, this is an optional <code>list</code> of\nknot values for smooth\nfunctions within the <code>trend_formula</code></p></dd>\n\n\n<dt id=\"arg-trend-model\">trend_model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-model\"></a></dt>\n<dd><p><code>character</code> or  <code>function</code> specifying the time\nseries dynamics for the latent trend. Options are:</p><ul><li><p><code>None</code> (no latent trend component; i.e. the GAM component is all that\ncontributes to the linear predictor, and the observation process is the only\nsource of error; similarly to what is estimated by <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code>)</p></li>\n<li><p><code>ZMVN</code> or <code><a href=\"ZMVN.html\">ZMVN()</a></code> (Zero-Mean Multivariate Normal; only available in\n<code>Stan</code>)</p></li>\n<li><p><code>'RW'</code> or <code><a href=\"RW.html\">RW()</a></code></p></li>\n<li><p><code>'AR1'</code> or <code>AR(p = 1)</code></p></li>\n<li><p><code>'AR2'</code> or <code>AR(p = 2)</code></p></li>\n<li><p><code>'AR3'</code> or <code>AR(p = 3)</code></p></li>\n<li><p><code>'CAR1'</code> or <code>CAR(p = 1)</code></p></li>\n<li><p><code>'VAR1'</code>  or <code><a href=\"RW.html\">VAR()</a></code>(only available in <code>Stan</code>)</p></li>\n<li><p><code>'PWlogistic</code>, <code>'PWlinear'</code> or <code><a href=\"piecewise_trends.html\">PW()</a></code> (only available in <code>Stan</code>)</p></li>\n<li><p><code>'GP'</code> or <code><a href=\"GP.html\">GP()</a></code> (Gaussian Process with squared exponential kernel;\nonly available in <code>Stan</code>)</p></li>\n</ul><p>For all trend types apart from <code><a href=\"ZMVN.html\">ZMVN()</a></code>, <code><a href=\"GP.html\">GP()</a></code>, <code><a href=\"RW.html\">CAR()</a></code> and <code><a href=\"piecewise_trends.html\">PW()</a></code>, moving\naverage and/or correlated process error terms can also be estimated (for\nexample, <code>RW(cor = TRUE)</code> will set up a multivariate Random Walk if <code>n_series &gt; 1</code>).\nIt is also possible for many multivariate trends to estimate hierarchical\ncorrelations if the data are structured among levels of a relevant grouping\nfactor. See <a href=\"mvgam_trends.html\">mvgam_trends</a> for more details and see <a href=\"ZMVN.html\">ZMVN</a> for an example.</p></dd>\n\n\n<dt id=\"arg-noncentred\">noncentred<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-noncentred\"></a></dt>\n<dd><p><code>logical</code> Use the non-centred parameterisation for autoregressive\ntrend models? Setting to <code>TRUE</code> will reparameterise the model to avoid possible\ndegeneracies that can show up when estimating the latent dynamic random effects. For some\nmodels, this can produce big gains in efficiency, meaning that fewer burnin and sampling\niterations are required for posterior exploration. But for other models, where the data\nare highly informative about the latent dynamic processes, this can actually lead to worse\nperformance. Only available for certain trend models\n(i.e. <code><a href=\"RW.html\">RW()</a></code>, <code><a href=\"RW.html\">AR()</a></code>, or <code><a href=\"RW.html\">CAR()</a></code>, or for\n<code>trend = 'None'</code> when using a <code>trend_formula</code>). Not yet available for moving average or\ncorrelated error models</p></dd>\n\n\n<dt id=\"arg-family\">family<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-family\"></a></dt>\n<dd><p><code>family</code> specifying the exponential observation family for\nthe series. Currently supported\nfamilies are:</p><ul><li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">betar()</a></code> for proportional data on <code>(0,1)</code></p></li>\n<li><p><code><a href=\"mvgam_families.html\">lognormal()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">student_t()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">bernoulli()</a></code> for binary data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code> for count data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">nb()</a></code> for overdispersed count data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> for count data with imperfect detection when the number\nof trials is known;\nnote that the <code><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind()</a></code> function must be used to bind the discrete\nobservations and the discrete number\nof trials</p></li>\n<li><p><code><a href=\"mvgam_families.html\">beta_binomial()</a></code> as for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> but allows for overdispersion</p></li>\n<li><p><code><a href=\"mvgam_families.html\">nmix()</a></code> for count data with imperfect detection when the number of\ntrials is unknown and should be modeled via a State-Space N-Mixture model.\nThe latent states are Poisson, capturing the 'true' latent\nabundance, while the observation process is Binomial to account for\nimperfect detection.\nSee <code><a href=\"mvgam_families.html\">mvgam_families</a></code> for an example of how to use this family</p></li>\n</ul><p>Default is <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code>.\nSee <code><a href=\"mvgam_families.html\">mvgam_families</a></code> for more details</p></dd>\n\n\n<dt id=\"arg-share-obs-params\">share_obs_params<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-share-obs-params\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code> and the <code>family</code>\nhas additional family-specific observation parameters (e.g. variance\ncomponents in\n<code><a href=\"mvgam_families.html\">student_t()</a></code> or <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code>, or dispersion parameters in <code><a href=\"mvgam_families.html\">nb()</a></code> or\n<code><a href=\"mvgam_families.html\">betar()</a></code>), these parameters will be shared across all outcome variables. This is handy\nif you have multiple outcomes (time series in most <code>mvgam</code> models) that you\nbelieve share some properties,\nsuch as being from the same species over different spatial units. Default is\n<code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> containing the model response\nvariable and covariates\nrequired by the GAM <code>formula</code> and optional <code>trend_formula</code>. Most\nmodels should include columns:</p><ul><li><p><code>series</code> (a <code>factor</code> index of the series IDs; the number of\nlevels should be identical\nto the number of unique series labels (i.e. <code>n_series = length(levels(data$series))</code>))</p></li>\n<li><p><code>time</code> (<code>numeric</code> or <code>integer</code> index of the time point for\neach observation).\nFor most dynamic trend types available in <code>mvgam</code> (see argument <code>trend_model</code>),\ntime should be\nmeasured in discrete, regularly spaced intervals (i.e. <code>c(1, 2, 3, ...)</code>).\nHowever you can\nuse irregularly spaced intervals if using <code>trend_model = CAR(1)</code>, though\nnote that any\ntemporal intervals that are exactly <code>0</code> will be adjusted to a very small number\n(<code>1e-12</code>) to prevent sampling errors. See an example of <code><a href=\"RW.html\">CAR()</a></code> trends in\n<code><a href=\"RW.html\">CAR</a></code></p></li>\n</ul><p>Note however that there are special cases where these identifiers are not\nneeded. For\nexample, models with hierarchical temporal correlation processes (e.g.\n<code>AR(gr = region, subgr = species)</code>)\nshould NOT include a <code>series</code> identifier, as this will be constructed\ninternally (see\n<code><a href=\"mvgam_trends.html\">mvgam_trends</a></code> and <code><a href=\"RW.html\">AR</a></code> for details). <code>mvgam</code> can also\nfit models that do not\ninclude a <code>time</code> variable if there are no temporal dynamic structures included\n(i.e. <code>trend_model = 'None'</code> or\n<code>trend_model = ZMVN()</code>). <code>data</code> should also include any other variables to be\nincluded in\nthe linear predictor of <code>formula</code></p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing\nthe same variables\nas in <code>data</code>. If included, the\nobservations in variable <code>y</code> will be set to <code>NA</code> when fitting the\nmodel so that posterior\nsimulations can be obtained</p></dd>\n\n\n<dt id=\"arg-use-lv\">use_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-use-lv\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, use dynamic factors to estimate series'\nlatent trends in a reduced dimension format. Only available for\n<code><a href=\"RW.html\">RW()</a></code>, <code><a href=\"RW.html\">AR()</a></code> and <code><a href=\"GP.html\">GP()</a></code> trend models. Defaults to <code>FALSE</code></p></dd>\n\n\n<dt id=\"arg-n-lv\">n_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-lv\"></a></dt>\n<dd><p><code>integer</code> the number of latent dynamic factors to use if\n<code>use_lv == TRUE</code>. Cannot be <code>&gt; n_series</code>. Defaults arbitrarily to\n<code>min(2, floor(n_series / 2))</code></p></dd>\n\n\n<dt id=\"arg-trend-map\">trend_map<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-map\"></a></dt>\n<dd><p>Optional <code>data.frame</code> specifying which series should depend\non which latent trends. Useful for allowing multiple series to depend on the\nsame latent trend process, but with different observation processes. If\nsupplied, a latent factor model is set up by setting <code>use_lv = TRUE</code> and\nusing the mapping to set up the shared trends. Needs to have column names\n<code>series</code> and <code>trend</code>, with integer values in the <code>trend</code> column to state which\ntrend each series should depend on. The <code>series</code> column should have a single\nunique entry for each series in the data (names should perfectly match factor\nlevels of the <code>series</code> variable in <code>data</code>). Note that if this is supplied,\nthe intercept parameter in the process model will NOT be automatically suppressed.\nNot yet supported for models in wich the latent factors evolve in continuous time (<code><a href=\"RW.html\">CAR()</a></code>).\nSee examples for details</p></dd>\n\n\n<dt id=\"arg-priors\">priors<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-priors\"></a></dt>\n<dd><p>An optional <code>data.frame</code> with prior\ndefinitions or, preferentially, a vector containing\nobjects of class <code>brmsprior</code> (see. <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></code> for details).\nSee <a href=\"get_mvgam_priors.html\">get_mvgam_priors</a> and Details' for more information on changing default prior distributions</p></dd>\n\n\n<dt id=\"arg-run-model\">run_model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-run-model\"></a></dt>\n<dd><p><code>logical</code>. If <code>FALSE</code>, the model is not fitted but\ninstead the function will\nreturn the model file and the data / initial values that are needed to fit the\nmodel outside of <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-prior-simulation\">prior_simulation<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-prior-simulation\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, no observations are\nfed to the model, and instead\nsimulations from prior distributions are returned</p></dd>\n\n\n<dt id=\"arg-residuals\">residuals<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-residuals\"></a></dt>\n<dd><p>Logical indicating whether to compute series-level randomized quantile residuals and include\nthem as part of the returned object. Defaults to <code>TRUE</code>, but you can set to <code>FALSE</code> to save\ncomputational time and reduce the size of the returned object (users can always add residuals to\nan object of class <code>mvgam</code> using <a href=\"add_residuals.mvgam.html\">add_residuals</a>)</p></dd>\n\n\n<dt id=\"arg-return-model-data\">return_model_data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-return-model-data\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, the list of data that\nis needed to fit the\nmodel is returned, along with the initial values for smooth and AR parameters,\nonce the model is fitted.\nThis will be helpful if users wish to modify the model file to add\nother stochastic elements that are not currently available in <code>mvgam</code>.\nDefault is <code>FALSE</code> to reduce\nthe size of the returned object, unless <code>run_model == FALSE</code></p></dd>\n\n\n<dt id=\"arg-backend\">backend<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-backend\"></a></dt>\n<dd><p>Character string naming the package to use as the backend for fitting\nthe Stan model. Options are \"cmdstanr\" (the default) or \"rstan\". Can be set globally\nfor the current R session via the <code>\"brms.backend\"</code> option (see <code><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></code>). Details on\nthe rstan and cmdstanr packages are available at https://mc-stan.org/rstan/ and\nhttps://mc-stan.org/cmdstanr/, respectively</p></dd>\n\n\n<dt id=\"arg-algorithm\">algorithm<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-algorithm\"></a></dt>\n<dd><p>Character string naming the estimation approach to use.\nOptions are <code>\"sampling\"</code> for MCMC (the default), <code>\"meanfield\"</code> for\nvariational inference with factorized normal distributions,\n<code>\"fullrank\"</code> for variational inference with a multivariate normal\ndistribution, <code>\"laplace\"</code> for a Laplace approximation (only available\nwhen using cmdstanr as the backend) or <code>\"pathfinder\"</code> for the pathfinder\nalgorithm (only currently available when using cmdstanr as the backend).\nCan be set globally for the current <span style=\"R\">R</span> session via the\n<code>\"brms.algorithm\"</code> option (see <code><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></code>). Limited testing\nsuggests that <code>\"meanfield\"</code> performs best out of the non-MCMC approximations for\ndynamic GAMs, possibly because of the difficulties estimating covariances among the\nmany spline parameters and latent trend parameters. But rigorous testing has not\nbeen carried out</p></dd>\n\n\n<dt id=\"arg-control\">control<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-control\"></a></dt>\n<dd><p>A named <code>list</code> for controlling the sampler's behaviour. Valid\nelements include <code>max_treedepth</code>, <code>adapt_delta</code> and <code>init</code></p></dd>\n\n\n<dt id=\"arg-chains\">chains<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-chains\"></a></dt>\n<dd><p><code>integer</code> specifying the number of parallel chains for the model. Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-burnin\">burnin<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-burnin\"></a></dt>\n<dd><p><code>integer</code> specifying the number of warmup iterations of the Markov chain to run\nto tune sampling algorithms. Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-samples\">samples<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-samples\"></a></dt>\n<dd><p><code>integer</code> specifying the number of post-warmup iterations of the Markov chain to run for\nsampling the posterior distribution</p></dd>\n\n\n<dt id=\"arg-thin\">thin<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-thin\"></a></dt>\n<dd><p>Thinning interval for monitors.  Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-parallel\">parallel<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-parallel\"></a></dt>\n<dd><p><code>logical</code> specifying whether multiple cores should be used for\ngenerating MCMC simulations in parallel. If <code>TRUE</code>, the number of cores to use will be\n<code>min(c(chains, parallel::detectCores() - 1))</code></p></dd>\n\n\n<dt id=\"arg-threads\">threads<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-threads\"></a></dt>\n<dd><p><code>integer</code> Experimental option to use multithreading for within-chain\nparallelisation in <code>Stan</code>. We recommend its use only if you are experienced with\n<code>Stan</code>'s <code>reduce_sum</code> function and have a slow running model that cannot be sped\nup by any other means. Currently works for all families apart from <code><a href=\"mvgam_families.html\">nmix()</a></code> and\nwhen using <code>Cmdstan</code> as the backend</p></dd>\n\n\n<dt id=\"arg-save-all-pars\">save_all_pars<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-save-all-pars\"></a></dt>\n<dd><p><code>Logical</code> flag to indicate if draws from all\nvariables defined in Stan's <code>parameters</code> block should be saved\n(default is <code>FALSE</code>).</p></dd>\n\n\n<dt id=\"arg-silent\">silent<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-silent\"></a></dt>\n<dd><p>Verbosity level between <code>0</code> and <code>2</code>. If <code>1</code> (the default), most\nof the informational messages of compiler and sampler are suppressed. If <code>2</code>,\neven more messages are suppressed. The actual sampling progress is still printed.\nSet <code>refresh = 0</code> to turn this off as well. If using <code>backend = \"rstan\"</code> you\ncan also set open_progress = FALSE to prevent opening additional progress bars.</p></dd>\n\n\n<dt id=\"arg-autoformat\">autoformat<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-autoformat\"></a></dt>\n<dd><p><code>Logical</code>. Use the <code>stanc</code> parser to automatically format the\n<code>Stan</code> code and check for deprecations. Only for development purposes, so leave to <code>TRUE</code></p></dd>\n\n\n<dt id=\"arg-refit\">refit<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-refit\"></a></dt>\n<dd><p>Logical indicating whether this is a refit, called using <a href=\"update.mvgam.html\">update.mvgam</a>. Users should leave\nas <code>FALSE</code></p></dd>\n\n\n<dt id=\"arg-lfo\">lfo<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-lfo\"></a></dt>\n<dd><p>Logical indicating whether this is part of a call to <a href=\"lfo_cv.mvgam.html\">lfo_cv.mvgam</a>. Returns a\nlighter version of the model with no residuals and fewer monitored parameters to speed up\npost-processing. But other downstream functions will not work properly, so users should always\nleave this set as <code>FALSE</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Further arguments passed to Stan.\nFor <code>backend = \"rstan\"</code> the arguments are passed to\n<code><a href=\"https://mc-stan.org/rstan/reference/stanmodel-method-sampling.html\" class=\"external-link\">sampling</a></code> or <code><a href=\"https://mc-stan.org/rstan/reference/stanmodel-method-vb.html\" class=\"external-link\">vb</a></code>.\nFor <code>backend = \"cmdstanr\"</code> the arguments are passed to the\n<code><a href=\"https://mc-stan.org/cmdstanr/reference/model-method-sample.html\" class=\"external-link\">cmdstanr::sample</a></code>, <code><a href=\"https://mc-stan.org/cmdstanr/reference/model-method-variational.html\" class=\"external-link\">cmdstanr::variational</a></code>,\n<code><a href=\"https://mc-stan.org/cmdstanr/reference/model-method-laplace.html\" class=\"external-link\">cmdstanr::laplace</a></code> or\n<code><a href=\"https://mc-stan.org/cmdstanr/reference/model-method-pathfinder.html\" class=\"external-link\">cmdstanr::pathfinder</a></code> method</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> object of class <code>mvgam</code> containing model output, the text representation of the model file,\nthe mgcv model output (for easily generating simulations at\nunsampled covariate values), Dunn-Smyth residuals for each series and key information needed\nfor other functions in the package. See <code><a href=\"mvgam-class.html\">mvgam-class</a></code> for details.\nUse <code>methods(class = \"mvgam\")</code> for an overview on available methods.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Dynamic GAMs are useful when we wish to predict future values from time series that show temporal dependence\nbut we do not want to rely on extrapolating from a smooth term (which can sometimes lead to unpredictable and unrealistic behaviours).\nIn addition, smooths can often try to wiggle excessively to capture any autocorrelation that is present in a time series,\nwhich exacerbates the problem of forecasting ahead. As GAMs are very naturally viewed through a Bayesian lens, and we often\nmust model time series that show complex distributional features and missing data, parameters for <code>mvgam</code> models are estimated\nin a Bayesian framework using Markov Chain Monte Carlo by default. A general overview is provided\nin the primary vignettes: <code><a href=\"../articles/mvgam_overview.html\">vignette(\"mvgam_overview\")</a></code> and <code><a href=\"../articles/data_in_mvgam.html\">vignette(\"data_in_mvgam\")</a></code>.\nFor a full list of available vignettes see <code>vignette(package = \"mvgam\")</code>\n<br><br><em>Formula syntax</em>: Details of the formula syntax used by <span class=\"pkg\">mvgam</span> can be found in\n<code><a href=\"mvgam_formulae.html\">mvgam_formulae</a></code>. Note that it is possible to supply an empty formula where\nthere are no predictors or intercepts in the observation model (i.e. <code>y ~ 0</code> or <code>y ~ -1</code>).\nIn this case, an intercept-only observation model will be set up but the intercept coefficient\nwill be fixed at zero. This can be handy if you wish to fit pure State-Space models where\nthe variation in the dynamic trend controls the average expectation, and/or where intercepts\nare non-identifiable (as in piecewise trends, see examples below)\n<br><br><em>Families and link functions</em>: Details of families supported by <span class=\"pkg\">mvgam</span>\ncan be found in <code><a href=\"mvgam_families.html\">mvgam_families</a></code>.\n<br><br><em>Trend models</em>: Details of latent error process models supported by <span class=\"pkg\">mvgam</span>\ncan be found in <code><a href=\"mvgam_trends.html\">mvgam_trends</a></code>.\n<br><br><em>Priors</em>: Default priors for intercepts and any scale parameters are generated\nusing the same practice as <span class=\"pkg\">brms</span>. Prior distributions for most important\nmodel parameters can be altered by the user to inspect model\nsensitivities to given priors (see <code><a href=\"get_mvgam_priors.html\">get_mvgam_priors</a></code> for details).\nNote that latent trends are estimated on the link scale so choose priors\naccordingly. However more control over the model specification can be accomplished\nby first using <code>mvgam</code> as a baseline, then editing the returned model accordingly.\nThe model file can be edited and run outside of <code>mvgam</code> by setting\n<code>run_model = FALSE</code> and this is encouraged for complex modelling tasks.\nNote, no priors are formally checked to ensure they are in the right syntax so it is\nup to the user to ensure these are correct\n<br><br><em>Random effects</em>: For any smooth terms using the random effect basis (<code><a href=\"https://rdrr.io/pkg/mgcv/man/smooth.construct.re.smooth.spec.html\" class=\"external-link\">smooth.construct.re.smooth.spec</a></code>),\na non-centred parameterisation is automatically employed to avoid degeneracies that are common in hierarchical models.\nNote however that centred versions may perform better for series that are particularly informative, so as with any\nforay into Bayesian modelling, it is worth building an understanding of the model's assumptions and limitations by following a\nprincipled workflow. Also note that models are parameterised using <code>drop.unused.levels = FALSE</code> in <code><a href=\"https://rdrr.io/pkg/mgcv/man/jagam.html\" class=\"external-link\">jagam</a></code>\nto ensure predictions can be made for all levels of the supplied factor variable\n<br><br><em>Observation level parameters</em>: When more than one series is included in <code>data</code> and an\nobservation family that contains more than one parameter is used, additional observation family parameters\n(i.e. <code>phi</code> for <code><a href=\"mvgam_families.html\">nb()</a></code> or <code>sigma</code> for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code>) are\nby default estimated independently for each series. But if you wish for the series to share\nthe same observation parameters, set <code>share_obs_params = TRUE</code>\n<br><br><em>Residuals</em>: For each series, randomized quantile (i.e. Dunn-Smyth) residuals are calculated for inspecting model diagnostics\nIf the fitted model is appropriate then Dunn-Smyth residuals will be standard normal in distribution and no\nautocorrelation will be evident. When a particular observation is missing, the residual is calculated by comparing independent\ndraws from the model's posterior distribution\n<br><br><em>Using Stan</em>: <code>mvgam</code> is primarily designed to use Hamiltonian Monte Carlo for parameter estimation\nvia the software <code>Stan</code> (using either the <code>cmdstanr</code> or <code>rstan</code> interface).\nThere are great advantages when using <code>Stan</code> over Gibbs / Metropolis Hastings samplers, which includes the option\nto estimate nonlinear effects via <a href=\"https://arxiv.org/abs/2004.11408\" class=\"external-link\">Hilbert space approximate Gaussian Processes</a>,\nthe availability of a variety of inference algorithms (i.e. variational inference, laplacian inference etc...) and\n<a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\" class=\"external-link\">capabilities to enforce stationarity for complex Vector Autoregressions</a>.\nBecause of the many advantages of <code>Stan</code> over <code>JAGS</code>,\n<em>further development of the package will only be applied to <code>Stan</code></em>. This includes the planned addition\nof more response distributions, plans to handle zero-inflation, and plans to incorporate a greater\nvariety of trend models. Users are strongly encouraged to opt for <code>Stan</code> over <code>JAGS</code> in any proceeding workflows\n<br><br><em>How to start?</em>: The <a href=\"https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf\" class=\"external-link\"><code>mvgam</code> cheatsheet</a> is a\ngood starting place if you are just learning to use the package. It gives an overview of the package's key functions and objects,\nas well as providing a reasonable workflow that new users can follow. In general it is recommended to</p><ul><li><p>1. Check that your time series data are in a suitable long format for <code>mvgam</code> modeling (see the <a href=\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\">data formatting vignette</a> for guidance)</p></li>\n<li><p>2. Inspect features of the data using <code><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></code>. Now is also a good time to familiarise yourself\nwith the package's example workflows that are detailed in the vignettes. In particular,\nthe <a href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\">getting started vignette</a>,\nthe <a href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\">shared latent states vignette</a>,\nthe <a href=\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\">time-varying effects vignette</a> and\nthe <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space models vignette</a> all provide\ndetailed information about how to structure, fit and interrogate Dynamic Generalized Additive Models in <code>mvgam</code>. Some\nmore specialized how-to articles include\n<a href=\"https://ecogambler.netlify.app/blog/time-varying-seasonality/\" class=\"external-link\">\"Incorporating time-varying seasonality in forecast models\"</a>\nand <a href=\"https://ecogambler.netlify.app/blog/autocorrelated-gams/\" class=\"external-link\">\"Temporal autocorrelation in GAMs and the <code>mvgam</code> package\"</a></p></li>\n<li><p>3. Carefully think about how to structure linear predictor effects (i.e. smooth terms using <code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></code> or <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti</a></code>, GPs using <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></code>, dynamic time-varying effects using <code><a href=\"dynamic.html\">dynamic</a></code>, and parametric terms), latent temporal trend components (see <code><a href=\"mvgam_trends.html\">mvgam_trends</a></code>) and the appropriate\nobservation family (see <code><a href=\"mvgam_families.html\">mvgam_families</a></code>). Use <code><a href=\"get_mvgam_priors.html\">get_mvgam_priors</a></code> to see default prior distributions\nfor stochastic parameters</p></li>\n<li><p>4. Change default priors using appropriate prior knowledge (see <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></code>)</p></li>\n<li><p>5. Fit the model using either Hamiltonian Monte Carlo or an approximation algorithm (i.e. change the <code>backend</code> argument)\nand use <code><a href=\"summary.mvgam.html\">summary.mvgam</a></code>, <code><a href=\"conditional_effects.mvgam.html\">conditional_effects.mvgam</a></code>, <code><a href=\"mcmc_plot.mvgam.html\">mcmc_plot.mvgam</a></code>, <code><a href=\"pp_check.mvgam.html\">pp_check.mvgam</a></code> and\n<code><a href=\"plot.mvgam.html\">plot.mvgam</a></code> to inspect / interrogate the model</p></li>\n<li><p>6. Update the model as needed and use <code><a href=\"loo.mvgam.html\">loo_compare.mvgam</a></code> for in-sample model comparisons, or alternatively\nuse <code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code> and <code><a href=\"score.mvgam_forecast.html\">score.mvgam_forecast</a></code> to compare models based on out-of-sample forecasts (see the <a href=\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\">forecast evaluation vignette</a> for guidance)</p></li>\n<li><p>7. When satisfied with the model structure, use <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code>,\n<code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></code> and/or <code><a href=\"https://marginaleffects.com/man/r/plot_slopes.html\" class=\"external-link\">plot_slopes</a></code> for\nmore targeted inferences (see <a href=\"https://ecogambler.netlify.app/blog/interpreting-gams/\" class=\"external-link\">\"How to interpret and report nonlinear effects from Generalized Additive Models\"</a> for some guidance on interpreting GAMs)</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Nicholas J Clark &amp; Konstans Wells (2020). Dynamic generalised additive models (DGAMs) for forecasting discrete ecological time series.\nMethods in Ecology and Evolution. 14:3, 771-784.\n<br><br>\nNicholas J Clark, SK Morgan Ernest, Henry Senyondo, Juniper Simonis, Ethan P White,\nGlenda M Yenni, KANK Karunarathna (2025). Beyond single-species models: leveraging\nmultispecies forecasts to navigate the dynamics of ecological predictability. PeerJ.\n13:e18929 https://doi.org/10.7717/peerj.18929</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"https://rdrr.io/pkg/mgcv/man/jagam.html\" class=\"external-link\">jagam</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.models.html\" class=\"external-link\">gam.models</a></code>,\n<code><a href=\"get_mvgam_priors.html\">get_mvgam_priors</a></code>, <code><a href=\"jsdgam.html\">jsdgam</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate a collection of three time series that have shared seasonal dynamics</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and independent AR1 trends, with a Poisson observation process</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  T <span class=\"op\">=</span> <span class=\"fl\">80</span>,</span></span>\n<span class=\"r-in\"><span>  n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span></span>\n<span class=\"r-in\"><span>  mu <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  prop_missing <span class=\"op\">=</span> <span class=\"fl\">0.1</span>,</span></span>\n<span class=\"r-in\"><span>  prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot key summary statistics for a single series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Removed 5 rows containing non-finite outside the scale range (`stat_bin()`).</span>\n<span class=\"r-plt img\"><img src=\"mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot all series together</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">\"all\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Formulate a model using Stan where series share a cyclic smooth for</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># seasonality and each series has an independent AR1 temporal process.</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Note that 'noncentred = TRUE' will likely give performance gains.</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Set run_model = FALSE to inspect the returned objects</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mvgam</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>  run_model <span class=\"op\">=</span> <span class=\"cn\">FALSE</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># View the model code in Stan language</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/stancode.html\" class=\"external-link\">stancode</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[4, 4] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_series] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     trend[2 : n, s] += ar1[s] * trend[1 : (n - 1), s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : num_basis] = b_raw[1 : num_basis];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for (Intercept)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1] ~ student_t(3, 1.9, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[2 : 5] ~ multi_normal_prec(zero[2 : 5], S1[1 : 4, 1 : 4] * lambda[1]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for latent trend variance parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   to_vector(trend_raw) ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                               append_row(b, 1.0));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_series] tau;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     tau[s] = pow(sigma[s], -2.0);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># View the data objects needed to fit the model in Stan</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sdata1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/standata.html\" class=\"external-link\">standata</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">sdata1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 18</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ y           : num [1:60, 1:3] 4 5 7 39 51 26 6 6 4 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n           : int 60</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ X           : num [1:180, 1:5] 1 1 1 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : chr [1:5] \"X.Intercept.\" \"V2\" \"V3\" \"V4\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ S1          : num [1:4, 1:4] 1.244 -0.397 0.384 0.619 -0.397 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ zero        : num [1:5] 0 0 0 0 0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ p_coefs     : Named num 0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"names\")= chr \"(Intercept)\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ p_taus      : num 0.853</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ ytimes      : int [1:60, 1:3] 1 4 7 10 13 16 19 22 25 28 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n_series    : int 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ sp          : Named num 0.368</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"names\")= chr \"s(season)\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ y_observed  : num [1:60, 1:3] 1 1 1 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ total_obs   : int 180</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ num_basis   : int 5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n_sp        : num 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ n_nonmissing: int 164</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ obs_ind     : int [1:164] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ flat_ys     : num [1:164] 4 5 7 39 51 26 6 6 4 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ flat_xs     : num [1:164, 1:5] 1 1 1 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..$ : chr [1:5] \"X.Intercept.\" \"V2\" \"V3\" \"V4\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"trend_model\")= chr \"AR1\"</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now fit the model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mvgam</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>  chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmp0I0R3Y/model-2718194a6f1d.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                           </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract the model summary</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ s(season, bs = \"cc\", k = 6)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001b088c85638&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> poisson</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> log</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 60 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               2.5%   50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)  1.900  2.00  2.10 1.00   794</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).1  0.065  0.31  0.55 1.00   468</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).2  0.580  0.83  1.10 1.01   356</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).3 -0.058  0.18  0.39 1.00   555</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).4 -0.680 -0.43 -0.17 1.00   659</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            edf Ref.df Chi.sq p-value    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season) 3.79      4   36.5  &lt;2e-16 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Latent trend parameter AR estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>           2.5%   50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[1]    0.30  0.73 0.980 1.01   282</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[2]   -0.95 -0.43 0.057 1.01   122</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[3]    0.18  0.69 0.980 1.00   296</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[1]  0.42  0.56 0.760 1.01   323</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[2]  0.33  0.49 0.690 1.01   229</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[3]  0.38  0.51 0.720 1.01   354</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 26 10:06:24 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod1) to get started describing this model</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot the estimated historical trend and forecast for one series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"trend\"</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"forecast\"</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Residual diagnostics</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"residuals\"</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"va\">resids</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/residuals.html\" class=\"external-link\">residuals</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">resids</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  num [1:180, 1:4] -0.144 NaN -0.143 0.284 -0.819 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ : chr [1:4] \"Estimate\" \"Est.Error\" \"Q2.5\" \"Q97.5\"</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fitted values and residuals can also be added to training data</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://generics.r-lib.org/reference/augment.html\" class=\"external-link\">augment</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># A tibble: 180 × 14</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        y season  year series    time .observed .fitted .fit.variability</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>  <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>     <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span>            <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 1</span>     4      1     1 series_1     1         4    4.64             1.52</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 2</span>    <span style=\"color: #BB0000;\">NA</span>      1     1 series_2     1        <span style=\"color: #BB0000;\">NA</span>    7.04             4.29</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 3</span>     4      1     1 series_3     1         4    4.62             1.60</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 4</span>     5      2     1 series_1     2         5    4.73             1.70</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 5</span>     2      2     1 series_2     2         2    3.79             1.44</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 6</span>    <span style=\"color: #BB0000;\">NA</span>      2     1 series_3     2        <span style=\"color: #BB0000;\">NA</span>    5.32             3.15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 7</span>     7      3     1 series_1     3         7    8.56             2.53</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 8</span>    12      3     1 series_2     3        12   11.5              3.08</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 9</span>     4      3     1 series_3     3         4    5.35             1.93</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\">10</span>    39      4     1 series_1     4        39   36.3              5.93</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># ℹ 170 more rows</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># ℹ 6 more variables: .fit.cred.low &lt;dbl&gt;, .fit.cred.high &lt;dbl&gt;, .resid &lt;dbl&gt;,</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\">#   .resid.variability &lt;dbl&gt;, .resid.cred.low &lt;dbl&gt;, .resid.cred.high &lt;dbl&gt;</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compute the forecast using covariate information in data_test</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 16</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\", k = 6)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x000001b088c85638&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family_pars       : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"response\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : Factor w/ 3 levels \"series_1\",\"series_2\",..: 1 2 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:60] 4 5 7 39 51 26 6 6 4 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:60] NA 2 12 16 6 31 9 15 5 3 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:60] 4 NA 4 NA NA 16 7 7 3 NA ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:60] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:20] 1 NA NA 13 18 20 16 6 NA 4 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:20] 4 36 8 6 7 NA NA 1 6 4 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:20] 6 8 5 5 19 14 1 1 7 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : int [1:20] 61 62 63 64 65 66 67 68 69 70 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:60] 4 1 4 4 4 3 5 3 6 8 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:60] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:60] 1 9 4 2 4 1 14 3 4 12 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:60] \"ypred[1,2]\" \"ypred[2,2]\" \"ypred[3,2]\" \"ypred[4,2]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:60] 10 4 4 6 6 3 5 6 1 7 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:60] \"ypred[1,3]\" \"ypred[2,3]\" \"ypred[3,3]\" \"ypred[4,3]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:1000, 1:20] 2 1 3 2 17 2 0 1 4 7 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:1000, 1:20] 2 5 6 1 2 6 7 4 7 9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:1000, 1:20] 8 7 6 16 10 18 3 10 2 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 57.089579</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Removed 8 rows containing missing values or values outside the scale range</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> (`geom_point()`).</span>\n<span class=\"r-plt img\"><img src=\"mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot the estimated seasonal smooth function</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"smooths\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot estimated first derivatives of the smooth</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"smooths\"</span>, derivatives <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot partial residuals of the smooth</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"smooths\"</span>, residuals <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot posterior realisations for the smooth</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, type <span class=\"op\">=</span> <span class=\"st\">\"smooths\"</span>, realisations <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-10.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot conditional response predictions using marginaleffects</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-11.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, condition <span class=\"op\">=</span> <span class=\"st\">\"season\"</span>, points <span class=\"op\">=</span> <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Removed 16 rows containing missing values or values outside the scale range</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> (`geom_point()`).</span>\n<span class=\"r-plt img\"><img src=\"mvgam-12.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Generate posterior predictive checks using bayesplot</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'dens_overlay' by default.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>NA responses are not shown in 'pp_check'.</span>\n<span class=\"r-plt img\"><img src=\"mvgam-13.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract observation model beta coefficient draws as a data.frame</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">beta_draws_df</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.data.frame.html\" class=\"external-link\">as.data.frame</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, variable <span class=\"op\">=</span> <span class=\"st\">\"betas\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">beta_draws_df</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   (Intercept) s(season).1 s(season).2 s(season).3 s(season).4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1     1.85730    0.335897    0.924472    0.106442   -0.378858</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2     1.98551    0.336287    0.750726    0.207395   -0.388888</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3     1.97766    0.339708    0.822352    0.267692   -0.366780</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4     1.97217    0.248420    0.680271    0.323205   -0.188949</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5     2.05115    0.216980    0.598978    0.259691   -0.228897</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6     2.02619    0.312091    0.772603    0.303855   -0.262500</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">beta_draws_df</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 'data.frame':\t1000 obs. of  5 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ (Intercept): num  1.86 1.99 1.98 1.97 2.05 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).1: num  0.336 0.336 0.34 0.248 0.217 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).2: num  0.924 0.751 0.822 0.68 0.599 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).3: num  0.106 0.207 0.268 0.323 0.26 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).4: num  -0.379 -0.389 -0.367 -0.189 -0.229 ...</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Investigate model fit</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mc.cores.def</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">getOption</a></span><span class=\"op\">(</span><span class=\"st\">\"mc.cores\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></span><span class=\"op\">(</span>mc.cores <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Computed from 1000 by 164 log-likelihood matrix.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          Estimate   SE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> elpd_loo   -459.2  8.8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> p_loo        89.3  4.9</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> looic       918.4 17.7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ------</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE of elpd_loo is NA.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> MCSE and ESS estimates assume MCMC draws (r_eff in [0.3, 1.9]).</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Pareto k diagnostic values:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                           Count Pct.    Min. ESS</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (-Inf, 0.67]   (good)     68    41.5%   75      </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    (0.67, 1]   (bad)      82    50.0%   &lt;NA&gt;    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     (1, Inf)   (very bad) 14     8.5%   &lt;NA&gt;    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> See help('pareto-k-diagnostic') for details.</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></span><span class=\"op\">(</span>mc.cores <span class=\"op\">=</span> <span class=\"va\">mc.cores.def</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example of supplying a trend_map so that some series can share</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># latent trend processes</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_data</span> <span class=\"op\">&lt;-</span> <span class=\"va\">sim</span><span class=\"op\">$</span><span class=\"va\">data_train</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Here, we specify only two latent trends; series 1 and 2 share a trend,</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># while series 3 has it's own unique latent trend</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">trend_map</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">mod_data</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  trend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit the model using AR1 trends</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mvgam</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  trend_map <span class=\"op\">=</span> <span class=\"va\">trend_map</span>,</span></span>\n<span class=\"r-in\"><span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">mod_data</span>,</span></span>\n<span class=\"r-in\"><span>  return_model_data <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>  chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmp0I0R3Y/model-27182b606fd4.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                           </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The mapping matrix is now supplied as data to the model in the 'Z' element</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span><span class=\"op\">$</span><span class=\"va\">model_data</span><span class=\"op\">$</span><span class=\"va\">Z</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      [,1] [,2]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1,]    1    0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2,]    1    0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3,]    0    1</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_lv; // number of dynamic factors</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_series, n_lv] Z; // matrix mapping series to latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[4, 4] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent factor SD terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_lv] sigma;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // latent factor AR1 terms</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=-1, upper=1&gt;[n_lv] ar1;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // dynamic factors</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_lv] LV;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // trends and dynamic factor loading matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] trend;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : num_basis] = b_raw[1 : num_basis];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // derived latent trends</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (i in 1 : n) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for (Intercept)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1] ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[2 : 5] ~ multi_normal_prec(zero[2 : 5], S1[1 : 4, 1 : 4] * lambda[1]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for AR parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ar1 ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for factor SD parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // dynamic factor estimates</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   LV[1, 1 : n_lv] ~ normal(0, sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (j in 1 : n_lv) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     LV[2 : n, j] ~ normal(ar1[j] * LV[1 : (n - 1), j], sigma[j]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     vector[n_nonmissing] flat_trends;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_trends = to_vector(trend)[obs_ind];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                               append_row(b, 1.0));</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_lv] penalty;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   penalty = 1.0 / (sigma .* sigma);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_series, n_lv] lv_coefs = Z;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The first two series share an identical latent trend; the third is different</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"trend\"</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-14.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"trend\"</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-15.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"trend\"</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-16.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example of how to use dynamic coefficients</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate a time-varying coefficient for the effect of temperature</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">123</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">N</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">200</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">beta_temp</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/vector.html\" class=\"external-link\">vector</a></span><span class=\"op\">(</span>length <span class=\"op\">=</span> <span class=\"va\">N</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">beta_temp</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">0.4</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">for</span> <span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"va\">N</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">beta_temp</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, mean <span class=\"op\">=</span> <span class=\"va\">beta_temp</span><span class=\"op\">[</span><span class=\"va\">i</span> <span class=\"op\">-</span> <span class=\"fl\">1</span><span class=\"op\">]</span> <span class=\"op\">-</span> <span class=\"fl\">0.0025</span>, sd <span class=\"op\">=</span> <span class=\"fl\">0.05</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">beta_temp</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-17.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate a covariate called 'temp'</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">temp</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">N</span>, sd <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some noisy Gaussian observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">out</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"va\">N</span>,</span></span>\n<span class=\"r-in\"><span>  mean <span class=\"op\">=</span> <span class=\"fl\">4</span> <span class=\"op\">+</span> <span class=\"va\">beta_temp</span> <span class=\"op\">*</span> <span class=\"va\">temp</span>,</span></span>\n<span class=\"r-in\"><span>  sd <span class=\"op\">=</span> <span class=\"fl\">0.5</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Gather necessary data into a data.frame; split into training / testing</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">out</span>, <span class=\"va\">temp</span>, time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq_along</a></span><span class=\"op\">(</span><span class=\"va\">temp</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data_train</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">180</span>, <span class=\"op\">]</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data_test</span> <span class=\"op\">&lt;-</span> <span class=\"va\">data</span><span class=\"op\">[</span><span class=\"fl\">181</span><span class=\"op\">:</span><span class=\"fl\">200</span>, <span class=\"op\">]</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit the model using the dynamic() formula helper</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mvgam</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  formula <span class=\"op\">=</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"va\">out</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"dynamic.html\">dynamic</a></span><span class=\"op\">(</span><span class=\"va\">temp</span>,</span></span>\n<span class=\"r-in\"><span>      scale <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span></span>\n<span class=\"r-in\"><span>      k <span class=\"op\">=</span> <span class=\"fl\">40</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>  newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>  chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>gp effects in mvgam cannot yet handle autogrouping</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> resetting all instances of 'gr = TRUE' to 'gr = FALSE'</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once per session.</span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmp0I0R3Y/model-271861f12de.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                           </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect the model summary, forecast and time-varying coefficient distribution</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> out ~ gp(time, by = temp, c = 5/4, k = 40, scale = FALSE)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001b088c85638&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gaussian</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> identity</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> None</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 200 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Observation error parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              2.5%  50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma_obs[1] 0.44 0.49  0.55    1  1291</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                    2.5%      50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)       4.000  4.0e+00 4.100 1.00  1466</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.1   0.900  3.2e+00 6.200 1.00   761</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.2  -2.700  1.4e+00 5.600 1.00   649</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.3  -5.300 -1.6e+00 3.400 1.00   739</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.4  -5.200 -1.2e+00 1.900 1.00   759</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.5  -2.300  4.8e-01 3.500 1.00   937</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.6  -2.200  1.8e-01 3.500 1.00   871</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.7  -3.100 -3.6e-01 2.100 1.00  1152</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.8  -1.800  2.2e-01 2.700 1.00   951</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.9  -1.400  2.8e-01 2.500 1.00   969</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.10 -2.400 -3.3e-01 1.200 1.00   814</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.11 -2.100 -6.9e-02 1.200 1.00   967</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.12 -0.960  1.5e-01 2.200 1.00   898</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.13 -1.400  1.3e-09 1.300 1.00  1036</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.14 -1.600 -8.0e-03 0.680 1.00  1112</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.15 -0.960  4.7e-11 1.200 1.00   793</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.16 -1.000  1.1e-06 1.000 1.00  1006</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.17 -0.710  5.7e-08 0.860 1.00   932</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.18 -0.840 -3.5e-14 0.870 1.00   697</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.19 -1.100 -3.2e-07 0.410 1.00  1005</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.20 -0.760  3.6e-20 0.580 1.00  1316</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.21 -0.320  1.7e-06 0.950 1.00   754</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.22 -0.670 -3.0e-14 0.340 1.01   533</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.23 -0.700 -7.1e-13 0.310 1.00   725</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.24 -0.270  1.2e-12 0.650 1.01   723</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.25 -0.340 -4.2e-27 0.300 1.00   922</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.26 -0.830 -2.1e-21 0.150 1.00   509</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.27 -0.240  1.6e-25 0.390 1.00   869</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.28 -0.190  6.4e-21 0.500 1.00   809</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.29 -0.240 -1.6e-50 0.270 1.00  1141</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.30 -0.230 -4.1e-41 0.220 1.00   847</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.31 -0.190  1.9e-57 0.290 1.00  1254</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.32 -0.160 -8.5e-55 0.160 1.00   987</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.33 -0.150 -3.2e-91 0.130 1.00  1181</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.34 -0.150 -1.9e-62 0.120 1.00   867</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.35 -0.095 -1.4e-84 0.160 1.00   779</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.36 -0.230 -1.9e-78 0.061 1.00   745</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.37 -0.240  4.9e-77 0.037 1.00   383</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.38 -0.051  4.6e-81 0.160 1.00   290</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.39 -0.045  1.7e-81 0.097 1.00   685</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gp(time):temp.40 -0.083 -5.3e-90 0.041 1.00   574</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM gp term marginal deviation (alpha) and length scale (rho) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                     2.5%   50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> alpha_gp(time):temp 0.17  0.33   0.73 1.00   360</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> rho_gp(time):temp   9.10 30.00 100.00 1.01   148</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 39 of 1000 iterations ended with a divergence (3.9%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  *Try running with larger adapt_delta to remove the divergences</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 26 10:07:50 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"smooths\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-18.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample CRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 6.32777364953055</span>\n<span class=\"r-plt img\"><img src=\"mvgam-19.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Propagating the smooth term shows how the coefficient is expected to evolve</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_smooth.html\">plot_mvgam_smooth</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, smooth <span class=\"op\">=</span> <span class=\"fl\">1</span>, newdata <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>v <span class=\"op\">=</span> <span class=\"fl\">180</span>, lty <span class=\"op\">=</span> <span class=\"st\">\"dashed\"</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/points.html\" class=\"external-link\">points</a></span><span class=\"op\">(</span><span class=\"va\">beta_temp</span>, pch <span class=\"op\">=</span> <span class=\"fl\">16</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-20.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example showing how to incorporate an offset; simulate some count data</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># with different means per series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">100</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  prop_trend <span class=\"op\">=</span> <span class=\"fl\">0</span>, mu <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">2</span>, <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  seasonality <span class=\"op\">=</span> <span class=\"st\">\"hierarchical\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Add offset terms to the training and testing data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">offset</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">0.5</span> <span class=\"op\">*</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">offset</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">0.5</span> <span class=\"op\">*</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model that includes the offset in the linear predictor as well as</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># hierarchical seasonal smooths</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mvgam</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  formula <span class=\"op\">=</span> <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/offset.html\" class=\"external-link\">offset</a></span><span class=\"op\">(</span><span class=\"va\">offset</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"re\"</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span>, m <span class=\"op\">=</span> <span class=\"fl\">1</span>, k <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>  chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmp0I0R3Y/model-2718797d1653.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                                 ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Inspect the model file to see the modification to the linear predictor</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># (eta)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"code.html\">code</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> // Stan model code generated by package mvgam</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> data {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; total_obs; // total number of observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n; // number of timepoints per series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_series; // number of series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] zero; // prior locations for basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] off_set; // offset vector</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[4, 4] S2; // mgcv smooth penalty matrix S2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[4, 4] S3; // mgcv smooth penalty matrix S3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[4, 4] S4; // mgcv smooth penalty matrix S4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // raw basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[1] sigma_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // random effect means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[1] mu_raw;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector&lt;lower=0&gt;[n_sp] lambda;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> transformed parameters {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // basis coefficients</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[num_basis] b;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[1 : 21] = b_raw[1 : 21];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b[22 : 24] = mu_raw[1] + b_raw[22 : 24] * sigma_raw[1];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> model {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population variances</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   sigma_raw ~ student_t(3, 0, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for random effect population means</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   mu_raw ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for (Intercept)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[1] ~ student_t(3, 1.6, 2.5);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[2 : 9] ~ multi_normal_prec(zero[2 : 9], S1[1 : 8, 1 : 8] * lambda[1]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season):seriesseries_1...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[10 : 13] ~ multi_normal_prec(zero[10 : 13],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      S2[1 : 4, 1 : 4] * lambda[2]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season):seriesseries_2...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[14 : 17] ~ multi_normal_prec(zero[14 : 17],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      S3[1 : 4, 1 : 4] * lambda[3]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior for s(season):seriesseries_3...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[18 : 21] ~ multi_normal_prec(zero[18 : 21],</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                      S4[1 : 4, 1 : 4] * lambda[4]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // prior (non-centred) for s(series)...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   b_raw[22 : 24] ~ std_normal();</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // priors for smoothing parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   lambda ~ normal(5, 30);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     // likelihood functions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     flat_ys ~ poisson_log_glm(flat_xs, off_set[obs_ind], b);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> generated quantities {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[total_obs] eta;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   matrix[n, n_series] mus;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   vector[n_sp] rho;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   array[n, n_series] int ypred;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   rho = log(lambda);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   // posterior predictions</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   eta = X * b + off_set;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   for (s in 1 : n_series) {</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> }</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Forecasts for the first two series will differ in magnitude</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span>, ncol <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span>, ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">75</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 26.74677</span>\n<span class=\"r-plt img\"><img src=\"mvgam-21.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span>, ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">75</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 101.419478</span>\n<span class=\"r-plt img\"><img src=\"mvgam-22.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Changing the offset for the testing data should lead to changes in</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># the forecast</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">offset</span> <span class=\"op\">&lt;-</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">offset</span> <span class=\"op\">-</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 41.478396</span>\n<span class=\"r-plt img\"><img src=\"mvgam-23.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Relative Risks can be computed by fixing the offset to the same value</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># for each series</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">offset</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/nrow.html\" class=\"external-link\">NROW</a></span><span class=\"op\">(</span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">preds_rr</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/predict.html\" class=\"external-link\">predict</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"link\"</span>, newdata <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>  summary <span class=\"op\">=</span> <span class=\"cn\">FALSE</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">series1_inds</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"st\">\"series_1\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">series2_inds</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/which.html\" class=\"external-link\">which</a></span><span class=\"op\">(</span><span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">$</span><span class=\"va\">series</span> <span class=\"op\">==</span> <span class=\"st\">\"series_2\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Relative Risks are now more comparable among series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span>, ncol <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">preds_rr</span><span class=\"op\">[</span><span class=\"fl\">1</span>, <span class=\"va\">series1_inds</span><span class=\"op\">]</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"l\"</span>, col <span class=\"op\">=</span> <span class=\"st\">\"grey75\"</span>,</span></span>\n<span class=\"r-in\"><span>  ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/range.html\" class=\"external-link\">range</a></span><span class=\"op\">(</span><span class=\"va\">preds_rr</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  ylab <span class=\"op\">=</span> <span class=\"st\">\"Series1 Relative Risk\"</span>, xlab <span class=\"op\">=</span> <span class=\"st\">\"Time\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">for</span> <span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">50</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">preds_rr</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">series1_inds</span><span class=\"op\">]</span>, col <span class=\"op\">=</span> <span class=\"st\">\"grey75\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">preds_rr</span><span class=\"op\">[</span><span class=\"fl\">1</span>, <span class=\"va\">series2_inds</span><span class=\"op\">]</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"l\"</span>, col <span class=\"op\">=</span> <span class=\"st\">\"darkred\"</span>,</span></span>\n<span class=\"r-in\"><span>  ylim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/range.html\" class=\"external-link\">range</a></span><span class=\"op\">(</span><span class=\"va\">preds_rr</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  ylab <span class=\"op\">=</span> <span class=\"st\">\"Series2 Relative Risk\"</span>, xlab <span class=\"op\">=</span> <span class=\"st\">\"Time\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">for</span> <span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">50</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/lines.html\" class=\"external-link\">lines</a></span><span class=\"op\">(</span><span class=\"va\">preds_rr</span><span class=\"op\">[</span><span class=\"va\">i</span>, <span class=\"va\">series2_inds</span><span class=\"op\">]</span>, col <span class=\"op\">=</span> <span class=\"st\">\"darkred\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-24.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example showcasing how cbind() is needed for Binomial observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate two time series of Binomial trials</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">trials</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sample.html\" class=\"external-link\">sample</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">20</span><span class=\"op\">:</span><span class=\"fl\">25</span><span class=\"op\">)</span>, <span class=\"fl\">50</span>, replace <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">50</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">detprob1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Logistic.html\" class=\"external-link\">plogis</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">0.5</span> <span class=\"op\">+</span> <span class=\"fl\">0.9</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">detprob2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Logistic.html\" class=\"external-link\">plogis</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">0.1</span> <span class=\"op\">-</span> <span class=\"fl\">0.7</span> <span class=\"op\">*</span> <span class=\"va\">x</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">rbind</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>    y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">50</span>, size <span class=\"op\">=</span> <span class=\"va\">trials</span>, prob <span class=\"op\">=</span> <span class=\"va\">detprob1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>    time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">50</span>,</span></span>\n<span class=\"r-in\"><span>    series <span class=\"op\">=</span> <span class=\"st\">\"series1\"</span>,</span></span>\n<span class=\"r-in\"><span>    x <span class=\"op\">=</span> <span class=\"va\">x</span>,</span></span>\n<span class=\"r-in\"><span>    ntrials <span class=\"op\">=</span> <span class=\"va\">trials</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>    y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">50</span>, size <span class=\"op\">=</span> <span class=\"va\">trials</span>, prob <span class=\"op\">=</span> <span class=\"va\">detprob2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>    time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">50</span>,</span></span>\n<span class=\"r-in\"><span>    series <span class=\"op\">=</span> <span class=\"st\">\"series2\"</span>,</span></span>\n<span class=\"r-in\"><span>    x <span class=\"op\">=</span> <span class=\"va\">x</span>,</span></span>\n<span class=\"r-in\"><span>    ntrials <span class=\"op\">=</span> <span class=\"va\">trials</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span><span class=\"va\">dat</span>, series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">dat</span>, <span class=\"va\">time</span>, <span class=\"va\">series</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">dat</span>, series <span class=\"op\">=</span> <span class=\"st\">\"all\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-25.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model using the binomial() family; must specify observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and number of trials in the cbind() wrapper</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mvgam</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  formula <span class=\"op\">=</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"va\">ntrials</span><span class=\"op\">)</span> <span class=\"op\">~</span> <span class=\"va\">series</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>  chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Binomial and Beta-binomial families require cbind(n_successes, n_trials)</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> in the formula left-hand side. Do not use cbind(n_successes, n_failures)!</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once per session.</span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmp0I0R3Y/model-2718134b5c27.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                       </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>        \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> cbind(y, ntrials) ~ series + s(x, by = series)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001b088c85638&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> binomial</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> logit</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> None</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                        2.5%      50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)          -0.430 -0.31000 -0.170 1.00   535</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> seriesseries2        -0.076  0.10000  0.280 1.01   490</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.1 -0.100  0.05900  0.760 1.03    50</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.2 -0.320 -0.00250  0.370 1.00   330</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.3 -0.250 -0.01000  0.100 1.00   223</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.4 -0.190  0.00190  0.220 1.00   268</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.5 -0.110 -0.00270  0.050 1.01   246</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.6 -0.150  0.00440  0.210 1.00   323</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.7 -0.130 -0.00470  0.089 1.00   381</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.8 -0.820 -0.00910  0.690 1.00   315</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.9  0.034  0.86000  1.100 1.03    56</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.1 -0.330 -0.02300  0.130 1.02   103</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.2 -0.230 -0.01100  0.130 1.01   292</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.3 -0.080 -0.00220  0.077 1.00   530</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.4 -0.120 -0.00140  0.100 1.00   558</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.5 -0.037  0.00033  0.039 1.00   352</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.6 -0.083  0.00360  0.120 1.00   613</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.7 -0.056 -0.00110  0.054 1.00   714</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.8 -0.480 -0.01300  0.370 1.00   548</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.9 -0.840 -0.63000 -0.260 1.01   126</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                      edf Ref.df Chi.sq p-value    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1 3.242      9   48.5  &lt;2e-16 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2 0.985      9   23.3    0.35    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 26 10:09:03 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"bars_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span>, ndraws <span class=\"op\">=</span> <span class=\"fl\">50</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-26.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"ecdf_overlay_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span>, ndraws <span class=\"op\">=</span> <span class=\"fl\">50</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-27.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"link\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam-28.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"mvgam-29.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_diagnostics.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Extract diagnostic quantities of mvgam models — mvgam_diagnostics • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\"><meta name=\"description\" content=\"Extract quantities that can be used to diagnose sampling behavior\nof the algorithms applied by Stan at the back-end of mvgam.\"><meta property=\"og:description\" content=\"Extract quantities that can be used to diagnose sampling behavior\nof the algorithms applied by Stan at the back-end of mvgam.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract diagnostic quantities of <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_diagnostics.R\" class=\"external-link\"><code>R/mvgam_diagnostics.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_diagnostics.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Extract quantities that can be used to diagnose sampling behavior\nof the algorithms applied by <span class=\"pkg\">Stan</span> at the back-end of <span class=\"pkg\">mvgam</span>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">nuts_params</span><span class=\"op\">(</span><span class=\"va\">object</span>, pars <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">log_posterior</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">rhat</span><span class=\"op\">(</span><span class=\"va\">x</span>, pars <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">neff_ratio</span><span class=\"op\">(</span><span class=\"va\">object</span>, pars <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object-x\">object, x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object-x\"></a></dt>\n<dd><p>A <code>mvgam</code> or <code>jsdgam</code> object.</p></dd>\n\n\n<dt id=\"arg-pars\">pars<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-pars\"></a></dt>\n<dd><p>An optional character vector of parameter names.\nFor <code>nuts_params</code> these will be NUTS sampler parameter\nnames rather than model parameters. If pars is omitted\nall parameters are included.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Arguments passed to individual methods.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>The exact form of the output depends on the method.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>For more details see\n<code><a href=\"https://mc-stan.org/bayesplot/reference/bayesplot-extractors.html\" class=\"external-link\">bayesplot-extractors</a></code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 0.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"va\">np</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">nuts_params</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">np</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   Chain Iteration     Parameter    Value</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1     1         1 accept_stat__ 1.000000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2     1         2 accept_stat__ 0.992268</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3     1         3 accept_stat__ 0.777018</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4     1         4 accept_stat__ 0.989895</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5     1         5 accept_stat__ 0.854329</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6     1         6 accept_stat__ 0.928752</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># extract the number of divergence transitions</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/sum.html\" class=\"external-link\">sum</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/subset.html\" class=\"external-link\">subset</a></span><span class=\"op\">(</span><span class=\"va\">np</span>, <span class=\"va\">Parameter</span> <span class=\"op\">==</span> <span class=\"st\">\"divergent__\"</span><span class=\"op\">)</span><span class=\"op\">$</span><span class=\"va\">Value</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 0</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"fu\">neff_ratio</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  mus[1,1]  mus[2,1]  mus[3,1]  mus[4,1]  mus[5,1]  mus[6,1] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0.7872905 0.6691465 0.7611481 0.5512319 0.7750102 0.7717447 </span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_draws.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Extract posterior draws from fitted mvgam objects — mvgam_draws • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract posterior draws from fitted mvgam objects — mvgam_draws\"><meta name=\"description\" content=\"Extract posterior draws in conventional formats as data.frames, matrices, or arrays.\"><meta property=\"og:description\" content=\"Extract posterior draws in conventional formats as data.frames, matrices, or arrays.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract posterior draws from fitted <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/as.data.frame.mvgam.R\" class=\"external-link\"><code>R/as.data.frame.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_draws.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Extract posterior draws in conventional formats as data.frames, matrices, or arrays.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.data.frame.html\" class=\"external-link\">as.data.frame</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  row.names <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  optional <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  variable <span class=\"op\">=</span> <span class=\"st\">\"betas\"</span>,</span>\n<span>  use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">as.matrix</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, variable <span class=\"op\">=</span> <span class=\"st\">\"betas\"</span>, regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/array.html\" class=\"external-link\">as.array</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, variable <span class=\"op\">=</span> <span class=\"st\">\"betas\"</span>, regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/posterior/reference/draws.html\" class=\"external-link\">as_draws</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  inc_warmup <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/posterior/reference/draws_matrix.html\" class=\"external-link\">as_draws_matrix</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  inc_warmup <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/posterior/reference/draws_df.html\" class=\"external-link\">as_draws_df</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  inc_warmup <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/posterior/reference/draws_array.html\" class=\"external-link\">as_draws_array</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  inc_warmup <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/posterior/reference/draws_list.html\" class=\"external-link\">as_draws_list</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  inc_warmup <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/posterior/reference/draws_rvars.html\" class=\"external-link\">as_draws_rvars</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, inc_warmup <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-row-names\">row.names<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-row-names\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n\n<dt id=\"arg-optional\">optional<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-optional\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n\n<dt id=\"arg-variable\">variable<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-variable\"></a></dt>\n<dd><p>A character specifying which parameters to extract. Can either be one of the\nfollowing options:</p><ul><li><p><code>obs_params</code> (other parameters specific to the observation model, such as overdispsersions\nfor negative binomial models or observation error SD for gaussian / student-t models)</p></li>\n<li><p><code>betas</code> (beta coefficients from the GAM observation model linear predictor; default)</p></li>\n<li><p><code>smooth_params</code> (smoothing parameters from the GAM observation model)</p></li>\n<li><p><code>linpreds</code> (estimated linear predictors on whatever link scale was used in the model)</p></li>\n<li><p><code>trend_params</code> (parameters governing the trend dynamics, such as AR parameters,\ntrend SD parameters or Gaussian Process parameters)</p></li>\n<li><p><code>trend_betas</code> (beta coefficients from the GAM latent process model linear predictor;\nonly available if a <code>trend_formula</code> was supplied in the original model)</p></li>\n<li><p><code>trend_smooth_params</code> (process model GAM smoothing parameters;\nonly available if a <code>trend_formula</code> was supplied in the original model)</p></li>\n<li><p><code>trend_linpreds</code> (process model linear predictors on the identity scale;\nonly available if a <code>trend_formula</code> was supplied in the original model)</p></li>\n</ul><p>OR can be a character vector\nproviding the variables to extract</p></dd>\n\n\n<dt id=\"arg-use-alias\">use_alias<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-use-alias\"></a></dt>\n<dd><p>Logical. If more informative names for parameters are available\n(i.e. for beta coefficients <code>b</code> or for smoothing parameters <code>rho</code>), replace the uninformative\nnames with the more informative alias. Defaults to <code>TRUE</code></p></dd>\n\n\n<dt id=\"arg-regex\">regex<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-regex\"></a></dt>\n<dd><p>Logical. If not using one of the prespecified options for extractions,\nshould <code>variable</code> be treated as a (vector of)\nregular expressions? Any variable in x matching at least one of the regular expressions\nwill be selected. Defaults to <code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n\n<dt id=\"arg-inc-warmup\">inc_warmup<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-inc-warmup\"></a></dt>\n<dd><p>Should warmup draws be included? Defaults to <code>FALSE</code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>data.frame</code>, <code>matrix</code>, or <code>array</code> containing the posterior draws.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">sim</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Supplying trend_model as a character string is deprecated</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> Please use the dedicated functions (i.e. RW() or ZMVN()) instead</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once per session.</span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c33d43f8.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"va\">beta_draws_df</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.data.frame.html\" class=\"external-link\">as.data.frame</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, variable <span class=\"op\">=</span> <span class=\"st\">'betas'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">beta_draws_df</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   (Intercept) s(season).1 s(season).2 s(season).3 s(season).4 s(season).5 s(season).6 s(season).7 s(season).8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1    0.319726   -0.972376   -1.148710   -0.734276    0.462118     1.59223    0.934666    0.399375    0.176647</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2    0.180193   -1.616300   -1.036090   -0.768414    0.655170     1.20669    0.844760    0.243960    0.868440</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3    0.304901   -1.073380   -1.322890   -0.503359    0.964529     1.30952    1.059640    0.516082    0.115212</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4    0.268791   -1.224270   -0.946018   -0.636852    0.379731     1.22659    0.803573    0.351586    0.719370</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5    0.245721   -0.968587   -1.256310   -0.893110    0.591861     1.64159    1.097970    0.255019    0.607658</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6    0.135226   -1.155560   -1.011880   -0.336560    0.623057     1.02631    0.844620    0.643441    0.583991</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">beta_draws_df</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 'data.frame':\t1000 obs. of  9 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ (Intercept): num  0.32 0.18 0.305 0.269 0.246 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).1: num  -0.972 -1.616 -1.073 -1.224 -0.969 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).2: num  -1.149 -1.036 -1.323 -0.946 -1.256 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).3: num  -0.734 -0.768 -0.503 -0.637 -0.893 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).4: num  0.462 0.655 0.965 0.38 0.592 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).5: num  1.59 1.21 1.31 1.23 1.64 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).6: num  0.935 0.845 1.06 0.804 1.098 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).7: num  0.399 0.244 0.516 0.352 0.255 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ s(season).8: num  0.177 0.868 0.115 0.719 0.608 ...</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">beta_draws_mat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">as.matrix</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, variable <span class=\"op\">=</span> <span class=\"st\">'betas'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">beta_draws_mat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     variable</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> draw (Intercept) s(season).1 s(season).2 s(season).3 s(season).4 s(season).5 s(season).6 s(season).7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    1    0.319726   -0.972376   -1.148710   -0.734276    0.462118     1.59223    0.934666    0.399375</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    2    0.180193   -1.616300   -1.036090   -0.768414    0.655170     1.20669    0.844760    0.243960</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    3    0.304901   -1.073380   -1.322890   -0.503359    0.964529     1.30952    1.059640    0.516082</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    4    0.268791   -1.224270   -0.946018   -0.636852    0.379731     1.22659    0.803573    0.351586</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    5    0.245721   -0.968587   -1.256310   -0.893110    0.591861     1.64159    1.097970    0.255019</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    6    0.135226   -1.155560   -1.011880   -0.336560    0.623057     1.02631    0.844620    0.643441</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     variable</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> draw s(season).8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    1    0.176647</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    2    0.868440</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    3    0.115212</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    4    0.719370</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    5    0.607658</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    6    0.583991</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">beta_draws_mat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  num [1:1000, 1:9] 0.32 0.18 0.305 0.269 0.246 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ draw    : chr [1:1000] \"1\" \"2\" \"3\" \"4\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ variable: chr [1:9] \"(Intercept)\" \"s(season).1\" \"s(season).2\" \"s(season).3\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"nchains\")= int 2</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">shape_pars</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">as.matrix</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>, variable <span class=\"op\">=</span> <span class=\"st\">'shape'</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">shape_pars</span><span class=\"op\">)</span><span class=\"co\"># }</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     variable</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> draw shape[1] shape[2] shape[3]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    1 1.365670 0.973384 1.237680</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    2 0.869383 1.512070 0.948521</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    3 0.790533 1.020250 1.035100</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    4 0.957937 1.139440 1.354040</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    5 0.981846 0.952409 1.087680</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    6 0.967652 1.438820 1.650290</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_families.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Supported mvgam families\"><title>Supported mvgam families — mvgam_families • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Supported mvgam families — mvgam_families\"><meta property=\"og:description\" content=\"Supported mvgam families\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Supported <span class=\"pkg\">mvgam</span> families</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/families.R\" class=\"external-link\"><code>R/families.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_families.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Supported <span class=\"pkg\">mvgam</span> families</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">tweedie</span><span class=\"op\">(</span>link <span class=\"op\">=</span> <span class=\"st\">\"log\"</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">student_t</span><span class=\"op\">(</span>link <span class=\"op\">=</span> <span class=\"st\">\"identity\"</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">betar</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">nb</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">lognormal</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">student</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">bernoulli</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">beta_binomial</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">nmix</span><span class=\"op\">(</span>link <span class=\"op\">=</span> <span class=\"st\">\"log\"</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>link</dt>\n<dd><p>a specification for the family link function. At present these cannot\nbe changed</p></dd>\n\n\n<dt>...</dt>\n<dd><p>Arguments to be passed to the <span class=\"pkg\">mgcv</span> version of the associated functions</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>Objects of class <code>family</code></p>\n\n\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>mvgam</code> currently supports the following standard observation families:</p><ul><li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></code> with identity link, for real-valued data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></code> with log-link, for count data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma</a></code> with log-link, for non-negative real-valued data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial</a></code> with logit-link, for count data when the number\nof trials is known (and must be supplied)</p></li>\n</ul><p>In addition, the following extended families from the <code>mgcv</code> and <code>brms</code> packages are supported:</p><ul><li><p><code><a href=\"https://rdrr.io/pkg/mgcv/man/Beta.html\" class=\"external-link\">betar</a></code> with logit-link, for proportional data on <code>(0,1)</code></p></li>\n<li><p><code><a href=\"https://rdrr.io/pkg/mgcv/man/negbin.html\" class=\"external-link\">nb</a></code> with log-link, for count data</p></li>\n<li><p><code><a href=\"https://paulbuerkner.com/brms/reference/brmsfamily.html\" class=\"external-link\">lognormal</a></code> with identity-link, for non-negative real-valued data</p></li>\n<li><p><code><a href=\"https://paulbuerkner.com/brms/reference/brmsfamily.html\" class=\"external-link\">bernoulli</a></code> with logit-link, for binary data</p></li>\n<li><p><code><a href=\"https://paulbuerkner.com/brms/reference/brmsfamily.html\" class=\"external-link\">beta_binomial</a></code> with logit-link, as for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> but allows\nfor overdispersion</p></li>\n</ul><p>Finally, <code>mvgam</code> supports the three extended families described here:</p><ul><li><p><code>tweedie</code> with log-link, for count data (power parameter <code>p</code> fixed at <code>1.5</code>)</p></li>\n<li><p><code>student_t()</code> (or <code><a href=\"https://paulbuerkner.com/brms/reference/brmsfamily.html\" class=\"external-link\">student</a></code>) with identity-link, for real-valued data</p></li>\n<li><p><code>nmix</code> for count data with imperfect detection modeled via a\nState-Space N-Mixture model. The latent states are Poisson (with log link), capturing the 'true' latent\nabundance, while the observation process is Binomial to account for imperfect detection. The\nobservation <code>formula</code> in these models is used to set up a linear predictor for the detection\nprobability (with logit link). See the example below for a more detailed worked explanation\nof the <code>nmix()</code> family</p></li>\n</ul><p>Only <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code>, <code>nb()</code>, and <code>tweedie()</code> are available if\nusing <code>JAGS</code>. All families, apart from <code>tweedie()</code>, are supported if\nusing <code>Stan</code>.</p>\n<p>Note that currently it is not possible to change the default link\nfunctions in <code>mvgam</code>, so any call to change these will be silently ignored</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example showing how to set up N-mixture models</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">999</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate observations for species 1, which shows a declining trend and 0.7 detection probability</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>site <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>          <span class=\"co\"># five replicates per year; six years</span></span></span>\n<span class=\"r-in\"><span>          replicate <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>          time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">6</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>          species <span class=\"op\">=</span> <span class=\"st\">'sp_1'</span>,</span></span>\n<span class=\"r-in\"><span>          <span class=\"co\"># true abundance declines nonlinearly</span></span></span>\n<span class=\"r-in\"><span>          truth <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">28</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">26</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">23</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">16</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">14</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">14</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>          <span class=\"co\"># observations are taken with detection prob = 0.7</span></span></span>\n<span class=\"r-in\"><span>          obs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">28</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">26</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">23</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">15</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">14</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                  <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">14</span>, <span class=\"fl\">0.7</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span> <span class=\"co\"># add 'series' information, which is an identifier of site, replicate and species</span></span></span>\n<span class=\"r-in\"><span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'site_'</span>, <span class=\"va\">site</span>,</span></span>\n<span class=\"r-in\"><span>                               <span class=\"st\">'_'</span>, <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>                               <span class=\"st\">'_rep_'</span>, <span class=\"va\">replicate</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">time</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>               <span class=\"co\"># add a 'cap' variable that defines the maximum latent N to</span></span></span>\n<span class=\"r-in\"><span>               <span class=\"co\"># marginalize over when estimating latent abundance; in other words</span></span></span>\n<span class=\"r-in\"><span>               <span class=\"co\"># how large do we realistically think the true abundance could be?</span></span></span>\n<span class=\"r-in\"><span>               cap <span class=\"op\">=</span> <span class=\"fl\">80</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"op\">-</span> <span class=\"va\">replicate</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">testdat</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now add another species that has a different temporal trend and a smaller</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># detection probability (0.45 for this species)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">testdat</span> <span class=\"op\">=</span> <span class=\"va\">testdat</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/bind_rows.html\" class=\"external-link\">bind_rows</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>site <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>                             replicate <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                             time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sort.html\" class=\"external-link\">sort</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">6</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                             species <span class=\"op\">=</span> <span class=\"st\">'sp_2'</span>,</span></span>\n<span class=\"r-in\"><span>                             truth <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">4</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                       <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">7</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                       <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">15</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                       <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">16</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                       <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">19</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                       <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">18</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                             obs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">4</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                     <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">7</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                     <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">15</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                     <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">16</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                     <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">19</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                     <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">18</span>, <span class=\"fl\">0.45</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"st\">'site_'</span>, <span class=\"va\">site</span>,</span></span>\n<span class=\"r-in\"><span>                                                  <span class=\"st\">'_'</span>, <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>                                                  <span class=\"st\">'_rep_'</span>, <span class=\"va\">replicate</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                  time <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"va\">time</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                  cap <span class=\"op\">=</span> <span class=\"fl\">50</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span>                    <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"va\">replicate</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># series identifiers</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">species</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span>                          levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">species</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">series</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">series</span>,</span></span>\n<span class=\"r-in\"><span>                         levels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/unique.html\" class=\"external-link\">unique</a></span><span class=\"op\">(</span><span class=\"va\">testdat</span><span class=\"op\">$</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The trend_map to state how replicates are structured</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">testdat</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># each unique combination of site*species is a separate process</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span>trend <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">as.numeric</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"va\">site</span>, <span class=\"va\">species</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/select.html\" class=\"external-link\">select</a></span><span class=\"op\">(</span><span class=\"va\">trend</span>, <span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\"><a href=\"pipe.html\">%&gt;%</a></span></span></span>\n<span class=\"r-in\"><span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/distinct.html\" class=\"external-link\">distinct</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">-&gt;</span> <span class=\"va\">trend_map</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">trend_map</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    trend            series</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1      1 site_1_sp_1_rep_1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2      1 site_1_sp_1_rep_2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3      1 site_1_sp_1_rep_3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4      1 site_1_sp_1_rep_4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5      1 site_1_sp_1_rep_5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6      2 site_1_sp_2_rep_1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7      2 site_1_sp_2_rep_2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8      2 site_1_sp_2_rep_3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9      2 site_1_sp_2_rep_4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10     2 site_1_sp_2_rep_5</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>            <span class=\"co\"># the observation formula sets up linear predictors for</span></span></span>\n<span class=\"r-in\"><span>            <span class=\"co\"># detection probability on the logit scale</span></span></span>\n<span class=\"r-in\"><span>            formula <span class=\"op\">=</span> <span class=\"va\">obs</span> <span class=\"op\">~</span> <span class=\"va\">species</span> <span class=\"op\">-</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>            <span class=\"co\"># the trend_formula sets up the linear predictors for</span></span></span>\n<span class=\"r-in\"><span>            <span class=\"co\"># the latent abundance processes on the log scale</span></span></span>\n<span class=\"r-in\"><span>            trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">time</span>, by <span class=\"op\">=</span> <span class=\"va\">trend</span>, k <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"va\">species</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>            <span class=\"co\"># the trend_map takes care of the mapping</span></span></span>\n<span class=\"r-in\"><span>            trend_map <span class=\"op\">=</span> <span class=\"va\">trend_map</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>            <span class=\"co\"># nmix() family and data</span></span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\">nmix</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">testdat</span>,</span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span>            <span class=\"co\"># priors can be set in the usual way</span></span></span>\n<span class=\"r-in\"><span>            priors <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">std_normal</span><span class=\"op\">(</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">b</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                       <span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></span><span class=\"op\">(</span><span class=\"fu\">normal</span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1.5</span><span class=\"op\">)</span>, class <span class=\"op\">=</span> <span class=\"va\">Intercept_trend</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 4.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 4.7 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 4.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 5.1 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The usual diagnostics</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM observation formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> obs ~ species - 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x00000283526ecb60&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM process formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ~s(time, by = trend, k = 4) + species</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x00000283526ecb60&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> nmix</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> log</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> None</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N process models:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM observation model coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              2.5%     50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> speciessp_1 -0.19  0.7300  1.40 1.01   411</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> speciessp_2 -1.20 -0.0064  0.89 1.00   398</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM process model coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                               2.5%     50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)_trend            2.700  3.0000  3.400 1.01   394</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> speciessp_2_trend           -1.200 -0.6100  0.150 1.00   329</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):trendtrend1.1_trend -0.064  0.0160  0.180 1.01   375</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):trendtrend1.2_trend -0.230  0.0035  0.280 1.00   685</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):trendtrend1.3_trend -0.450 -0.2400 -0.042 1.00   680</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):trendtrend2.1_trend -0.160 -0.0110  0.076 1.00   456</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):trendtrend2.2_trend -0.170  0.0230  0.350 1.00   475</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):trendtrend2.3_trend  0.059  0.3400  0.630 1.00   664</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM process smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                        edf Ref.df Chi.sq p-value</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):seriestrend1 0.809      3   4.22    0.57</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(time):seriestrend2 0.999      3   3.00    0.54</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Tue Feb 18 10:33:03 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plotting conditional effects</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://ggplot2.tidyverse.org\" class=\"external-link\">ggplot2</a></span><span class=\"op\">)</span>; <span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://marginaleffects.com/\" class=\"external-link\">marginaleffects</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"st\">'species'</span>,</span></span>\n<span class=\"r-in\"><span>                 type <span class=\"op\">=</span> <span class=\"st\">'detection'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>     <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">ylab</a></span><span class=\"op\">(</span><span class=\"st\">'Pr(detection)'</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>     <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/lims.html\" class=\"external-link\">ylim</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>     <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/ggtheme.html\" class=\"external-link\">theme_classic</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>     <span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/theme.html\" class=\"external-link\">theme</a></span><span class=\"op\">(</span>legend.position <span class=\"op\">=</span> <span class=\"st\">'none'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"mvgam_families-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example showcasing how cbind() is needed for Binomial observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate two time series of Binomial trials</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">trials</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sample.html\" class=\"external-link\">sample</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">20</span><span class=\"op\">:</span><span class=\"fl\">25</span><span class=\"op\">)</span>, <span class=\"fl\">50</span>, replace <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">50</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">detprob1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Logistic.html\" class=\"external-link\">plogis</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">0.5</span> <span class=\"op\">+</span> <span class=\"fl\">0.9</span><span class=\"op\">*</span><span class=\"va\">x</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">detprob2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Logistic.html\" class=\"external-link\">plogis</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">0.1</span> <span class=\"op\">-</span><span class=\"fl\">0.7</span><span class=\"op\">*</span><span class=\"va\">x</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">rbind</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">50</span>, size <span class=\"op\">=</span> <span class=\"va\">trials</span>, prob <span class=\"op\">=</span> <span class=\"va\">detprob1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                        time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">50</span>,</span></span>\n<span class=\"r-in\"><span>                        series <span class=\"op\">=</span> <span class=\"st\">'series1'</span>,</span></span>\n<span class=\"r-in\"><span>                        x <span class=\"op\">=</span> <span class=\"va\">x</span>,</span></span>\n<span class=\"r-in\"><span>                        ntrials <span class=\"op\">=</span> <span class=\"va\">trials</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Binomial.html\" class=\"external-link\">rbinom</a></span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">50</span>, size <span class=\"op\">=</span> <span class=\"va\">trials</span>, prob <span class=\"op\">=</span> <span class=\"va\">detprob2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                        time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">50</span>,</span></span>\n<span class=\"r-in\"><span>                        series <span class=\"op\">=</span> <span class=\"st\">'series2'</span>,</span></span>\n<span class=\"r-in\"><span>                        x <span class=\"op\">=</span> <span class=\"va\">x</span>,</span></span>\n<span class=\"r-in\"><span>                        ntrials <span class=\"op\">=</span> <span class=\"va\">trials</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/mutate.html\" class=\"external-link\">mutate</a></span><span class=\"op\">(</span><span class=\"va\">dat</span>, series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">dplyr</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://dplyr.tidyverse.org/reference/arrange.html\" class=\"external-link\">arrange</a></span><span class=\"op\">(</span><span class=\"va\">dat</span>, <span class=\"va\">time</span>, <span class=\"va\">series</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model using the binomial() family; must specify observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and number of trials in the cbind() wrapper</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"va\">ntrials</span><span class=\"op\">)</span> <span class=\"op\">~</span> <span class=\"va\">series</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, by <span class=\"op\">=</span> <span class=\"va\">series</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Binomial and Beta-binomial families require cbind(n_successes, n_trials)</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> in the formula left-hand side. Do not use cbind(n_successes, n_failures)!</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once per session.</span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 4 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 4 finished in 3.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 4.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 4.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 3 finished in 4.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> All 4 chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 4.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 4.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> cbind(y, ntrials) ~ series + s(x, by = series)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x00000283526ecb60&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> binomial</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> logit</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> None</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 2000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                        2.5%     50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)          -0.510 -0.3900 -0.270 1.00  1118</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> seriesseries2         0.095  0.2700  0.430 1.00  1261</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.1 -0.110  0.0590  0.490 1.03   280</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.2 -0.180  0.0110  0.250 1.01   928</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.3 -0.130 -0.0100  0.047 1.02   446</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.4 -0.140 -0.0085  0.096 1.00   919</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.5 -0.077 -0.0053  0.044 1.01   658</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.6 -0.072  0.0096  0.120 1.01   765</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.7 -0.087 -0.0078  0.047 1.01   737</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.8 -0.600  0.0850  1.100 1.01   749</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1.9  0.160  0.7300  1.000 1.03   257</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.1 -0.440 -0.0610  0.120 1.01   432</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.2 -0.150  0.0240  0.320 1.01   209</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.3 -0.051  0.0053  0.120 1.01   624</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.4 -0.180 -0.0160  0.078 1.01   223</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.5 -0.073 -0.0048  0.049 1.00   522</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.6 -0.065  0.0140  0.130 1.01   253</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.7 -0.092 -0.0098  0.051 1.01   247</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.8 -0.540  0.1500  1.200 1.01   221</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2.9 -0.840 -0.5600 -0.068 1.01   436</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                      edf Ref.df Chi.sq p-value    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries1 0.992      9   35.8    0.57    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x):seriesseries2 2.147      9   31.5 1.8e-05 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 2000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 2000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Tue Feb 18 10:33:51 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_fevd-class.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content='A mvgam_fevd object returned by function fevd.\nRun methods(class = \"mvgam_fevd\") to see an overview of available methods.'><title>mvgam_fevd object description — mvgam_fevd-class • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"mvgam_fevd object description — mvgam_fevd-class\"><meta property=\"og:description\" content='A mvgam_fevd object returned by function fevd.\nRun methods(class = \"mvgam_fevd\") to see an overview of available methods.'><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1><code>mvgam_fevd</code> object description</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_fevd-class.R\" class=\"external-link\"><code>R/mvgam_fevd-class.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_fevd-class.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>A <code>mvgam_fevd</code> object returned by function <code><a href=\"fevd.mvgam.html\">fevd</a></code>.\nRun <code>methods(class = \"mvgam_fevd\")</code> to see an overview of available methods.</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A <code>mvgam_fevd</code> object contains a list of posterior forecast\nerror variance decompositions, each stored as\nits own list</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><a href=\"mvgam.html\">mvgam</a>, <a href=\"RW.html\">VAR</a></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_forecast-class.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content='A mvgam_forecast object returned by function hindcast or forecast.\nRun methods(class = \"mvgam_forecast\") to see an overview of available methods.'><title>mvgam_forecast object description — mvgam_forecast-class • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"mvgam_forecast object description — mvgam_forecast-class\"><meta property=\"og:description\" content='A mvgam_forecast object returned by function hindcast or forecast.\nRun methods(class = \"mvgam_forecast\") to see an overview of available methods.'><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.3</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1><code>mvgam_forecast</code> object description</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_forecast-class.R\" class=\"external-link\"><code>R/mvgam_forecast-class.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_forecast-class.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>A <code>mvgam_forecast</code> object returned by function <code><a href=\"hindcast.mvgam.html\">hindcast</a></code> or <code><a href=\"forecast.mvgam.html\">forecast</a></code>.\nRun <code>methods(class = \"mvgam_forecast\")</code> to see an overview of available methods.</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A <code>mvgam_forecast</code> object contains the following elements:</p><ul><li><p><code>call</code> the original observation model formula</p></li>\n<li><p><code>trend_call</code> If a <code>trend_formula was supplied</code>, the original trend model formula is\nreturned. Otherwise <code>NULL</code></p></li>\n<li><p><code>family</code> <code>character</code> description of the observation distribution</p></li>\n<li><p><code>family_pars</code> <code>list</code> containing draws of family-specific parameters (i.e.\nshape, scale or overdispersion parameters). Only returned if <code>type = link</code>. Otherwise <code>NULL</code></p></li>\n<li><p><code>trend_model</code> <code>character</code> description of the latent trend model</p></li>\n<li><p><code>drift</code> Logical specifying whether a drift term was used in the trend model</p></li>\n<li><p><code>use_lv</code> Logical flag indicating whether latent dynamic factors were used in the model</p></li>\n<li><p><code>fit_engine</code> <code>Character</code> describing the fit engine, either as <code>stan</code> or <code>jags</code></p></li>\n<li><p><code>type</code> The type of predictions included (either <code>link</code>, <code>response</code> or <code>trend</code>)</p></li>\n<li><p><code>series_names</code> Names of the time series, taken from <code>levels(data$series)</code> in the original\nmodel fit</p></li>\n<li><p><code>train_observations</code> A <code>list</code> of training observation vectors of length <code>n_series</code></p></li>\n<li><p><code>train_times</code> A <code>vector</code> of the unique training times</p></li>\n<li><p><code>test_observations</code> If the <code><a href=\"forecast.mvgam.html\">forecast</a></code> function was used,\na <code>list</code> of test observation vectors of length <code>n_series</code>. Otherwise <code>NULL</code></p></li>\n<li><p><code>test_times</code> If the <code><a href=\"forecast.mvgam.html\">forecast</a></code> function was used, a\n<code>vector</code> of the unique validation (testing) times. Otherwise <code>NULL</code></p></li>\n<li><p><code>hindcasts</code> A <code>list</code> of posterior hindcast distributions of length <code>n_series</code>.</p></li>\n<li><p><code>forecasts</code> If the <code><a href=\"forecast.mvgam.html\">forecast</a></code> function was used,\na <code>list</code> of posterior forecast distributions of length <code>n_series</code>. Otherwise <code>NULL</code></p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><a href=\"mvgam.html\">mvgam</a>, <a href=\"hindcast.mvgam.html\">hindcast.mvgam</a>, <a href=\"forecast.mvgam.html\">forecast.mvgam</a></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_formulae.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Details of formula specifications in mvgam models — mvgam_formulae • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Details of formula specifications in mvgam models — mvgam_formulae\"><meta name=\"description\" content=\"Details of formula specifications in mvgam models\"><meta property=\"og:description\" content=\"Details of formula specifications in mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Details of formula specifications in <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_formulae.R\" class=\"external-link\"><code>R/mvgam_formulae.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_formulae.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Details of formula specifications in <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code><a href=\"mvgam.html\">mvgam</a></code> will accept an observation model formula and an optional\nprocess model formula (via the argument <code>trend_formula</code>). Neither of these formulae can\nbe specified as lists, contrary to the accepted behaviour in some <code>mgcv</code> or <code>brms</code> models.\n<br><br>\nNote that it is possible to supply an empty formula where\nthere are no predictors or intercepts in the observation model (i.e. <code>y ~ 0</code> or <code>y ~ -1</code>).\nIn this case, an intercept-only observation model will be set up but the intercept coefficient\nwill be fixed at zero. This can be handy if you wish to fit pure State-Space models where\nthe variation in the dynamic trend controls the average expectation, and/or where intercepts\nare non-identifiable.\n<br><br>\nThe formulae supplied to <code><a href=\"mvgam.html\">mvgam</a></code> and <code><a href=\"jsdgam.html\">jsdgam</a></code>\nare exactly like those supplied to\n<code><a href=\"https://rdrr.io/r/stats/glm.html\" class=\"external-link\">glm</a></code> except that smooth terms,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti</a></code> and\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/t2.html\" class=\"external-link\">t2</a></code>,\ntime-varying effects using <code><a href=\"dynamic.html\">dynamic</a></code>,\nmonotonically increasing (using <code>s(x, bs = 'moi')</code>)\nor decreasing splines (using <code>s(x, bs = 'mod')</code>;\nsee <code><a href=\"monotonic.html\">smooth.construct.moi.smooth.spec</a></code> for\ndetails), as well as\nGaussian Process functions using <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></code> and offsets using\n<code><a href=\"https://rdrr.io/r/stats/offset.html\" class=\"external-link\">offset</a></code>\ncan be added to the right hand side (and <code>.</code> is not supported in <code>mvgam</code> formulae).\n<br><br>\nFurther details on specifying different kinds of smooth functions, and how to control their behaviours\nby modifying their potential complexities and / or how the penalties behave, can be found in the\nextensive documentation for the <code>mgcv</code> package.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"mvgam.html\">mvgam</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/formula.gam.html\" class=\"external-link\">formula.gam</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.models.html\" class=\"external-link\">gam.models</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/jagam.html\" class=\"external-link\">jagam</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code>,\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></code>,\n<code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></code>,\n<code><a href=\"https://rdrr.io/r/stats/formula.html\" class=\"external-link\">formula</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_irf-class.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content='A mvgam_irf object returned by function irf.\nRun methods(class = \"mvgam_irf\") to see an overview of available methods.'><title>mvgam_irf object description — mvgam_irf-class • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"mvgam_irf object description — mvgam_irf-class\"><meta property=\"og:description\" content='A mvgam_irf object returned by function irf.\nRun methods(class = \"mvgam_irf\") to see an overview of available methods.'><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.3</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1><code>mvgam_irf</code> object description</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_irf-class.R\" class=\"external-link\"><code>R/mvgam_irf-class.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_irf-class.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>A <code>mvgam_irf</code> object returned by function <code><a href=\"irf.mvgam.html\">irf</a></code>.\nRun <code>methods(class = \"mvgam_irf\")</code> to see an overview of available methods.</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A <code>mvgam_irf</code> object contains a list of posterior IRFs, each stored as\nits own list</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><a href=\"mvgam.html\">mvgam</a>, <a href=\"RW.html\">VAR</a></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_marginaleffects.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Helper functions for marginaleffects calculations in mvgam models — mvgam_marginaleffects • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Helper functions for marginaleffects calculations in mvgam models — mvgam_marginaleffects\"><meta name=\"description\" content=\"Helper functions for marginaleffects calculations in mvgam models\nFunctions needed for working with marginaleffects\nFunctions needed for getting data / objects with insight\"><meta property=\"og:description\" content=\"Helper functions for marginaleffects calculations in mvgam models\nFunctions needed for working with marginaleffects\nFunctions needed for getting data / objects with insight\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Helper functions for <span class=\"pkg\">marginaleffects</span> calculations in <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/marginaleffects.mvgam.R\" class=\"external-link\"><code>R/marginaleffects.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_marginaleffects.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Helper functions for <span class=\"pkg\">marginaleffects</span> calculations in <span class=\"pkg\">mvgam</span> models</p>\n<p>Functions needed for working with <span class=\"pkg\">marginaleffects</span></p>\n<p>Functions needed for getting data / objects with <span class=\"pkg\">insight</span></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/get_coef.html\" class=\"external-link\">get_coef</a></span><span class=\"op\">(</span><span class=\"va\">model</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/set_coef.html\" class=\"external-link\">set_coef</a></span><span class=\"op\">(</span><span class=\"va\">model</span>, <span class=\"va\">coefs</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/get_vcov.html\" class=\"external-link\">get_vcov</a></span><span class=\"op\">(</span><span class=\"va\">model</span>, vcov <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/get_predict.html\" class=\"external-link\">get_predict</a></span><span class=\"op\">(</span><span class=\"va\">model</span>, <span class=\"va\">newdata</span>, type <span class=\"op\">=</span> <span class=\"st\">\"response\"</span>, process_error <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://easystats.github.io/insight/reference/get_data.html\" class=\"external-link\">get_data</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, source <span class=\"op\">=</span> <span class=\"st\">\"environment\"</span>, verbose <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_prefit'</span></span>\n<span><span class=\"fu\"><a href=\"https://easystats.github.io/insight/reference/get_data.html\" class=\"external-link\">get_data</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, source <span class=\"op\">=</span> <span class=\"st\">\"environment\"</span>, verbose <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">find_predictors</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  effects <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"fixed\"</span>, <span class=\"st\">\"random\"</span>, <span class=\"st\">\"all\"</span><span class=\"op\">)</span>,</span>\n<span>  component <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"all\"</span>, <span class=\"st\">\"conditional\"</span>, <span class=\"st\">\"zi\"</span>, <span class=\"st\">\"zero_inflated\"</span>, <span class=\"st\">\"dispersion\"</span>, <span class=\"st\">\"instruments\"</span>,</span>\n<span>    <span class=\"st\">\"correlation\"</span>, <span class=\"st\">\"smooth_terms\"</span><span class=\"op\">)</span>,</span>\n<span>  flatten <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  verbose <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_prefit'</span></span>\n<span><span class=\"fu\">find_predictors</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  effects <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"fixed\"</span>, <span class=\"st\">\"random\"</span>, <span class=\"st\">\"all\"</span><span class=\"op\">)</span>,</span>\n<span>  component <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"all\"</span>, <span class=\"st\">\"conditional\"</span>, <span class=\"st\">\"zi\"</span>, <span class=\"st\">\"zero_inflated\"</span>, <span class=\"st\">\"dispersion\"</span>, <span class=\"st\">\"instruments\"</span>,</span>\n<span>    <span class=\"st\">\"correlation\"</span>, <span class=\"st\">\"smooth_terms\"</span><span class=\"op\">)</span>,</span>\n<span>  flatten <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  verbose <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-model\">model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-model\"></a></dt>\n<dd><p>Model object</p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p><code>logical</code>, extract from the process model component\n(only applicable if a <code>trend_formula</code> was specified in the model)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Additional arguments are passed to the <code><a href=\"https://rdrr.io/r/stats/predict.html\" class=\"external-link\">predict()</a></code> method\nsupplied by the modeling package.These arguments are particularly useful\nfor mixed-effects or bayesian models (see the online vignettes on the\n<code>marginaleffects</code> website). Available arguments can vary from model to\nmodel, depending on the range of supported arguments by each modeling\npackage. See the \"Model-Specific Arguments\" section of the\n<code><a href=\"https://marginaleffects.com/man/r/slopes.html\" class=\"external-link\">?slopes</a></code> documentation for a non-exhaustive list of available\narguments.</p></dd>\n\n\n<dt id=\"arg-coefs\">coefs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-coefs\"></a></dt>\n<dd><p>vector of coefficients to insert in the model object</p></dd>\n\n\n<dt id=\"arg-vcov\">vcov<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-vcov\"></a></dt>\n<dd><p>Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values:</p><ul><li><p>FALSE: Do not compute standard errors. This can speed up computation considerably.</p></li>\n<li><p>TRUE: Unit-level standard errors using the default <code>vcov(model)</code> variance-covariance matrix.</p></li>\n<li><p>String which indicates the kind of uncertainty estimates to return.</p><ul><li><p>Heteroskedasticity-consistent: <code>\"HC\"</code>, <code>\"HC0\"</code>, <code>\"HC1\"</code>, <code>\"HC2\"</code>, <code>\"HC3\"</code>, <code>\"HC4\"</code>, <code>\"HC4m\"</code>, <code>\"HC5\"</code>. See <code><a href=\"https://sandwich.R-Forge.R-project.org/reference/vcovHC.html\" class=\"external-link\">?sandwich::vcovHC</a></code></p></li>\n<li><p>Heteroskedasticity and autocorrelation consistent: <code>\"HAC\"</code></p></li>\n<li><p>Mixed-Models degrees of freedom: \"satterthwaite\", \"kenward-roger\"</p></li>\n<li><p>Other: <code>\"NeweyWest\"</code>, <code>\"KernHAC\"</code>, <code>\"OPG\"</code>. See the <code>sandwich</code> package documentation.</p></li>\n</ul></li>\n<li><p>One-sided formula which indicates the name of cluster variables (e.g., <code>~unit_id</code>). This formula is passed to the <code>cluster</code> argument of the <code><a href=\"https://sandwich.R-Forge.R-project.org/reference/vcovCL.html\" class=\"external-link\">sandwich::vcovCL</a></code> function.</p></li>\n<li><p>Square covariance matrix</p></li>\n<li><p>Function which returns a covariance matrix (e.g., <code>stats::vcov(model)</code>)</p></li>\n</ul></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Grid of predictor values at which we evaluate the slopes.</p><ul><li><p>Warning: Please avoid modifying your dataset between fitting the model and calling a <code>marginaleffects</code> function. This can sometimes lead to unexpected results.</p></li>\n<li><p><code>NULL</code> (default): Unit-level slopes for each observed value in the dataset (empirical distribution). The dataset is retrieved using <code><a href=\"https://easystats.github.io/insight/reference/get_data.html\" class=\"external-link\">insight::get_data()</a></code>, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model.</p></li>\n<li><p><code><a href=\"https://marginaleffects.com/man/r/datagrid.html\" class=\"external-link\">datagrid()</a></code> call to specify a custom grid of regressors. For example:</p><ul><li><p><code>newdata = datagrid(cyl = c(4, 6))</code>: <code>cyl</code> variable equal to 4 and 6 and other regressors fixed at their means or modes.</p></li>\n<li><p>See the Examples section and the <code><a href=\"https://marginaleffects.com/man/r/datagrid.html\" class=\"external-link\">datagrid()</a></code> documentation.</p></li>\n</ul></li>\n<li><p><code><a href=\"https://rdrr.io/r/base/subset.html\" class=\"external-link\">subset()</a></code> call with a single argument to select a subset of the dataset used to fit the model, ex: <code>newdata = subset(treatment == 1)</code></p></li>\n<li><p><code><a href=\"https://dplyr.tidyverse.org/reference/filter.html\" class=\"external-link\">dplyr::filter()</a></code> call with a single argument to select a subset of the dataset used to fit the model, ex: <code>newdata = filter(treatment == 1)</code></p></li>\n<li><p>string:</p><ul><li><p>\"mean\": Slopes evaluated when each predictor is held at its mean or mode.</p></li>\n<li><p>\"median\": Slopes evaluated when each predictor is held at its median or mode.</p></li>\n<li><p>\"balanced\": Slopes evaluated on a balanced grid with every combination of categories and numeric variables held at their means.</p></li>\n<li><p>\"tukey\": Slopes evaluated at Tukey's 5 numbers.</p></li>\n<li><p>\"grid\": Slopes evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors).</p></li>\n</ul></li>\n</ul></dd>\n\n\n<dt id=\"arg-type\">type<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-type\"></a></dt>\n<dd><p>string indicates the type (scale) of the predictions used to\ncompute contrasts or slopes. This can differ based on the model\ntype, but will typically be a string such as: \"response\", \"link\", \"probs\",\nor \"zero\". When an unsupported string is entered, the model-specific list of\nacceptable values is returned in an error message. When <code>type</code> is <code>NULL</code>, the\nfirst entry in the error message is used by default.</p></dd>\n\n\n<dt id=\"arg-process-error\">process_error<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-process-error\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, uncertainty in the latent\nprocess (or trend) model is incorporated in predictions</p></dd>\n\n\n<dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A fitted model.</p></dd>\n\n\n<dt id=\"arg-source\">source<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-source\"></a></dt>\n<dd><p>String, indicating from where data should be recovered. If\n<code>source = \"environment\"</code> (default), data is recovered from the environment\n(e.g. if the data is in the workspace). This option is usually the fastest\nway of getting data and ensures that the original variables used for model\nfitting are returned. Note that always the <em>current</em> data is recovered from\nthe environment. Hence, if the data was modified <em>after</em> model fitting\n(e.g., variables were recoded or rows filtered), the returned data may no\nlonger equal the model data. If <code>source = \"frame\"</code> (or <code>\"mf\"</code>), the data\nis taken from the model frame. Any transformed variables are back-transformed,\nif possible. This option returns the data even if it is not available in\nthe environment, however, in certain edge cases back-transforming to the\noriginal data may fail. If <code>source = \"environment\"</code> fails to recover the\ndata, it tries to extract the data from the model frame; if\n<code>source = \"frame\"</code> and data cannot be extracted from the model frame, data\nwill be recovered from the environment. Both ways only returns observations\nthat have no missing data in the variables used for model fitting.</p></dd>\n\n\n<dt id=\"arg-verbose\">verbose<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-verbose\"></a></dt>\n<dd><p>Toggle messages and warnings.</p></dd>\n\n\n<dt id=\"arg-effects\">effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-effects\"></a></dt>\n<dd><p>Should model data for fixed effects (<code>\"fixed\"</code>), random\neffects (<code>\"random\"</code>) or both (<code>\"all\"</code>) be returned? Only applies to mixed\nor gee models.</p></dd>\n\n\n<dt id=\"arg-component\">component<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-component\"></a></dt>\n<dd><p>Which type of parameters to return, such as parameters for\nthe conditional model, the zero-inflated part of the model, the dispersion\nterm, the instrumental variables or marginal effects be returned? Applies to\nmodels with zero-inflated and/or dispersion formula, or to models with\ninstrumental variables (so called fixed-effects regressions), or models with\nmarginal effects (from <strong>mfx</strong>). See details in section <em>Model Components</em>\n.May be abbreviated. Note that the <em>conditional</em> component also refers to the\n<em>count</em> or <em>mean</em> component - names may differ, depending on the modeling\npackage. There are three convenient shortcuts (not applicable to <em>all</em> model\nclasses):</p><ul><li><p><code>component = \"all\"</code> returns all possible parameters.</p></li>\n<li><p>If <code>component = \"location\"</code>, location parameters such as <code>conditional</code>,\n<code>zero_inflated</code>, <code>smooth_terms</code>, or <code>instruments</code> are returned (everything\nthat are fixed or random effects - depending on the <code>effects</code> argument -\nbut no auxiliary parameters).</p></li>\n<li><p>For <code>component = \"distributional\"</code> (or <code>\"auxiliary\"</code>), components like\n<code>sigma</code>, <code>dispersion</code>, <code>beta</code> or <code>precision</code> (and other auxiliary\nparameters) are returned.</p></li>\n</ul></dd>\n\n\n<dt id=\"arg-flatten\">flatten<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-flatten\"></a></dt>\n<dd><p>Logical, if <code>TRUE</code>, the values are returned as character\nvector, not as list. Duplicated values are removed.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>Objects suitable for internal 'marginaleffects' functions to proceed.\nSee <code><a href=\"https://marginaleffects.com/man/r/get_coef.html\" class=\"external-link\">marginaleffects::get_coef()</a></code>, <code><a href=\"https://marginaleffects.com/man/r/set_coef.html\" class=\"external-link\">marginaleffects::set_coef()</a></code>,\n<code><a href=\"https://marginaleffects.com/man/r/get_vcov.html\" class=\"external-link\">marginaleffects::get_vcov()</a></code>, <code><a href=\"https://marginaleffects.com/man/r/get_predict.html\" class=\"external-link\">marginaleffects::get_predict()</a></code>,\n<code><a href=\"https://easystats.github.io/insight/reference/get_data.html\" class=\"external-link\">insight::get_data()</a></code> and <code><a href=\"https://easystats.github.io/insight/reference/find_predictors.html\" class=\"external-link\">insight::find_predictors()</a></code> for details</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/mvgam_trends.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Supported latent trend models in mvgam — mvgam_trends • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Supported latent trend models in mvgam — mvgam_trends\"><meta name=\"description\" content=\"Supported latent trend models in mvgam\"><meta property=\"og:description\" content=\"Supported latent trend models in mvgam\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Supported latent trend models in <span class=\"pkg\">mvgam</span></h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/trends.R\" class=\"external-link\"><code>R/trends.R</code></a></small>\n      <div class=\"d-none name\"><code>mvgam_trends.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Supported latent trend models in <span class=\"pkg\">mvgam</span></p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>mvgam</code> currently supports the following dynamic trend models:</p><ul><li><p><code>None</code> (no latent trend component; i.e. the GAM component is all that contributes to the linear predictor,\nand the observation process is the only source of error; similarly to what is estimated by <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code>)</p></li>\n<li><p><code><a href=\"ZMVN.html\">ZMVN()</a></code> (zero-mean correlated errors, useful for modelling time series where no\nautoregressive terms are needed or for modelling data that are not sampled as time series)</p></li>\n<li><p><code><a href=\"RW.html\">RW()</a></code></p></li>\n<li><p><code>AR(p = 1, 2, or 3)</code></p></li>\n<li><p><code>CAR(p = 1)</code>(continuous time autoregressive trends; only available in <code>Stan</code>)</p></li>\n<li><p><code><a href=\"RW.html\">VAR()</a></code>(only available in <code>Stan</code>)</p></li>\n<li><p><code><a href=\"piecewise_trends.html\">PW()</a></code> (piecewise linear or logistic trends; only available in <code>Stan</code>)</p></li>\n<li><p><code><a href=\"GP.html\">GP()</a></code> (Gaussian Process with squared exponential kernel;\nonly available in <code>Stan</code>)</p></li>\n</ul><p>For most dynamic trend types available in <code>mvgam</code> (see argument <code>trend_model</code>), time should be\nmeasured in discrete, regularly spaced intervals (i.e. <code>c(1, 2, 3, ...)</code>). However you can\nuse irregularly spaced intervals if using <code>trend_model = CAR(1)</code>, though note that any\ntemporal intervals that are exactly <code>0</code> will be adjusted to a very small number\n(<code>1e-12</code>) to prevent sampling errors. For all autoregressive trend types\napart from <code><a href=\"RW.html\">CAR()</a></code>, moving average and/or correlated\nprocess error terms can also be estimated (for example, <code>RW(cor = TRUE)</code> will set up a\nmultivariate Random Walk if <code>data</code> contains <code>&gt;1</code> series). Hierarchical process error correlations\ncan also be handled if the data contain relevant observation units that are nested into\nrelevant grouping and subgrouping levels (i.e. using <code>AR(gr = region, subgr = species)</code>)</p>\n<p>Note that only <code>RW</code>, <code>AR1</code>, <code>AR2</code> and <code>AR3</code> are available if\nusing <code>JAGS</code>. All trend models are supported if using <code>Stan</code>.\nDynamic factor models can be used in which the latent factors evolve as either\n<code>RW</code>, <code>AR1-3</code>, <code>VAR</code> or <code>GP</code>. For <code>VAR</code> models\n(i.e. <code>VAR</code> and <code>VARcor</code> models), users can either fix the trend error covariances to be <code>0</code>\n(using <code>VAR</code>) or estimate them and potentially allow for contemporaneously correlated errors using\n<code>VARcor</code>. For all <code>VAR</code> models, stationarity of\nthe latent process is enforced through the prior using the parameterisation given by\nHeaps (2022). Stationarity is not enforced when using <code>AR1</code>, <code>AR2</code> or <code>AR3</code> models,\nthough this can be changed by the user by specifying lower and upper bounds on autoregressive\nparameters using functionality in <a href=\"get_mvgam_priors.html\">get_mvgam_priors</a> and the <code>priors</code> argument in\n<a href=\"mvgam.html\">mvgam</a>. Piecewise trends follow the formulation in the popular <code>prophet</code> package produced\nby <code>Facebook</code>, where users can allow for changepoints to control the potential flexibility\nof the trend. See Taylor and Letham (2018) for details</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Sarah E. Heaps (2022) Enforcing stationarity through the prior in Vector Autoregressions.\nJournal of Computational and Graphical Statistics. 32:1, 1-10.</p>\n<p>Sean J. Taylor and Benjamin Letham (2018) Forecasting at scale.\nThe American Statistician 72.1, 37-45.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"RW.html\">RW</a></code>, <code><a href=\"RW.html\">AR</a></code>, <code><a href=\"RW.html\">CAR</a></code>,\n<code><a href=\"RW.html\">VAR</a></code>, <code><a href=\"piecewise_trends.html\">PW</a></code>, <code><a href=\"GP.html\">GP</a></code>, <code><a href=\"ZMVN.html\">ZMVN</a></code></p></div>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/pairs.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Create a matrix of output plots from a mvgam object — pairs.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Create a matrix of output plots from a mvgam object — pairs.mvgam\"><meta name=\"description\" content=\"A pairs\nmethod that is customized for MCMC output.\"><meta property=\"og:description\" content=\"A pairs\nmethod that is customized for MCMC output.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Create a matrix of output plots from a <code>mvgam</code> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/pairs.mvgam.R\" class=\"external-link\"><code>R/pairs.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>pairs.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>A <code><a href=\"https://rdrr.io/r/graphics/pairs.html\" class=\"external-link\">pairs</a></code>\nmethod that is customized for MCMC output.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/pairs.html\" class=\"external-link\">pairs</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, variable <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, regex <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, use_alias <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>An object of class <code>mvgam</code> or <code>jsdgam</code></p></dd>\n\n\n<dt id=\"arg-variable\">variable<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-variable\"></a></dt>\n<dd><p>Names of the variables (parameters) to plot, as given by a\ncharacter vector or a regular expression (if <code>regex = TRUE</code>). By\ndefault, a hopefully not too large selection of variables is plotted.</p></dd>\n\n\n<dt id=\"arg-regex\">regex<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-regex\"></a></dt>\n<dd><p>Logical; Indicates whether <code>variable</code> should\nbe treated as regular expressions. Defaults to <code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg-use-alias\">use_alias<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-use-alias\"></a></dt>\n<dd><p>Logical. If more informative names for parameters are available\n(i.e. for beta coefficients <code>b</code> or for smoothing parameters <code>rho</code>), replace the uninformative\nnames with the more informative alias. Defaults to <code>TRUE</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Further arguments to be passed to\n<code><a href=\"https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html\" class=\"external-link\">mcmc_pairs</a></code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>Plottable objects whose classes depend on the arguments supplied.\nSee <code><a href=\"https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html\" class=\"external-link\">mcmc_pairs</a></code> for details.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>For a detailed description see\n<code><a href=\"https://mc-stan.org/bayesplot/reference/MCMC-scatterplots.html\" class=\"external-link\">mcmc_pairs</a></code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c20f26b82.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 0.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/pairs.html\" class=\"external-link\">pairs</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"pairs.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/pairs.html\" class=\"external-link\">pairs</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variable <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'ar1'</span>, <span class=\"st\">'sigma'</span><span class=\"op\">)</span>, regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"pairs.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/pfilter_mvgam_fc.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"This function generates a forecast from a set of particles that each capture a unique proposal about\nthe current state of the system that was modelled in the mvgam object. The covariate and timepoint information\nfrom data_test is used to generate the GAM component forecast, while the trends are run forward in time\naccording to their state space dynamics. The forecast is a weighted ensemble, with weights determined by\neach particle's proposal likelihood prior to the most recent assimilation step\"><title>Forecast from a particle filtered mvgam object — pfilter_mvgam_fc • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Forecast from a particle filtered mvgam object — pfilter_mvgam_fc\"><meta property=\"og:description\" content=\"This function generates a forecast from a set of particles that each capture a unique proposal about\nthe current state of the system that was modelled in the mvgam object. The covariate and timepoint information\nfrom data_test is used to generate the GAM component forecast, while the trends are run forward in time\naccording to their state space dynamics. The forecast is a weighted ensemble, with weights determined by\neach particle's proposal likelihood prior to the most recent assimilation step\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.0.91</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Forecast from a particle filtered mvgam object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/pfilter_mvgam_fc.R\" class=\"external-link\"><code>R/pfilter_mvgam_fc.R</code></a></small>\n      <div class=\"d-none name\"><code>pfilter_mvgam_fc.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function generates a forecast from a set of particles that each capture a unique proposal about\nthe current state of the system that was modelled in the mvgam object. The covariate and timepoint information\nfrom <code>data_test</code> is used to generate the GAM component forecast, while the trends are run forward in time\naccording to their state space dynamics. The forecast is a weighted ensemble, with weights determined by\neach particle's proposal likelihood prior to the most recent assimilation step</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">pfilter_mvgam_fc</span><span class=\"op\">(</span></span>\n<span>  file_path <span class=\"op\">=</span> <span class=\"st\">\"pfilter\"</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  plot_legend <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  legend_position <span class=\"op\">=</span> <span class=\"st\">\"topleft\"</span>,</span>\n<span>  <span class=\"va\">ylim</span>,</span>\n<span>  return_forecasts <span class=\"op\">=</span> <span class=\"cn\">FALSE</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>file_path</dt>\n<dd><p><code>character</code> string specifying the file path where the particles have been saved</p></dd>\n\n\n<dt>n_cores</dt>\n<dd><p><code>integer</code> specifying number of cores for generating particle forecasts in parallel</p></dd>\n\n\n<dt>newdata</dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> of test data containing at least 'series' and time',\nin addition to any other variables included in the linear predictor of <code>formula</code></p></dd>\n\n\n<dt>data_test</dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt>plot_legend</dt>\n<dd><p><code>logical</code> stating whether to include a legend to highlight which observations\nwere used for calibration and which were assimilated by the particle filter</p></dd>\n\n\n<dt>legend_position</dt>\n<dd><p>The legend location may be specified by setting x to a single keyword from the\nlist \"bottomright\", \"bottom\", \"bottomleft\", \"left\", \"topleft\", \"top\", \"topright\", \"right\" and \"center\".\nThis places the legend on the inside of the plot frame at the given location.</p></dd>\n\n\n<dt>ylim</dt>\n<dd><p>Optional <code>vector</code> of y-axis limits (min, max). The same limits will be used for all plots</p></dd>\n\n\n<dt>return_forecasts</dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, the returned list object will contain plots of forecasts\nas well as the forecast objects (each as a <code>matrix</code> of dimension <code>n_particles</code> x <code>horizon</code>)</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>A named <code>list</code> containing functions that call base <code>R</code> plots of each series' forecast. Optionally\nthe actual forecasts are returned within the <code>list</code> as a separate <code>list</code> of <code>matrices</code></p>\n\n\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/pfilter_mvgam_init.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"This function generates a set of particles that each captures a unique proposal about\nthe current state of the system. The next observation in data_assim is assimilated\nand particles are weighted by their proposal's multivariate composite likelihood to update the model's\nforecast distribution\"><title>Initiate particles for online filtering from a fitted mvgam object — pfilter_mvgam_init • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Initiate particles for online filtering from a fitted mvgam object — pfilter_mvgam_init\"><meta property=\"og:description\" content=\"This function generates a set of particles that each captures a unique proposal about\nthe current state of the system. The next observation in data_assim is assimilated\nand particles are weighted by their proposal's multivariate composite likelihood to update the model's\nforecast distribution\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.0.91</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Initiate particles for online filtering from a fitted mvgam object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/pfilter_mvgam_init.R\" class=\"external-link\"><code>R/pfilter_mvgam_init.R</code></a></small>\n      <div class=\"d-none name\"><code>pfilter_mvgam_init.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function generates a set of particles that each captures a unique proposal about\nthe current state of the system. The next observation in <code>data_assim</code> is assimilated\nand particles are weighted by their proposal's multivariate composite likelihood to update the model's\nforecast distribution</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">pfilter_mvgam_init</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_assim</span>,</span>\n<span>  n_particles <span class=\"op\">=</span> <span class=\"fl\">1000</span>,</span>\n<span>  file_path <span class=\"op\">=</span> <span class=\"st\">\"pfilter\"</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">2</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>object</dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code></p></dd>\n\n\n<dt>newdata</dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> of test data containing at least one more observation per series\n(beyond the last observation seen by the model in <code>object</code>) to be assimilated by the particle filter.\nShould at least contain 'series' and 'time' for the one-step ahead horizon,\nin addition to any other variables included in the linear predictor of <code>object</code></p></dd>\n\n\n<dt>data_assim</dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt>n_particles</dt>\n<dd><p><code>integer</code> specifying the number of unique particles to generate for tracking the\nlatent system state</p></dd>\n\n\n<dt>file_path</dt>\n<dd><p><code>character</code> string specifying the file path for saving the initiated particles</p></dd>\n\n\n<dt>n_cores</dt>\n<dd><p><code>integer</code> specifying number of cores for generating particle forecasts in parallel</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>A <code>list</code> object of <code>length = n_particles</code> containing information on parameters and\ncurrent state estimates for each particle is generated and saved, along with other important information\nfrom the original model, to an <code>.rda</code> object in <code>file_path</code></p>\n\n\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/pfilter_mvgam_online.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"This function operates sequentially on new observations in data_assim to update the\nposterior forecast distribution. It is a wrapper that calls pfilter_mvgam_smooth.\nIn each iteration, the next observation is assimilated\nand particles are weighted by their proposal's multivariate composite likelihood\"><title>Automatic online particle filtering for assimilating new observations into a fitted mvgam model — pfilter_mvgam_online • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Automatic online particle filtering for assimilating new observations into a fitted mvgam model — pfilter_mvgam_online\"><meta property=\"og:description\" content=\"This function operates sequentially on new observations in data_assim to update the\nposterior forecast distribution. It is a wrapper that calls pfilter_mvgam_smooth.\nIn each iteration, the next observation is assimilated\nand particles are weighted by their proposal's multivariate composite likelihood\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.0.91</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Automatic online particle filtering for assimilating new observations into a fitted mvgam model</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/pfilter_mvgam_online.R\" class=\"external-link\"><code>R/pfilter_mvgam_online.R</code></a></small>\n      <div class=\"d-none name\"><code>pfilter_mvgam_online.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function operates sequentially on new observations in <code>data_assim</code> to update the\nposterior forecast distribution. It is a wrapper that calls <code><a href=\"pfilter_mvgam_smooth.html\">pfilter_mvgam_smooth</a></code>.\nIn each iteration, the next observation is assimilated\nand particles are weighted by their proposal's multivariate composite likelihood</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">pfilter_mvgam_online</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_assim</span>,</span>\n<span>  file_path <span class=\"op\">=</span> <span class=\"st\">\"pfilter\"</span>,</span>\n<span>  threshold <span class=\"op\">=</span> <span class=\"fl\">0.5</span>,</span>\n<span>  use_resampling <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  kernel_lambda <span class=\"op\">=</span> <span class=\"fl\">0.25</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>newdata</dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> of test data containing at least one more observation per series\n(beyond the last observation seen by the model when initialising particles with\n<code><a href=\"pfilter_mvgam_init.html\">pfilter_mvgam_init</a></code> or in previous calls to <code>pfilter_mvgam_online</code>.\nShould at least contain 'series' and 'time' for the one-step ahead horizon,\nin addition to any other variables included in the linear predictor of <code>object</code></p></dd>\n\n\n<dt>data_assim</dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt>file_path</dt>\n<dd><p><code>character</code> string specifying the file path for locating the particles</p></dd>\n\n\n<dt>threshold</dt>\n<dd><p><code>proportional numeric</code> specifying the Effective Sample Size limit under which\nresampling of particles will be triggered (calculated as <code>ESS / n_particles</code>) if <code>use_resampling == TRUE</code>.\nShould be between <code>0</code> and <code>1</code></p></dd>\n\n\n<dt>use_resampling</dt>\n<dd><p><code>logical</code> specifying whether resampling should be used when ESS falls below\nthe specified <code>threshold</code>. Default for this option is <code>FALSE</code>, relying instead on kernel smoothing only\nto maintain particle diversity</p></dd>\n\n\n<dt>kernel_lambda</dt>\n<dd><p><code>proportional numeric</code> specifying the strength of kernel smoothing to use when\npulling low weight particles toward the high likelihood state space. Should be between <code>0</code> and <code>1</code></p></dd>\n\n\n<dt>n_cores</dt>\n<dd><p><code>integer</code> specifying number of cores for generating particle forecasts in parallel</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>A <code>list</code> object of <code>length = n_particles</code> containing information on parameters and\ncurrent state estimates for each particle is generated and saved, along with other important information\nfrom the original model, to an <code>.rda</code> object in <code>file_path</code></p>\n\n\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/pfilter_mvgam_smooth.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"This function operates on a new observation in next_assim to update the\nposterior forecast distribution. The next observation is assimilated\nand particle weights are updated in light of their most recent their multivariate composite likelihood.\nLow weight particles are smoothed towards the high weight state space using importance sampling, and options are\ngiven for using resampling of high weight particles when Effective Sample Size falls below a\nuser-specified threshold\"><title>Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing — pfilter_mvgam_smooth • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing — pfilter_mvgam_smooth\"><meta property=\"og:description\" content=\"This function operates on a new observation in next_assim to update the\nposterior forecast distribution. The next observation is assimilated\nand particle weights are updated in light of their most recent their multivariate composite likelihood.\nLow weight particles are smoothed towards the high weight state space using importance sampling, and options are\ngiven for using resampling of high weight particles when Effective Sample Size falls below a\nuser-specified threshold\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.0.91</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/pfilter_mvgam_smooth.R\" class=\"external-link\"><code>R/pfilter_mvgam_smooth.R</code></a></small>\n      <div class=\"d-none name\"><code>pfilter_mvgam_smooth.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function operates on a new observation in <code>next_assim</code> to update the\nposterior forecast distribution. The next observation is assimilated\nand particle weights are updated in light of their most recent their multivariate composite likelihood.\nLow weight particles are smoothed towards the high weight state space using importance sampling, and options are\ngiven for using resampling of high weight particles when Effective Sample Size falls below a\nuser-specified threshold</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">pfilter_mvgam_smooth</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">particles</span>,</span>\n<span>  <span class=\"va\">mgcv_model</span>,</span>\n<span>  <span class=\"va\">next_assim</span>,</span>\n<span>  threshold <span class=\"op\">=</span> <span class=\"fl\">0.25</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  use_resampling <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  kernel_lambda <span class=\"op\">=</span> <span class=\"fl\">0.5</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>particles</dt>\n<dd><p>A <code>list</code> of particles that have been run up to one observation prior to the observation\nin <code>next_assim</code></p></dd>\n\n\n<dt>mgcv_model</dt>\n<dd><p>A <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code> model returned through a call to <code>link{mvgam}</code></p></dd>\n\n\n<dt>next_assim</dt>\n<dd><p>A <code>dataframe</code> of test data containing at one more observation per series\n(beyond the last observation seen by the model when initialising particles with\n<code><a href=\"pfilter_mvgam_init.html\">pfilter_mvgam_init</a></code> or in previous calls to <code>pfilter_mvgam_online</code>.\nShould at least contain 'series' and 'time' for the one-step ahead horizon,\nin addition to any other variables included in the linear predictor of <code>object</code></p></dd>\n\n\n<dt>threshold</dt>\n<dd><p><code>proportional numeric</code> specifying the Effective Sample Size limit under which\nresampling of particles will be triggered (calculated as <code>ESS / n_particles</code>) if <code>use_resampling == TRUE</code>.\nShould be between <code>0</code> and <code>1</code></p></dd>\n\n\n<dt>n_cores</dt>\n<dd><p><code>integer</code> specifying number of cores for generating particle forecasts in parallel</p></dd>\n\n\n<dt>use_resampling</dt>\n<dd><p><code>logical</code> specifying whether resampling should be used when ESS falls below\nthe specified <code>threshold</code>. Note that resampling can result in loss of the original model's diversity of\nGAM beta coefficients, which may have undesirable consequences for the forecast distribution. If\n<code>use_resampling</code> is <code>TRUE</code>, some effort is made to remedy this by assigning randomly sampled draws of\nGAM beta coefficients from the original model's distribution to each particle. This does not however guarantee there\nwill be no loss of diversity, especially if successive resampling take place. Default for this option is therefore\n<code>FALSE</code></p></dd>\n\n\n<dt>kernel_lambda</dt>\n<dd><p><code>proportional numeric</code> specifying the strength of smoothing to use when\npulling low weight particles toward the high likelihood state space. Should be between <code>0</code> and <code>1</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>A <code>list</code> object of <code>length = n_particles</code> containing information on parameters and\ncurrent state estimates for each particle</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/piecewise_trends.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Specify piecewise linear or logistic trends in mvgam models — PW • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Specify piecewise linear or logistic trends in mvgam models — PW\"><meta name=\"description\" content=\"Set up piecewise linear or logistic trend models\nin mvgam. These functions do not evaluate their arguments –\nthey exist purely to help set up a model with particular piecewise\ntrend models.\"><meta property=\"og:description\" content=\"Set up piecewise linear or logistic trend models\nin mvgam. These functions do not evaluate their arguments –\nthey exist purely to help set up a model with particular piecewise\ntrend models.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Specify piecewise linear or logistic trends in <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_trend_types.R\" class=\"external-link\"><code>R/mvgam_trend_types.R</code></a></small>\n      <div class=\"d-none name\"><code>piecewise_trends.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Set up piecewise linear or logistic trend models\nin <code>mvgam</code>. These functions do not evaluate their arguments –\nthey exist purely to help set up a model with particular piecewise\ntrend models.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">PW</span><span class=\"op\">(</span></span>\n<span>  n_changepoints <span class=\"op\">=</span> <span class=\"fl\">10</span>,</span>\n<span>  changepoint_range <span class=\"op\">=</span> <span class=\"fl\">0.8</span>,</span>\n<span>  changepoint_scale <span class=\"op\">=</span> <span class=\"fl\">0.05</span>,</span>\n<span>  growth <span class=\"op\">=</span> <span class=\"st\">\"linear\"</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-n-changepoints\">n_changepoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-changepoints\"></a></dt>\n<dd><p>A non-negative integer specifying the number of potential\nchangepoints. Potential changepoints are selected uniformly from the\nfirst <code>changepoint_range</code> proportion of timepoints in <code>data</code>. Default is <code>10</code></p></dd>\n\n\n<dt id=\"arg-changepoint-range\">changepoint_range<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-changepoint-range\"></a></dt>\n<dd><p>Proportion of history in <code>data</code> in which trend changepoints\nwill be estimated. Defaults to 0.8 for the first 80%.</p></dd>\n\n\n<dt id=\"arg-changepoint-scale\">changepoint_scale<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-changepoint-scale\"></a></dt>\n<dd><p>Parameter modulating the flexibility of the\nautomatic changepoint selection by altering the scale parameter of a Laplace distribution.\nThe resulting prior will be <code>double_exponential(0, changepoint_scale)</code>.\nLarge values will allow many changepoints and a more flexible trend, while\nsmall values will allow few changepoints. Default is <code>0.05</code>.</p></dd>\n\n\n<dt id=\"arg-growth\">growth<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-growth\"></a></dt>\n<dd><p>Character string specifying either 'linear' or 'logistic' growth of\nthe trend. If 'logistic', a variable labelled <code>cap</code> MUST be in <code>data</code> to specify the\nmaximum saturation point for the trend (see details and examples in <code><a href=\"mvgam.html\">mvgam</a></code> for\nmore information).\nDefault is 'linear'.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An object of class <code>mvgam_trend</code>, which contains a list of\narguments to be interpreted by the parsing functions in <code>mvgam</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><em>Offsets and intercepts</em>:\nFor each of these trend models, an offset parameter is included in the trend\nestimation process. This parameter will be incredibly difficult to identify\nif you also include an intercept in the observation formula. For that reason,\nit is highly recommended that you drop the intercept from the formula\n(i.e. <code>y ~ x + 0</code> or <code>y ~ x - 1</code>, where <code>x</code> are your optional predictor terms).\n<br><br><em>Logistic growth and the cap variable</em>:\nWhen forecasting growth, there is often some maximum achievable point that\na time series can reach. For example, total market size, total population size\nor carrying capacity in population dynamics. It can be advantageous for the forecast\nto saturate at or near this point so that predictions are more sensible.\nThis function allows you to make forecasts using a logistic growth trend model,\nwith a specified carrying capacity. Note that this capacity does not need to be static\nover time, it can vary with each series x timepoint combination if necessary. But you\nmust supply a <code>cap</code> value for each observation in the data when using <code>growth = 'logistic'</code>.\nFor observation families that use a non-identity link function, the <code>cap</code> value will\nbe internally transformed to the link scale (i.e. your specified <code>cap</code> will be log\ntransformed if you are using a <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code> or <code><a href=\"mvgam_families.html\">nb()</a></code> family). It is therefore important\nthat you specify the <code>cap</code> values on the scale of your outcome. Note also that\nno missing values are allowed in <code>cap</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Taylor, Sean J., and Benjamin Letham. \"Forecasting at scale.\" The American Statistician 72.1 (2018): 37-45.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Example of logistic growth with possible changepoints</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simple logistic growth model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dNt</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">r</span>, <span class=\"va\">N</span>, <span class=\"va\">k</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>   <span class=\"va\">r</span> <span class=\"op\">*</span> <span class=\"va\">N</span> <span class=\"op\">*</span> <span class=\"op\">(</span><span class=\"va\">k</span> <span class=\"op\">-</span> <span class=\"va\">N</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Iterate growth through time</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">Nt</span> <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">r</span>, <span class=\"va\">N</span>, <span class=\"va\">t</span>, <span class=\"va\">k</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">for</span> <span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"kw\">in</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"op\">(</span><span class=\"va\">t</span> <span class=\"op\">-</span> <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span> <span class=\"co\"># population at next time step is current population + growth,</span></span></span>\n<span class=\"r-in\"><span> <span class=\"co\"># but we introduce several 'shocks' as changepoints</span></span></span>\n<span class=\"r-in\"><span> <span class=\"kw\">if</span><span class=\"op\">(</span><span class=\"va\">i</span> <span class=\"op\"><a href=\"https://rdrr.io/r/base/match.html\" class=\"external-link\">%in%</a></span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">15</span>, <span class=\"fl\">25</span>, <span class=\"fl\">41</span>, <span class=\"fl\">45</span>, <span class=\"fl\">60</span>, <span class=\"fl\">80</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>   <span class=\"va\">N</span><span class=\"op\">[</span><span class=\"va\">i</span> <span class=\"op\">+</span> <span class=\"fl\">1</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"va\">N</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span> <span class=\"op\">+</span> <span class=\"fu\">dNt</span><span class=\"op\">(</span><span class=\"va\">r</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"op\">-</span><span class=\"fl\">0.1</span>, <span class=\"fl\">0.1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                                 <span class=\"va\">N</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span>, <span class=\"va\">k</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>   <span class=\"op\">}</span> <span class=\"kw\">else</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>   <span class=\"va\">N</span><span class=\"op\">[</span><span class=\"va\">i</span> <span class=\"op\">+</span> <span class=\"fl\">1</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"va\">N</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span> <span class=\"op\">+</span> <span class=\"fu\">dNt</span><span class=\"op\">(</span><span class=\"va\">r</span>, <span class=\"va\">N</span><span class=\"op\">[</span><span class=\"va\">i</span><span class=\"op\">]</span>, <span class=\"va\">k</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>   <span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span> <span class=\"va\">N</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate expected values</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">11</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">expected</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">Nt</span><span class=\"op\">(</span><span class=\"fl\">0.004</span>, <span class=\"fl\">2</span>, <span class=\"fl\">100</span>, <span class=\"fl\">30</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">expected</span>, xlab <span class=\"op\">=</span> <span class=\"st\">'Time'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"piecewise_trends-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Take Poisson draws</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">y</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Poisson.html\" class=\"external-link\">rpois</a></span><span class=\"op\">(</span><span class=\"fl\">100</span>, <span class=\"va\">expected</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, xlab <span class=\"op\">=</span> <span class=\"st\">'Time'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"piecewise_trends-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Assemble data into dataframe and model. We set a</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># fixed carrying capacity of 35 for this example, but note that</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># this value is not required to be fixed at each timepoint</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"va\">y</span>,</span></span>\n<span class=\"r-in\"><span>                       time <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">100</span>,</span></span>\n<span class=\"r-in\"><span>                       cap <span class=\"op\">=</span> <span class=\"fl\">35</span>,</span></span>\n<span class=\"r-in\"><span>                       series <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">as.factor</a></span><span class=\"op\">(</span><span class=\"st\">'series_1'</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">mod_data</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"piecewise_trends-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># The intercept is nonidentifiable when using piecewise</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># trends because the trend functions have their own offset</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># parameters 'm'; it is recommended to always drop intercepts</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># when using these trend models</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">0</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\">PW</span><span class=\"op\">(</span>growth <span class=\"op\">=</span> <span class=\"st\">'logistic'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">mod_data</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c1ac83c6.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 5.1 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 5.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 5.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 6.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x000001d627ea1ee8&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> poisson</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> log</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> PW(growth = \"logistic\")</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 100 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             2.5% 50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)    0   0     0  NaN   NaN</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Latent trend growth rate estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             2.5%   50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> k_trend[1] -0.27 -0.15 -0.073    1   355</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Latent trend offset estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            2.5%  50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> m_trend[1]  -15 -4.1 -0.33    1   465</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 98 of 1000 iterations saturated the maximum tree depth of 10 (9.8%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  *Run with max_treedepth set to a larger value to avoid saturation</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 19 11:54:14 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot the posterior hindcast</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"piecewise_trends-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># View the changepoints with ggplot2 utilities</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://ggplot2.tidyverse.org\" class=\"external-link\">ggplot2</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, variable <span class=\"op\">=</span> <span class=\"st\">'delta_trend'</span>,</span></span>\n<span class=\"r-in\"><span>          regex <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/scale_discrete.html\" class=\"external-link\">scale_y_discrete</a></span><span class=\"op\">(</span>labels <span class=\"op\">=</span> <span class=\"va\">mod</span><span class=\"op\">$</span><span class=\"va\">trend_model</span><span class=\"op\">$</span><span class=\"va\">changepoints</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://ggplot2.tidyverse.org/reference/labs.html\" class=\"external-link\">labs</a></span><span class=\"op\">(</span>y <span class=\"op\">=</span> <span class=\"st\">'Potential changepoint'</span>,</span></span>\n<span class=\"r-in\"><span>     x <span class=\"op\">=</span> <span class=\"st\">'Rate change'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Scale for <span style=\"color: #00BB00;\">y</span> is already present.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Adding another scale for <span style=\"color: #00BB00;\">y</span>, which will replace the existing scale.</span>\n<span class=\"r-plt img\"><img src=\"piecewise_trends-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/pipe.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"See magrittr::%&amp;gt;% for details.\"><title>Pipe operator — %&gt;% • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Pipe operator — %&gt;%\"><meta property=\"og:description\" content=\"See magrittr::%&amp;gt;% for details.\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.3</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Pipe operator</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/utils-pipe.R\" class=\"external-link\"><code>R/utils-pipe.R</code></a></small>\n      <div class=\"d-none name\"><code>pipe.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>See <code>magrittr::%&gt;%</code> for details.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"va\">lhs</span> <span class=\"op\">%&gt;%</span> <span class=\"va\">rhs</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>lhs</dt>\n<dd><p>A value or the magrittr placeholder.</p></dd>\n\n\n<dt>rhs</dt>\n<dd><p>A function call using the magrittr semantics.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>The result of calling <code>rhs(lhs)</code>.</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Default plots for mvgam models — plot.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Default plots for mvgam models — plot.mvgam\"><meta name=\"description\" content=\"This function takes a fitted mvgam object and produces plots of smooth functions, forecasts, trends and\nuncertainty components\"><meta property=\"og:description\" content=\"This function takes a fitted mvgam object and produces plots of smooth functions, forecasts, trends and\nuncertainty components\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Default plots for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot.mvgam.R\" class=\"external-link\"><code>R/plot.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>plot.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function takes a fitted <code>mvgam</code> object and produces plots of smooth functions, forecasts, trends and\nuncertainty components</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  type <span class=\"op\">=</span> <span class=\"st\">\"residuals\"</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  residuals <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-type\">type<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-type\"></a></dt>\n<dd><p><code>character</code> specifying which type of plot to return. Options are:\nseries,\nresiduals,\nsmooths,\nre (random effect smooths),\npterms (parametric effects),\nforecast,\ntrend,\nuncertainty,\nfactors</p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which series in the set is to be plotted. This is ignored\nif <code>type == 're'</code></p></dd>\n\n\n<dt id=\"arg-residuals\">residuals<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-residuals\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code> and <code>type = 'smooths'</code>, posterior quantiles of partial residuals are added\nto plots of 1-D smooths as a series of ribbon rectangles.\nPartial residuals for a smooth term are the median Dunn-Smyth residuals that would be obtained by dropping the term\nconcerned from the model, while leaving all other estimates fixed (i.e. the\nestimates for the term plus the original median Dunn-Smyth residuals). Note that because <code>mvgam</code> works with\nDunn-Smyth residuals and not working residuals, which are used by <code>mgcv</code>, the magnitudes of\npartial residuals will be different to what you would expect from <code><a href=\"https://rdrr.io/pkg/mgcv/man/plot.gam.html\" class=\"external-link\">plot.gam</a></code>. Interpretation\nis similar though, as these partial residuals should be evenly scattered\naround the smooth function if the function is well estimated</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing at least 'series' and 'time'\nin addition to any other variables included in the linear predictor of the original <code>formula</code>.\nThis argument is optional when plotting out of sample forecast period observations\n(when <code>type = forecast</code>) and required when plotting\nuncertainty components (<code>type = uncertainty</code>).</p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p>logical. If <code>TRUE</code> and a <code>trend_formula</code> was used in model\nfitting, terms from the trend (i.e. process) model will be plotted</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Additional arguments for each individual plotting function.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base R plot or set of plots</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>These plots are useful for getting an overview of the fitted model and its estimated\nrandom effects or smooth functions,\nbut the individual plotting functions and the functions from the <code>marginaleffects</code> and <code>gratia</code> packages\noffer far more more customisation.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"plot_mvgam_resids.html\">plot_mvgam_resids</a></code>, <code><a href=\"plot_mvgam_smooth.html\">plot_mvgam_smooth</a></code>, <code><a href=\"plot_mvgam_forecasts.html\">plot_mvgam_fc</a></code>,\n<code><a href=\"plot_mvgam_trend.html\">plot_mvgam_trend</a></code>, <code><a href=\"plot_mvgam_uncertainty.html\">plot_mvgam_uncertainty</a></code>, <code><a href=\"plot_mvgam_factors.html\">plot_mvgam_factors</a></code>,\n<code><a href=\"plot_mvgam_randomeffects.html\">plot_mvgam_randomeffects</a></code>, <code><a href=\"conditional_effects.mvgam.html\">conditional_effects.mvgam</a></code>,\n<code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></code>, <code><a href=\"https://marginaleffects.com/man/r/plot_slopes.html\" class=\"external-link\">plot_slopes</a></code>,\n<code><a href=\"gratia_mvgam_enhancements.html\">gratia_mvgam_enhancements</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some time series</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>T <span class=\"op\">=</span> <span class=\"fl\">80</span>, n_series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a basic model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c38222f99.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot predictions and residuals for each series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'forecast'</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'residuals'</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot model effects</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooths'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'re'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># More flexible plots with 'marginaleffects' utilities</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://marginaleffects.com/\" class=\"external-link\">marginaleffects</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"st\">'season'</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>                condition <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'season'</span>, <span class=\"st\">'series'</span>, <span class=\"st\">'series'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-10.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"st\">'series'</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-11.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># When using a State-Space model with predictors on the process</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># model, set trend_effects = TRUE to visualise process effects</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>            trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">dat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c3b362b14.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'smooths'</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-12.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># But marginaleffects functions work without any modification</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, condition <span class=\"op\">=</span> <span class=\"st\">'season'</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot.mvgam-13.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot.mvgam_fevd.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot forecast error variance decompositions from an mvgam_fevd object — plot.mvgam_fevd • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot forecast error variance decompositions from an mvgam_fevd object — plot.mvgam_fevd\"><meta name=\"description\" content=\"This function takes an mvgam_fevd object and produces\na plot of the posterior median contributions to forecast variance for each series\nin the fitted Vector Autoregression\"><meta property=\"og:description\" content=\"This function takes an mvgam_fevd object and produces\na plot of the posterior median contributions to forecast variance for each series\nin the fitted Vector Autoregression\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot forecast error variance decompositions from an <code>mvgam_fevd</code> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_fevd-class.R\" class=\"external-link\"><code>R/mvgam_fevd-class.R</code></a></small>\n      <div class=\"d-none name\"><code>plot.mvgam_fevd.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function takes an <code>mvgam_fevd</code> object and produces\na plot of the posterior median contributions to forecast variance for each series\nin the fitted Vector Autoregression</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam_fevd'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam_fevd</code>. See <code><a href=\"fevd.mvgam.html\">fevd()</a></code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></code> object,\nwhich can be further customized using the <span class=\"pkg\">ggplot2</span> package</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot.mvgam_irf.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot impulse responses from an mvgam_irf object — plot.mvgam_irf • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot impulse responses from an mvgam_irf object — plot.mvgam_irf\"><meta name=\"description\" content=\"This function takes an mvgam_irf object and produces plots of Impulse Response Functions\"><meta property=\"og:description\" content=\"This function takes an mvgam_irf object and produces plots of Impulse Response Functions\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot impulse responses from an <code>mvgam_irf</code> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/mvgam_irf-class.R\" class=\"external-link\"><code>R/mvgam_irf-class.R</code></a></small>\n      <div class=\"d-none name\"><code>plot.mvgam_irf.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function takes an <code>mvgam_irf</code> object and produces plots of Impulse Response Functions</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam_irf'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam_irf</code>. See <code><a href=\"irf.mvgam.html\">irf()</a></code></p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which process series should be given the shock</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A ggplot object showing the expected response of each latent time series to\na shock of the focal <code>series</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot.mvgam_lfo.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot Pareto-k and ELPD values from a mvgam_lfo object — plot.mvgam_lfo • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot Pareto-k and ELPD values from a mvgam_lfo object — plot.mvgam_lfo\"><meta name=\"description\" content=\"This function takes an object of class mvgam_lfo and creates several\ninformative diagnostic plots\"><meta property=\"og:description\" content=\"This function takes an object of class mvgam_lfo and creates several\ninformative diagnostic plots\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot Pareto-k and ELPD values from a <code>mvgam_lfo</code> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/lfo_cv.mvgam.R\" class=\"external-link\"><code>R/lfo_cv.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>plot.mvgam_lfo.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function takes an object of class <code>mvgam_lfo</code> and creates several\ninformative diagnostic plots</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam_lfo'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>An object of class <code>mvgam_lfo</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A ggplot object of Pareto-k and ELPD values over the\nevaluation timepoints. For the Pareto-k plot, a dashed red line indicates the\nspecified threshold chosen for triggering model refits. For the ELPD plot,\na dashed red line indicates the bottom 10% quantile of ELPD values. Points below\nthis threshold may represent outliers that were more difficult to forecast</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_effects.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Convenient way to call marginal or conditional effect plotting functions\nimplemented in the marginaleffects package\"><title>Effect plot as implemented in marginaleffects — plot_effects.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.2.2/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.2.2/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Effect plot as implemented in marginaleffects — plot_effects.mvgam\"><meta property=\"og:description\" content=\"Convenient way to call marginal or conditional effect plotting functions\nimplemented in the marginaleffects package\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.0.6</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in the mvgam package</a>\n  </div>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Effect plot as implemented in <span class=\"pkg\">marginaleffects</span></h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_effects.R\" class=\"external-link\"><code>R/plot_effects.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_effects.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Convenient way to call marginal or conditional effect plotting functions\nimplemented in the <span class=\"pkg\">marginaleffects</span> package</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_effects</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for mvgam</span></span>\n<span><span class=\"fu\">plot_effects</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  condition <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  by <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  newdata <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  type <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  conf_level <span class=\"op\">=</span> <span class=\"fl\">0.95</span>,</span>\n<span>  wts <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  transform <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  points <span class=\"op\">=</span> <span class=\"fl\">0</span>,</span>\n<span>  rug <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>...</dt>\n<dd><p>Additional arguments are passed to the <code><a href=\"https://rdrr.io/r/stats/predict.html\" class=\"external-link\">predict()</a></code> method\nsupplied by the modeling package.These arguments are particularly useful\nfor mixed-effects or bayesian models (see the online vignettes on the\n<code>marginaleffects</code> website). Available arguments can vary from model to\nmodel, depending on the range of supported arguments by each modeling\npackage. See the \"Model-Specific Arguments\" section of the\n<code>?marginaleffects</code> documentation for a non-exhaustive list of available\narguments.</p></dd>\n\n\n<dt>condition</dt>\n<dd><p>Conditional predictions</p><ul><li><p>Character vector (max length 3): Names of the predictors to display.</p></li>\n<li><p>Named list (max length 3): List names correspond to predictors. List elements can be:</p><ul><li><p>Numeric vector</p></li>\n<li><p>Function which returns a numeric vector or a set of unique categorical values</p></li>\n<li><p>Shortcut strings for common reference values: \"minmax\", \"quartile\", \"threenum\"</p></li>\n</ul></li>\n<li><p>1: x-axis. 2: color/shape. 3: facets.</p></li>\n<li><p>Numeric variables in positions 2 and 3 are summarized by Tukey's five numbers <code><a href=\"https://rdrr.io/r/stats/fivenum.html\" class=\"external-link\">?stats::fivenum</a></code></p></li>\n</ul></dd>\n\n\n<dt>by</dt>\n<dd><p>Marginal predictions</p><ul><li><p>Character vector (max length 3): Names of the categorical predictors to marginalize across.</p></li>\n<li><p>1: x-axis. 2: color. 3: facets.</p></li>\n</ul></dd>\n\n\n<dt>newdata</dt>\n<dd><p>When <code>newdata</code> is <code>NULL</code>, the grid is determined by the <code>condition</code> argument. When <code>newdata</code> is not <code>NULL</code>, the argument behaves in the same way as in the <code>predictions()</code> function.</p></dd>\n\n\n<dt>type</dt>\n<dd><p>string indicates the type (scale) of the predictions used to\ncompute contrasts or slopes. This can differ based on the model\ntype, but will typically be a string such as: \"response\", \"link\", \"probs\",\nor \"zero\". When an unsupported string is entered, the model-specific list of\nacceptable values is returned in an error message. When <code>type</code> is <code>NULL</code>, the\ndefault value is used. This default is the first model-related row in\nthe <code>marginaleffects:::type_dictionary</code> dataframe.</p></dd>\n\n\n<dt>conf_level</dt>\n<dd><p>numeric value between 0 and 1. Confidence level to use to build a confidence interval.</p></dd>\n\n\n<dt>wts</dt>\n<dd><p>string or numeric: weights to use when computing average contrasts or slopes. These weights only affect the averaging in <code>avg_*()</code> or with the <code>by</code> argument, and not the unit-level estimates themselves. Internally, estimates and weights are passed to the <code><a href=\"https://rdrr.io/r/stats/weighted.mean.html\" class=\"external-link\">weighted.mean()</a></code> function.</p><ul><li><p>string: column name of the weights variable in <code>newdata</code>. When supplying a column name to <code>wts</code>, it is recommended to supply the original data (including the weights variable) explicitly to <code>newdata</code>.</p></li>\n<li><p>numeric: vector of length equal to the number of rows in the original data or in <code>newdata</code> (if supplied).</p></li>\n</ul></dd>\n\n\n<dt>transform</dt>\n<dd><p>A function applied to unit-level adjusted predictions and confidence intervals just before the function returns results. For bayesian models, this function is applied to individual draws from the posterior distribution, before computing summaries.</p></dd>\n\n\n<dt>points</dt>\n<dd><p>Number between 0 and 1 which controls the transparency of raw data points. 0 (default) does not display any points.</p></dd>\n\n\n<dt>rug</dt>\n<dd><p>TRUE displays tick marks on the axes to mark the distribution of raw data.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>A <code><a href=\"https://ggplot2.tidyverse.org/reference/ggplot.html\" class=\"external-link\">ggplot</a></code> object\nthat can be further customized using the <span class=\"pkg\">ggplot2</span> package</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_factors.html",
    "content": "<!DOCTYPE html>\r\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Latent factor summaries for a fitted mvgam object — plot_mvgam_factors • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\"><meta name=\"description\" content=\"This function takes a fitted mvgam object and returns plots and summary statistics for\r\nthe latent dynamic factors\"><meta property=\"og:description\" content=\"This function takes a fitted mvgam object and returns plots and summary statistics for\r\nthe latent dynamic factors\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\r\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\r\n\r\n\r\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\r\n\r\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\r\n\r\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\r\n\r\n\r\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n      <span class=\"navbar-toggler-icon\"></span>\r\n    </button>\r\n\r\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\r\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\r\n<li class=\"nav-item dropdown\">\r\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\r\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\r\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\r\n  </ul></li>\r\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\r\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\r\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\r\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\r\n      </ul></div>\r\n\r\n\r\n  </div>\r\n</nav><div class=\"container template-reference-topic\">\r\n<div class=\"row\">\r\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\r\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Latent factor summaries for a fitted <span class=\"pkg\">mvgam</span> object</h1>\r\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_factors.R\" class=\"external-link\"><code>R/plot_mvgam_factors.R</code></a></small>\r\n      <div class=\"d-none name\"><code>plot_mvgam_factors.Rd</code></div>\r\n    </div>\r\n\r\n    <div class=\"ref-description section level2\">\r\n    <p>This function takes a fitted <code>mvgam</code> object and returns plots and summary statistics for\r\nthe latent dynamic factors</p>\r\n    </div>\r\n\r\n    <div class=\"section level2\">\r\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\r\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_factors</span><span class=\"op\">(</span><span class=\"va\">object</span>, plot <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\r\n    </div>\r\n\r\n    <div class=\"section level2\">\r\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\r\n\r\n\r\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\r\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\r\n\r\n\r\n<dt id=\"arg-plot\">plot<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-plot\"></a></dt>\r\n<dd><p><code>logical</code> specifying whether factors should be plotted</p></dd>\r\n\r\n</dl></div>\r\n    <div class=\"section level2\">\r\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\r\n    <p>A <code>dataframe</code> of factor contributions and,\r\noptionally, a series of base <code>R</code> plots</p>\r\n    </div>\r\n    <div class=\"section level2\">\r\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\r\n    <p>If the model in <code>object</code> was estimated using dynamic factors, it is possible that not all factors\r\ncontributed to the estimated trends. This is due to the regularisation penalty that acts independently on each\r\nfactor's Gaussian precision, which will squeeze un-needed factors to a white noise process (effectively dropping\r\nthat factor from the model). In this function, each factor is tested against a null hypothesis of white noise by\r\ncalculating the sum of the factor's 2nd derivatives. A factor that has a larger contribution will have a larger\r\nsum due to the weaker penalty on the factor's precision. If\r\n<code>plot == TRUE</code>, the factors are also plotted.</p>\r\n    </div>\r\n    <div class=\"section level2\">\r\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\r\n    <p>Nicholas J Clark</p>\r\n    </div>\r\n\r\n    <div class=\"section level2\">\r\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\r\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\r\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>,</span></span>\r\n<span class=\"r-in\"><span>                  k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\r\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\r\n<span class=\"r-in\"><span>            use_lv <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\r\n<span class=\"r-in\"><span>            n_lv <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\r\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\r\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Warning in 'C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model_0f5e123adc47a9208b1c8eaa9e58906b.stan', line 23, column 31: Found\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     int division:\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       n_lv * (n_lv - 1) / 2\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     Values will be rounded towards zero. If rounding is not desired you can\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     write\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     the division as\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       n_lv * (n_lv - 1) / 2.0\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     If rounding is intended please use the integer division operator %/%.\r</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\r\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 1.5 seconds.</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 1.6 seconds.</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 1.5 seconds.</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 1.7 seconds.</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\r\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_factors</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\r\n<span class=\"r-plt img\"><img src=\"plot_mvgam_factors-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         Contribution</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Factor1    0.2470528</span>\r\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Factor2    0.7529472</span>\r\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\r\n</code></pre></div>\r\n    </div>\r\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\r\n    </nav></aside></div>\r\n\r\n\r\n    <footer><div class=\"pkgdown-footer-left\">\r\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\r\n</div>\r\n\r\n<div class=\"pkgdown-footer-right\">\r\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\r\n</div>\r\n\r\n    </footer></div>\r\n\r\n\r\n\r\n\r\n\r\n  </body></html>\r\n\r\n"
  },
  {
    "path": "docs/reference/plot_mvgam_forecasts.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot posterior forecast predictions from mvgam models — plot_mvgam_forecasts • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot posterior forecast predictions from mvgam models — plot_mvgam_forecasts\"><meta name=\"description\" content=\"Plot posterior forecast predictions from mvgam models\"><meta property=\"og:description\" content=\"Plot posterior forecast predictions from mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot posterior forecast predictions from <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_fc.R\" class=\"external-link\"><code>R/plot_mvgam_fc.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_forecasts.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Plot posterior forecast predictions from <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_fc</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  realisations <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  n_realisations <span class=\"op\">=</span> <span class=\"fl\">15</span>,</span>\n<span>  hide_xlabels <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">xlab</span>,</span>\n<span>  <span class=\"va\">ylab</span>,</span>\n<span>  <span class=\"va\">ylim</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  return_forecasts <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  return_score <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_forecast'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  realisations <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  n_realisations <span class=\"op\">=</span> <span class=\"fl\">15</span>,</span>\n<span>  <span class=\"va\">xlab</span>,</span>\n<span>  <span class=\"va\">ylab</span>,</span>\n<span>  <span class=\"va\">ylim</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which series in the set is to be plotted</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing at least 'series' and 'time'\nin addition to any other variables included in the linear predictor of the original <code>formula</code>. If included, the\ncovariate information in <code>newdata</code> will be used to generate forecasts from the fitted model equations. If\nthis same <code>newdata</code> was originally included in the call to <code>mvgam</code>, then forecasts have already been\nproduced by the generative model and these will simply be extracted and plotted. However if no <code>newdata</code> was\nsupplied to the original model call, an assumption is made that the <code>newdata</code> supplied here comes sequentially\nafter the data supplied as <code>data</code> in the original model (i.e. we assume there is no time gap between the last\nobservation of series 1 in <code>data</code> and the first observation for series 1 in <code>newdata</code>). If\n<code>newdata</code> contains observations in column <code>y</code>, these observations will be used to compute a Discrete Rank\nProbability Score for the forecast distribution</p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-realisations\">realisations<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-realisations\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, forecast realisations are shown as a spaghetti plot,\nmaking it easier to visualise the diversity of possible forecasts. If <code>FALSE</code>, the default,\nempirical quantiles of the forecast distribution are shown</p></dd>\n\n\n<dt id=\"arg-n-realisations\">n_realisations<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-realisations\"></a></dt>\n<dd><p><code>integer</code> specifying the number of posterior realisations to plot, if\n<code>realisations = TRUE</code>. Ignored otherwise</p></dd>\n\n\n<dt id=\"arg-hide-xlabels\">hide_xlabels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-hide-xlabels\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, no xlabels are printed to allow the user to add custom labels using\n<code>axis</code> from base <code>R</code></p></dd>\n\n\n<dt id=\"arg-xlab\">xlab<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-xlab\"></a></dt>\n<dd><p>label for x axis.</p></dd>\n\n\n<dt id=\"arg-ylab\">ylab<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ylab\"></a></dt>\n<dd><p>label for y axis.</p></dd>\n\n\n<dt id=\"arg-ylim\">ylim<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ylim\"></a></dt>\n<dd><p>Optional <code>vector</code> of y-axis limits (min, max)</p></dd>\n\n\n<dt id=\"arg-n-cores\">n_cores<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-cores\"></a></dt>\n<dd><p><code>integer</code> specifying number of cores for generating forecasts in parallel</p></dd>\n\n\n<dt id=\"arg-return-forecasts\">return_forecasts<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-return-forecasts\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, the function will plot the forecast\nas well as returning the forecast object (as a <code>matrix</code> of dimension <code>n_samples</code> x <code>horizon</code>)</p></dd>\n\n\n<dt id=\"arg-return-score\">return_score<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-return-score\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code> and out of sample test data is provided as\n<code>newdata</code>, a probabilistic score will be calculated and returned. The score used will depend on the\nobservation family from the fitted model. Discrete families (<code>poisson</code>, <code>negative binomial</code>, <code>tweedie</code>)\nuse the Discrete Rank Probability Score. Other families use the Continuous Rank Probability Score. The value\nreturned is the <code>sum</code> of all scores within the out of sample forecast horizon</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>further <code><a href=\"https://rdrr.io/r/graphics/par.html\" class=\"external-link\">par</a></code> graphical parameters.</p></dd>\n\n\n<dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>Object of class <code>mvgam_forecast</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base <code>R</code> graphics plot (for <code>plot_mvgam_fc</code>) or a <code>ggplot</code> object (for <code>plot.mvgam_forecast</code>) and an optional <code>list</code> containing the forecast distribution\nand the out of sample probabilistic forecast score</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>plot_mvgam_fc</code> generates posterior predictions from an object of class <code>mvgam</code>, calculates posterior\nempirical quantiles and plots them against the observed data. If <code>realisations = FALSE</code>, the returned plot shows\n90, 60, 40 and 20 percent posterior quantiles (as ribbons of increasingly darker shades or red)\nas well as the posterior median (as a dark red line). If <code>realisations = FALSE</code>, a set of <code>n_realisations</code> posterior\ndraws are shown. This function produces an older style base <code>R</code> plot, as opposed to <code>plot.mvgam_forecast</code></p>\n<p><code>plot.mvgam_forecast</code> takes an object of class <code>mvgam_forecast</code>, in which forecasts have already\nbeen computed, and plots the resulting forecast distribution as a <code>ggplot</code> object. This function is therefore more\nversatile and is recommended over the older and clunkier <code>plot_mvgam_fc</code> version</p>\n<p>If <code>realisations = FALSE</code>, these posterior quantiles are plotted along\nwith the true observed data that was used to train the model. Otherwise, a spaghetti plot is returned\nto show possible forecast paths.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Hindcasts on response scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">hc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"hindcast.mvgam.html\">hindcast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">hc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\", k = 6)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x0000027337a0d7d0&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"response\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : chr [1:3] \"series_1\" \"series_2\" \"series_3\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:75] 0 1 1 0 5 1 3 4 5 4 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:75] 0 0 0 0 0 2 3 1 2 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:75] 1 0 0 0 3 1 0 1 3 3 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:75] 0 1 0 0 0 0 0 0 1 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:75] 0 0 2 0 0 0 0 0 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,2]\" \"ypred[2,2]\" \"ypred[3,2]\" \"ypred[4,2]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:75] 0 1 0 3 0 1 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,3]\" \"ypred[2,3]\" \"ypred[3,3]\" \"ypred[4,3]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">hc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> No non-missing values in test_observations; cannot calculate forecast score</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Forecasts on response scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 16</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ call              :Class 'formula'  language y ~ s(season, bs = \"cc\", k = 6)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \".Environment\")=&lt;environment: 0x0000027337a0d7d0&gt; </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_call        : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family            : chr \"poisson\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ family_pars       : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ trend_model       :List of 7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ trend_model: chr \"AR1\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ ma         : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ cor        : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ unit       : chr \"time\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ gr         : chr \"NA\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ subgr      : chr \"series\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ label      : language AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..- attr(*, \"class\")= chr \"mvgam_trend\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ drift             : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ use_lv            : logi FALSE</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ fit_engine        : chr \"stan\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ type              : chr \"response\"</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_names      : Factor w/ 3 levels \"series_1\",\"series_2\",..: 1 2 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_observations:List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:75] 0 1 1 0 5 1 3 4 5 4 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:75] 0 0 0 0 0 2 3 1 2 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:75] 1 0 0 0 3 1 0 1 3 3 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_observations :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:25] 1 0 4 2 4 4 3 5 2 2 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:25] 1 1 0 0 0 5 1 1 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:25] 0 0 1 0 3 3 0 3 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ test_times        : int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ hindcasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: num [1:1000, 1:75] 0 1 0 0 0 0 0 0 1 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,1]\" \"ypred[2,1]\" \"ypred[3,1]\" \"ypred[4,1]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: num [1:1000, 1:75] 0 0 2 0 0 0 0 0 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,2]\" \"ypred[2,2]\" \"ypred[3,2]\" \"ypred[4,2]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: num [1:1000, 1:75] 0 1 0 3 0 1 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. ..- attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   .. .. ..$ : chr [1:75] \"ypred[1,3]\" \"ypred[2,3]\" \"ypred[3,3]\" \"ypred[4,3]\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ forecasts         :List of 3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_1: int [1:1000, 1:25] 0 0 1 0 0 1 0 1 1 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_2: int [1:1000, 1:25] 1 0 0 1 1 1 1 0 2 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ series_3: int [1:1000, 1:25] 1 0 0 0 3 0 0 0 0 0 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"class\")= chr \"mvgam_forecast\"</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 27.997178</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 12.082925</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 13.097777</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Forecasts as expectations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>, type <span class=\"op\">=</span> <span class=\"st\">'expected'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Dynamic trend extrapolations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>, type <span class=\"op\">=</span> <span class=\"st\">'trend'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-10.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-11.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_forecasts-12.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_pterms.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot parametric term partial effects for mvgam models — plot_mvgam_pterms • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot parametric term partial effects for mvgam models — plot_mvgam_pterms\"><meta name=\"description\" content=\"This function plots posterior empirical quantiles for partial effects of parametric terms\"><meta property=\"og:description\" content=\"This function plots posterior empirical quantiles for partial effects of parametric terms\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot parametric term partial effects for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_pterms.R\" class=\"external-link\"><code>R/plot_mvgam_pterms.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_pterms.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function plots posterior empirical quantiles for partial effects of parametric terms</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_pterms</span><span class=\"op\">(</span><span class=\"va\">object</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p>logical. If <code>TRUE</code> and a <code>trend_formula</code> was used in model\nfitting, terms from the trend (i.e. process) model will be plotted</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base <code>R</code> graphics plot</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Posterior empirical quantiles of each parametric term's partial effect estimates\n(on the link scale) are calculated and visualised as ribbon plots. These effects can\nbe interpreted as the partial effect that a parametric term contributes when all other\nterms in the model have been set to <code>0</code></p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_randomeffects.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot random effect terms from mvgam models — plot_mvgam_randomeffects • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot random effect terms from mvgam models — plot_mvgam_randomeffects\"><meta name=\"description\" content=\"This function plots posterior empirical quantiles for random effect smooths (bs = re)\"><meta property=\"og:description\" content=\"This function plots posterior empirical quantiles for random effect smooths (bs = re)\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot random effect terms from <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_randomeffects.R\" class=\"external-link\"><code>R/plot_mvgam_randomeffects.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_randomeffects.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function plots posterior empirical quantiles for random effect smooths (bs = re)</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_randomeffects</span><span class=\"op\">(</span><span class=\"va\">object</span>, trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p>logical. If <code>TRUE</code> and a <code>trend_formula</code> was used in model\nfitting, terms from the trend (i.e. process) model will be plotted</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base <code>R</code> graphics plot</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Posterior empirical quantiles of random effect coefficient estimates\n(on the link scale) are calculated and visualised as ribbon plots.\nLabels for coefficients are taken from the levels of the original factor variable\nthat was used to specify the smooth in the model's formula</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_resids.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Residual diagnostics for a fitted mvgam object — plot_mvgam_resids • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\"><meta name=\"description\" content=\"This function takes a fitted mvgam object and returns various residual diagnostic plots\"><meta property=\"og:description\" content=\"This function takes a fitted mvgam object and returns various residual diagnostic plots\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Residual diagnostics for a fitted <span class=\"pkg\">mvgam</span> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_resids.R\" class=\"external-link\"><code>R/plot_mvgam_resids.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_resids.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function takes a fitted <code>mvgam</code> object and returns various residual diagnostic plots</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_resids</span><span class=\"op\">(</span><span class=\"va\">object</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span>, n_draws <span class=\"op\">=</span> <span class=\"fl\">100L</span>, n_points <span class=\"op\">=</span> <span class=\"fl\">1000L</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which series in the set is to be plotted</p></dd>\n\n\n<dt id=\"arg-n-draws\">n_draws<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-draws\"></a></dt>\n<dd><p><code>integer</code> specifying the number of posterior residual draws\nto use for calculating uncertainty in the \"ACF\" and \"pACF\" frames. Default is <code>100</code></p></dd>\n\n\n<dt id=\"arg-n-points\">n_points<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-points\"></a></dt>\n<dd><p><code>integer</code> specifying the maximum number of points to show in the\n\"Resids vs Fitted\" and \"Normal Q-Q Plot\" frames. Default is <code>1000</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A series of facetted ggplot object</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A total of four ggplot plots are generated to examine posterior\nDunn-Smyth residuals for the specified series. Plots include a residuals vs fitted values plot,\na Q-Q plot, and two plots to check for any remaining temporal autocorrelation in the residuals.\nNote, all plots only report statistics from a sample of up to 100 posterior\ndraws (to save computational time), so uncertainty in these relationships may not be adequately represented.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n<p>Nicholas J Clark and Matthijs Hollanders</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot Dunn Smyth residuals for some series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_resids</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_resids-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_resids</span><span class=\"op\">(</span><span class=\"va\">mod</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_resids-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_series.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot observed time series used for mvgam modelling — plot_mvgam_series • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot observed time series used for mvgam modelling — plot_mvgam_series\"><meta name=\"description\" content=\"This function takes either a fitted mvgam object or a data.frame object\nand produces plots of observed time series, ACF, CDF and histograms for exploratory data analysis\"><meta property=\"og:description\" content=\"This function takes either a fitted mvgam object or a data.frame object\nand produces plots of observed time series, ACF, CDF and histograms for exploratory data analysis\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot observed time series used for <span class=\"pkg\">mvgam</span> modelling</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_series.R\" class=\"external-link\"><code>R/plot_mvgam_series.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_series.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function takes either a fitted <code>mvgam</code> object or a <code>data.frame</code> object\nand produces plots of observed time series, ACF, CDF and histograms for exploratory data analysis</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_series</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">data</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  y <span class=\"op\">=</span> <span class=\"st\">\"y\"</span>,</span>\n<span>  lines <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">n_bins</span>,</span>\n<span>  log_scale <span class=\"op\">=</span> <span class=\"cn\">FALSE</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>Optional <code>list</code> object returned from <code>mvgam</code>. Either <code>object</code> or <code>data</code>\nmust be supplied.</p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>Optional <code>data.frame</code> or <code>list</code> of training data containing at least 'series' and 'time'.\nUse this argument if training data have been gathered in the correct format for <code>mvgam</code> modelling\nbut no model has yet been fitted.</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>data.frame</code> or <code>list</code> of test data containing at least 'series' and 'time'\nfor the forecast horizon, in addition to any other variables included in the linear predictor of <code>formula</code>. If\nincluded, the observed values in the test data are compared to the model's forecast distribution for exploring\nbiases in model predictions.</p></dd>\n\n\n<dt id=\"arg-y\">y<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-y\"></a></dt>\n<dd><p>Character. What is the name of the outcome variable in the supplied data? Defaults to\n<code>'y'</code></p></dd>\n\n\n<dt id=\"arg-lines\">lines<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-lines\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code>, line plots are used for visualizing time series. If\n<code>FALSE</code>, points are used.</p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p>Either a <code>integer</code> specifying which series in the set is to be plotted or\nthe string 'all', which plots all series available in the supplied data</p></dd>\n\n\n<dt id=\"arg-n-bins\">n_bins<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-bins\"></a></dt>\n<dd><p><code>integer</code> specifying the number of bins to use for binning observed values when plotting\na the histogram. Default is to use the number of bins returned by a call to <code>hist</code> in base <code>R</code></p></dd>\n\n\n<dt id=\"arg-log-scale\">log_scale<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-log-scale\"></a></dt>\n<dd><p><code>logical</code>. If <code>series == 'all'</code>, this flag is used to control whether\nthe time series plot is shown on the log scale (using <code>log(Y + 1)</code>). This can be useful when\nvisualizing many series that may have different observed ranges. Default is <code>FALSE</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A set of ggplot objects. If <code>series</code> is an integer, the plots will\nshow observed time series, autocorrelation and\ncumulative distribution functions, and a histogram for the series. If <code>series == 'all'</code>,\na set of observed time series plots is returned in which all series are shown on each plot but\nonly a single focal series is highlighted, with all remaining series shown as faint gray lines.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark and Matthijs Hollanders</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># Simulate and plot series with observations bounded at 0 and 1 (Beta responses)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                     trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>, prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_series</span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">sim_data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_series-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_series</span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">sim_data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>                 newdata <span class=\"op\">=</span> <span class=\"va\">sim_data</span><span class=\"op\">$</span><span class=\"va\">data_test</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_series-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now simulate series with overdispersed discrete observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">nb</a></span><span class=\"op\">(</span><span class=\"op\">)</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                     prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span>, phi <span class=\"op\">=</span> <span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_series</span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">sim_data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_series-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_smooth.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot smooth terms from mvgam models — plot_mvgam_smooth • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot smooth terms from mvgam models — plot_mvgam_smooth\"><meta name=\"description\" content=\"This function plots posterior empirical quantiles for a series-specific smooth term\"><meta property=\"og:description\" content=\"This function plots posterior empirical quantiles for a series-specific smooth term\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot smooth terms from <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_smooth.R\" class=\"external-link\"><code>R/plot_mvgam_smooth.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_smooth.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function plots posterior empirical quantiles for a series-specific smooth term</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_smooth</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  trend_effects <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">smooth</span>,</span>\n<span>  residuals <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  n_resid_bins <span class=\"op\">=</span> <span class=\"fl\">25</span>,</span>\n<span>  realisations <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  n_realisations <span class=\"op\">=</span> <span class=\"fl\">15</span>,</span>\n<span>  derivatives <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">newdata</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-trend-effects\">trend_effects<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-effects\"></a></dt>\n<dd><p>logical. If <code>TRUE</code> and a <code>trend_formula</code> was used in model\nfitting, terms from the trend (i.e. process) model will be plotted</p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which series in the set is to be plotted</p></dd>\n\n\n<dt id=\"arg-smooth\">smooth<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-smooth\"></a></dt>\n<dd><p>either a <code>character</code> or <code>integer</code> specifying which smooth term to be plotted</p></dd>\n\n\n<dt id=\"arg-residuals\">residuals<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-residuals\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code> then posterior quantiles of partial residuals are added\nto plots of 1-D smooths as a series of ribbon rectangles.\nPartial residuals for a smooth term are the median Dunn-Smyth residuals that would be obtained by dropping the term\nconcerned from the model, while leaving all other estimates fixed (i.e. the\nestimates for the term plus the original median Dunn-Smyth residuals). Note that because <code>mvgam</code> works with\nDunn-Smyth residuals and not working residuals, which are used by <code>mgcv</code>, the magnitudes of\npartial residuals will be different to what you would expect from <code><a href=\"https://rdrr.io/pkg/mgcv/man/plot.gam.html\" class=\"external-link\">plot.gam</a></code>. Interpretation\nis similar though, as these partial residuals should be evenly scattered\naround the smooth function if the function is well estimated</p></dd>\n\n\n<dt id=\"arg-n-resid-bins\">n_resid_bins<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-resid-bins\"></a></dt>\n<dd><p><code>integer</code> specifying the number of bins group the covariate into when plotting partial residuals.\nSetting this argument too high can make for messy plots that are difficult to interpret, while setting it too\nlow will likely mask some potentially useful patterns in the partial residuals. Default is <code>25</code></p></dd>\n\n\n<dt id=\"arg-realisations\">realisations<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-realisations\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, posterior realisations are shown as a spaghetti plot,\nmaking it easier to visualise the diversity of possible functions. If <code>FALSE</code>, the default,\nempirical quantiles of the posterior distribution are shown</p></dd>\n\n\n<dt id=\"arg-n-realisations\">n_realisations<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-realisations\"></a></dt>\n<dd><p><code>integer</code> specifying the number of posterior realisations to plot, if\n<code>realisations = TRUE</code>. Ignored otherwise</p></dd>\n\n\n<dt id=\"arg-derivatives\">derivatives<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-derivatives\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, an additional plot will be returned to show the\nestimated 1st derivative for the specified smooth (Note, this only works for univariate smooths)</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> for predicting the smooth, containing at least 'series'\nin addition to any other variables included in the linear predictor of the original model's <code>formula</code>.\nNote that this currently is only supported for plotting univariate smooths</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base <code>R</code> graphics plot</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Smooth functions are shown as empirical quantiles (or spaghetti plots) of posterior partial expectations\nacross a sequence of values between the variable's <code>min</code> and <code>max</code>,\nwhile zeroing out effects of all other variables. At present, only univariate and bivariate smooth plots\nare allowed, though note that bivariate smooths rely on default behaviour from\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/plot.gam.html\" class=\"external-link\">plot.gam</a></code>. <code>plot_mvgam_smooth</code> generates posterior predictions from an\nobject of class <code>mvgam</code>, calculates posterior empirical quantiles and plots them.\nIf <code>realisations = FALSE</code>, the returned plot shows 90, 60, 40 and 20 percent posterior\nquantiles (as ribbons of increasingly darker shades or red) as well as the posterior\nmedian (as a dark red line). If <code>realisations = FALSE</code>, a set of <code>n_realisations</code> posterior\ndraws are shown. For more nuanced visualisation, supply\n<code>newdata</code> just as you would when predicting from a <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code> model or use the more flexible <code><a href=\"conditional_effects.mvgam.html\">conditional_effects.mvgam</a></code>. Alternatively, if you prefer to use partial\neffect plots in the style of <code>gratia</code>, and if you have the <code>gratia</code> package installed, you can\nuse <code>draw.mvgam</code>. See <code><a href=\"gratia_mvgam_enhancements.html\">gratia_mvgam_enhancements</a></code> for details.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"https://rdrr.io/pkg/mgcv/man/plot.gam.html\" class=\"external-link\">plot.gam</a></code>, <code><a href=\"conditional_effects.mvgam.html\">conditional_effects.mvgam</a></code>,\n<code><a href=\"gratia_mvgam_enhancements.html\">gratia_mvgam_enhancements</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_trend.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot latent trend predictions from mvgam models — plot_mvgam_trend • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot latent trend predictions from mvgam models — plot_mvgam_trend\"><meta name=\"description\" content=\"Plot latent trend predictions from mvgam models\"><meta property=\"og:description\" content=\"Plot latent trend predictions from mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot latent trend predictions from <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_trend.R\" class=\"external-link\"><code>R/plot_mvgam_trend.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_trend.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Plot latent trend predictions from <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_trend</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  realisations <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  n_realisations <span class=\"op\">=</span> <span class=\"fl\">15</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  derivatives <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  hide_xlabels <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">xlab</span>,</span>\n<span>  <span class=\"va\">ylab</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which series in the set is to be plotted</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing at least 'series' and 'time'\nin addition to any other variables included in the linear predictor of the original <code>formula</code>.</p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-realisations\">realisations<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-realisations\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, posterior trend realisations are shown as a spaghetti plot,\nmaking it easier to visualise the diversity of possible trend paths. If <code>FALSE</code>, the default,\nempirical quantiles of the posterior distribution are shown</p></dd>\n\n\n<dt id=\"arg-n-realisations\">n_realisations<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-realisations\"></a></dt>\n<dd><p><code>integer</code> specifying the number of posterior realisations to plot, if\n<code>realisations = TRUE</code>. Ignored otherwise</p></dd>\n\n\n<dt id=\"arg-n-cores\">n_cores<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-cores\"></a></dt>\n<dd><p><code>integer</code> specifying number of cores for generating trend forecasts in parallel</p></dd>\n\n\n<dt id=\"arg-derivatives\">derivatives<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-derivatives\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, an additional plot will be returned to show the\nestimated 1st derivative for the estimated trend</p></dd>\n\n\n<dt id=\"arg-hide-xlabels\">hide_xlabels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-hide-xlabels\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, no xlabels are printed to allow the user to add custom labels using\n<code>axis</code> from base <code>R</code>. Ignored if <code>derivatives = TRUE</code></p></dd>\n\n\n<dt id=\"arg-xlab\">xlab<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-xlab\"></a></dt>\n<dd><p>label for x axis.</p></dd>\n\n\n<dt id=\"arg-ylab\">ylab<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ylab\"></a></dt>\n<dd><p>label for y axis.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>further <code><a href=\"https://rdrr.io/r/graphics/par.html\" class=\"external-link\">par</a></code> graphical parameters.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base <code>R</code> graphics plot</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>, trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 1.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 1.1 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 1.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 1.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Plot estimated trends for some series</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_trend</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_trend-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_trend</span><span class=\"op\">(</span><span class=\"va\">mod</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_trend-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extrapolate trends forward in time and plot on response scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_trend</span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_trend-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">plot_mvgam_trend</span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_trend-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># But it is recommended to compute extrapolations for all series</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># first and then plot</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">trend_fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">trend_fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 29.244167</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_trend-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">trend_fc</span>, series <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 29.555438</span>\n<span class=\"r-plt img\"><img src=\"plot_mvgam_trend-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/plot_mvgam_uncertainty.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot forecast uncertainty contributions from mvgam models — plot_mvgam_uncertainty • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot forecast uncertainty contributions from mvgam models — plot_mvgam_uncertainty\"><meta name=\"description\" content=\"Plot forecast uncertainty contributions from mvgam models\"><meta property=\"og:description\" content=\"Plot forecast uncertainty contributions from mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot forecast uncertainty contributions from <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/plot_mvgam_uncertainty.R\" class=\"external-link\"><code>R/plot_mvgam_uncertainty.R</code></a></small>\n      <div class=\"d-none name\"><code>plot_mvgam_uncertainty.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Plot forecast uncertainty contributions from <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">plot_mvgam_uncertainty</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  legend_position <span class=\"op\">=</span> <span class=\"st\">\"topleft\"</span>,</span>\n<span>  hide_xlabels <span class=\"op\">=</span> <span class=\"cn\">FALSE</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which series in the set is to be plotted</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> containing at least 'series' and 'time' for the forecast horizon, in\naddition to any other variables included in the linear predictor of <code>formula</code></p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-legend-position\">legend_position<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-legend-position\"></a></dt>\n<dd><p>The location may also be specified by setting x to a single keyword from the\nlist: \"none\", \"bottomright\", \"bottom\", \"bottomleft\", \"left\", \"topleft\", \"top\", \"topright\", \"right\" and \"center\".\nThis places the legend on the inside of the plot frame at the given location (if it is not \"none\").</p></dd>\n\n\n<dt id=\"arg-hide-xlabels\">hide_xlabels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-hide-xlabels\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, no xlabels are printed to allow the user to add custom labels using\n<code>axis</code> from base <code>R</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base <code>R</code> graphics plot</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>The basic idea of this function is to compute forecasts by ignoring one of the\ntwo primary components in a correlated residual model (i.e. by either ignoring the\nlinear predictor effects or by ignoring the residual dynamics). Some caution is required\nhowever, as this function was designed early in the <span class=\"pkg\">mvgam</span> development cycle and\nthere are now many types of models that it cannot handle very well. For example,\nmodels with shared latent states, or any type of State-Space models that include terms\nin the <code>trend_formula</code>, will either fail or give nonsensical results. Improvements are\nin the works to provide a more general way to decompose forecast uncertainties, so\nplease check back at a later date.</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/portal_data.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"A dataset containing timeseries of total captures (across all control plots) for select rodent species from the Portal Project\"><title>Portal Project rodent capture survey data — portal_data • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Portal Project rodent capture survey data — portal_data\"><meta property=\"og:description\" content=\"A dataset containing timeseries of total captures (across all control plots) for select rodent species from the Portal Project\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.3</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Portal Project rodent capture survey data</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/portal_data.R\" class=\"external-link\"><code>R/portal_data.R</code></a></small>\n      <div class=\"d-none name\"><code>portal_data.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>A dataset containing timeseries of total captures (across all control plots) for select rodent species from the Portal Project</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"va\">portal_data</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"format\">Format<a class=\"anchor\" aria-label=\"anchor\" href=\"#format\"></a></h2>\n    <p>A dataframe containing the following fields:</p><dl><dt>moon</dt>\n<dd><p>time of sampling in lunar cycles</p></dd>\n\n<dt>DM</dt>\n<dd><p>Total captures of species Dipodomys merriami</p></dd>\n\n<dt>DO</dt>\n<dd><p>Total captures of species Dipodomys ordii</p></dd>\n\n<dt>PP</dt>\n<dd><p>Total captures of species Chaetodipus penicillatus</p></dd>\n\n<dt>OT</dt>\n<dd><p>Total captures of species Onychomys torridus</p></dd>\n\n<dt>year</dt>\n<dd><p>Sampling year</p></dd>\n\n<dt>month</dt>\n<dd><p>Sampling month</p></dd>\n\n<dt>mintemp</dt>\n<dd><p>Monthly mean minimum temperature</p></dd>\n\n<dt>precipitation</dt>\n<dd><p>Monthly mean precipitation</p></dd>\n\n<dt>ndvi</dt>\n<dd><p>Monthly mean Normalised Difference Vegetation Index</p></dd>\n\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"source\">Source<a class=\"anchor\" aria-label=\"anchor\" href=\"#source\"></a></h2>\n    <p><a href=\"https://github.com/weecology/PortalData/blob/main/SiteandMethods/Methods.md\" class=\"external-link\">https://github.com/weecology/PortalData/blob/main/SiteandMethods/Methods.md</a></p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/posterior_epred.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Draws from the expected value of the posterior predictive distribution for mvgam objects — posterior_epred.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Draws from the expected value of the posterior predictive distribution for mvgam objects — posterior_epred.mvgam\"><meta name=\"description\" content=\"Compute posterior draws of the expected value of the posterior predictive\ndistribution (i.e. the conditional expectation).\nCan be performed for the data used to fit the model (posterior\npredictive checks) or for new data. By definition, these predictions have\nsmaller variance than the posterior predictions performed by the\nposterior_predict.mvgam method. This is because only the\nuncertainty in the expected value of the posterior predictive distribution is\nincorporated in the draws computed by posterior_epred while the\nresidual error is ignored there. However, the estimated means of both methods\naveraged across draws should be very similar.\"><meta property=\"og:description\" content=\"Compute posterior draws of the expected value of the posterior predictive\ndistribution (i.e. the conditional expectation).\nCan be performed for the data used to fit the model (posterior\npredictive checks) or for new data. By definition, these predictions have\nsmaller variance than the posterior predictions performed by the\nposterior_predict.mvgam method. This is because only the\nuncertainty in the expected value of the posterior predictive distribution is\nincorporated in the draws computed by posterior_epred while the\nresidual error is ignored there. However, the estimated means of both methods\naveraged across draws should be very similar.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Draws from the expected value of the posterior predictive distribution for <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/posterior_epred.mvgam.R\" class=\"external-link\"><code>R/posterior_epred.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>posterior_epred.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute posterior draws of the expected value of the posterior predictive\ndistribution (i.e. the conditional expectation).\nCan be performed for the data used to fit the model (posterior\npredictive checks) or for new data. By definition, these predictions have\nsmaller variance than the posterior predictions performed by the\n<code><a href=\"posterior_predict.mvgam.html\">posterior_predict.mvgam</a></code> method. This is because only the\nuncertainty in the expected value of the posterior predictive distribution is\nincorporated in the draws computed by <code>posterior_epred</code> while the\nresidual error is ignored there. However, the estimated means of both methods\naveraged across draws should be very similar.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/rstantools/reference/posterior_epred.html\" class=\"external-link\">posterior_epred</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  ndraws <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  process_error <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> or <code>jsdgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing the same variables\nthat were included in the original <code>data</code> used to fit the model. If not supplied,\npredictions are generated for the original observations used for the model fit.</p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-ndraws\">ndraws<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ndraws\"></a></dt>\n<dd><p>Positive <code>integer</code> indicating how many posterior draws should be used.\nIf <code>NULL</code> (the default) all draws are used.</p></dd>\n\n\n<dt id=\"arg-process-error\">process_error<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-process-error\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code> and <code>newdata</code> is supplied,\nexpected uncertainty in the process model is accounted for by using draws\nfrom any latent trend SD parameters. If <code>FALSE</code>, uncertainty in the latent\ntrend component is ignored when calculating predictions. If no <code>newdata</code> is\nsupplied, draws from the fitted model's posterior predictive distribution will be used\n(which will always include uncertainty in any latent trend components)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>matrix</code> of dimension <code>n_samples x new_obs</code>,\nwhere <code>n_samples</code> is the number of posterior samples from the fitted object\nand <code>n_obs</code> is the number of observations in <code>newdata</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Note that for all types of predictions for models that did not include\na <code>trend_formula</code>, uncertainty in the dynamic trend\ncomponent can be ignored by setting <code>process_error = FALSE</code>. However,\nif a <code>trend_formula</code> was supplied in the model, predictions for this component cannot be\nignored. If <code>process_error = TRUE</code>, trend predictions will ignore autocorrelation\ncoefficients or GP length scale coefficients, ultimately assuming the process is stationary.\nThis method is similar to the types of posterior predictions returned from <code>brms</code> models\nwhen using autocorrelated error predictions for newdata.\nThis function is therefore more suited to posterior simulation from the GAM components\nof a <code>mvgam</code> model, while the forecasting functions\n<code><a href=\"plot_mvgam_forecasts.html\">plot_mvgam_fc</a></code> and <code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code> are better suited to generate h-step ahead forecasts\nthat respect the temporal dynamics of estimated latent trends.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"hindcast.mvgam.html\">hindcast.mvgam</a></code> <code><a href=\"posterior_linpred.mvgam.html\">posterior_linpred.mvgam</a></code> <code><a href=\"posterior_predict.mvgam.html\">posterior_predict.mvgam</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data and fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compute posterior expectations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">expectations</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://mc-stan.org/rstantools/reference/posterior_epred.html\" class=\"external-link\">posterior_epred</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">expectations</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  num [1:1000, 1:75] 2.85 2.41 2.5 2.5 2.55 ...</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/posterior_linpred.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Posterior draws of the linear predictor for mvgam objects — posterior_linpred.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Posterior draws of the linear predictor for mvgam objects — posterior_linpred.mvgam\"><meta name=\"description\" content=\"Compute posterior draws of the linear predictor, that is draws before\napplying any link functions or other transformations. Can be performed for\nthe data used to fit the model (posterior predictive checks) or for new data.\"><meta property=\"og:description\" content=\"Compute posterior draws of the linear predictor, that is draws before\napplying any link functions or other transformations. Can be performed for\nthe data used to fit the model (posterior predictive checks) or for new data.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Posterior draws of the linear predictor for <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/posterior_epred.mvgam.R\" class=\"external-link\"><code>R/posterior_epred.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>posterior_linpred.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute posterior draws of the linear predictor, that is draws before\napplying any link functions or other transformations. Can be performed for\nthe data used to fit the model (posterior predictive checks) or for new data.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/rstantools/reference/posterior_linpred.html\" class=\"external-link\">posterior_linpred</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  transform <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  ndraws <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  process_error <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> or <code>jsdgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-transform\">transform<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-transform\"></a></dt>\n<dd><p>Logical; if <code>FALSE</code>\n(the default), draws of the linear predictor are returned.\nIf <code>TRUE</code>, draws of the transformed linear predictor,\ni.e. the conditional expectation, are returned.</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing the same variables\nthat were included in the original <code>data</code> used to fit the model. If not supplied,\npredictions are generated for the original observations used for the model fit.</p></dd>\n\n\n<dt id=\"arg-ndraws\">ndraws<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ndraws\"></a></dt>\n<dd><p>Positive <code>integer</code> indicating how many posterior draws should be used.\nIf <code>NULL</code> (the default) all draws are used.</p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-process-error\">process_error<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-process-error\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code> and <code>newdata</code> is supplied,\nexpected uncertainty in the process model is accounted for by using draws\nfrom any latent trend SD parameters. If <code>FALSE</code>, uncertainty in the latent\ntrend component is ignored when calculating predictions. If no <code>newdata</code> is\nsupplied, draws from the fitted model's posterior predictive distribution will be used\n(which will always include uncertainty in any latent trend components)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>matrix</code> of dimension <code>n_samples x new_obs</code>,\nwhere <code>n_samples</code> is the number of posterior samples from the fitted object\nand <code>n_obs</code> is the number of observations in <code>newdata</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Note that for all types of predictions for models that did not include\na <code>trend_formula</code>, uncertainty in the dynamic trend\ncomponent can be ignored by setting <code>process_error = FALSE</code>. However,\nif a <code>trend_formula</code> was supplied in the model, predictions for this component cannot be\nignored. If <code>process_error = TRUE</code>, trend predictions will ignore autocorrelation\ncoefficients or GP length scale coefficients, ultimately assuming the process is stationary.\nThis method is similar to the types of posterior predictions returned from <code>brms</code> models\nwhen using autocorrelated error predictions for newdata.\nThis function is therefore more suited to posterior simulation from the GAM components\nof a <code>mvgam</code> model, while the forecasting functions\n<code><a href=\"plot_mvgam_forecasts.html\">plot_mvgam_fc</a></code> and <code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code> are better suited to generate h-step ahead forecasts\nthat respect the temporal dynamics of estimated latent trends.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code> <code><a href=\"posterior_predict.mvgam.html\">posterior_predict.mvgam</a></code></p>\n<p><code><a href=\"hindcast.mvgam.html\">hindcast.mvgam</a></code> <code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code> <code><a href=\"posterior_predict.mvgam.html\">posterior_predict.mvgam</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data and fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c2df534e8.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract linear predictor values</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">linpreds</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://mc-stan.org/rstantools/reference/posterior_linpred.html\" class=\"external-link\">posterior_linpred</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">linpreds</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  num [1:1000, 1:75] -0.7353 -0.5959 -0.8928 -0.0926 -2.269 ...</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/posterior_predict.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Draws from the posterior predictive distribution for mvgam objects — posterior_predict.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Draws from the posterior predictive distribution for mvgam objects — posterior_predict.mvgam\"><meta name=\"description\" content=\"Compute posterior draws of the posterior predictive distribution. Can be\nperformed for the data used to fit the model (posterior predictive checks) or\nfor new data. By definition, these draws have higher variance than draws\nof the expected value of the posterior predictive distribution computed by\nposterior_epred.mvgam. This is because the residual error\nis incorporated in posterior_predict. However, the estimated means of\nboth methods averaged across draws should be very similar.\"><meta property=\"og:description\" content=\"Compute posterior draws of the posterior predictive distribution. Can be\nperformed for the data used to fit the model (posterior predictive checks) or\nfor new data. By definition, these draws have higher variance than draws\nof the expected value of the posterior predictive distribution computed by\nposterior_epred.mvgam. This is because the residual error\nis incorporated in posterior_predict. However, the estimated means of\nboth methods averaged across draws should be very similar.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Draws from the posterior predictive distribution for <span class=\"pkg\">mvgam</span> objects</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/posterior_epred.mvgam.R\" class=\"external-link\"><code>R/posterior_epred.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>posterior_predict.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute posterior draws of the posterior predictive distribution. Can be\nperformed for the data used to fit the model (posterior predictive checks) or\nfor new data. By definition, these draws have higher variance than draws\nof the expected value of the posterior predictive distribution computed by\n<code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code>. This is because the residual error\nis incorporated in <code>posterior_predict</code>. However, the estimated means of\nboth methods averaged across draws should be very similar.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://mc-stan.org/rstantools/reference/posterior_predict.html\" class=\"external-link\">posterior_predict</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  ndraws <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  process_error <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> or <code>jsdgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing the same variables\nthat were included in the original <code>data</code> used to fit the model. If not supplied,\npredictions are generated for the original observations used for the model fit.</p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-ndraws\">ndraws<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ndraws\"></a></dt>\n<dd><p>Positive <code>integer</code> indicating how many posterior draws should be used.\nIf <code>NULL</code> (the default) all draws are used.</p></dd>\n\n\n<dt id=\"arg-process-error\">process_error<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-process-error\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code> and <code>newdata</code> is supplied,\nexpected uncertainty in the process model is accounted for by using draws\nfrom any latent trend SD parameters. If <code>FALSE</code>, uncertainty in the latent\ntrend component is ignored when calculating predictions. If no <code>newdata</code> is\nsupplied, draws from the fitted model's posterior predictive distribution will be used\n(which will always include uncertainty in any latent trend components)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>matrix</code> of dimension <code>n_samples x new_obs</code>,\nwhere <code>n_samples</code> is the number of posterior samples from the fitted object\nand <code>n_obs</code> is the number of observations in <code>newdata</code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Note that for all types of predictions for models that did not include\na <code>trend_formula</code>, uncertainty in the dynamic trend\ncomponent can be ignored by setting <code>process_error = FALSE</code>. However,\nif a <code>trend_formula</code> was supplied in the model, predictions for this component cannot be\nignored. If <code>process_error = TRUE</code>, trend predictions will ignore autocorrelation\ncoefficients or GP length scale coefficients, ultimately assuming the process is stationary.\nThis method is similar to the types of posterior predictions returned from <code>brms</code> models\nwhen using autocorrelated error predictions for newdata.\nThis function is therefore more suited to posterior simulation from the GAM components\nof a <code>mvgam</code> model, while the forecasting functions\n<code><a href=\"plot_mvgam_forecasts.html\">plot_mvgam_fc</a></code> and <code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code> are better suited to generate h-step ahead forecasts\nthat respect the temporal dynamics of estimated latent trends.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"hindcast.mvgam.html\">hindcast.mvgam</a></code> <code><a href=\"posterior_linpred.mvgam.html\">posterior_linpred.mvgam</a></code> <code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data and fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>            silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c6332e42.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compute posterior predictions</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">predictions</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://mc-stan.org/rstantools/reference/posterior_predict.html\" class=\"external-link\">posterior_predict</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">predictions</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  int [1:1000, 1:75] 1 0 1 1 2 0 1 2 0 0 ...</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/pp_check.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Posterior Predictive Checks for mvgam models — pp_check.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Posterior Predictive Checks for mvgam models — pp_check.mvgam\"><meta name=\"description\" content=\"Perform unconditional posterior predictive checks with the help\nof the bayesplot package.\"><meta property=\"og:description\" content=\"Perform unconditional posterior predictive checks with the help\nof the bayesplot package.\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Posterior Predictive Checks for <code>mvgam</code> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/ppc.mvgam.R\" class=\"external-link\"><code>R/ppc.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>pp_check.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Perform unconditional posterior predictive checks with the help\nof the <span class=\"pkg\">bayesplot</span> package.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">pp_check</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">type</span>,</span>\n<span>  ndraws <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  prefix <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"ppc\"</span>, <span class=\"st\">\"ppd\"</span><span class=\"op\">)</span>,</span>\n<span>  group <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  x <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  newdata <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>An object of class <code>mvgam</code>.</p></dd>\n\n\n<dt id=\"arg-type\">type<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-type\"></a></dt>\n<dd><p>Type of the ppc plot as given by a character string.\nSee <code><a href=\"https://mc-stan.org/bayesplot/reference/PPC-overview.html\" class=\"external-link\">PPC</a></code> for an overview\nof currently supported types. You may also use an invalid\ntype (e.g. <code>type = \"xyz\"</code>) to get a list of supported\ntypes in the resulting error message.</p></dd>\n\n\n<dt id=\"arg-ndraws\">ndraws<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ndraws\"></a></dt>\n<dd><p>Positive integer indicating how many\nposterior draws should be used.\nIf <code>NULL</code> all draws are used. If not specified,\nthe number of posterior draws is chosen automatically.\nIgnored if <code>draw_ids</code> is not <code>NULL</code>.</p></dd>\n\n\n<dt id=\"arg-prefix\">prefix<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-prefix\"></a></dt>\n<dd><p>The prefix of the <span class=\"pkg\">bayesplot</span> function to be applied.\nEither `\"ppc\"` (posterior predictive check; the default)\nor `\"ppd\"` (posterior predictive distribution), the latter being the same\nas the former except that the observed data is not shown for `\"ppd\"`.</p></dd>\n\n\n<dt id=\"arg-group\">group<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-group\"></a></dt>\n<dd><p>Optional name of a factor variable in the model\nby which to stratify the ppc plot. This argument is required for\nppc <code>*_grouped</code> types and ignored otherwise.</p></dd>\n\n\n<dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>Optional name of a variable in the model.\nOnly used for ppc types having an <code>x</code> argument\nand ignored otherwise.</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing the\nvariables included in the linear predictor of <code>formula</code>. If not supplied,\npredictions are generated for the original observations used for the model fit.\nIgnored if using one of the residual plots (i.e. 'resid_hist')</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Further arguments passed to <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code>\nas well as to the PPC function specified in <code>type</code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A ggplot object that can be further\ncustomized using the <span class=\"pkg\">ggplot2</span> package.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Unlike the conditional posterior checks provided by <code><a href=\"ppc.mvgam.html\">ppc</a></code>,\nThis function computes <em>unconditional</em> posterior predictive checks (i.e. it generates\npredictions for fake data without considering the true observations associated with those\nfake data). For a detailed explanation of each of the ppc functions,\nsee the <code><a href=\"https://mc-stan.org/bayesplot/reference/PPC-overview.html\" class=\"external-link\">PPC</a></code>\ndocumentation of the <span class=\"pkg\"><a href=\"https://mc-stan.org/bayesplot/reference/bayesplot-package.html\" class=\"external-link\">bayesplot</a></span>\npackage.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"ppc.mvgam.html\">ppc</a></code>, <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>seasonality <span class=\"op\">=</span> <span class=\"st\">\"hierarchical\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"va\">series</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"cc\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span> <span class=\"op\">+</span></span></span>\n<span class=\"r-in\"><span>    <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, <span class=\"va\">series</span>, bs <span class=\"op\">=</span> <span class=\"st\">\"fs\"</span>, k <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>  chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>model has repeated 1-d smooths of same variable.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-16186c053d9.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                           </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Use pp_check(mod, type = \"xyz\") for a list of available plot types</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Default is a density overlay for all observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'dens_overlay' by default.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Rootograms particularly useful for count data</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"rootogram\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using all posterior draws for ppc type 'rootogram' by default.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Grouping plots by series is useful</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"bars_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span>, ndraws <span class=\"op\">=</span> <span class=\"fl\">50</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"ecdf_overlay_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span>, ndraws <span class=\"op\">=</span> <span class=\"fl\">50</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"stat_freqpoly_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span>, ndraws <span class=\"op\">=</span> <span class=\"fl\">50</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Note: in most cases the default test statistic 'mean' is too weak to detect anything of interest.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Several types can be used to plot distributions of randomized</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># quantile residuals</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  object <span class=\"op\">=</span> <span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  x <span class=\"op\">=</span> <span class=\"st\">\"season\"</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"resid_ribbon\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'resid_ribbon' by default.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>  object <span class=\"op\">=</span> <span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  x <span class=\"op\">=</span> <span class=\"st\">\"season\"</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"resid_ribbon_grouped\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'resid_ribbon_grouped' by default.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-7.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  ndraws <span class=\"op\">=</span> <span class=\"fl\">5</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"resid_hist_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-8.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Custom functions accepted</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"stat\"</span>, stat <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/mean.html\" class=\"external-link\">mean</a></span><span class=\"op\">(</span><span class=\"va\">x</span> <span class=\"op\">==</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using all posterior draws for ppc type 'stat' by default.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-9.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"stat_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  stat <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/mean.html\" class=\"external-link\">mean</a></span><span class=\"op\">(</span><span class=\"va\">x</span> <span class=\"op\">==</span> <span class=\"fl\">0</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using all posterior draws for ppc type 'stat_grouped' by default.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-10.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Some functions accept covariates to set the x-axes</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>  x <span class=\"op\">=</span> <span class=\"st\">\"season\"</span>,</span></span>\n<span class=\"r-in\"><span>  type <span class=\"op\">=</span> <span class=\"st\">\"ribbon_grouped\"</span>,</span></span>\n<span class=\"r-in\"><span>  prob <span class=\"op\">=</span> <span class=\"fl\">0.5</span>,</span></span>\n<span class=\"r-in\"><span>  prob_outer <span class=\"op\">=</span> <span class=\"fl\">0.8</span>,</span></span>\n<span class=\"r-in\"><span>  group <span class=\"op\">=</span> <span class=\"st\">\"series\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using all posterior draws for ppc type 'ribbon_grouped' by default.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-11.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Many plots can be made without the observed data</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">pp_check</span><span class=\"op\">(</span><span class=\"va\">mod</span>, prefix <span class=\"op\">=</span> <span class=\"st\">\"ppd\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'dens_overlay' by default.</span>\n<span class=\"r-plt img\"><img src=\"pp_check.mvgam-12.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/ppc.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Plot conditional posterior predictive checks from mvgam models — ppc.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Plot conditional posterior predictive checks from mvgam models — ppc.mvgam\"><meta name=\"description\" content=\"Plot conditional posterior predictive checks from mvgam models\"><meta property=\"og:description\" content=\"Plot conditional posterior predictive checks from mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Plot conditional posterior predictive checks from <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/ppc.mvgam.R\" class=\"external-link\"><code>R/ppc.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>ppc.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Plot conditional posterior predictive checks from <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">ppc</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">ppc</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  series <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  type <span class=\"op\">=</span> <span class=\"st\">\"hist\"</span>,</span>\n<span>  <span class=\"va\">n_bins</span>,</span>\n<span>  <span class=\"va\">legend_position</span>,</span>\n<span>  <span class=\"va\">xlab</span>,</span>\n<span>  <span class=\"va\">ylab</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>further <code><a href=\"https://rdrr.io/r/graphics/par.html\" class=\"external-link\">par</a></code> graphical parameters.</p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing at least 'series' and 'time'\nfor the forecast horizon, in addition to any other variables included in the linear predictor of <code>formula</code>. If\nincluded, the observed values in the test data are compared to the model's forecast distribution for exploring\nbiases in model predictions.\nNote this is only useful if the same <code>newdata</code> was also included when fitting the original model.</p></dd>\n\n\n<dt id=\"arg-data-test\">data_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data-test\"></a></dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code>integer</code> specifying which series in the set is to be plotted</p></dd>\n\n\n<dt id=\"arg-type\">type<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-type\"></a></dt>\n<dd><p><code>character</code> specifying the type of posterior predictive check to calculate and plot.\nValid options are: 'rootogram', 'mean', 'hist', 'density', 'prop_zero', 'pit' and 'cdf'</p></dd>\n\n\n<dt id=\"arg-n-bins\">n_bins<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-bins\"></a></dt>\n<dd><p><code>integer</code> specifying the number of bins to use for binning observed values when plotting\na rootogram or histogram. Default is <code>50</code> bins for a rootogram, which means that if\nthere are <code>&gt;50</code> unique observed values, bins will\nbe used to prevent overplotting and facilitate interpretation. Default for a histogram is to use the\nnumber of bins returned by a call to <code>hist</code> in base <code>R</code></p></dd>\n\n\n<dt id=\"arg-legend-position\">legend_position<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-legend-position\"></a></dt>\n<dd><p>The location may also be specified by setting x to a single keyword from the\nlist \"bottomright\", \"bottom\", \"bottomleft\", \"left\", \"topleft\", \"top\", \"topright\", \"right\" and \"center\".\nThis places the legend on the inside of the plot frame at the given location. Or alternatively,\nuse \"none\" to hide the legend.</p></dd>\n\n\n<dt id=\"arg-xlab\">xlab<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-xlab\"></a></dt>\n<dd><p>label for x axis.</p></dd>\n\n\n<dt id=\"arg-ylab\">ylab<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-ylab\"></a></dt>\n<dd><p>label for y axis.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A base <code>R</code> graphics plot showing either a posterior rootogram (for <code>type == 'rootogram'</code>),\nthe predicted vs observed mean for the\nseries (for <code>type == 'mean'</code>), predicted vs observed proportion of zeroes for the\nseries (for <code>type == 'prop_zero'</code>),predicted vs observed histogram for the\nseries (for <code>type == 'hist'</code>), kernel density or empirical CDF estimates for\nposterior predictions (for <code>type == 'density'</code> or <code>type == 'cdf'</code>) or a Probability\nIntegral Transform histogram (for <code>type == 'pit'</code>).</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Conditional posterior predictions are drawn from the fitted <code>mvgam</code> and compared against\nthe empirical distribution of the observed data for a specified series to help evaluate the model's\nability to generate unbiased predictions. For all plots apart from <code>type = 'rootogram'</code>, posterior predictions\ncan also be compared to out of sample observations as long as these observations were included as\n' data_test' in the original model fit and supplied here. Rootograms are currently only plotted using the\n' hanging' style.\n<br>\nNote that the predictions used for these plots are <em>conditional on the observed data</em>, i.e. they\nare those predictions that have been generated directly within\nthe <code><a href=\"mvgam.html\">mvgam()</a></code> model. They can be misleading if the model included flexible dynamic trend components. For\na broader range of posterior checks that are created using <em>unconditional</em> \"new data\" predictions, see\n<code><a href=\"pp_check.mvgam.html\">pp_check.mvgam</a></code></p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"pp_check.mvgam.html\">pp_check.mvgam</a></code>, <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some smooth effects and fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, n <span class=\"op\">=</span> <span class=\"fl\">200</span>, scale <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Gu &amp; Wahba 4 term additive model</span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x0</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x1</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x2</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x3</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  data <span class=\"op\">=</span> <span class=\"va\">dat</span>,</span></span>\n<span class=\"r-in\"><span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>  chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>  silent <span class=\"op\">=</span> <span class=\"fl\">2</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-161817fb4d8a.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_mat</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> h/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for con</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> structor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Posterior checks</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">ppc</span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"hist\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"ppc.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">ppc</span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"density\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"ppc.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\">ppc</span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"cdf\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"ppc.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Many more options are available with pp_check()</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'dens_overlay' by default.</span>\n<span class=\"r-plt img\"><img src=\"ppc.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"ecdf_overlay\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'ecdf_overlay' by default.</span>\n<span class=\"r-plt img\"><img src=\"ppc.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"pp_check.mvgam.html\">pp_check</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">\"freqpoly\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Using 10 posterior draws for ppc type 'freqpoly' by default.</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.</span>\n<span class=\"r-plt img\"><img src=\"ppc.mvgam-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/predict.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Predict from a fitted mvgam model\"><title>Predict from a fitted mvgam model — predict.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Predict from a fitted mvgam model — predict.mvgam\"><meta property=\"og:description\" content=\"Predict from a fitted mvgam model\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Predict from a fitted <span class=\"pkg\">mvgam</span> model</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/predict.mvgam.R\" class=\"external-link\"><code>R/predict.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>predict.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Predict from a fitted <span class=\"pkg\">mvgam</span> model</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for mvgam</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/predict.html\" class=\"external-link\">predict</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">data_test</span>,</span>\n<span>  type <span class=\"op\">=</span> <span class=\"st\">\"link\"</span>,</span>\n<span>  process_error <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  summary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  robust <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.025</span>, <span class=\"fl\">0.975</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>object</dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> or <code>jsdgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt>newdata</dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing the same variables\nthat were included in the original <code>data</code> used to fit the model. If not supplied,\npredictions are generated for the original observations used for the model fit.</p></dd>\n\n\n<dt>data_test</dt>\n<dd><p>Deprecated. Still works in place of <code>newdata</code> but users are recommended to use\n<code>newdata</code> instead for more seamless integration into <code>R</code> workflows</p></dd>\n\n\n<dt>type</dt>\n<dd><p>When this has the value <code>link</code> (default) the linear predictor is\ncalculated on the link scale.\nIf <code>expected</code> is used, predictions reflect the expectation of the response (the mean)\nbut ignore uncertainty in the observation process. When <code>response</code> is used,\nthe predictions take uncertainty in the observation process into account to return\npredictions on the outcome scale. When <code>variance</code> is used, the variance of the response\nwith respect to the mean (mean-variance relationship) is returned.\nWhen <code>type = \"terms\"</code>, each component of the linear predictor is\nreturned separately in the form of a <code>list</code> (possibly with standard\nerrors, if <code>summary = TRUE</code>): this includes parametric model components,\nfollowed by each smooth component, but excludes any offset and any intercept.\nTwo special cases are also allowed:\ntype <code>latent_N</code> will return the estimated latent abundances from an\nN-mixture distribution, while type <code>detection</code> will return the estimated\ndetection probability from an N-mixture distribution</p></dd>\n\n\n<dt>process_error</dt>\n<dd><p>Logical. If <code>TRUE</code> and a dynamic trend model was fit,\nexpected uncertainty in the process model is accounted for by using draws\nfrom the latent trend SD parameters. If <code>FALSE</code>, uncertainty in the latent trend\ncomponent is ignored when calculating predictions</p></dd>\n\n\n<dt>summary</dt>\n<dd><p>Should summary statistics be returned\ninstead of the raw values? Default is <code>TRUE</code>..</p></dd>\n\n\n<dt>robust</dt>\n<dd><p>If <code>FALSE</code> (the default) the mean is used as\nthe measure of central tendency and the standard deviation as\nthe measure of variability. If <code>TRUE</code>, the median and the\nmedian absolute deviation (MAD) are applied instead.\nOnly used if <code>summary</code> is <code>TRUE</code>.</p></dd>\n\n\n<dt>probs</dt>\n<dd><p>The percentiles to be computed by the <code>quantile</code>\nfunction. Only used if <code>summary</code> is <code>TRUE</code>.</p></dd>\n\n\n<dt>...</dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>Predicted values on the appropriate scale.\nIf <code>summary = FALSE</code> and <code>type != \"terms\"</code>,\nthe output is a matrix of dimension <code>n_draw x n_observations</code></p>\n\n\n<p>containing predicted values for each posterior draw in <code>object</code>.</p>\n\n\n<p>If <code>summary = TRUE</code> and <code>type != \"terms\"</code>, the output is an <code>n_observations</code> x <code>E</code></p>\n\n\n<p>matrix. The number of summary statistics <code>E</code> is equal to <code>2 +\n  length(probs)</code>: The <code>Estimate</code> column contains point estimates (either\nmean or median depending on argument <code>robust</code>), while the\n<code>Est.Error</code> column contains uncertainty estimates (either standard\ndeviation or median absolute deviation depending on argument\n<code>robust</code>). The remaining columns starting with <code>Q</code> contain\nquantile estimates as specified via argument <code>probs</code>.</p>\n\n\n<p>If <code>type = \"terms\"</code> and <code>summary = FALSE</code>, the output is a named <code>list</code></p>\n\n\n<p>containing a separate slot for each effect, with the effects returned as\nmatrices of dimension <code>n_draw x 1</code>. If <code>summary = TRUE</code>, the output resembles that\nfrom <code><a href=\"https://rdrr.io/pkg/mgcv/man/predict.gam.html\" class=\"external-link\">predict.gam</a></code> when using the call\n<code>predict.gam(object, type = \"terms\", se.fit = TRUE)</code>, where mean contributions\nfrom each effect are returned in <code>matrix</code> form while standard errors (representing\nthe interval: <code>(max(probs) - min(probs)) / 2</code>) are returned in a separate <code>matrix</code></p>\n\n\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Note that for all types of predictions for models that did not include\na <code>trend_formula</code>, uncertainty in the dynamic trend\ncomponent can be ignored by setting <code>process_error = FALSE</code>. However,\nif a <code>trend_formula</code> was supplied in the model, predictions for this component cannot be\nignored. If <code>process_error = TRUE</code>, trend predictions will ignore autocorrelation\ncoefficients or GP length scale coefficients, ultimately assuming the process is stationary.\nThis method is similar to the types of posterior predictions returned from <code>brms</code> models\nwhen using autocorrelated error predictions for newdata.\nThis function is therefore more suited to posterior simulation from the GAM components\nof a <code>mvgam</code> model, while the forecasting functions\n<code><a href=\"plot_mvgam_forecasts.html\">plot_mvgam_fc</a></code> and <code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code> are better suited to generate h-step ahead forecasts\nthat respect the temporal dynamics of estimated latent trends.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate 4 time series with hierarchical seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># and independent AR1 dynamic processes</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">111</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>seasonality <span class=\"op\">=</span> <span class=\"st\">'hierarchical'</span>,</span></span>\n<span class=\"r-in\"><span>                   trend_model <span class=\"op\">=</span> <span class=\"st\">'AR1'</span>,</span></span>\n<span class=\"r-in\"><span>                   family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model with shared seasonality</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Generate predictions against observed data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">preds</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/predict.html\" class=\"external-link\">predict</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>,</span></span>\n<span class=\"r-in\"><span>                summary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">preds</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          Estimate Est.Error       Q2.5       Q97.5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1,] -0.004792439 0.1100971 -0.2554910  0.20130427</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2,] -0.004792439 0.1100971 -0.2554910  0.20130427</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3,] -0.004792439 0.1100971 -0.2554910  0.20130427</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4,] -0.217605056 0.1047161 -0.4358171 -0.03374743</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [5,] -0.217605056 0.1047161 -0.4358171 -0.03374743</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [6,] -0.217605056 0.1047161 -0.4358171 -0.03374743</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Generate predictions against test data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">preds</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/predict.html\" class=\"external-link\">predict</a></span><span class=\"op\">(</span><span class=\"va\">mod1</span>,</span></span>\n<span class=\"r-in\"><span>                newdata <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>                summary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">preds</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        Estimate Est.Error        Q2.5      Q97.5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1,] -0.1711986 0.1085784 -0.38794662 0.02847842</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2,] -0.1711986 0.1085784 -0.38794662 0.02847842</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3,] -0.1711986 0.1085784 -0.38794662 0.02847842</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4,]  0.2894259 0.1312018  0.03487911 0.54980798</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [5,]  0.2894259 0.1312018  0.03487911 0.54980798</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [6,]  0.2894259 0.1312018  0.03487911 0.54980798</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/print.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Summary for a fitted mvgam object — print.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Summary for a fitted mvgam object — print.mvgam\"><meta name=\"description\" content=\"This function takes a fitted mvgam or jsdgam object and prints a quick summary\"><meta property=\"og:description\" content=\"This function takes a fitted mvgam or jsdgam object and prints a quick summary\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Summary for a fitted <span class=\"pkg\">mvgam</span> object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/print.mvgam.R\" class=\"external-link\"><code>R/print.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>print.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function takes a fitted <code>mvgam</code> or <code>jsdgam</code> object and prints a quick summary</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/print.html\" class=\"external-link\">print</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> is printed on-screen</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>A brief summary of the model's call is printed</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/reexports.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Objects exported from other packages — reexports • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Objects exported from other packages — reexports\"><meta name=\"description\" content=\"These objects are imported from other packages. Follow the links\nbelow to see their documentation.\n\n  brms\nconditional_effects, gp, mcmc_plot, prior, prior_, prior_string, set_prior, stancode, standata\n\n\n  generics\naugment\n\n\n  insight\nget_data\n\n\n  loo\nloo, loo_compare\n\n\n  marginaleffects\navg_predictions, comparisons, datagrid, get_predict, hypotheses, plot_comparisons, plot_predictions, plot_slopes, predictions, slopes\n\n\n  mgcv\ns, t2, te, ti\n\n\n  posterior\nas_draws, as_draws_array, as_draws_df, as_draws_list, as_draws_matrix, as_draws_rvars\n\n\n  rstantools\nposterior_epred, posterior_linpred, posterior_predict\n\n\n\"><meta property=\"og:description\" content=\"These objects are imported from other packages. Follow the links\nbelow to see their documentation.\n\n  brms\nconditional_effects, gp, mcmc_plot, prior, prior_, prior_string, set_prior, stancode, standata\n\n\n  generics\naugment\n\n\n  insight\nget_data\n\n\n  loo\nloo, loo_compare\n\n\n  marginaleffects\navg_predictions, comparisons, datagrid, get_predict, hypotheses, plot_comparisons, plot_predictions, plot_slopes, predictions, slopes\n\n\n  mgcv\ns, t2, te, ti\n\n\n  posterior\nas_draws, as_draws_array, as_draws_df, as_draws_list, as_draws_matrix, as_draws_rvars\n\n\n  rstantools\nposterior_epred, posterior_linpred, posterior_predict\n\n\n\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Objects exported from other packages</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/as.data.frame.mvgam.R\" class=\"external-link\"><code>R/as.data.frame.mvgam.R</code></a>, <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/conditional_effects.R\" class=\"external-link\"><code>R/conditional_effects.R</code></a>, <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/get_mvgam_priors.R\" class=\"external-link\"><code>R/get_mvgam_priors.R</code></a>, and 7 more</small>\n      <div class=\"d-none name\"><code>reexports.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>These objects are imported from other packages. Follow the links\nbelow to see their documentation.</p>\n<dl><dt>brms</dt>\n<dd><p><code><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/gp.html\" class=\"external-link\">gp</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/mcmc_plot.brmsfit.html\" class=\"external-link\">mcmc_plot</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior_</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior_string</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">set_prior</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/stancode.html\" class=\"external-link\">stancode</a></code>, <code><a href=\"https://paulbuerkner.com/brms/reference/standata.html\" class=\"external-link\">standata</a></code></p></dd>\n\n\n  <dt>generics</dt>\n<dd><p><code><a href=\"https://generics.r-lib.org/reference/augment.html\" class=\"external-link\">augment</a></code></p></dd>\n\n\n  <dt>insight</dt>\n<dd><p><code><a href=\"https://easystats.github.io/insight/reference/get_data.html\" class=\"external-link\">get_data</a></code></p></dd>\n\n\n  <dt>loo</dt>\n<dd><p><code><a href=\"https://mc-stan.org/loo/reference/loo.html\" class=\"external-link\">loo</a></code>, <code><a href=\"https://mc-stan.org/loo/reference/loo_compare.html\" class=\"external-link\">loo_compare</a></code></p></dd>\n\n\n  <dt>marginaleffects</dt>\n<dd><p><code><a href=\"https://marginaleffects.com/man/r/predictions.html\" class=\"external-link\">avg_predictions</a></code>, <code><a href=\"https://marginaleffects.com/man/r/comparisons.html\" class=\"external-link\">comparisons</a></code>, <code><a href=\"https://marginaleffects.com/man/r/datagrid.html\" class=\"external-link\">datagrid</a></code>, <code><a href=\"https://marginaleffects.com/man/r/get_predict.html\" class=\"external-link\">get_predict</a></code>, <code><a href=\"https://marginaleffects.com/man/r/hypotheses.html\" class=\"external-link\">hypotheses</a></code>, <code><a href=\"https://marginaleffects.com/man/r/plot_comparisons.html\" class=\"external-link\">plot_comparisons</a></code>, <code><a href=\"https://marginaleffects.com/man/r/plot_predictions.html\" class=\"external-link\">plot_predictions</a></code>, <code><a href=\"https://marginaleffects.com/man/r/plot_slopes.html\" class=\"external-link\">plot_slopes</a></code>, <code><a href=\"https://marginaleffects.com/man/r/predictions.html\" class=\"external-link\">predictions</a></code>, <code><a href=\"https://marginaleffects.com/man/r/slopes.html\" class=\"external-link\">slopes</a></code></p></dd>\n\n\n  <dt>mgcv</dt>\n<dd><p><code><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/t2.html\" class=\"external-link\">t2</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">te</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">ti</a></code></p></dd>\n\n\n  <dt>posterior</dt>\n<dd><p><code><a href=\"https://mc-stan.org/posterior/reference/draws.html\" class=\"external-link\">as_draws</a></code>, <code><a href=\"https://mc-stan.org/posterior/reference/draws_array.html\" class=\"external-link\">as_draws_array</a></code>, <code><a href=\"https://mc-stan.org/posterior/reference/draws_df.html\" class=\"external-link\">as_draws_df</a></code>, <code><a href=\"https://mc-stan.org/posterior/reference/draws_list.html\" class=\"external-link\">as_draws_list</a></code>, <code><a href=\"https://mc-stan.org/posterior/reference/draws_matrix.html\" class=\"external-link\">as_draws_matrix</a></code>, <code><a href=\"https://mc-stan.org/posterior/reference/draws_rvars.html\" class=\"external-link\">as_draws_rvars</a></code></p></dd>\n\n\n  <dt>rstantools</dt>\n<dd><p><code><a href=\"https://mc-stan.org/rstantools/reference/posterior_epred.html\" class=\"external-link\">posterior_epred</a></code>, <code><a href=\"https://mc-stan.org/rstantools/reference/posterior_linpred.html\" class=\"external-link\">posterior_linpred</a></code>, <code><a href=\"https://mc-stan.org/rstantools/reference/posterior_predict.html\" class=\"external-link\">posterior_predict</a></code></p></dd>\n\n\n</dl></div>\n\n\n\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/residual_cor.jsdgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Compute residual correlation estimates from Joint Species Distribution\njsdgam models using latent factor loadings\"><title>Extract residual correlations based on latent factors from a fitted jsdgam — residual_cor.jsdgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Extract residual correlations based on latent factors from a fitted jsdgam — residual_cor.jsdgam\"><meta property=\"og:description\" content=\"Compute residual correlation estimates from Joint Species Distribution\njsdgam models using latent factor loadings\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Extract residual correlations based on latent factors from a fitted jsdgam</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/residual_cor.R\" class=\"external-link\"><code>R/residual_cor.R</code></a></small>\n      <div class=\"d-none name\"><code>residual_cor.jsdgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute residual correlation estimates from Joint Species Distribution\n<code>jsdgam</code> models using latent factor loadings</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">residual_cor</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for jsdgam</span></span>\n<span><span class=\"fu\">residual_cor</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  summary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  robust <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.025</span>, <span class=\"fl\">0.975</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>object</dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> resulting from a call to <code><a href=\"jsdgam.html\">jsdgam()</a></code></p></dd>\n\n\n<dt>...</dt>\n<dd><p>ignored</p></dd>\n\n\n<dt>summary</dt>\n<dd><p>Should summary statistics be returned\ninstead of the raw values? Default is <code>TRUE</code>..</p></dd>\n\n\n<dt>robust</dt>\n<dd><p>If <code>FALSE</code> (the default) the mean is used as a measure of central tendency.\nIf <code>TRUE</code>, the median is used instead. Only used if <code>summary</code> is <code>TRUE</code></p></dd>\n\n\n<dt>probs</dt>\n<dd><p>The percentiles to be computed by the <code>quantile</code>\nfunction. Only used if <code>summary</code> is <code>TRUE</code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    \n\n<p>If <code>summary = TRUE</code>, a <code>list</code> with the following components:</p>\n<dl><dt>cor, cor_lower, cor_upper</dt>\n<dd><p>A set of \\(p \\times p\\) correlation matrices,\ncontaining either the posterior median or mean estimate, plus lower and upper limits\nof the corresponding credible intervals supplied to <code>probs</code></p></dd>\n\n<dt>sig_cor</dt>\n<dd><p>A \\(p \\times p\\) correlation matrix containing only those correlations whose credible\ninterval does not contain zero. All other correlations are set to zero</p></dd>\n\n<dt>prec, prec_lower, prec_upper</dt>\n<dd><p>A set of \\(p \\times p\\) precision matrices,\ncontaining either the posterior median or mean estimate, plus lower and upper limits\nof the corresponding credible intervals supplied to <code>probs</code></p></dd>\n\n<dt>sig_prec</dt>\n<dd><p>A \\(p \\times p\\) precision matrix containing only those precisions whose credible\ninterval does not contain zero. All other precisions are set to zero</p></dd>\n\n<dt>cov</dt>\n<dd><p>A \\(p \\times p\\) posterior median or mean covariance matrix</p></dd>\n\n<dt>trace</dt>\n<dd><p>The median/mean point estimator of the trace (sum of the diagonal elements)\nof the residual covariance matrix <code>cov</code></p></dd>\n\n\n</dl><p>If <code>summary = FALSE</code>, this function returns a <code>list</code> containing the following components:</p>\n<dl><dt>all_cormat</dt>\n<dd><p>A \\(n_{draws} \\times p \\times p\\) <code>array</code> of posterior\nresidual correlation matrix draws</p></dd>\n\n<dt>all_covmat</dt>\n<dd><p>A \\(n_{draws} \\times p \\times p\\) <code>array</code> of posterior\nresidual covariance matrix draws</p></dd>\n\n<dt>all_presmat</dt>\n<dd><p>A \\(n_{draws} \\times p \\times p\\) <code>array</code> of posterior\nresidual precision matrix draws</p></dd>\n\n<dt>all_trace</dt>\n<dd><p>A \\(n_{draws}\\) <code>vector</code> of posterior covariance trace draws</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Hui (2016) provides an excellent description of the quantities that this function calculates, so this passage\nis heavily paraphrased from his associated <code>boral</code> package.</p>\n<p>In Joint Species Distribution Models, the residual covariance matrix is calculated\nbased on the matrix of latent factor loading matrix \\(\\Theta\\), where the residual covariance\nmatrix \\(\\Sigma = \\Theta\\Theta'\\). A strong residual covariance/correlation matrix\nbetween two species can be interpreted as evidence of species interaction (e.g.,\nfacilitation or competition),\nmissing covariates, as well as any additional species correlation not accounted for by shared\nenvironmental captured in <code>formula</code>.</p>\n<p>The residual precision matrix (also known as partial correlation matrix, Ovaskainen et al., 2016)\nis defined as the inverse of the residual correlation matrix. The precision matrix is often used to\nidentify direct or causal relationships between two species e.g., two species can have a zero\nprecision but still be correlated, which can be interpreted as saying that two species are not\ndirectly associated, but they are still correlated <em>through</em> other species. In other words, they\nare conditionally independent given the other species. It is important that the precision matrix\ndoes not exhibit the exact same properties of the correlation e.g., the diagonal elements are\nnot equal to 1. Nevertheless, relatively larger values of precision may imply stronger\ndirect relationships between two species.</p>\n<p>In addition to the residual correlation and precision matrices, the median or mean point estimator\nof trace of the residual covariance matrix is returned,\n\\(\\sum\\limits_{j=1}^p [\\Theta\\Theta']_{jj}\\). Often used in other areas of multivariate\nstatistics, the trace may be interpreted as the amount of covariation explained by the latent factors.\nOne situation where the trace may be useful is when comparing a pure latent factor model\n(where no terms are suppled to <code>formula</code>) versus a model with latent\nfactors and some additional predictors in <code>formula</code> -- the proportional difference in trace\nbetween these two models may be interpreted as the proportion of covariation between species explained\nby the predictors in <code>formula</code>. Of course, the trace itself is random due to the MCMC sampling, and so it\nis not always guaranteed to produce sensible answers.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>Francis KC Hui (2016). BORAL - Bayesian ordination and regression analysis of\nmultivariate abundance data in R. Methods in Ecology and Evolution. 7, 744-750.\n<br><br>\nOtso Ovaskainen et al. (2016). Using latent variable models to identify large networks of\nspecies-to-species associations at different spatial scales. Methods in Ecology and Evolution,\n7, 549-555.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"jsdgam.html\">jsdgam()</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/residuals.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Posterior draws of residuals from mvgam models — residuals.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Posterior draws of residuals from mvgam models — residuals.mvgam\"><meta name=\"description\" content=\"This method extracts posterior draws of Dunn-Smyth (randomized quantile)\nresiduals in the order in which the data were supplied to the model. It included\nadditional arguments for obtaining summaries of the computed residuals\"><meta property=\"og:description\" content=\"This method extracts posterior draws of Dunn-Smyth (randomized quantile)\nresiduals in the order in which the data were supplied to the model. It included\nadditional arguments for obtaining summaries of the computed residuals\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Posterior draws of residuals from <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/residuals.mvgam.R\" class=\"external-link\"><code>R/residuals.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>residuals.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This method extracts posterior draws of Dunn-Smyth (randomized quantile)\nresiduals in the order in which the data were supplied to the model. It included\nadditional arguments for obtaining summaries of the computed residuals</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/residuals.html\" class=\"external-link\">residuals</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, summary <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, robust <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.025</span>, <span class=\"fl\">0.975</span><span class=\"op\">)</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p>An object of class <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-summary\">summary<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-summary\"></a></dt>\n<dd><p>Should summary statistics be returned\ninstead of the raw values? Default is <code>TRUE</code>..</p></dd>\n\n\n<dt id=\"arg-robust\">robust<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-robust\"></a></dt>\n<dd><p>If <code>FALSE</code> (the default) the mean is used as\nthe measure of central tendency and the standard deviation as\nthe measure of variability. If <code>TRUE</code>, the median and the\nmedian absolute deviation (MAD) are applied instead.\nOnly used if <code>summary</code> is <code>TRUE</code>.</p></dd>\n\n\n<dt id=\"arg-probs\">probs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-probs\"></a></dt>\n<dd><p>The percentiles to be computed by the <code>quantile</code>\nfunction. Only used if <code>summary</code> is <code>TRUE</code>.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>An <code>array</code> of randomized quantile residual values.\nIf <code>summary = FALSE</code> the output resembles those of\n<code><a href=\"posterior_epred.mvgam.html\">posterior_epred.mvgam</a></code> and <code><a href=\"predict.mvgam.html\">predict.mvgam</a></code>.</p>\n<p>If <code>summary = TRUE</code> the output is an <code>n_observations</code> x <code>E</code>\nmatrix. The number of summary statistics <code>E</code> is equal to <code>2 +\n  length(probs)</code>: The <code>Estimate</code> column contains point estimates (either\nmean or median depending on argument <code>robust</code>), while the\n<code>Est.Error</code> column contains uncertainty estimates (either standard\ndeviation or median absolute deviation depending on argument\n<code>robust</code>). The remaining columns starting with <code>Q</code> contain\nquantile estimates as specified via argument <code>probs</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>This method gives residuals as Dunn-Smyth (randomized quantile) residuals. Any\nobservations that were missing (i.e. <code>NA</code>) in the original data will have missing values\nin the residuals</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"augment.mvgam.html\">augment.mvgam</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data and fit a model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract posterior residuals</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">resids</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/residuals.html\" class=\"external-link\">residuals</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">resids</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  num [1:75, 1:4] 0.7284 0.228 0.7504 -0.579 -0.0936 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  - attr(*, \"dimnames\")=List of 2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ : NULL</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ : chr [1:4] \"Estimate\" \"Est.Error\" \"Q2.5\" \"Q97.5\"</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Or add them directly to the observed data, along with fitted values</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://generics.r-lib.org/reference/augment.html\" class=\"external-link\">augment</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, robust <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, probs <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.25</span>, <span class=\"fl\">0.75</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># A tibble: 75 × 14</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        y season  year series    time .observed .fitted .fit.variability .fit.cred.low .fit.cred.high  .resid</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>  <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;fct&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>     <span style=\"color: #949494; font-style: italic;\">&lt;int&gt;</span>   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span>            <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span>         <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span>          <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span>   <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 1</span>     1      1     1 series_1     1         1   0.542            0.257         0.373          0.645  0.728 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 2</span>     1      2     1 series_1     2         1   0.962            0.382         0.703          1.16   0.228 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 3</span>     3      3     1 series_1     3         3   2.06             0.745         1.58           2.42   0.750 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 4</span>     1      4     1 series_1     4         1   1.97             0.703         1.49           2.40  -<span style=\"color: #BB0000;\">0.579</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 5</span>     1      5     1 series_1     5         1   1.32             0.497         0.965          1.62  -<span style=\"color: #BB0000;\">0.093</span><span style=\"color: #BB0000; text-decoration: underline;\">6</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 6</span>     0      6     1 series_1     6         0   0.673            0.298         0.464          0.835 -<span style=\"color: #BB0000;\">0.736</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 7</span>     0      7     1 series_1     7         0   0.510            0.240         0.346          0.620 -<span style=\"color: #BB0000;\">0.645</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 8</span>     1      8     1 series_1     8         1   0.518            0.265         0.332          0.636  0.776 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\"> 9</span>     0      9     1 series_1     9         0   0.418            0.204         0.279          0.514 -<span style=\"color: #BB0000;\">0.583</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #BCBCBC;\">10</span>     0     10     1 series_1    10         0   0.381            0.187         0.253          0.487 -<span style=\"color: #BB0000;\">0.482</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># ℹ 65 more rows</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #949494;\"># ℹ 3 more variables: .resid.variability &lt;dbl&gt;, .resid.cred.low &lt;dbl&gt;, .resid.cred.high &lt;dbl&gt;</span></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/score.mvgam_forecast.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Compute probabilistic forecast scores for mvgam models — score.mvgam_forecast • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Compute probabilistic forecast scores for mvgam models — score.mvgam_forecast\"><meta name=\"description\" content=\"Compute probabilistic forecast scores for mvgam models\"><meta property=\"og:description\" content=\"Compute probabilistic forecast scores for mvgam models\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Compute probabilistic forecast scores for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/score.mvgam_forecast.R\" class=\"external-link\"><code>R/score.mvgam_forecast.R</code></a></small>\n      <div class=\"d-none name\"><code>score.mvgam_forecast.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute probabilistic forecast scores for <span class=\"pkg\">mvgam</span> models</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam_forecast'</span></span>\n<span><span class=\"fu\">score</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  score <span class=\"op\">=</span> <span class=\"st\">\"crps\"</span>,</span>\n<span>  log <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">weights</span>,</span>\n<span>  interval_width <span class=\"op\">=</span> <span class=\"fl\">0.9</span>,</span>\n<span>  n_cores <span class=\"op\">=</span> <span class=\"fl\">1</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">score</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>mvgam_forecast</code> object. See <code><a href=\"forecast.mvgam.html\">forecast.mvgam()</a></code>.</p></dd>\n\n\n<dt id=\"arg-score\">score<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-score\"></a></dt>\n<dd><p><code>character</code> specifying the type of proper scoring rule to use for evaluation. Options are:\n<code>sis</code> (i.e. the Scaled Interval Score), <code>energy</code>, <code>variogram</code>, <code>elpd</code>\n(i.e. the Expected log pointwise Predictive Density),\n<code>drps</code> (i.e. the Discrete Rank Probability Score), <code>crps</code> (the Continuous Rank Probability Score)\nor <code>brier</code> (the latter of which is only applicable for <code>bernoulli</code> models.\nNote that when choosing <code>elpd</code>, the supplied object must have forecasts on the <code>link</code> scale so that\nexpectations can be calculated prior to scoring. If choosing <code>brier</code>, the object must have forecasts\non the <code>expected</code> scale (i.e. probability predictions). For all other scores, forecasts should be supplied\non the <code>response</code> scale (i.e. posterior predictions)</p></dd>\n\n\n<dt id=\"arg-log\">log<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-log\"></a></dt>\n<dd><p><code>logical</code>. Should the forecasts and truths be logged prior to scoring?\nThis is often appropriate for comparing\nperformance of models when series vary in their observation ranges. Ignored if <code>score = 'brier'</code></p></dd>\n\n\n<dt id=\"arg-weights\">weights<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-weights\"></a></dt>\n<dd><p>optional <code>vector</code> of weights (where <code>length(weights) == n_series</code>)\nfor weighting pairwise correlations when evaluating the variogram score for multivariate\nforecasts. Useful for down-weighting series that have larger magnitude observations or that\nare of less interest when forecasting. Ignored if <code>score != 'variogram'</code></p></dd>\n\n\n<dt id=\"arg-interval-width\">interval_width<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-interval-width\"></a></dt>\n<dd><p>proportional value on <code>[0.05,0.95]</code> defining the forecast interval\nfor calculating coverage and, if <code>score = 'sis'</code>, for calculating the interval score.\nIgnored if <code>score = 'brier'</code></p></dd>\n\n\n<dt id=\"arg-n-cores\">n_cores<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-cores\"></a></dt>\n<dd><p><code>integer</code> specifying number of cores for calculating scores in parallel</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>a <code>list</code> containing scores and interval coverages per forecast horizon.\nIf <code>score %in% c('drps', 'crps', 'elpd', 'brier')</code>,\nthe list will also contain return the sum of all series-level scores per horizon. If\n<code>score %in% c('energy','variogram')</code>, no series-level scores are computed and the only score returned\nwill be for all series. For all scores apart from <code>elpd</code> and <code>brier</code>, the <code>in_interval</code> column in each series-level\nslot is a binary indicator of whether or not the true value was within the forecast's corresponding\nposterior empirical quantiles. Intervals are not calculated when using <code>elpd</code> because forecasts\nwill only contain the linear predictors</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"forecast.mvgam.html\">forecast.mvgam</a></code>, <code><a href=\"ensemble.mvgam_forecast.html\">ensemble</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate observations for three count-valued time series</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a dynamic model using 'newdata' to automatically produce forecasts</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            newdata <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 3.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 3.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 3.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 3.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract forecasts into a 'mvgam_forecast' object</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample DRPS:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 10.713994</span>\n<span class=\"r-plt img\"><img src=\"score.mvgam_forecast-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compute Discrete Rank Probability Scores and 0.90 interval coverages</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc_scores</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">score</span><span class=\"op\">(</span><span class=\"va\">fc</span>, score <span class=\"op\">=</span> <span class=\"st\">'drps'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">fc_scores</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_1  :'data.frame':\t25 obs. of  5 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score         : num [1:25] 0.267 0.285 0.955 0.266 0.309 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ in_interval   : num [1:25] 1 1 1 1 1 1 1 0 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type    : chr [1:25] \"drps\" \"drps\" \"drps\" \"drps\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_2  :'data.frame':\t25 obs. of  5 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score         : num [1:25] 0.0824 0.5192 1.2494 0.189 0.2144 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ in_interval   : num [1:25] 1 1 1 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type    : chr [1:25] \"drps\" \"drps\" \"drps\" \"drps\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_3  :'data.frame':\t25 obs. of  5 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score         : num [1:25] 0.268 0.287 1.905 0.274 0.287 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ in_interval   : num [1:25] 1 1 0 1 1 1 1 1 1 1 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type    : chr [1:25] \"drps\" \"drps\" \"drps\" \"drps\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ all_series:'data.frame':\t25 obs. of  3 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score       : num [1:25] 0.617 1.092 4.109 0.729 0.81 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type  : chr [1:25] \"sum_drps\" \"sum_drps\" \"sum_drps\" \"sum_drps\" ...</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># An example using binary data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">bernoulli</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span>, k <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            data <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>            newdata <span class=\"op\">=</span> <span class=\"va\">data</span><span class=\"op\">$</span><span class=\"va\">data_test</span>,</span></span>\n<span class=\"r-in\"><span>            family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">bernoulli</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>            chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Your model may benefit from using \"noncentred = TRUE\"</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c3b9c6685.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 1.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 2.2 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 2.1 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 2.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Extract forecasts on the expectation (probability) scale</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"forecast.mvgam.html\">forecast</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'expected'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/plot.default.html\" class=\"external-link\">plot</a></span><span class=\"op\">(</span><span class=\"va\">fc</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Out of sample Brier:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 10.7769847272021</span>\n<span class=\"r-plt img\"><img src=\"score.mvgam_forecast-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compute Brier scores</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fc_scores</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">score</span><span class=\"op\">(</span><span class=\"va\">fc</span>, score <span class=\"op\">=</span> <span class=\"st\">'brier'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/str.html\" class=\"external-link\">str</a></span><span class=\"op\">(</span><span class=\"va\">fc_scores</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> List of 4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_1  :'data.frame':\t25 obs. of  5 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score         : num [1:25] 0.51 0.452 0.36 0.333 0.479 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ in_interval   : num [1:25] NA NA NA NA NA NA NA NA NA NA ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type    : chr [1:25] \"brier\" \"brier\" \"brier\" \"brier\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_2  :'data.frame':\t25 obs. of  5 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score         : num [1:25] 0.323 0.301 0.362 0.209 0.193 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ in_interval   : num [1:25] NA NA NA NA NA NA NA NA NA NA ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type    : chr [1:25] \"brier\" \"brier\" \"brier\" \"brier\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ series_3  :'data.frame':\t25 obs. of  5 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score         : num [1:25] 0.31 0.474 0.374 0.423 0.318 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ in_interval   : num [1:25] NA NA NA NA NA NA NA NA NA NA ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type    : chr [1:25] \"brier\" \"brier\" \"brier\" \"brier\" ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  $ all_series:'data.frame':\t25 obs. of  3 variables:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score       : num [1:25] 1.143 1.227 1.095 0.965 0.99 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   ..$ score_type  : chr [1:25] \"sum_brier\" \"sum_brier\" \"sum_brier\" \"sum_brier\" ...</span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/series_to_mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Convert timeseries object to format necessary for mvgam models — series_to_mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Convert timeseries object to format necessary for mvgam models — series_to_mvgam\"><meta name=\"description\" content=\"This function converts univariate or multivariate time series (xts or ts objects)\nto the format necessary for mvgam\"><meta property=\"og:description\" content=\"This function converts univariate or multivariate time series (xts or ts objects)\nto the format necessary for mvgam\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Convert timeseries object to format necessary for <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/series_to_mvgam.R\" class=\"external-link\"><code>R/series_to_mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>series_to_mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function converts univariate or multivariate time series (<code>xts</code> or <code>ts</code> objects)\nto the format necessary for <code><a href=\"mvgam.html\">mvgam</a></code></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">series_to_mvgam</span><span class=\"op\">(</span><span class=\"va\">series</span>, <span class=\"va\">freq</span>, train_prop <span class=\"op\">=</span> <span class=\"fl\">0.85</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-series\">series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-series\"></a></dt>\n<dd><p><code><a href=\"https://rdrr.io/pkg/xts/man/xts.html\" class=\"external-link\">xts</a></code> or <code><a href=\"https://rdrr.io/r/stats/ts.html\" class=\"external-link\">ts</a></code> object to be converted to <code><a href=\"mvgam.html\">mvgam</a></code> format</p></dd>\n\n\n<dt id=\"arg-freq\">freq<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-freq\"></a></dt>\n<dd><p><code>integer</code>. The seasonal frequency of the series</p></dd>\n\n\n<dt id=\"arg-train-prop\">train_prop<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-train-prop\"></a></dt>\n<dd><p><code>numeric</code> stating the proportion of data to use for training. Should be between <code>0.25</code> and <code>0.95</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> object containing outputs needed for <code><a href=\"mvgam.html\">mvgam</a></code>,\nincluding 'data_train' and 'data_test'</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># A ts object example</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/data.html\" class=\"external-link\">data</a></span><span class=\"op\">(</span><span class=\"st\">\"sunspots\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">series</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind</a></span><span class=\"op\">(</span><span class=\"va\">sunspots</span>, <span class=\"va\">sunspots</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/colnames.html\" class=\"external-link\">colnames</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'blood'</span>, <span class=\"st\">'bone'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      blood bone</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1,]  58.0 58.0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [2,]  62.6 62.6</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [3,]  70.0 70.0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4,]  55.7 55.7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [5,]  85.0 85.0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [6,]  83.5 83.5</span>\n<span class=\"r-in\"><span><span class=\"fu\">series_to_mvgam</span><span class=\"op\">(</span><span class=\"va\">series</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/time.html\" class=\"external-link\">frequency</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span>, <span class=\"fl\">0.85</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $data_train</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         y season year                date series time</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1    58.0      1 1749 1749-01-01 00:00:00  blood    1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2    58.0      1 1749 1749-01-01 00:00:00   bone    1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3    62.6      2 1749 1749-01-31 10:00:00  blood    2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4    62.6      2 1749 1749-01-31 10:00:00   bone    2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5    70.0      3 1749 1749-03-02 20:00:01  blood    3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6    70.0      3 1749 1749-03-02 20:00:01   bone    3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7    55.7      4 1749 1749-04-02 06:00:00  blood    4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8    55.7      4 1749 1749-04-02 06:00:00   bone    4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9    85.0      5 1749 1749-05-02 16:00:00  blood    5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10   85.0      5 1749 1749-05-02 16:00:00   bone    5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11   83.5      6 1749 1749-06-02 02:00:01  blood    6</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12   83.5      6 1749 1749-06-02 02:00:01   bone    6</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13   94.8      7 1749 1749-07-02 12:00:00  blood    7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14   94.8      7 1749 1749-07-02 12:00:00   bone    7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15   66.3      8 1749 1749-08-01 22:00:00  blood    8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16   66.3      8 1749 1749-08-01 22:00:00   bone    8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17   75.9      9 1749 1749-09-01 08:00:01  blood    9</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18   75.9      9 1749 1749-09-01 08:00:01   bone    9</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19   75.5     10 1749 1749-10-01 18:00:00  blood   10</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20   75.5     10 1749 1749-10-01 18:00:00   bone   10</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21  158.6     11 1749 1749-11-01 04:00:00  blood   11</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22  158.6     11 1749 1749-11-01 04:00:00   bone   11</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23   85.2     12 1749 1749-12-01 14:00:01  blood   12</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24   85.2     12 1749 1749-12-01 14:00:01   bone   12</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25   73.3      1 1750 1750-01-01 00:00:00  blood   13</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 26   73.3      1 1750 1750-01-01 00:00:00   bone   13</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 27   75.9      2 1750 1750-01-31 10:00:00  blood   14</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 28   75.9      2 1750 1750-01-31 10:00:00   bone   14</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 29   89.2      3 1750 1750-03-02 20:00:01  blood   15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 30   89.2      3 1750 1750-03-02 20:00:01   bone   15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 31   88.3      4 1750 1750-04-02 06:00:00  blood   16</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 32   88.3      4 1750 1750-04-02 06:00:00   bone   16</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 33   90.0      5 1750 1750-05-02 16:00:00  blood   17</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 34   90.0      5 1750 1750-05-02 16:00:00   bone   17</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 35  100.0      6 1750 1750-06-02 02:00:01  blood   18</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 36  100.0      6 1750 1750-06-02 02:00:01   bone   18</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 37   85.4      7 1750 1750-07-02 12:00:00  blood   19</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 38   85.4      7 1750 1750-07-02 12:00:00   bone   19</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 39  103.0      8 1750 1750-08-01 22:00:00  blood   20</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 40  103.0      8 1750 1750-08-01 22:00:00   bone   20</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 41   91.2      9 1750 1750-09-01 08:00:01  blood   21</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 42   91.2      9 1750 1750-09-01 08:00:01   bone   21</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 43   65.7     10 1750 1750-10-01 18:00:00  blood   22</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 44   65.7     10 1750 1750-10-01 18:00:00   bone   22</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 45   63.3     11 1750 1750-11-01 04:00:00  blood   23</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 46   63.3     11 1750 1750-11-01 04:00:00   bone   23</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 47   75.4     12 1750 1750-12-01 14:00:01  blood   24</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 48   75.4     12 1750 1750-12-01 14:00:01   bone   24</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 49   70.0      1 1751 1751-01-01 00:00:00  blood   25</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50   70.0      1 1751 1751-01-01 00:00:00   bone   25</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 51   43.5      2 1751 1751-01-31 10:00:00  blood   26</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 52   43.5      2 1751 1751-01-31 10:00:00   bone   26</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 53   45.3      3 1751 1751-03-02 20:00:01  blood   27</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 54   45.3      3 1751 1751-03-02 20:00:01   bone   27</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 55   56.4      4 1751 1751-04-02 06:00:00  blood   28</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 56   56.4      4 1751 1751-04-02 06:00:00   bone   28</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 57   60.7      5 1751 1751-05-02 16:00:00  blood   29</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 58   60.7      5 1751 1751-05-02 16:00:00   bone   29</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 59   50.7      6 1751 1751-06-02 02:00:01  blood   30</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 60   50.7      6 1751 1751-06-02 02:00:01   bone   30</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 61   66.3      7 1751 1751-07-02 12:00:00  blood   31</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 62   66.3      7 1751 1751-07-02 12:00:00   bone   31</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 63   59.8      8 1751 1751-08-01 22:00:00  blood   32</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 64   59.8      8 1751 1751-08-01 22:00:00   bone   32</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 65   23.5      9 1751 1751-09-01 08:00:01  blood   33</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 66   23.5      9 1751 1751-09-01 08:00:01   bone   33</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 67   23.2     10 1751 1751-10-01 18:00:00  blood   34</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 68   23.2     10 1751 1751-10-01 18:00:00   bone   34</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 69   28.5     11 1751 1751-11-01 04:00:00  blood   35</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 70   28.5     11 1751 1751-11-01 04:00:00   bone   35</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 71   44.0     12 1751 1751-12-01 14:00:01  blood   36</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 72   44.0     12 1751 1751-12-01 14:00:01   bone   36</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 73   35.0      1 1752 1752-01-01 00:00:00  blood   37</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 74   35.0      1 1752 1752-01-01 00:00:00   bone   37</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75   50.0      2 1752 1752-01-31 12:00:00  blood   38</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 76   50.0      2 1752 1752-01-31 12:00:00   bone   38</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 77   71.0      3 1752 1752-03-02 00:00:01  blood   39</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 78   71.0      3 1752 1752-03-02 00:00:01   bone   39</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 79   59.3      4 1752 1752-04-01 12:00:00  blood   40</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 80   59.3      4 1752 1752-04-01 12:00:00   bone   40</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 81   59.7      5 1752 1752-05-02 00:00:00  blood   41</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 82   59.7      5 1752 1752-05-02 00:00:00   bone   41</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 83   39.6      6 1752 1752-06-01 12:00:01  blood   42</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 84   39.6      6 1752 1752-06-01 12:00:01   bone   42</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 85   78.4      7 1752 1752-07-02 00:00:00  blood   43</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 86   78.4      7 1752 1752-07-02 00:00:00   bone   43</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 87   29.3      8 1752 1752-08-01 12:00:00  blood   44</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 88   29.3      8 1752 1752-08-01 12:00:00   bone   44</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 89   27.1      9 1752 1752-09-01 00:00:01  blood   45</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 90   27.1      9 1752 1752-09-01 00:00:01   bone   45</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 91   46.6     10 1752 1752-10-01 12:00:00  blood   46</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 92   46.6     10 1752 1752-10-01 12:00:00   bone   46</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 93   37.6     11 1752 1752-11-01 00:00:00  blood   47</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 94   37.6     11 1752 1752-11-01 00:00:00   bone   47</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 95   40.0     12 1752 1752-12-01 12:00:01  blood   48</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 96   40.0     12 1752 1752-12-01 12:00:01   bone   48</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 97   44.0      1 1753 1753-01-01 00:00:00  blood   49</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 98   44.0      1 1753 1753-01-01 00:00:00   bone   49</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 99   32.0      2 1753 1753-01-31 10:00:00  blood   50</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 100  32.0      2 1753 1753-01-31 10:00:00   bone   50</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 101  45.7      3 1753 1753-03-02 20:00:01  blood   51</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 102  45.7      3 1753 1753-03-02 20:00:01   bone   51</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 103  38.0      4 1753 1753-04-02 06:00:00  blood   52</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 104  38.0      4 1753 1753-04-02 06:00:00   bone   52</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 105  36.0      5 1753 1753-05-02 16:00:00  blood   53</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 106  36.0      5 1753 1753-05-02 16:00:00   bone   53</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 107  31.7      6 1753 1753-06-02 02:00:01  blood   54</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 108  31.7      6 1753 1753-06-02 02:00:01   bone   54</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 109  22.2      7 1753 1753-07-02 12:00:00  blood   55</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 110  22.2      7 1753 1753-07-02 12:00:00   bone   55</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 111  39.0      8 1753 1753-08-01 22:00:00  blood   56</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 112  39.0      8 1753 1753-08-01 22:00:00   bone   56</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 113  28.0      9 1753 1753-09-01 08:00:01  blood   57</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 114  28.0      9 1753 1753-09-01 08:00:01   bone   57</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 115  25.0     10 1753 1753-10-01 18:00:00  blood   58</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 116  25.0     10 1753 1753-10-01 18:00:00   bone   58</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 117  20.0     11 1753 1753-11-01 04:00:00  blood   59</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 118  20.0     11 1753 1753-11-01 04:00:00   bone   59</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 119   6.7     12 1753 1753-12-01 14:00:01  blood   60</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 120   6.7     12 1753 1753-12-01 14:00:01   bone   60</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 121   0.0      1 1754 1754-01-01 00:00:00  blood   61</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 122   0.0      1 1754 1754-01-01 00:00:00   bone   61</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 123   3.0      2 1754 1754-01-31 10:00:00  blood   62</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 124   3.0      2 1754 1754-01-31 10:00:00   bone   62</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 125   1.7      3 1754 1754-03-02 20:00:01  blood   63</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 126   1.7      3 1754 1754-03-02 20:00:01   bone   63</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 127  13.7      4 1754 1754-04-02 06:00:00  blood   64</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 128  13.7      4 1754 1754-04-02 06:00:00   bone   64</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 129  20.7      5 1754 1754-05-02 16:00:00  blood   65</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 130  20.7      5 1754 1754-05-02 16:00:00   bone   65</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 131  26.7      6 1754 1754-06-02 02:00:01  blood   66</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 132  26.7      6 1754 1754-06-02 02:00:01   bone   66</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 133  18.8      7 1754 1754-07-02 12:00:00  blood   67</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 134  18.8      7 1754 1754-07-02 12:00:00   bone   67</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 135  12.3      8 1754 1754-08-01 22:00:00  blood   68</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 136  12.3      8 1754 1754-08-01 22:00:00   bone   68</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 137   8.2      9 1754 1754-09-01 08:00:01  blood   69</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 138   8.2      9 1754 1754-09-01 08:00:01   bone   69</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 139  24.1     10 1754 1754-10-01 18:00:00  blood   70</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 140  24.1     10 1754 1754-10-01 18:00:00   bone   70</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 141  13.2     11 1754 1754-11-01 04:00:00  blood   71</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 142  13.2     11 1754 1754-11-01 04:00:00   bone   71</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 143   4.2     12 1754 1754-12-01 14:00:01  blood   72</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 144   4.2     12 1754 1754-12-01 14:00:01   bone   72</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 145  10.2      1 1755 1755-01-01 00:00:00  blood   73</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 146  10.2      1 1755 1755-01-01 00:00:00   bone   73</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 147  11.2      2 1755 1755-01-31 10:00:00  blood   74</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 148  11.2      2 1755 1755-01-31 10:00:00   bone   74</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 149   6.8      3 1755 1755-03-02 20:00:01  blood   75</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 150   6.8      3 1755 1755-03-02 20:00:01   bone   75</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 151   6.5      4 1755 1755-04-02 06:00:00  blood   76</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 152   6.5      4 1755 1755-04-02 06:00:00   bone   76</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 153   0.0      5 1755 1755-05-02 16:00:00  blood   77</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 154   0.0      5 1755 1755-05-02 16:00:00   bone   77</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 155   0.0      6 1755 1755-06-02 02:00:01  blood   78</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 156   0.0      6 1755 1755-06-02 02:00:01   bone   78</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 157   8.6      7 1755 1755-07-02 12:00:00  blood   79</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 158   8.6      7 1755 1755-07-02 12:00:00   bone   79</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 159   3.2      8 1755 1755-08-01 22:00:00  blood   80</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 160   3.2      8 1755 1755-08-01 22:00:00   bone   80</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 161  17.8      9 1755 1755-09-01 08:00:01  blood   81</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 162  17.8      9 1755 1755-09-01 08:00:01   bone   81</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 163  23.7     10 1755 1755-10-01 18:00:00  blood   82</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 164  23.7     10 1755 1755-10-01 18:00:00   bone   82</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 165   6.8     11 1755 1755-11-01 04:00:00  blood   83</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 166   6.8     11 1755 1755-11-01 04:00:00   bone   83</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [ reached 'max' / getOption(\"max.print\") -- omitted 4628 rows ]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $data_test</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         y season year                date series time</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1   136.3     10 1948 1948-10-01 12:00:00  blood 2398</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2   136.3     10 1948 1948-10-01 12:00:00   bone 2398</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3    95.8     11 1948 1948-11-01 00:00:01  blood 2399</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4    95.8     11 1948 1948-11-01 00:00:01   bone 2399</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5   138.0     12 1948 1948-12-01 12:00:01  blood 2400</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6   138.0     12 1948 1948-12-01 12:00:01   bone 2400</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7   119.1      1 1949 1949-01-01 00:00:00  blood 2401</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8   119.1      1 1949 1949-01-01 00:00:00   bone 2401</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9   182.3      2 1949 1949-01-31 10:00:01  blood 2402</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10  182.3      2 1949 1949-01-31 10:00:01   bone 2402</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11  157.5      3 1949 1949-03-02 20:00:01  blood 2403</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12  157.5      3 1949 1949-03-02 20:00:01   bone 2403</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13  147.0      4 1949 1949-04-02 06:00:00  blood 2404</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14  147.0      4 1949 1949-04-02 06:00:00   bone 2404</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15  106.2      5 1949 1949-05-02 16:00:01  blood 2405</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16  106.2      5 1949 1949-05-02 16:00:01   bone 2405</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17  121.7      6 1949 1949-06-02 02:00:01  blood 2406</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18  121.7      6 1949 1949-06-02 02:00:01   bone 2406</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19  125.8      7 1949 1949-07-02 12:00:00  blood 2407</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20  125.8      7 1949 1949-07-02 12:00:00   bone 2407</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21  123.8      8 1949 1949-08-01 22:00:01  blood 2408</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22  123.8      8 1949 1949-08-01 22:00:01   bone 2408</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23  145.3      9 1949 1949-09-01 08:00:01  blood 2409</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24  145.3      9 1949 1949-09-01 08:00:01   bone 2409</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25  131.6     10 1949 1949-10-01 18:00:00  blood 2410</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 26  131.6     10 1949 1949-10-01 18:00:00   bone 2410</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 27  143.5     11 1949 1949-11-01 04:00:01  blood 2411</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 28  143.5     11 1949 1949-11-01 04:00:01   bone 2411</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 29  117.6     12 1949 1949-12-01 14:00:01  blood 2412</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 30  117.6     12 1949 1949-12-01 14:00:01   bone 2412</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 31  101.6      1 1950 1950-01-01 00:00:00  blood 2413</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 32  101.6      1 1950 1950-01-01 00:00:00   bone 2413</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 33   94.8      2 1950 1950-01-31 10:00:01  blood 2414</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 34   94.8      2 1950 1950-01-31 10:00:01   bone 2414</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 35  109.7      3 1950 1950-03-02 20:00:01  blood 2415</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 36  109.7      3 1950 1950-03-02 20:00:01   bone 2415</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 37  113.4      4 1950 1950-04-02 06:00:00  blood 2416</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 38  113.4      4 1950 1950-04-02 06:00:00   bone 2416</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 39  106.2      5 1950 1950-05-02 16:00:01  blood 2417</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 40  106.2      5 1950 1950-05-02 16:00:01   bone 2417</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 41   83.6      6 1950 1950-06-02 02:00:01  blood 2418</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 42   83.6      6 1950 1950-06-02 02:00:01   bone 2418</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 43   91.0      7 1950 1950-07-02 12:00:00  blood 2419</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 44   91.0      7 1950 1950-07-02 12:00:00   bone 2419</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 45   85.2      8 1950 1950-08-01 22:00:01  blood 2420</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 46   85.2      8 1950 1950-08-01 22:00:01   bone 2420</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 47   51.3      9 1950 1950-09-01 08:00:01  blood 2421</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 48   51.3      9 1950 1950-09-01 08:00:01   bone 2421</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 49   61.4     10 1950 1950-10-01 18:00:00  blood 2422</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50   61.4     10 1950 1950-10-01 18:00:00   bone 2422</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 51   54.8     11 1950 1950-11-01 04:00:01  blood 2423</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 52   54.8     11 1950 1950-11-01 04:00:01   bone 2423</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 53   54.1     12 1950 1950-12-01 14:00:01  blood 2424</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 54   54.1     12 1950 1950-12-01 14:00:01   bone 2424</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 55   59.9      1 1951 1951-01-01 00:00:00  blood 2425</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 56   59.9      1 1951 1951-01-01 00:00:00   bone 2425</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 57   59.9      2 1951 1951-01-31 10:00:01  blood 2426</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 58   59.9      2 1951 1951-01-31 10:00:01   bone 2426</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 59   59.9      3 1951 1951-03-02 20:00:01  blood 2427</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 60   59.9      3 1951 1951-03-02 20:00:01   bone 2427</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 61   92.9      4 1951 1951-04-02 06:00:00  blood 2428</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 62   92.9      4 1951 1951-04-02 06:00:00   bone 2428</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 63  108.5      5 1951 1951-05-02 16:00:01  blood 2429</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 64  108.5      5 1951 1951-05-02 16:00:01   bone 2429</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 65  100.6      6 1951 1951-06-02 02:00:01  blood 2430</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 66  100.6      6 1951 1951-06-02 02:00:01   bone 2430</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 67   61.5      7 1951 1951-07-02 12:00:00  blood 2431</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 68   61.5      7 1951 1951-07-02 12:00:00   bone 2431</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 69   61.0      8 1951 1951-08-01 22:00:01  blood 2432</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 70   61.0      8 1951 1951-08-01 22:00:01   bone 2432</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 71   83.1      9 1951 1951-09-01 08:00:01  blood 2433</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 72   83.1      9 1951 1951-09-01 08:00:01   bone 2433</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 73   51.6     10 1951 1951-10-01 18:00:00  blood 2434</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 74   51.6     10 1951 1951-10-01 18:00:00   bone 2434</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75   52.4     11 1951 1951-11-01 04:00:01  blood 2435</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 76   52.4     11 1951 1951-11-01 04:00:01   bone 2435</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 77   45.8     12 1951 1951-12-01 14:00:01  blood 2436</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 78   45.8     12 1951 1951-12-01 14:00:01   bone 2436</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 79   40.7      1 1952 1952-01-01 00:00:00  blood 2437</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 80   40.7      1 1952 1952-01-01 00:00:00   bone 2437</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 81   22.7      2 1952 1952-01-31 12:00:01  blood 2438</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 82   22.7      2 1952 1952-01-31 12:00:01   bone 2438</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 83   22.0      3 1952 1952-03-02 00:00:01  blood 2439</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 84   22.0      3 1952 1952-03-02 00:00:01   bone 2439</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 85   29.1      4 1952 1952-04-01 12:00:00  blood 2440</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 86   29.1      4 1952 1952-04-01 12:00:00   bone 2440</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 87   23.4      5 1952 1952-05-02 00:00:01  blood 2441</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 88   23.4      5 1952 1952-05-02 00:00:01   bone 2441</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 89   36.4      6 1952 1952-06-01 12:00:01  blood 2442</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 90   36.4      6 1952 1952-06-01 12:00:01   bone 2442</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 91   39.3      7 1952 1952-07-02 00:00:00  blood 2443</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 92   39.3      7 1952 1952-07-02 00:00:00   bone 2443</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 93   54.9      8 1952 1952-08-01 12:00:01  blood 2444</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 94   54.9      8 1952 1952-08-01 12:00:01   bone 2444</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 95   28.2      9 1952 1952-09-01 00:00:01  blood 2445</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 96   28.2      9 1952 1952-09-01 00:00:01   bone 2445</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 97   23.8     10 1952 1952-10-01 12:00:00  blood 2446</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 98   23.8     10 1952 1952-10-01 12:00:00   bone 2446</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 99   22.1     11 1952 1952-11-01 00:00:01  blood 2447</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 100  22.1     11 1952 1952-11-01 00:00:01   bone 2447</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 101  34.3     12 1952 1952-12-01 12:00:01  blood 2448</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 102  34.3     12 1952 1952-12-01 12:00:01   bone 2448</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 103  26.5      1 1953 1953-01-01 00:00:00  blood 2449</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 104  26.5      1 1953 1953-01-01 00:00:00   bone 2449</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 105   3.9      2 1953 1953-01-31 10:00:01  blood 2450</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 106   3.9      2 1953 1953-01-31 10:00:01   bone 2450</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 107  10.0      3 1953 1953-03-02 20:00:01  blood 2451</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 108  10.0      3 1953 1953-03-02 20:00:01   bone 2451</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 109  27.8      4 1953 1953-04-02 06:00:00  blood 2452</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 110  27.8      4 1953 1953-04-02 06:00:00   bone 2452</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 111  12.5      5 1953 1953-05-02 16:00:01  blood 2453</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 112  12.5      5 1953 1953-05-02 16:00:01   bone 2453</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 113  21.8      6 1953 1953-06-02 02:00:01  blood 2454</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 114  21.8      6 1953 1953-06-02 02:00:01   bone 2454</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 115   8.6      7 1953 1953-07-02 12:00:00  blood 2455</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 116   8.6      7 1953 1953-07-02 12:00:00   bone 2455</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 117  23.5      8 1953 1953-08-01 22:00:01  blood 2456</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 118  23.5      8 1953 1953-08-01 22:00:01   bone 2456</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 119  19.3      9 1953 1953-09-01 08:00:01  blood 2457</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 120  19.3      9 1953 1953-09-01 08:00:01   bone 2457</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 121   8.2     10 1953 1953-10-01 18:00:00  blood 2458</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 122   8.2     10 1953 1953-10-01 18:00:00   bone 2458</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 123   1.6     11 1953 1953-11-01 04:00:01  blood 2459</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 124   1.6     11 1953 1953-11-01 04:00:01   bone 2459</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 125   2.5     12 1953 1953-12-01 14:00:01  blood 2460</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 126   2.5     12 1953 1953-12-01 14:00:01   bone 2460</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 127   0.2      1 1954 1954-01-01 00:00:00  blood 2461</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 128   0.2      1 1954 1954-01-01 00:00:00   bone 2461</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 129   0.5      2 1954 1954-01-31 10:00:01  blood 2462</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 130   0.5      2 1954 1954-01-31 10:00:01   bone 2462</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 131  10.9      3 1954 1954-03-02 20:00:01  blood 2463</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 132  10.9      3 1954 1954-03-02 20:00:01   bone 2463</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 133   1.8      4 1954 1954-04-02 06:00:00  blood 2464</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 134   1.8      4 1954 1954-04-02 06:00:00   bone 2464</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 135   0.8      5 1954 1954-05-02 16:00:01  blood 2465</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 136   0.8      5 1954 1954-05-02 16:00:01   bone 2465</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 137   0.2      6 1954 1954-06-02 02:00:01  blood 2466</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 138   0.2      6 1954 1954-06-02 02:00:01   bone 2466</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 139   4.8      7 1954 1954-07-02 12:00:00  blood 2467</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 140   4.8      7 1954 1954-07-02 12:00:00   bone 2467</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 141   8.4      8 1954 1954-08-01 22:00:01  blood 2468</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 142   8.4      8 1954 1954-08-01 22:00:01   bone 2468</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 143   1.5      9 1954 1954-09-01 08:00:01  blood 2469</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 144   1.5      9 1954 1954-09-01 08:00:01   bone 2469</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 145   7.0     10 1954 1954-10-01 18:00:00  blood 2470</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 146   7.0     10 1954 1954-10-01 18:00:00   bone 2470</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 147   9.2     11 1954 1954-11-01 04:00:01  blood 2471</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 148   9.2     11 1954 1954-11-01 04:00:01   bone 2471</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 149   7.6     12 1954 1954-12-01 14:00:01  blood 2472</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 150   7.6     12 1954 1954-12-01 14:00:01   bone 2472</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 151  23.1      1 1955 1955-01-01 00:00:00  blood 2473</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 152  23.1      1 1955 1955-01-01 00:00:00   bone 2473</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 153  20.8      2 1955 1955-01-31 10:00:01  blood 2474</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 154  20.8      2 1955 1955-01-31 10:00:01   bone 2474</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 155   4.9      3 1955 1955-03-02 20:00:01  blood 2475</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 156   4.9      3 1955 1955-03-02 20:00:01   bone 2475</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 157  11.3      4 1955 1955-04-02 06:00:00  blood 2476</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 158  11.3      4 1955 1955-04-02 06:00:00   bone 2476</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 159  28.9      5 1955 1955-05-02 16:00:01  blood 2477</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 160  28.9      5 1955 1955-05-02 16:00:01   bone 2477</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 161  31.7      6 1955 1955-06-02 02:00:01  blood 2478</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 162  31.7      6 1955 1955-06-02 02:00:01   bone 2478</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 163  26.7      7 1955 1955-07-02 12:00:00  blood 2479</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 164  26.7      7 1955 1955-07-02 12:00:00   bone 2479</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 165  40.7      8 1955 1955-08-01 22:00:01  blood 2480</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 166  40.7      8 1955 1955-08-01 22:00:01   bone 2480</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [ reached 'max' / getOption(\"max.print\") -- omitted 680 rows ]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># An xts object example</span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://joshuaulrich.github.io/xts/\" class=\"external-link\">xts</a></span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘xts’ was built under R version 4.3.3</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Loading required package: zoo</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>package ‘zoo’ was built under R version 4.3.2</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Attaching package: ‘zoo’</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> The following objects are masked from ‘package:base’:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>     as.Date, as.Date.numeric</span>\n<span class=\"r-in\"><span><span class=\"va\">dates</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/zoo/man/yearmon.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2001-05-01\"</span><span class=\"op\">)</span>, length<span class=\"op\">=</span><span class=\"fl\">30</span>, by<span class=\"op\">=</span><span class=\"st\">\"quarter\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">data</span>  <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>gas <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Poisson.html\" class=\"external-link\">rpois</a></span><span class=\"op\">(</span><span class=\"fl\">30</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cumsum.html\" class=\"external-link\">cumprod</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">+</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">30</span>, mean <span class=\"op\">=</span> <span class=\"fl\">0.01</span>, sd <span class=\"op\">=</span> <span class=\"fl\">0.001</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>oil <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Poisson.html\" class=\"external-link\">rpois</a></span><span class=\"op\">(</span><span class=\"fl\">30</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cumsum.html\" class=\"external-link\">cumprod</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">+</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">30</span>, mean <span class=\"op\">=</span> <span class=\"fl\">0.01</span>, sd <span class=\"op\">=</span> <span class=\"fl\">0.001</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">series</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/xts/man/xts.html\" class=\"external-link\">xts</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"va\">data</span>, order.by <span class=\"op\">=</span> <span class=\"va\">dates</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/colnames.html\" class=\"external-link\">colnames</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">'gas'</span>, <span class=\"st\">'oil'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/head.html\" class=\"external-link\">head</a></span><span class=\"op\">(</span><span class=\"va\">series</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            gas oil</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2001-05-01   1   1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2001-08-01   1   0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2001-11-01   2   0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2002-02-01   2   1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2002-05-01   0   1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2002-08-01   1   1</span>\n<span class=\"r-in\"><span><span class=\"fu\">series_to_mvgam</span><span class=\"op\">(</span><span class=\"va\">series</span>, freq <span class=\"op\">=</span> <span class=\"fl\">4</span>, train_prop <span class=\"op\">=</span> <span class=\"fl\">0.85</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $data_train</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    y season year       date series time</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  1      2 2001 2001-05-01    gas    1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  1      2 2001 2001-05-01    oil    1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  1      3 2001 2001-08-01    gas    2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  0      3 2001 2001-08-01    oil    2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  2      4 2001 2001-11-01    gas    3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  0      4 2001 2001-11-01    oil    3</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  2      1 2002 2002-02-01    gas    4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  1      1 2002 2002-02-01    oil    4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  0      2 2002 2002-05-01    gas    5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1      2 2002 2002-05-01    oil    5</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 11 1      3 2002 2002-08-01    gas    6</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 12 1      3 2002 2002-08-01    oil    6</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 13 2      4 2002 2002-11-01    gas    7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 14 1      4 2002 2002-11-01    oil    7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 15 1      1 2003 2003-02-01    gas    8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 16 2      1 2003 2003-02-01    oil    8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 17 4      2 2003 2003-05-01    gas    9</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 18 1      2 2003 2003-05-01    oil    9</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 19 2      3 2003 2003-08-01    gas   10</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 20 2      3 2003 2003-08-01    oil   10</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 21 1      4 2003 2003-11-01    gas   11</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 22 1      4 2003 2003-11-01    oil   11</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23 2      1 2004 2004-02-01    gas   12</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 24 1      1 2004 2004-02-01    oil   12</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 25 1      2 2004 2004-05-01    gas   13</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 26 1      2 2004 2004-05-01    oil   13</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 27 2      3 2004 2004-08-01    gas   14</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 28 3      3 2004 2004-08-01    oil   14</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 29 1      4 2004 2004-11-01    gas   15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 30 2      4 2004 2004-11-01    oil   15</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 31 1      1 2005 2005-02-01    gas   16</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 32 1      1 2005 2005-02-01    oil   16</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 33 1      2 2005 2005-05-01    gas   17</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 34 1      2 2005 2005-05-01    oil   17</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 35 1      3 2005 2005-08-01    gas   18</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 36 1      3 2005 2005-08-01    oil   18</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 37 2      4 2005 2005-11-01    gas   19</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 38 1      4 2005 2005-11-01    oil   19</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 39 1      1 2006 2006-02-01    gas   20</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 40 3      1 2006 2006-02-01    oil   20</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 41 2      2 2006 2006-05-01    gas   21</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 42 2      2 2006 2006-05-01    oil   21</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 43 2      3 2006 2006-08-01    gas   22</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 44 3      3 2006 2006-08-01    oil   22</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 45 0      4 2006 2006-11-01    gas   23</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 46 0      4 2006 2006-11-01    oil   23</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 47 2      1 2007 2007-02-01    gas   24</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 48 1      1 2007 2007-02-01    oil   24</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 49 1      2 2007 2007-05-01    gas   25</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 50 0      2 2007 2007-05-01    oil   25</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> $data_test</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    y season year       date series time</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1  1      3 2007 2007-08-01    gas   26</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2  0      3 2007 2007-08-01    oil   26</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 3  0      4 2007 2007-11-01    gas   27</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 4  2      4 2007 2007-11-01    oil   27</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 5  1      1 2008 2008-02-01    gas   28</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 6  0      1 2008 2008-02-01    oil   28</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 7  1      2 2008 2008-05-01    gas   29</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 8  2      2 2008 2008-05-01    oil   29</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 9  2      3 2008 2008-08-01    gas   30</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 1      3 2008 2008-08-01    oil   30</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/sim_mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Simulate a set of time series for modelling in mvgam — sim_mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Simulate a set of time series for modelling in mvgam — sim_mvgam\"><meta name=\"description\" content=\"This function simulates sets of time series data for fitting a multivariate GAM that includes\nshared seasonality and dependence on state-space latent dynamic factors. Random\ndependencies among series, i.e. correlations in their long-term trends, are included\nin the form of correlated loadings on the latent dynamic factors\"><meta property=\"og:description\" content=\"This function simulates sets of time series data for fitting a multivariate GAM that includes\nshared seasonality and dependence on state-space latent dynamic factors. Random\ndependencies among series, i.e. correlations in their long-term trends, are included\nin the form of correlated loadings on the latent dynamic factors\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Simulate a set of time series for modelling in <span class=\"pkg\">mvgam</span></h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/sim_mvgam.R\" class=\"external-link\"><code>R/sim_mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>sim_mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function simulates sets of time series data for fitting a multivariate GAM that includes\nshared seasonality and dependence on state-space latent dynamic factors. Random\ndependencies among series, i.e. correlations in their long-term trends, are included\nin the form of correlated loadings on the latent dynamic factors</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">sim_mvgam</span><span class=\"op\">(</span></span>\n<span>  T <span class=\"op\">=</span> <span class=\"fl\">100</span>,</span>\n<span>  n_series <span class=\"op\">=</span> <span class=\"fl\">3</span>,</span>\n<span>  seasonality <span class=\"op\">=</span> <span class=\"st\">\"shared\"</span>,</span>\n<span>  use_lv <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  n_lv <span class=\"op\">=</span> <span class=\"fl\">0</span>,</span>\n<span>  trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  drift <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.2</span>,</span>\n<span>  <span class=\"va\">trend_rel</span>,</span>\n<span>  freq <span class=\"op\">=</span> <span class=\"fl\">12</span>,</span>\n<span>  family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"va\">phi</span>,</span>\n<span>  <span class=\"va\">shape</span>,</span>\n<span>  <span class=\"va\">sigma</span>,</span>\n<span>  <span class=\"va\">nu</span>,</span>\n<span>  <span class=\"va\">mu</span>,</span>\n<span>  prop_missing <span class=\"op\">=</span> <span class=\"fl\">0</span>,</span>\n<span>  prop_train <span class=\"op\">=</span> <span class=\"fl\">0.85</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-t\">T<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-t\"></a></dt>\n<dd><p><code>integer</code>. Number of observations (timepoints)</p></dd>\n\n\n<dt id=\"arg-n-series\">n_series<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-series\"></a></dt>\n<dd><p><code>integer</code>. Number of discrete time series</p></dd>\n\n\n<dt id=\"arg-seasonality\">seasonality<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-seasonality\"></a></dt>\n<dd><p><code>character</code>. Either <code>shared</code>, meaning that\nall series share the exact same seasonal pattern,\nor <code>hierarchical</code>, meaning that there is a global seasonality but\neach series' pattern can deviate slightly</p></dd>\n\n\n<dt id=\"arg-use-lv\">use_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-use-lv\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, use dynamic factors to estimate series'\nlatent trends in a reduced dimension format. If <code>FALSE</code>, estimate independent\nlatent trends for each series</p></dd>\n\n\n<dt id=\"arg-n-lv\">n_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-lv\"></a></dt>\n<dd><p><code>integer</code>. Number of latent dynamic factors for generating the series' trends.\nDefaults to <code>0</code>, meaning that dynamics are estimated independently for each series</p></dd>\n\n\n<dt id=\"arg-trend-model\">trend_model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-model\"></a></dt>\n<dd><p><code>character</code> specifying the time series dynamics for the latent trend.\nOptions are:</p><ul><li><p><code>None</code> (no latent trend component; i.e. the GAM component is all that\ncontributes to the linear predictor, and the observation process is the only\nsource of error; similarly to what is estimated by <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code>)</p></li>\n<li><p><code>RW</code> (random walk with possible drift)</p></li>\n<li><p><code>AR1</code> (with possible drift)</p></li>\n<li><p><code>AR2</code> (with possible drift)</p></li>\n<li><p><code>AR3</code> (with possible drift)</p></li>\n<li><p><code>VAR1</code> (contemporaneously uncorrelated VAR1)</p></li>\n<li><p><code>VAR1cor</code> (contemporaneously correlated VAR1)</p></li>\n<li><p><code>GP</code> (Gaussian Process with squared exponential kernel)</p></li>\n</ul><p>See <a href=\"mvgam_trends.html\">mvgam_trends</a> for more details</p></dd>\n\n\n<dt id=\"arg-drift\">drift<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-drift\"></a></dt>\n<dd><p><code>logical</code>, simulate a drift term for each trend</p></dd>\n\n\n<dt id=\"arg-prop-trend\">prop_trend<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-prop-trend\"></a></dt>\n<dd><p><code>numeric</code>. Relative importance of the trend for each series.\nShould be between <code>0</code> and <code>1</code></p></dd>\n\n\n<dt id=\"arg-trend-rel\">trend_rel<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-rel\"></a></dt>\n<dd><p>Deprecated. Use <code>prop_trend</code> instead</p></dd>\n\n\n<dt id=\"arg-freq\">freq<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-freq\"></a></dt>\n<dd><p><code>integer</code>. The seasonal frequency of the series</p></dd>\n\n\n<dt id=\"arg-family\">family<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-family\"></a></dt>\n<dd><p><code>family</code> specifying the exponential observation family for the series.\nCurrently supported\nfamilies are: <code><a href=\"mvgam_families.html\">nb()</a></code>, <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code>, <code><a href=\"mvgam_families.html\">bernoulli()</a></code>, <code><a href=\"mvgam_families.html\">tweedie()</a></code>, <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code>,\n<code><a href=\"mvgam_families.html\">betar()</a></code>, <code><a href=\"mvgam_families.html\">lognormal()</a></code>, <code><a href=\"mvgam_families.html\">student()</a></code> and <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma()</a></code></p></dd>\n\n\n<dt id=\"arg-phi\">phi<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-phi\"></a></dt>\n<dd><p><code>vector</code> of dispersion parameters for the series\n(i.e. <code>size</code> for <code><a href=\"mvgam_families.html\">nb()</a></code> or\n<code>phi</code> for <code><a href=\"mvgam_families.html\">betar()</a></code>). If <code>length(phi) &lt; n_series</code>,\nthe first element of <code>phi</code> will\nbe replicated <code>n_series</code> times.\nDefaults to <code>5</code> for <code><a href=\"mvgam_families.html\">nb()</a></code> and <code><a href=\"mvgam_families.html\">tweedie()</a></code>; <code>10</code> for\n<code><a href=\"mvgam_families.html\">betar()</a></code></p></dd>\n\n\n<dt id=\"arg-shape\">shape<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-shape\"></a></dt>\n<dd><p><code>vector</code> of shape parameters for the series\n(i.e. <code>shape</code> for <code><a href=\"https://rdrr.io/r/base/Special.html\" class=\"external-link\">gamma()</a></code>)\nIf <code>length(shape) &lt; n_series</code>, the first element of <code>shape</code> will\nbe replicated <code>n_series</code> times. Defaults to <code>10</code></p></dd>\n\n\n<dt id=\"arg-sigma\">sigma<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-sigma\"></a></dt>\n<dd><p><code>vector</code> of scale parameters for the series\n(i.e. <code>sd</code> for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code> or <code><a href=\"mvgam_families.html\">student()</a></code>,\n<code>log(sd)</code> for <code><a href=\"mvgam_families.html\">lognormal()</a></code>). If <code>length(sigma) &lt; n_series</code>, the first element of <code>sigma</code> will\nbe replicated <code>n_series</code> times. Defaults to <code>0.5</code> for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code> and\n<code><a href=\"mvgam_families.html\">student()</a></code>; <code>0.2</code> for <code><a href=\"mvgam_families.html\">lognormal()</a></code></p></dd>\n\n\n<dt id=\"arg-nu\">nu<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-nu\"></a></dt>\n<dd><p><code>vector</code> of degrees of freedom parameters for the\nseries (i.e. <code>nu</code> for <code><a href=\"mvgam_families.html\">student()</a></code>)\nIf <code>length(nu) &lt; n_series</code>, the first element of <code>nu</code> will\nbe replicated <code>n_series</code> times. Defaults to <code>3</code></p></dd>\n\n\n<dt id=\"arg-mu\">mu<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-mu\"></a></dt>\n<dd><p><code>vector</code> of location parameters for the series.\nIf <code>length(mu) &lt; n_series</code>, the first element of <code>mu</code> will\nbe replicated <code>n_series</code> times. Defaults to small random values\nbetween <code>-0.5</code> and <code>0.5</code> on the link scale</p></dd>\n\n\n<dt id=\"arg-prop-missing\">prop_missing<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-prop-missing\"></a></dt>\n<dd><p><code>numeric</code> stating proportion of observations that are missing.\nShould be between\n<code>0</code> and <code>0.8</code>, inclusive</p></dd>\n\n\n<dt id=\"arg-prop-train\">prop_train<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-prop-train\"></a></dt>\n<dd><p><code>numeric</code> stating the proportion of data to use for training.\nShould be between <code>0.2</code> and <code>1</code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> object containing outputs needed for <code><a href=\"mvgam.html\">mvgam</a></code>,\nincluding 'data_train' and 'data_test', as well as some additional information\nabout the simulated seasonality and trend dependencies</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># Simulate series with observations bounded at 0 and 1 (Beta responses)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">sim_mvgam</span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">betar</a></span><span class=\"op\">(</span><span class=\"op\">)</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>, prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">sim_data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"sim_mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now simulate series with overdispersed discrete observations</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">sim_data</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">sim_mvgam</span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"mvgam_families.html\">nb</a></span><span class=\"op\">(</span><span class=\"op\">)</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">RW</a></span><span class=\"op\">(</span><span class=\"op\">)</span>, prop_trend <span class=\"op\">=</span> <span class=\"fl\">0.6</span>, phi <span class=\"op\">=</span> <span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">sim_data</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"sim_mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/stability.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Calculate measures of latent VAR community stability — stability.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Calculate measures of latent VAR community stability — stability.mvgam\"><meta name=\"description\" content=\"Compute reactivity, return rates and contributions of interactions to\nstationary forecast variance from\nmvgam models with Vector Autoregressive dynamics\"><meta property=\"og:description\" content=\"Compute reactivity, return rates and contributions of interactions to\nstationary forecast variance from\nmvgam models with Vector Autoregressive dynamics\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Calculate measures of latent VAR community stability</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/stability.R\" class=\"external-link\"><code>R/stability.R</code></a></small>\n      <div class=\"d-none name\"><code>stability.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Compute reactivity, return rates and contributions of interactions to\nstationary forecast variance from\n<span class=\"pkg\">mvgam</span> models with Vector Autoregressive dynamics</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">stability</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\">stability</span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object of class <code>mvgam</code> resulting from a call to <code><a href=\"mvgam.html\">mvgam()</a></code>\nthat used a Vector Autoregressive latent process model (either as <code>VAR(cor = FALSE)</code> or\n<code>VAR(cor = TRUE)</code>)</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>ignored</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>data.frame</code> containing posterior draws for each stability metric.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>These measures of stability can be used to assess how important inter-series\ndependencies are to the variability of a multivariate system and to ask how systems\nare expected to respond to environmental perturbations. Using the formula for a latent VAR(1) as:\n$$\n\\mu_t \\sim \\text{MVNormal}(A(\\mu_{t - 1}), \\Sigma) \\quad\n$$\nthis function will calculate the long-term stationary forecast distribution of the system, which\nhas mean \\(\\mu_{\\infty}\\) and variance \\(\\Sigma_{\\infty}\\), to then calculate the following quantities:</p><ul><li><p><code>prop_int</code>: Proportion of the volume of the stationary forecast distribution\nthat is attributable to lagged interactions (i.e. how important are the autoregressive\ninteraction coefficients in \\(A\\) for explaining the shape of the stationary forecast distribution?):\n$$\n    det(A)^2 \\quad\n    $$</p></li>\n<li><p><code>prop_int_adj</code>: Same as <code>prop_int</code> but scaled by the number of series \\(p\\) to facilitate\ndirect comparisons among systems with different numbers of interacting variables:\n$$\n    det(A)^{2/p} \\quad\n    $$</p></li>\n<li><p><code>prop_int_offdiag</code>: Sensitivity of <code>prop_int</code> to inter-series\ninteractions (i.e. how important are the off-diagonals of the autoregressive coefficient\nmatrix \\(A\\) for shaping <code>prop_int</code>?), calculated as the relative magnitude of the <em>off-diagonals</em> in\nthe partial derivative matrix:\n$$\n    [2~det(A) (A^{-1})^T] \\quad\n    $$</p></li>\n<li><p><code>prop_int_diag</code>: Sensitivity of <code>prop_int</code> to intra-series\ninteractions (i.e. how important are the diagonals of the autoregressive coefficient matrix \\(A\\)\nfor shaping <code>prop_int</code>?), calculated as the relative magnitude of the <em>diagonals</em> in the partial derivative\nmatrix:\n$$\n    [2~det(A) (A^{-1})^T] \\quad\n    $$</p></li>\n<li><p><code>prop_cov_offdiag</code>: Sensitivity of \\(\\Sigma_{\\infty}\\) to inter-series error correlations\n(i.e. how important are off-diagonal covariances in \\(\\Sigma\\) for shaping\n\\(\\Sigma_{\\infty}\\)?), calculated as the relative magnitude of the <em>off-diagonals</em> in\nthe partial derivative matrix:\n$$\n    [2~det(\\Sigma_{\\infty}) (\\Sigma_{\\infty}^{-1})^T] \\quad\n    $$</p></li>\n<li><p><code>prop_cov_diag</code>: Sensitivity of \\(\\Sigma_{\\infty}\\) to error variances\n(i.e. how important are diagonal variances in \\(\\Sigma\\) for shaping\n\\(\\Sigma_{\\infty}\\)?), calculated as the relative magnitude of the <em>diagonals</em> in\nthe partial derivative matrix:\n$$\n    [2~det(\\Sigma_{\\infty}) (\\Sigma_{\\infty}^{-1})^T] \\quad\n    $$</p></li>\n<li><p><code>reactivity</code>: A measure of the degree to which the system moves\naway from a stable equilibrium following a perturbation.\nValues <code>&gt; 0</code> suggest the system is reactive, whereby a\nperturbation of the system in one period can be amplified in the next period. If\n\\(\\sigma_{max}(A)\\) is the largest singular value of \\(A\\), then reactivity is defined as:\n$$\n    log\\sigma_{max}(A) \\quad\n    $$</p></li>\n<li><p><code>mean_return_rate</code>: Asymptotic (long-term) return rate of the mean of the transition distribution\nto the stationary mean, calculated using the largest eigenvalue of the matrix \\(A\\):\n$$\n   max(\\lambda_{A}) \\quad\n   $$\nLower values suggest greater stability</p></li>\n<li><p><code>var_return_rate</code>: Asymptotic (long-term) return rate of the variance of the transition distribution\nto the stationary variance:\n$$\n   max(\\lambda_{A \\otimes{A}}) \\quad\n   $$\nAgain, lower values suggest greater stability</p></li>\n</ul><p>Major advantages of using <span class=\"pkg\">mvgam</span> to compute these metrics are that well-calibrated uncertainties are\navailable and that VAR processes are forced to be stationary. These properties make it simple and\ninsightful to calculate and inspect aspects of both long-term and short-term stability.\nBut it is also possible to more directly inspect possible interactions among the\ntime series in a latent VAR process. To do so, you can calculate and plot\nGeneralized or Orthogonalized Impulse Response Functions using the <code><a href=\"irf.mvgam.html\">irf</a></code> function.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"references\">References<a class=\"anchor\" aria-label=\"anchor\" href=\"#references\"></a></h2>\n    <p>AR Ives, B Dennis, KL Cottingham &amp; SR Carpenter (2003).\nEstimating community stability and ecological interactions from time-series data.\nEcological Monographs. 73, 301-330.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"RW.html\">VAR</a></code>, <code><a href=\"irf.mvgam.html\">irf</a></code>, <code><a href=\"fevd.mvgam.html\">fevd</a></code></p></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some time series that follow a latent VAR(1) process</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    n_series <span class=\"op\">=</span> <span class=\"fl\">4</span>,</span></span>\n<span class=\"r-in\"><span>                    trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                    prop_trend <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"plot_mvgam_series.html\">plot_mvgam_series</a></span><span class=\"op\">(</span>data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>, series <span class=\"op\">=</span> <span class=\"st\">'all'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"stability.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a model that uses a latent VAR(1)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"op\">-</span><span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>             trend_formula <span class=\"op\">=</span> <span class=\"op\">~</span> <span class=\"fl\">1</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">VAR</a></span><span class=\"op\">(</span>cor <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span>,</span></span>\n<span class=\"r-in\"><span>             silent <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/von_mises_lccdf.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob/von_mises_ccdf_log.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:359,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/RtmpotLup8/model-9e8c4c5d1635.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::von_mises_cdf(const T_x&amp;, const T_mu&amp;, const T_k&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   194 |       if (cdf_n &lt; 0.0)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/von_mises_cdf.hpp:194: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Calulate stability metrics for this system</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">metrics</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">stability</span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Proportion of stationary forecast distribution</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># attributable to lagged interactions</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/hist.html\" class=\"external-link\">hist</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">prop_int</span>,</span></span>\n<span class=\"r-in\"><span>     xlim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Prop_int'</span>,</span></span>\n<span class=\"r-in\"><span>     main <span class=\"op\">=</span> <span class=\"st\">''</span>,</span></span>\n<span class=\"r-in\"><span>     col <span class=\"op\">=</span> <span class=\"st\">'#B97C7C'</span>,</span></span>\n<span class=\"r-in\"><span>     border <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"stability.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Within this contribution of interactions, how important</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># are inter-series interactions (offdiagonals of the A matrix) vs</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># intra-series density dependence (diagonals of the A matrix)?</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span>, nrow <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/hist.html\" class=\"external-link\">hist</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">prop_int_offdiag</span>,</span></span>\n<span class=\"r-in\"><span>     xlim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>     xlab <span class=\"op\">=</span> <span class=\"st\">''</span>,</span></span>\n<span class=\"r-in\"><span>     main <span class=\"op\">=</span> <span class=\"st\">'Inter-series interactions'</span>,</span></span>\n<span class=\"r-in\"><span>     col <span class=\"op\">=</span> <span class=\"st\">'#B97C7C'</span>,</span></span>\n<span class=\"r-in\"><span>     border <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/hist.html\" class=\"external-link\">hist</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">prop_int_diag</span>,</span></span>\n<span class=\"r-in\"><span>     xlim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Contribution to interaction effect'</span>,</span></span>\n<span class=\"r-in\"><span>     main <span class=\"op\">=</span> <span class=\"st\">'Intra-series interactions (density dependence)'</span>,</span></span>\n<span class=\"r-in\"><span>     col <span class=\"op\">=</span> <span class=\"st\">'darkblue'</span>,</span></span>\n<span class=\"r-in\"><span>     border <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"stability.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># How important are inter-series error covariances</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># (offdiagonals of the Sigma matrix) vs</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># intra-series variances (diagonals of the Sigma matrix) for explaining</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># the variance of the stationary forecast distribution?</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/matrix.html\" class=\"external-link\">matrix</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span>, nrow <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/hist.html\" class=\"external-link\">hist</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">prop_cov_offdiag</span>,</span></span>\n<span class=\"r-in\"><span>     xlim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>     xlab <span class=\"op\">=</span> <span class=\"st\">''</span>,</span></span>\n<span class=\"r-in\"><span>     main <span class=\"op\">=</span> <span class=\"st\">'Inter-series covariances'</span>,</span></span>\n<span class=\"r-in\"><span>     col <span class=\"op\">=</span> <span class=\"st\">'#B97C7C'</span>,</span></span>\n<span class=\"r-in\"><span>     border <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/hist.html\" class=\"external-link\">hist</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">prop_cov_diag</span>,</span></span>\n<span class=\"r-in\"><span>     xlim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Contribution to forecast variance'</span>,</span></span>\n<span class=\"r-in\"><span>     main <span class=\"op\">=</span> <span class=\"st\">'Intra-series variances'</span>,</span></span>\n<span class=\"r-in\"><span>     col <span class=\"op\">=</span> <span class=\"st\">'darkblue'</span>,</span></span>\n<span class=\"r-in\"><span>     border <span class=\"op\">=</span> <span class=\"st\">'white'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"stability.mvgam-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/layout.html\" class=\"external-link\">layout</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Reactivity, i.e. degree to which the system moves</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># away from a stable equilibrium following a perturbation</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># (values &gt; 1 suggest a more reactive, less stable system)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/hist.html\" class=\"external-link\">hist</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">reactivity</span>,</span></span>\n<span class=\"r-in\"><span>     main <span class=\"op\">=</span> <span class=\"st\">''</span>,</span></span>\n<span class=\"r-in\"><span>     xlab <span class=\"op\">=</span> <span class=\"st\">'Reactivity'</span>,</span></span>\n<span class=\"r-in\"><span>     col <span class=\"op\">=</span> <span class=\"st\">'#B97C7C'</span>,</span></span>\n<span class=\"r-in\"><span>     border <span class=\"op\">=</span> <span class=\"st\">'white'</span>,</span></span>\n<span class=\"r-in\"><span>     xlim <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">1</span><span class=\"op\">*</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">reactivity</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/MathFun.html\" class=\"external-link\">abs</a></span><span class=\"op\">(</span><span class=\"va\">metrics</span><span class=\"op\">$</span><span class=\"va\">reactivity</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/graphics/abline.html\" class=\"external-link\">abline</a></span><span class=\"op\">(</span>v <span class=\"op\">=</span> <span class=\"fl\">0</span>, lwd <span class=\"op\">=</span> <span class=\"fl\">2.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"stability.mvgam-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/summary.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Summary for a fitted mvgam models — summary.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Summary for a fitted mvgam models — summary.mvgam\"><meta name=\"description\" content=\"These functions take a fitted mvgam or jsdgam object and\nreturn various useful summaries\"><meta property=\"og:description\" content=\"These functions take a fitted mvgam or jsdgam object and\nreturn various useful summaries\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.4</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Summary for a fitted <span class=\"pkg\">mvgam</span> models</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/summary.mvgam.R\" class=\"external-link\"><code>R/summary.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>summary.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>These functions take a fitted <code>mvgam</code> or <code>jsdgam</code> object and\nreturn various useful summaries</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, include_betas <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, smooth_test <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, digits <span class=\"op\">=</span> <span class=\"fl\">2</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam_prefit'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/coef.html\" class=\"external-link\">coef</a></span><span class=\"op\">(</span><span class=\"va\">object</span>, summarise <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code></p></dd>\n\n\n<dt id=\"arg-include-betas\">include_betas<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-include-betas\"></a></dt>\n<dd><p>Logical. Print a summary that includes posterior summaries\nof all linear predictor beta coefficients (including spline coefficients)?\nDefaults to <code>TRUE</code> but use <code>FALSE</code> for a more concise summary</p></dd>\n\n\n<dt id=\"arg-smooth-test\">smooth_test<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-smooth-test\"></a></dt>\n<dd><p>Logical. Compute estimated degrees of freedom and approximate\np-values for smooth terms? Defaults to <code>TRUE</code>, but users may wish to set\nto <code>FALSE</code> for complex models with many smooth or random effect terms</p></dd>\n\n\n<dt id=\"arg-digits\">digits<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-digits\"></a></dt>\n<dd><p>The number of significant digits for printing out the summary;\ndefaults to <code>2</code>.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Ignored</p></dd>\n\n\n<dt id=\"arg-summarise\">summarise<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-summarise\"></a></dt>\n<dd><p><code>logical</code>. Summaries of coefficients will be returned\nif <code>TRUE</code>. Otherwise the full posterior distribution will be returned</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>For <code>summary.mvgam</code> and <code>summary.mvgam_prefit</code>, a <code>list</code> is printed\non-screen showing the summaries for the model</p>\n<p>For <code>coef.mvgam</code>, either a <code>matrix</code> of posterior coefficient distributions\n(if <code>summarise == FALSE</code> or <code>data.frame</code> of coefficient summaries)</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>summary.mvgam</code> and <code>summary.mvgam_prefit</code> return brief summaries of the model's call, along with posterior intervals for\nsome of the key parameters in the model. Note that some smooths have extra penalties on the null space,\nso summaries for the <code>rho</code> parameters may include more penalty terms than the number of smooths in\nthe original model formula. Approximate p-values for smooth terms are also returned,\nwith methods used for their\ncalculation following those used for <code>mgcv</code> equivalents (see <code><a href=\"https://rdrr.io/pkg/mgcv/man/summary.gam.html\" class=\"external-link\">summary.gam</a></code> for details).\nThe Estimated Degrees of Freedom (edf) for smooth terms is computed using\neither <code>edf.type = 1</code> for models with no trend component, or <code>edf.type = 0</code> for models with\ntrend components. These are described in the documentation for <code><a href=\"https://rdrr.io/pkg/mgcv/man/jagam.html\" class=\"external-link\">jagam</a></code>. Experiments suggest\nthese p-values tend to be more conservative than those that might be returned from an equivalent\nmodel fit with <code><a href=\"https://rdrr.io/pkg/mgcv/man/summary.gam.html\" class=\"external-link\">summary.gam</a></code> using <code>method = 'REML'</code></p>\n<p><code>coef.mvgam</code> returns either summaries or full posterior estimates for <code>GAM</code> component\ncoefficients</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/ti.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"Functions used in definition of smooth terms within model formulae.\nThe functions do not evaluate a (spline) smooth - they exist purely\nto help set up mvgam models using spline based smooths.\"><title>Defining smooths in mvgam formulae — ti • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\"><!-- bootstrap-toc --><script src=\"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\" integrity=\"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\" crossorigin=\"anonymous\"></script><!-- headroom.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Defining smooths in mvgam formulae — ti\"><meta property=\"og:description\" content=\"Functions used in definition of smooth terms within model formulae.\nThe functions do not evaluate a (spline) smooth - they exist purely\nto help set up mvgam models using spline based smooths.\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.3</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a>\n    <a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a>\n    <a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"\" class=\"logo\" alt=\"\"><h1>Defining smooths in <span class=\"pkg\">mvgam</span> formulae</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/ti.R\" class=\"external-link\"><code>R/ti.R</code></a></small>\n      <div class=\"d-none name\"><code>ti.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Functions used in definition of smooth terms within model formulae.\nThe functions do not evaluate a (spline) smooth - they exist purely\nto help set up mvgam models using spline based smooths.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">ti</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">te</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>...</dt>\n<dd><p>Arguments passed to <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">mgcv::ti</a></code> or\n<code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">mgcv::te</a></code></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>The functions defined here are just simple wrappers of the respective\nfunctions of the <span class=\"pkg\">mgcv</span> package. When using them, please cite the\nappropriate references obtained via <code>citation(\"mgcv\")</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">mgcv::ti</a></code>, <code><a href=\"https://rdrr.io/pkg/mgcv/man/te.html\" class=\"external-link\">mgcv::te</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">mgcv</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/gamSim.html\" class=\"external-link\">gamSim</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, n <span class=\"op\">=</span> <span class=\"fl\">200</span>, scale <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Gu &amp; Wahba 4 term additive model</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit univariate smooths for all predictors</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fit1</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x0</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x1</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x2</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x3</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">dat</span>, chains <span class=\"op\">=</span> <span class=\"fl\">2</span>, family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 5.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 5.8 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 5.7 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 5.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">fit1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ s(x0) + s(x1) + s(x2) + s(x3)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x0000013426d46318&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gaussian</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> identity</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> None</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 200 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Observation error parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              2.5% 50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma_obs[1]  1.9 2.1   2.4    1   957</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               2.5%     50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)  7.500  7.8000  8.100 1.00  1593</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).1     -0.330  0.1200  0.640 1.00   588</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).2     -1.300  0.3400  2.500 1.00   282</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).3     -0.380  0.0820  0.590 1.00   376</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).4     -1.500 -0.3200  0.520 1.01   245</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).5     -0.240  0.0760  0.430 1.00   387</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).6     -1.300 -0.3400  0.430 1.00   260</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).7     -0.150  0.0058  0.170 1.00   498</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).8     -0.330  1.7000  5.000 1.01   206</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0).9     -0.430 -0.0044  0.430 1.00   581</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).1     -0.300 -0.0095  0.190 1.00   647</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).2     -0.410 -0.0100  0.320 1.00   592</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).3     -0.077  0.0088  0.160 1.00   445</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).4     -0.300 -0.0140  0.150 1.00   457</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).5     -0.045  0.0042  0.093 1.00   507</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).6     -0.120  0.0160  0.250 1.00   452</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).7     -0.058  0.0076  0.120 1.00   466</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).8     -0.980 -0.0840  0.340 1.00   328</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1).9      1.400  1.9000  2.200 1.00   818</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).1      3.500  5.2000  6.900 1.00   321</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).2      2.600 11.0000 19.000 1.00   223</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).3     -4.600 -3.0000 -1.200 1.00   375</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).4     -6.400  0.2100  6.000 1.00   242</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).5     -1.500  0.8000  3.100 1.00   334</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).6     -7.900 -2.0000  4.500 1.00   258</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).7      0.650  2.3000  4.100 1.00   798</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).8     -1.500 12.0000 24.000 1.00   228</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2).9     -0.520  0.0330  0.900 1.00   292</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).1     -0.140  0.0150  0.230 1.01   468</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).2     -0.330  0.0012  0.270 1.01   194</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).3     -0.077 -0.0027  0.062 1.00   433</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).4     -0.240 -0.0066  0.150 1.01   153</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).5     -0.091 -0.0049  0.067 1.01   244</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).6     -0.120  0.0077  0.190 1.00   147</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).7     -0.048  0.0051  0.086 1.01   195</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).8     -0.710 -0.0500  0.350 1.00   119</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3).9     -0.320 -0.0660  0.200 1.00   996</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>        edf Ref.df Chi.sq p-value    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x0) 3.76      9   39.6    0.07 .  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x1) 2.33      9  653.7  &lt;2e-16 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2) 7.71      9 1213.2  &lt;2e-16 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x3) 1.16      9    1.7    1.00    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 12 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Thu Aug 29 11:16:04 AM 2024.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-in\"><span><span class=\"fu\">conditional_effects</span><span class=\"op\">(</span><span class=\"va\">fit1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"ti-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"ti-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"ti-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"ti-4.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Fit a more complicated smooth model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">fit2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\">te</span><span class=\"op\">(</span><span class=\"va\">x0</span>, <span class=\"va\">x1</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">x2</span>, by <span class=\"op\">=</span> <span class=\"va\">x3</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>              data <span class=\"op\">=</span> <span class=\"va\">dat</span>, chains <span class=\"op\">=</span> <span class=\"fl\">2</span>, family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 3.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 3.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 3.9 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 4.0 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">fit2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ te(x0, x1) + s(x2, by = x3)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x0000013426d46318&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> gaussian</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> identity</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> None</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 200 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Observation error parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              2.5% 50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma_obs[1]  2.4 2.7     3    1  1067</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               2.5%    50%   97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept)   7.50  8.200  8.9000    1   745</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).1  -3.20 -1.900 -0.7400    1   314</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).2  -2.10 -0.620  0.5900    1   406</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).3  -0.38  1.300  2.8000    1   582</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).4   0.63  2.700  4.7000    1   727</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).5  -3.50 -2.300 -1.0000    1   701</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).6  -1.20 -0.320  0.7300    1   404</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).7   0.19  1.100  2.1000    1   403</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).8   2.40  3.500  4.8000    1   393</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).9   3.10  4.400  5.6000    1   677</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).10 -3.70 -2.400 -1.0000    1   464</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).11 -1.20 -0.120  0.9900    1   286</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).12  0.45  1.500  2.5000    1   286</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).13  2.50  3.600  4.8000    1   316</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).14  3.50  4.700  6.2000    1   489</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).15 -4.40 -3.100 -1.9000    1   694</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).16 -1.80 -0.750  0.3400    1   475</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).17 -0.14  0.780  1.7000    1   497</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).18  2.30  3.400  4.6000    1   444</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).19  3.00  4.300  5.8000    1   519</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).20 -7.30 -4.800 -2.3000    1   715</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).21 -4.20 -2.700 -1.2000    1   491</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).22 -2.70 -1.200  0.0057    1   415</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).23 -0.58  1.100  2.7000    1   425</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1).24 -0.21  2.400  4.7000    1   481</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.1   -1.40  2.100  5.3000    1   515</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.2    3.20  5.500  7.7000    1  1238</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.3   -0.10  3.400  6.7000    1   690</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.4   -4.10 -1.100  1.4000    1   690</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.5   -9.50 -5.300 -1.9000    1   621</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.6   -0.32  2.300  5.4000    1   971</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.7   -0.58  2.500  6.0000    1   882</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.8   -1.10  1.400  4.4000    1   887</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.9   -0.71  0.011  0.7800    1   531</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3.10  -0.57  0.032  0.7900    1   482</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             edf Ref.df Chi.sq p-value    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> te(x0,x1) 11.79     24    913  &lt;2e-16 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(x2):x3   7.74     10    640  &lt;2e-16 ***</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 12 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Thu Aug 29 11:16:53 AM 2024.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-in\"><span><span class=\"fu\">conditional_effects</span><span class=\"op\">(</span><span class=\"va\">fit2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"ti-5.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-plt img\"><img src=\"ti-6.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.7.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/update.mvgam.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Update an existing mvgam model object — update.mvgam • mvgam</title><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><meta property=\"og:title\" content=\"Update an existing mvgam model object — update.mvgam\"><meta name=\"description\" content=\"This function allows a previously fitted mvgam model to be updated\"><meta property=\"og:description\" content=\"This function allows a previously fitted mvgam model to be updated\"><meta property=\"og:image\" content=\"https://nicholasjclark.github.io/mvgam/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">mvgam</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.5</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"active nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\"><li><a class=\"dropdown-item\" href=\"../articles/data_in_mvgam.html\">Formatting data for use in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/forecast_evaluation.html\">Forecasting and forecast evaluation in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/mvgam_overview.html\">Overview of the mvgam package</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/nmixtures.html\">N-mixtures in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/shared_states.html\">Shared latent states in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/time_varying_effects.html\">Time-varying effects in mvgam</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/trend_formulas.html\">State-Space models in mvgam</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"../search.json\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/nicholasjclark/mvgam/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Update an existing <span class=\"pkg\">mvgam</span> model object</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/nicholasjclark/mvgam/blob/HEAD/R/update.mvgam.R\" class=\"external-link\"><code>R/update.mvgam.R</code></a></small>\n      <div class=\"d-none name\"><code>update.mvgam.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This function allows a previously fitted <span class=\"pkg\">mvgam</span> model to be updated</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'mvgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/update.html\" class=\"external-link\">update</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">formula</span>,</span>\n<span>  <span class=\"va\">trend_formula</span>,</span>\n<span>  <span class=\"va\">knots</span>,</span>\n<span>  <span class=\"va\">trend_knots</span>,</span>\n<span>  <span class=\"va\">trend_model</span>,</span>\n<span>  <span class=\"va\">family</span>,</span>\n<span>  <span class=\"va\">share_obs_params</span>,</span>\n<span>  <span class=\"va\">data</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">trend_map</span>,</span>\n<span>  <span class=\"va\">use_lv</span>,</span>\n<span>  <span class=\"va\">n_lv</span>,</span>\n<span>  <span class=\"va\">priors</span>,</span>\n<span>  <span class=\"va\">chains</span>,</span>\n<span>  <span class=\"va\">burnin</span>,</span>\n<span>  <span class=\"va\">samples</span>,</span>\n<span>  <span class=\"va\">threads</span>,</span>\n<span>  <span class=\"va\">algorithm</span>,</span>\n<span>  lfo <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'jsdgam'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/update.html\" class=\"external-link\">update</a></span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">object</span>,</span>\n<span>  <span class=\"va\">formula</span>,</span>\n<span>  <span class=\"va\">factor_formula</span>,</span>\n<span>  <span class=\"va\">knots</span>,</span>\n<span>  <span class=\"va\">factor_knots</span>,</span>\n<span>  <span class=\"va\">data</span>,</span>\n<span>  <span class=\"va\">newdata</span>,</span>\n<span>  <span class=\"va\">n_lv</span>,</span>\n<span>  <span class=\"va\">family</span>,</span>\n<span>  <span class=\"va\">share_obs_params</span>,</span>\n<span>  <span class=\"va\">priors</span>,</span>\n<span>  <span class=\"va\">chains</span>,</span>\n<span>  <span class=\"va\">burnin</span>,</span>\n<span>  <span class=\"va\">samples</span>,</span>\n<span>  <span class=\"va\">threads</span>,</span>\n<span>  <span class=\"va\">algorithm</span>,</span>\n<span>  lfo <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-object\">object<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-object\"></a></dt>\n<dd><p><code>list</code> object returned from <code>mvgam</code>. See <code><a href=\"mvgam.html\">mvgam()</a></code></p></dd>\n\n\n<dt id=\"arg-formula\">formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-formula\"></a></dt>\n<dd><p>Optional new <code>formula</code> object. Note, <code>mvgam</code> currently does not support dynamic formula\nupdates such as removal of specific terms with <code>- term</code>. When updating, the entire formula needs\nto be supplied</p></dd>\n\n\n<dt id=\"arg-trend-formula\">trend_formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-formula\"></a></dt>\n<dd><p>An optional <code>formula</code> object specifying the GAM\nprocess model formula. If\nsupplied, a linear predictor will be modelled for the latent trends to capture\nprocess model evolution\nseparately from the observation model. Should not have a response variable\nspecified on the left-hand side\nof the formula (i.e. a valid option would be <code>~ season + s(year)</code>). Also note\nthat you should not use\nthe identifier <code>series</code> in this formula to specify effects that vary across\ntime series. Instead you should use\n<code>trend</code>. This will ensure that models in which a <code>trend_map</code> is supplied will\nstill work consistently\n(i.e. by allowing effects to vary across process models, even when some time\nseries share the same underlying\nprocess model). This feature is only currently available for <code><a href=\"RW.html\">RW()</a></code>, <code><a href=\"RW.html\">AR()</a></code>\nand <code><a href=\"RW.html\">VAR()</a></code> trend models.\nIn <code><a href=\"mvgam_families.html\">nmix()</a></code> family models, the <code>trend_formula</code> is used to set up a linear\npredictor for the underlying\nlatent abundance. Be aware that it can be very challenging to simultaneously\nestimate intercept parameters\nfor both the observation mode (captured by <code>formula</code>) and the process model\n(captured by <code>trend_formula</code>).\nUsers are recommended to drop one of these using the <code>- 1</code> convention in the\nformula right hand side.</p></dd>\n\n\n<dt id=\"arg-knots\">knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-knots\"></a></dt>\n<dd><p>An optional <code>list</code> containing user specified knot values to\nbe used for basis construction.\nFor most bases the user simply supplies the knots to be used, which must match\nup with the <code>k</code> value supplied\n(note that the number of knots is not always just <code>k</code>). Different terms can\nuse different numbers of knots,\nunless they share a covariate</p></dd>\n\n\n<dt id=\"arg-trend-knots\">trend_knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-knots\"></a></dt>\n<dd><p>As for <code>knots</code> above, this is an optional <code>list</code> of\nknot values for smooth\nfunctions within the <code>trend_formula</code></p></dd>\n\n\n<dt id=\"arg-trend-model\">trend_model<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-model\"></a></dt>\n<dd><p><code>character</code> or  <code>function</code> specifying the time\nseries dynamics for the latent trend. Options are:</p><ul><li><p><code>None</code> (no latent trend component; i.e. the GAM component is all that\ncontributes to the linear predictor, and the observation process is the only\nsource of error; similarly to what is estimated by <code><a href=\"https://rdrr.io/pkg/mgcv/man/gam.html\" class=\"external-link\">gam</a></code>)</p></li>\n<li><p><code>ZMVN</code> or <code><a href=\"ZMVN.html\">ZMVN()</a></code> (Zero-Mean Multivariate Normal; only available in\n<code>Stan</code>)</p></li>\n<li><p><code>'RW'</code> or <code><a href=\"RW.html\">RW()</a></code></p></li>\n<li><p><code>'AR1'</code> or <code>AR(p = 1)</code></p></li>\n<li><p><code>'AR2'</code> or <code>AR(p = 2)</code></p></li>\n<li><p><code>'AR3'</code> or <code>AR(p = 3)</code></p></li>\n<li><p><code>'CAR1'</code> or <code>CAR(p = 1)</code></p></li>\n<li><p><code>'VAR1'</code>  or <code><a href=\"RW.html\">VAR()</a></code>(only available in <code>Stan</code>)</p></li>\n<li><p><code>'PWlogistic</code>, <code>'PWlinear'</code> or <code><a href=\"piecewise_trends.html\">PW()</a></code> (only available in <code>Stan</code>)</p></li>\n<li><p><code>'GP'</code> or <code><a href=\"GP.html\">GP()</a></code> (Gaussian Process with squared exponential kernel;\nonly available in <code>Stan</code>)</p></li>\n</ul><p>For all trend types apart from <code><a href=\"ZMVN.html\">ZMVN()</a></code>, <code><a href=\"GP.html\">GP()</a></code>, <code><a href=\"RW.html\">CAR()</a></code> and <code><a href=\"piecewise_trends.html\">PW()</a></code>, moving\naverage and/or correlated process error terms can also be estimated (for\nexample, <code>RW(cor = TRUE)</code> will set up a multivariate Random Walk if <code>n_series &gt; 1</code>).\nIt is also possible for many multivariate trends to estimate hierarchical\ncorrelations if the data are structured among levels of a relevant grouping\nfactor. See <a href=\"mvgam_trends.html\">mvgam_trends</a> for more details and see <a href=\"ZMVN.html\">ZMVN</a> for an example.</p></dd>\n\n\n<dt id=\"arg-family\">family<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-family\"></a></dt>\n<dd><p><code>family</code> specifying the exponential observation family for\nthe series. Currently supported\nfamilies are:</p><ul><li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">betar()</a></code> for proportional data on <code>(0,1)</code></p></li>\n<li><p><code><a href=\"mvgam_families.html\">lognormal()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">student_t()</a></code> for real-valued data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">Gamma()</a></code> for non-negative real-valued data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">bernoulli()</a></code> for binary data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code> for count data</p></li>\n<li><p><code><a href=\"mvgam_families.html\">nb()</a></code> for overdispersed count data</p></li>\n<li><p><code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> for count data with imperfect detection when the number\nof trials is known;\nnote that the <code><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind()</a></code> function must be used to bind the discrete\nobservations and the discrete number\nof trials</p></li>\n<li><p><code><a href=\"mvgam_families.html\">beta_binomial()</a></code> as for <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial()</a></code> but allows for overdispersion</p></li>\n<li><p><code><a href=\"mvgam_families.html\">nmix()</a></code> for count data with imperfect detection when the number of\ntrials is unknown and should be modeled via a State-Space N-Mixture model.\nThe latent states are Poisson, capturing the 'true' latent\nabundance, while the observation process is Binomial to account for\nimperfect detection.\nSee <code><a href=\"mvgam_families.html\">mvgam_families</a></code> for an example of how to use this family</p></li>\n</ul><p>Default is <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">poisson()</a></code>.\nSee <code><a href=\"mvgam_families.html\">mvgam_families</a></code> for more details</p></dd>\n\n\n<dt id=\"arg-share-obs-params\">share_obs_params<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-share-obs-params\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code> and the <code>family</code>\nhas additional family-specific observation parameters (e.g. variance\ncomponents in\n<code><a href=\"mvgam_families.html\">student_t()</a></code> or <code><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">gaussian()</a></code>, or dispersion parameters in <code><a href=\"mvgam_families.html\">nb()</a></code> or\n<code><a href=\"mvgam_families.html\">betar()</a></code>), these parameters will be shared across all outcome variables. This is handy\nif you have multiple outcomes (time series in most <code>mvgam</code> models) that you\nbelieve share some properties,\nsuch as being from the same species over different spatial units. Default is\n<code>FALSE</code>.</p></dd>\n\n\n<dt id=\"arg-data\">data<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-data\"></a></dt>\n<dd><p>A <code>dataframe</code> or <code>list</code> containing the model response\nvariable and covariates\nrequired by the GAM <code>formula</code> and optional <code>trend_formula</code>. Most\nmodels should include columns:</p><ul><li><p><code>series</code> (a <code>factor</code> index of the series IDs; the number of\nlevels should be identical\nto the number of unique series labels (i.e. <code>n_series = length(levels(data$series))</code>))</p></li>\n<li><p><code>time</code> (<code>numeric</code> or <code>integer</code> index of the time point for\neach observation).\nFor most dynamic trend types available in <code>mvgam</code> (see argument <code>trend_model</code>),\ntime should be\nmeasured in discrete, regularly spaced intervals (i.e. <code>c(1, 2, 3, ...)</code>).\nHowever you can\nuse irregularly spaced intervals if using <code>trend_model = CAR(1)</code>, though\nnote that any\ntemporal intervals that are exactly <code>0</code> will be adjusted to a very small number\n(<code>1e-12</code>) to prevent sampling errors. See an example of <code><a href=\"RW.html\">CAR()</a></code> trends in\n<code><a href=\"RW.html\">CAR</a></code></p></li>\n</ul><p>Note however that there are special cases where these identifiers are not\nneeded. For\nexample, models with hierarchical temporal correlation processes (e.g.\n<code>AR(gr = region, subgr = species)</code>)\nshould NOT include a <code>series</code> identifier, as this will be constructed\ninternally (see\n<code><a href=\"mvgam_trends.html\">mvgam_trends</a></code> and <code><a href=\"RW.html\">AR</a></code> for details). <code>mvgam</code> can also\nfit models that do not\ninclude a <code>time</code> variable if there are no temporal dynamic structures included\n(i.e. <code>trend_model = 'None'</code> or\n<code>trend_model = ZMVN()</code>). <code>data</code> should also include any other variables to be\nincluded in\nthe linear predictor of <code>formula</code></p></dd>\n\n\n<dt id=\"arg-newdata\">newdata<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-newdata\"></a></dt>\n<dd><p>Optional <code>dataframe</code> or <code>list</code> of test data containing\nthe same variables\nas in <code>data</code>. If included, the\nobservations in variable <code>y</code> will be set to <code>NA</code> when fitting the\nmodel so that posterior\nsimulations can be obtained</p></dd>\n\n\n<dt id=\"arg-trend-map\">trend_map<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-trend-map\"></a></dt>\n<dd><p>Optional <code>data.frame</code> specifying which series should depend\non which latent trends. Useful for allowing multiple series to depend on the\nsame latent trend process, but with different observation processes. If\nsupplied, a latent factor model is set up by setting <code>use_lv = TRUE</code> and\nusing the mapping to set up the shared trends. Needs to have column names\n<code>series</code> and <code>trend</code>, with integer values in the <code>trend</code> column to state which\ntrend each series should depend on. The <code>series</code> column should have a single\nunique entry for each series in the data (names should perfectly match factor\nlevels of the <code>series</code> variable in <code>data</code>). Note that if this is supplied,\nthe intercept parameter in the process model will NOT be automatically suppressed.\nNot yet supported for models in wich the latent factors evolve in continuous time (<code><a href=\"RW.html\">CAR()</a></code>).\nSee examples for details</p></dd>\n\n\n<dt id=\"arg-use-lv\">use_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-use-lv\"></a></dt>\n<dd><p><code>logical</code>. If <code>TRUE</code>, use dynamic factors to estimate series'\nlatent trends in a reduced dimension format. Only available for\n<code><a href=\"RW.html\">RW()</a></code>, <code><a href=\"RW.html\">AR()</a></code> and <code><a href=\"GP.html\">GP()</a></code> trend models. Defaults to <code>FALSE</code></p></dd>\n\n\n<dt id=\"arg-n-lv\">n_lv<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-lv\"></a></dt>\n<dd><p><code>integer</code> the number of latent dynamic factors to use if\n<code>use_lv == TRUE</code>. Cannot be <code>&gt; n_series</code>. Defaults arbitrarily to\n<code>min(2, floor(n_series / 2))</code></p></dd>\n\n\n<dt id=\"arg-priors\">priors<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-priors\"></a></dt>\n<dd><p>An optional <code>data.frame</code> with prior\ndefinitions or, preferentially, a vector containing\nobjects of class <code>brmsprior</code> (see. <code><a href=\"https://paulbuerkner.com/brms/reference/set_prior.html\" class=\"external-link\">prior</a></code> for details).\nSee <a href=\"get_mvgam_priors.html\">get_mvgam_priors</a> and Details' for more information on changing default prior distributions</p></dd>\n\n\n<dt id=\"arg-chains\">chains<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-chains\"></a></dt>\n<dd><p><code>integer</code> specifying the number of parallel chains for the model. Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-burnin\">burnin<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-burnin\"></a></dt>\n<dd><p><code>integer</code> specifying the number of warmup iterations of the Markov chain to run\nto tune sampling algorithms. Ignored\nif <code>algorithm %in% c('meanfield', 'fullrank', 'pathfinder', 'laplace')</code></p></dd>\n\n\n<dt id=\"arg-samples\">samples<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-samples\"></a></dt>\n<dd><p><code>integer</code> specifying the number of post-warmup iterations of the Markov chain to run for\nsampling the posterior distribution</p></dd>\n\n\n<dt id=\"arg-threads\">threads<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-threads\"></a></dt>\n<dd><p><code>integer</code> Experimental option to use multithreading for within-chain\nparallelisation in <code>Stan</code>. We recommend its use only if you are experienced with\n<code>Stan</code>'s <code>reduce_sum</code> function and have a slow running model that cannot be sped\nup by any other means. Currently works for all families apart from <code><a href=\"mvgam_families.html\">nmix()</a></code> and\nwhen using <code>Cmdstan</code> as the backend</p></dd>\n\n\n<dt id=\"arg-algorithm\">algorithm<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-algorithm\"></a></dt>\n<dd><p>Character string naming the estimation approach to use.\nOptions are <code>\"sampling\"</code> for MCMC (the default), <code>\"meanfield\"</code> for\nvariational inference with factorized normal distributions,\n<code>\"fullrank\"</code> for variational inference with a multivariate normal\ndistribution, <code>\"laplace\"</code> for a Laplace approximation (only available\nwhen using cmdstanr as the backend) or <code>\"pathfinder\"</code> for the pathfinder\nalgorithm (only currently available when using cmdstanr as the backend).\nCan be set globally for the current <span style=\"R\">R</span> session via the\n<code>\"brms.algorithm\"</code> option (see <code><a href=\"https://rdrr.io/r/base/options.html\" class=\"external-link\">options</a></code>). Limited testing\nsuggests that <code>\"meanfield\"</code> performs best out of the non-MCMC approximations for\ndynamic GAMs, possibly because of the difficulties estimating covariances among the\nmany spline parameters and latent trend parameters. But rigorous testing has not\nbeen carried out</p></dd>\n\n\n<dt id=\"arg-lfo\">lfo<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-lfo\"></a></dt>\n<dd><p>Logical indicating whether this is part of a call to <a href=\"lfo_cv.mvgam.html\">lfo_cv.mvgam</a>. Returns a\nlighter version of the model with no residuals and fewer monitored parameters to speed up\npost-processing. But other downstream functions will not work properly, so users should always\nleave this set as <code>FALSE</code></p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Other arguments to be passed to <code><a href=\"mvgam.html\">mvgam</a></code> or <code><a href=\"jsdgam.html\">jsdgam</a></code></p></dd>\n\n\n<dt id=\"arg-factor-formula\">factor_formula<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-factor-formula\"></a></dt>\n<dd><p>Optional new <code>formula</code> object for the factor linear predictors</p></dd>\n\n\n<dt id=\"arg-factor-knots\">factor_knots<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-factor-knots\"></a></dt>\n<dd><p>An optional <code>list</code> containing user specified knot values to\nbe used for basis construction of any smooth terms in <code>factor_formula</code>.\nFor most bases the user simply supplies the knots to be used, which must match up with the <code>k</code> value supplied\n(note that the number of knots is not always just <code>k</code>). Different terms can use different numbers of knots,\nunless they share a covariate</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A <code>list</code> object of class <code>mvgam</code> containing model output, the text representation of the model file,\nthe mgcv model output (for easily generating simulations at\nunsampled covariate values), Dunn-Smyth residuals for each outcome variable and key information needed\nfor other functions in the package. See <code><a href=\"mvgam-class.html\">mvgam-class</a></code> for details.\nUse <code>methods(class = \"mvgam\")</code> for an overview on available methods.</p>\n<p>A <code>list</code> object of class <code>mvgam</code> containing model output, the text representation of the model file,\nthe mgcv model output (for easily generating simulations at\nunsampled covariate values), Dunn-Smyth residuals for each series and key information needed\nfor other functions in the package. See <code><a href=\"mvgam-class.html\">mvgam-class</a></code> for details.\nUse <code>methods(class = \"mvgam\")</code> for an overview on available methods.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p>Nicholas J Clark</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"co\"># \\donttest{</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Simulate some data and fit a Poisson AR1 model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"sim_mvgam.html\">sim_mvgam</a></span><span class=\"op\">(</span>n_series <span class=\"op\">=</span> <span class=\"fl\">1</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"mvgam.html\">mvgam</a></span><span class=\"op\">(</span><span class=\"va\">y</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>             noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>             data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>             chains <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-1618324c4194.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                                 ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                             </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 0.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 0.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ s(season, bs = \"cc\")</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x0000019b13fe8088&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> poisson</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> log</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               2.5%    50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept) -0.900 -0.550 -0.220 1.01   563</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).1 -0.410  0.170  0.710 1.02   190</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).2 -0.045  0.540  1.100 1.00   675</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).3  0.280  0.810  1.400 1.00   721</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).4  0.570  1.100  1.700 1.01   398</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).5  0.190  0.730  1.300 1.01   519</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).6 -0.780 -0.095  0.560 1.00   548</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).7 -1.300 -0.550  0.093 1.00   260</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).8 -1.300 -0.690 -0.160 1.00   524</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            edf Ref.df Chi.sq p-value  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season) 2.62      8   33.4   0.049 *</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Latent trend parameter AR estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>           2.5%   50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[1]   -0.92 0.045  0.88 1.00   623</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[1]  0.01 0.250  0.69 1.01   164</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 26 9:36:53 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"update.mvgam-1.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Update to an AR2 model</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">updated_mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/update.html\" class=\"external-link\">update</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>, trend_model <span class=\"op\">=</span> <span class=\"fu\"><a href=\"RW.html\">AR</a></span><span class=\"op\">(</span>p <span class=\"op\">=</span> <span class=\"fl\">2</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                      noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-161848cf2c24.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in e</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> xpansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                           </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/t</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> bb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tb</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> b/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 0.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 0.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 0.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">updated_mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> y ~ s(season, bs = \"cc\")</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x0000019b13fe8088&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> poisson</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> log</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> AR(p = 2)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               2.5%   50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept) -0.910 -0.53 -0.240    1   623</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).1 -0.330  0.18  0.720    1   895</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).2 -0.037  0.55  1.100    1   931</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).3  0.250  0.81  1.400    1   902</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).4  0.630  1.10  1.700    1   957</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).5  0.230  0.72  1.300    1  1065</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).6 -0.780 -0.11  0.490    1  1053</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).7 -1.300 -0.60  0.065    1   885</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).8 -1.300 -0.71 -0.150    1   966</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            edf Ref.df Chi.sq p-value   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season) 3.01      8   31.2  0.0036 **</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Latent trend AR parameter estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             2.5%    50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[1]   -0.9100 -0.014  0.90    1  1066</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar2[1]   -0.9000 -0.037  0.89    1  1032</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[1]  0.0086  0.180  0.58    1   370</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 26 9:37:24 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(updated_mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">updated_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"update.mvgam-2.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Now update to a Binomial AR1 by adding information on trials</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># requires that we supply newdata that contains the 'trials' variable</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">trials</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/Extremes.html\" class=\"external-link\">max</a></span><span class=\"op\">(</span><span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span><span class=\"op\">$</span><span class=\"va\">y</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">15</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">updated_mod</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/update.html\" class=\"external-link\">update</a></span><span class=\"op\">(</span><span class=\"va\">mod</span>,</span></span>\n<span class=\"r-in\"><span>                      formula <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/cbind.html\" class=\"external-link\">cbind</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"va\">trials</span><span class=\"op\">)</span> <span class=\"op\">~</span> <span class=\"fu\"><a href=\"https://rdrr.io/pkg/mgcv/man/s.html\" class=\"external-link\">s</a></span><span class=\"op\">(</span><span class=\"va\">season</span>, bs <span class=\"op\">=</span> <span class=\"st\">'cc'</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>                      noncentred <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span></span>\n<span class=\"r-in\"><span>                      data <span class=\"op\">=</span> <span class=\"va\">simdat</span><span class=\"op\">$</span><span class=\"va\">data_train</span>,</span></span>\n<span class=\"r-in\"><span>                      family <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/family.html\" class=\"external-link\">binomial</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Compiling Stan program using cmdstanr</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h:123,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h:36,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h:23,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core/init_threadpool_tbb.hpp:18,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/core.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/Eigen_NumTraits.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/typedefs.hpp:7,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core/chainable_object.hpp:6,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev/core.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:10,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math.hpp:19,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/src/stan/model/model_header.hpp:4,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from C:/Users/uqnclar2/AppData/Local/Temp/Rtmpodm0uo/model-16184b0a5512.hpp:2:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   422 |     constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs): internal::atomic_impl&lt;T&gt;(rhs) {}</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                        ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:422:24: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:454:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   454 | __TBB_DECL_ATOMIC(__TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:455:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   455 | __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> 20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:459:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   459 | __TBB_DECL_ATOMIC(long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:460:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   460 | __TBB_DECL_ATOMIC(unsigned long)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:491:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   491 | __TBB_DECL_ATOMIC(unsigned)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:492:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   492 | __TBB_DECL_ATOMIC(int)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                                 ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:495:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   495 | __TBB_DECL_ATOMIC(unsigned short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:496:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   496 | __TBB_DECL_ATOMIC(short)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:497:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   497 | __TBB_DECL_ATOMIC(char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:498:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   498 | __TBB_DECL_ATOMIC(signed char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:499:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   499 | __TBB_DECL_ATOMIC(unsigned char)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: warning: template-id not allowed for constructor in C++20 [-Wtemplate-id-cdtor]</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:437:32: note: remove the '&lt; &gt;'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   437 |             constexpr atomic&lt;T&gt;(const atomic&lt;T&gt;&amp; rhs):                                              \\</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       |                                ^</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h:502:1: note: in expansion of macro '__TBB_DECL_ATOMIC'</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>   502 | __TBB_DECL_ATOMIC(wchar_t)</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>       | ^~~~~~~~~~~~~~~~~</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> In file included from stan/lib/stan_math/stan/math/prim/prob/normal_ccdf_log.hpp:5,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim/prob.hpp:243,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/prim.hpp:16,</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>                  from stan/lib/stan_math/stan/math/rev.hpp:16:</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp: In function 'stan::return_type_t&lt;T_x, T_sigma, T_l&gt; stan::math::normal_lccdf(const T_y&amp;, const T_loc&amp;, const T_scale&amp;)':</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: '-Wmisleading-indentation' is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span>    68 |     } else if (scaled_diff &gt; 8.25 * INV_SQRT_TWO) {</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> stan/lib/stan_math/stan/math/prim/prob/normal_lccdf.hpp:68: note: adding '-flarge-source-files' will allow for more column-tracking support, at the expense of compilation time and memory</span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Start sampling</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Running MCMC with 2 parallel chains...</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration:   1 / 1000 [  0%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 100 / 1000 [ 10%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 200 / 1000 [ 20%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 300 / 1000 [ 30%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 400 / 1000 [ 40%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 500 / 1000 [ 50%]  (Warmup) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 501 / 1000 [ 50%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 600 / 1000 [ 60%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 700 / 1000 [ 70%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 800 / 1000 [ 80%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 900 / 1000 [ 90%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 1 finished in 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 Iteration: 1000 / 1000 [100%]  (Sampling) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Chain 2 finished in 0.4 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Both chains finished successfully.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Mean chain execution time: 0.3 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total execution time: 0.5 seconds.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/summary.html\" class=\"external-link\">summary</a></span><span class=\"op\">(</span><span class=\"va\">updated_mod</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM formula:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> cbind(y, trials) ~ s(season, bs = \"cc\")</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;environment: 0x0000019b13fe8088&gt;</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Family:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> binomial</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Link function:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> logit</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Trend model:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> AR()</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N series:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> N timepoints:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 75 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Status:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Fitted using Stan </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 2 chains, each with iter = 1000; warmup = 500; thin = 1 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Total post-warmup draws = 1000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> GAM coefficient (beta) estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               2.5%   50%  97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (Intercept) -3.800 -3.40 -3.100    1   555</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).1 -0.360  0.19  0.740    1   476</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).2  0.024  0.55  1.100    1   598</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).3  0.230  0.83  1.400    1   672</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).4  0.530  1.10  1.700    1   499</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).5  0.140  0.75  1.300    1   576</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).6 -0.780 -0.11  0.470    1   828</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).7 -1.300 -0.59  0.025    1   677</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season).8 -1.400 -0.70 -0.094    1   520</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Approximate significance of GAM smooths:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            edf Ref.df Chi.sq p-value  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> s(season) 2.56      8   34.8   0.019 *</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ---</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Latent trend parameter AR estimates:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            2.5%   50% 97.5% Rhat n_eff</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> ar1[1]   -0.900 0.019  0.93    1   569</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> sigma[1]  0.012 0.250  0.73    1   269</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Stan MCMC diagnostics:</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> n_eff / iter looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Rhat looks reasonable for all parameters</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations ended with a divergence (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 0 of 1000 iterations saturated the maximum tree depth of 10 (0%)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> E-FMI indicated no pathological behavior</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Samples were drawn using NUTS(diag_e) at Wed Feb 26 9:37:54 AM 2025.</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> For each parameter, n_eff is a crude measure of effective sample size,</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> and Rhat is the potential scale reduction factor on split MCMC chains</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (at convergence, Rhat = 1)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Use how_to_cite(updated_mod) to get started describing this model</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://paulbuerkner.com/brms/reference/conditional_effects.brmsfit.html\" class=\"external-link\">conditional_effects</a></span><span class=\"op\">(</span><span class=\"va\">updated_mod</span>, type <span class=\"op\">=</span> <span class=\"st\">'link'</span><span class=\"op\">)</span></span></span>\n<span class=\"r-plt img\"><img src=\"update.mvgam-3.png\" alt=\"\" width=\"700\" height=\"433\"></span>\n<span class=\"r-in\"><span><span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by <a href=\"https://researchers.uq.edu.au/researcher/15140\" class=\"external-link\">Nicholas J Clark</a>.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.1.1.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/search.json",
    "content": "[{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"required-long-data-format\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Required long data format\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"Manipulating data ‘long’ format necessary modelling mvgam. ‘long’ format, mean series x time observation needs entry dataframe list object wish use data modelling. simple example can viewed simulating data using sim_mvgam function. See ?sim_mvgam details\",\"code\":\"simdat <- sim_mvgam(n_series = 4, T = 24, prop_missing = 0.2) head(simdat$data_train, 16) ##     y season year   series time ## 1   0      1    1 series_1    1 ## 2   0      1    1 series_2    1 ## 3   1      1    1 series_3    1 ## 4   0      1    1 series_4    1 ## 5  NA      2    1 series_1    2 ## 6   2      2    1 series_2    2 ## 7   3      2    1 series_3    2 ## 8   1      2    1 series_4    2 ## 9   1      3    1 series_1    3 ## 10  1      3    1 series_2    3 ## 11  1      3    1 series_3    3 ## 12  5      3    1 series_4    3 ## 13  0      4    1 series_1    4 ## 14  3      4    1 series_2    4 ## 15 NA      4    1 series_3    4 ## 16  1      4    1 series_4    4\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"series-as-a-factor-variable\",\"dir\":\"Articles\",\"previous_headings\":\"Required long data format\",\"what\":\"series as a factor variable\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"Notice four different time series simulated data, identified series-level indicator factor variable. important number levels matches number unique series data ensure indexing across series works properly underlying modelling functions. Several main workhorse functions package (including mvgam() get_mvgam_priors()) give error case, may worth checking anyway: Note can technically supply data series indicator, package assume using single time series. , better included confusion.\",\"code\":\"class(simdat$data_train$series) ## [1] \\\"factor\\\" levels(simdat$data_train$series) ## [1] \\\"series_1\\\" \\\"series_2\\\" \\\"series_3\\\" \\\"series_4\\\" all(levels(simdat$data_train$series) %in% unique(simdat$data_train$series)) ## [1] TRUE\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"a-single-outcome-variable\",\"dir\":\"Articles\",\"previous_headings\":\"Required long data format\",\"what\":\"A single outcome variable\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"may also notices spread numeric / integer-classed outcome variable different columns. Rather, single column outcome variable, labelled y simulated data (though outcome labelled y). another important requirement mvgam, shouldn’t unfamiliar R users frequently use modelling packages lme4, mgcv, brms many regression modelling packages . advantage format now easy specify effects vary among time series: Depending observation families plan use building models, may restrictions need satisfied within outcome variable. example, Beta regression can handle proportional data, values >= 1 <= 0 allowed. Likewise, Poisson regression can handle non-negative integers. regression functions R assume user knows issue warnings errors choose wrong distribution, often ends leading unhelpful error optimizer difficult interpret diagnose. mvgam attempt provide errors something simply allowed. example, can simulate data zero-centred Gaussian distribution (ensuring values < 1) attempt Beta regression mvgam using betar family: call gam using mgcv package leads model actually fits (though give unhelpful warning message): call mvgam gives us something useful: Please see ?mvgam_families information types responses package can handle restrictions\",\"code\":\"summary(glm(y ~ series + time,             data = simdat$data_train,             family = poisson())) ##  ## Call: ## glm(formula = y ~ series + time, family = poisson(), data = simdat$data_train) ##  ## Coefficients: ##                 Estimate Std. Error z value Pr(>|z|)     ## (Intercept)    -1.115625   0.480029  -2.324 0.020121 *   ## seriesseries_2  1.825006   0.481892   3.787 0.000152 *** ## seriesseries_3  1.886945   0.479838   3.932 8.41e-05 *** ## seriesseries_4  2.129507   0.473202   4.500 6.79e-06 *** ## time            0.001744   0.017862   0.098 0.922214     ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## (Dispersion parameter for poisson family taken to be 1) ##  ##     Null deviance: 154.10  on 59  degrees of freedom ## Residual deviance: 118.11  on 55  degrees of freedom ##   (12 observations deleted due to missingness) ## AIC: 233.48 ##  ## Number of Fisher Scoring iterations: 5 summary(gam(y ~ series + s(time, by = series),             data = simdat$data_train,             family = poisson())) ##  ## Family: poisson  ## Link function: log  ##  ## Formula: ## y ~ series + s(time, by = series) ##  ## Parametric coefficients: ##                Estimate Std. Error z value Pr(>|z|)     ## (Intercept)     -1.1233     0.4588  -2.448  0.01436 *   ## seriesseries_2   1.6315     0.5050   3.231  0.00123 **  ## seriesseries_3   1.4089     0.5298   2.659  0.00783 **  ## seriesseries_4   1.9757     0.4923   4.013 5.99e-05 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Approximate significance of smooth terms: ##                          edf Ref.df Chi.sq  p-value     ## s(time):seriesseries_1 1.000  1.000  0.156 0.692804     ## s(time):seriesseries_2 3.658  4.514 13.424 0.013628 *   ## s(time):seriesseries_3 4.043  4.970 23.958 0.000224 *** ## s(time):seriesseries_4 3.946  4.848 16.194 0.005763 **  ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## R-sq.(adj) =  0.713   Deviance explained =   70% ## UBRE = 0.32659  Scale est. = 1         n = 60 gauss_dat <- data.frame(outcome = rnorm(10),                         series = factor('series1',                                         levels = 'series1'),                         time = 1:10) gauss_dat ##       outcome  series time ## 1  -0.6486480 series1    1 ## 2  -0.8429284 series1    2 ## 3  -0.1077338 series1    3 ## 4   1.3225989 series1    4 ## 5   0.2371594 series1    5 ## 6   1.0564309 series1    6 ## 7  -0.4418067 series1    7 ## 8  -0.1915395 series1    8 ## 9  -0.2401515 series1    9 ## 10  0.4005033 series1   10 gam(outcome ~ time,     family = betar(),     data = gauss_dat) ## Warning in family$saturated.ll(y, prior.weights, theta): saturated likelihood ## may be inaccurate ##  ## Family: Beta regression(0.09)  ## Link function: logit  ##  ## Formula: ## outcome ~ time ## Total model degrees of freedom 2  ##  ## REML score: -205.1333 mvgam(outcome ~ time,       family = betar(),       data = gauss_dat) ## Error: Values <= 0 not allowed for beta responses\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"a-time-variable\",\"dir\":\"Articles\",\"previous_headings\":\"Required long data format\",\"what\":\"A time variable\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"requirement modelling mvgam numeric / integer-classed variable labelled time ensure modelling software knows arrange time series building models. setup still allows us formulate multivariate time series models. plan use autoregressive dynamic trend functions available mvgam (see ?mvgam_trends details available dynamic processes), need ensure time series entered fixed sampling interval (.e. time timesteps 1 2 time timesteps 2 3, etc…). note can missing observations () series. mvgam check , useful ensure missing timepoint x series combinations data. can generally simple dplyr call: Note models use dynamic components assume smaller values time older (.e. time = 1 came time = 2, etc…)\",\"code\":\"# A function to ensure all timepoints within a sequence are identical all_times_avail = function(time, min_time, max_time){     identical(as.numeric(sort(time)),               as.numeric(seq.int(from = min_time, to = max_time))) }  # Get min and max times from the data min_time <- min(simdat$data_train$time) max_time <- max(simdat$data_train$time)  # Check that all times are recorded for each series data.frame(series = simdat$data_train$series,            time = simdat$data_train$time) %>%     dplyr::group_by(series) %>%     dplyr::summarise(all_there = all_times_avail(time,                                                  min_time,                                                  max_time)) -> checked_times if(any(checked_times$all_there == FALSE)){   warning(\\\"One or more series in is missing observations for one or more timepoints\\\") } else {   cat('All series have observations at all timepoints :)') } ## All series have observations at all timepoints :)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"checking-data-with-get_mvgam_priors\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Checking data with get_mvgam_priors\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"get_mvgam_priors function designed return information parameters model whose prior distributions can modified user. , perform series checks ensure data formatted properly. can therefore useful new users ensuring isn’t anything strange going data setup. example, can replicate steps taken (check factor levels timepoint x series combinations) single call get_mvgam_priors. first simulate data timepoints time variable included data: Next call get_mvgam_priors simply specifying intercept-model, enough trigger checks: error useful tells us problem . many ways fill missing timepoints, correct way left user. don’t covariates, pretty easy using expand.grid: Now call get_mvgam_priors, using filled data, work: function also pick misaligned factor levels series variable. can check simulating, time adding additional factor level included data: Another call get_mvgam_priors brings useful error: Following message’s advice tells us level series_2 series variable, observations series data: Re-assigning levels fixes issue:\",\"code\":\"bad_times <- data.frame(time = seq(1, 16, by = 2),                         series = factor('series_1'),                         outcome = rnorm(8)) bad_times ##   time   series    outcome ## 1    1 series_1 -0.4906341 ## 2    3 series_1  0.1574320 ## 3    5 series_1  2.6049355 ## 4    7 series_1  0.0328311 ## 5    9 series_1  1.2738171 ## 6   11 series_1  1.4794145 ## 7   13 series_1  0.3193854 ## 8   15 series_1  0.1712443 get_mvgam_priors(outcome ~ 1,                  data = bad_times,                  family = gaussian()) ## Error: One or more series in data is missing observations for one or more timepoints bad_times %>%   dplyr::right_join(expand.grid(time = seq(min(bad_times$time),                                            max(bad_times$time)),                                 series = factor(unique(bad_times$series),                                                 levels = levels(bad_times$series)))) %>%   dplyr::arrange(time) -> good_times ## Joining with `by = join_by(time, series)` good_times ##    time   series    outcome ## 1     1 series_1 -0.4906341 ## 2     2 series_1         NA ## 3     3 series_1  0.1574320 ## 4     4 series_1         NA ## 5     5 series_1  2.6049355 ## 6     6 series_1         NA ## 7     7 series_1  0.0328311 ## 8     8 series_1         NA ## 9     9 series_1  1.2738171 ## 10   10 series_1         NA ## 11   11 series_1  1.4794145 ## 12   12 series_1         NA ## 13   13 series_1  0.3193854 ## 14   14 series_1         NA ## 15   15 series_1  0.1712443 get_mvgam_priors(outcome ~ 1,                  data = good_times,                  family = gaussian()) ##                             param_name param_length           param_info ## 1                          (Intercept)            1          (Intercept) ## 2 vector<lower=0>[n_series] sigma_obs;            1 observation error sd ##                                   prior                   example_change ## 1 (Intercept) ~ student_t(3, 0.2, 2.5);      (Intercept) ~ normal(0, 1); ## 2     sigma_obs ~ student_t(3, 0, 2.5); sigma_obs ~ normal(-0.49, 0.83); ##   new_lowerbound new_upperbound ## 1             NA             NA ## 2             NA             NA bad_levels <- data.frame(time = 1:8,                         series = factor('series_1',                                         levels = c('series_1',                                                    'series_2')),                         outcome = rnorm(8))  levels(bad_levels$series) ## [1] \\\"series_1\\\" \\\"series_2\\\" get_mvgam_priors(outcome ~ 1,                  data = bad_levels,                  family = gaussian()) ## Error: Mismatch between factor levels of \\\"series\\\" and unique values of \\\"series\\\" ## Use ##   `setdiff(levels(data$series), unique(data$series))`  ## and ##   `intersect(levels(data$series), unique(data$series))` ## for guidance setdiff(levels(bad_levels$series), unique(bad_levels$series)) ## [1] \\\"series_2\\\" bad_levels %>%   dplyr::mutate(series = droplevels(series)) -> good_levels levels(good_levels$series) ## [1] \\\"series_1\\\" get_mvgam_priors(outcome ~ 1,                  data = good_levels,                  family = gaussian()) ##                             param_name param_length           param_info ## 1                          (Intercept)            1          (Intercept) ## 2 vector<lower=0>[n_series] sigma_obs;            1 observation error sd ##                                    prior                   example_change ## 1 (Intercept) ~ student_t(3, -0.3, 2.5);      (Intercept) ~ normal(0, 1); ## 2      sigma_obs ~ student_t(3, 0, 2.5); sigma_obs ~ normal(-0.42, 0.95); ##   new_lowerbound new_upperbound ## 1             NA             NA ## 2             NA             NA\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"covariates-with-no-nas\",\"dir\":\"Articles\",\"previous_headings\":\"Checking data with get_mvgam_priors\",\"what\":\"Covariates with no NAs\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"Covariates can used models just using mgcv (see ?formula.gam details formula syntax). although outcome variable can NAs, covariates . regression software silently drop raws model matrix NAs, helpful debugging. mvgam get_mvgam_priors functions run simple checks , hopefully return useful errors finds missing values: Just like mgcv package, mvgam can also accept data list object. useful want set linear functional predictors even distributed lag predictors. checks run mvgam still work data. change cov predictor matrix: call mvgam returns error:\",\"code\":\"miss_dat <- data.frame(outcome = rnorm(10),                        cov = c(NA, rnorm(9)),                        series = factor('series1',                                        levels = 'series1'),                        time = 1:10) miss_dat ##        outcome        cov  series time ## 1  -0.15058064         NA series1    1 ## 2   0.03178451  0.7289831 series1    2 ## 3   1.00065562  0.9212862 series1    3 ## 4  -0.03331216 -0.5952961 series1    4 ## 5  -0.01451934  2.0583251 series1    5 ## 6   0.36674707 -0.6042471 series1    6 ## 7   0.67099411  1.2095204 series1    7 ## 8  -1.41582781 -0.6412307 series1    8 ## 9  -0.65945889  1.2445165 series1    9 ## 10  1.11464265  0.3423697 series1   10 get_mvgam_priors(outcome ~ cov,                  data = miss_dat,                  family = gaussian()) ## Error: Missing values found in data predictors: ##  Error in na.fail.default(structure(list(outcome = c(-0.150580643557141, : missing values in object miss_dat <- list(outcome = rnorm(10),                  series = factor('series1',                                  levels = 'series1'),                  time = 1:10) miss_dat$cov <- matrix(rnorm(50), ncol = 5, nrow = 10) miss_dat$cov[2,3] <- NA get_mvgam_priors(outcome ~ cov,                  data = miss_dat,                  family = gaussian()) ## Error: Missing values found in data predictors: ##  Error in na.fail.default(structure(list(outcome = c(-0.971128623892835, : missing values in object\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"plotting-with-plot_mvgam_series\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Plotting with plot_mvgam_series\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"Plotting data useful way ensure everything looks ok, ’ve gone throug checks factor levels timepoint x series combinations. plot_mvgam_series function take supplied data plot either series line plots (choose series = '') set plots describe distribution single time series. example, plot time series data, highlight single series plot, can use:  can look closely distribution first time series:  split data training testing folds (.e. forecast evaluation), can include test data plots:\",\"code\":\"plot_mvgam_series(data = simdat$data_train,                    y = 'y',                    series = 'all') plot_mvgam_series(data = simdat$data_train,                    y = 'y',                    series = 1) plot_mvgam_series(data = simdat$data_train,                   newdata = simdat$data_test,                   y = 'y',                    series = 1)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html\",\"id\":\"example-with-neon-tick-data\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Example with NEON tick data\",\"title\":\"Formatting data for use in mvgam\",\"text\":\"give one example data can reformatted mvgam modelling, use observations National Ecological Observatory Network (NEON) tick drag cloth samples. Ixodes scapularis widespread tick species capable transmitting diversity parasites animals humans, many zoonotic. Due medical ecological importance tick species, common goal understand factors influence abundances. NEON field team carries standardised long-term monitoring tick abundances well important indicators ecological change. Nymphal abundance . scapularis routinely recorded across NEON plots using field sampling method called drag cloth sampling, common method sampling ticks landscape. Field researchers sample ticks dragging large cloth behind terrain suspected harboring ticks, usually working grid-like pattern. sites sampled since 2014, resulting rich dataset nymph abundance time series. tick time series show strong seasonality incorporate many challenging features associated ecological data including overdispersion, high proportions missingness irregular sampling time, making useful exploring utility dynamic GAMs. begin loading NEON tick data years 2014 - 2021, downloaded NEON prepared described Clark & Wells 2022. can read bit data using call ?all_neon_tick_data exercise, use epiWeek variable index seasonality, work observations sampling plots (labelled plotID column): Now can select target species want (. scapularis), filter correct plot IDs convert epiWeek variable character numeric: Now tricky part: need fill missing observations NAs. tick data sparse field observers go sample possible epiWeek. many particular weeks observations included data. can use expand.grid take care : Create series variable needed mvgam modelling: Now create time variable, needs track Year epiWeek unique series. n function dplyr often useful generating time index grouped dataframes: Check factor levels series: looks good, rigorous check using get_mvgam_priors: can also set model mvgam use run_model = FALSE ensure necessary steps creating modelling code objects run. recommended use cmdstanr backend possible, auto-formatting options available package useful checking package-generated Stan code inefficiencies can fixed lead sampling performance improvements: call runs without issue, resulting object now contains model code data objects needed initiate sampling:\",\"code\":\"data(\\\"all_neon_tick_data\\\") str(dplyr::ungroup(all_neon_tick_data)) ## tibble [3,505 × 24] (S3: tbl_df/tbl/data.frame) ##  $ Year                : num [1:3505] 2015 2015 2015 2015 2015 ... ##  $ epiWeek             : chr [1:3505] \\\"37\\\" \\\"38\\\" \\\"39\\\" \\\"40\\\" ... ##  $ yearWeek            : chr [1:3505] \\\"201537\\\" \\\"201538\\\" \\\"201539\\\" \\\"201540\\\" ... ##  $ plotID              : chr [1:3505] \\\"BLAN_005\\\" \\\"BLAN_005\\\" \\\"BLAN_005\\\" \\\"BLAN_005\\\" ... ##  $ siteID              : chr [1:3505] \\\"BLAN\\\" \\\"BLAN\\\" \\\"BLAN\\\" \\\"BLAN\\\" ... ##  $ nlcdClass           : chr [1:3505] \\\"deciduousForest\\\" \\\"deciduousForest\\\" \\\"deciduousForest\\\" \\\"deciduousForest\\\" ... ##  $ decimalLatitude     : num [1:3505] 39.1 39.1 39.1 39.1 39.1 ... ##  $ decimalLongitude    : num [1:3505] -78 -78 -78 -78 -78 ... ##  $ elevation           : num [1:3505] 168 168 168 168 168 ... ##  $ totalSampledArea    : num [1:3505] 162 NA NA NA 162 NA NA NA NA 164 ... ##  $ amblyomma_americanum: num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ ixodes_scapularis   : num [1:3505] 2 NA NA NA 0 NA NA NA NA 0 ... ##  $ time                : Date[1:3505], format: \\\"2015-09-13\\\" \\\"2015-09-20\\\" ... ##  $ RHMin_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ RHMin_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ RHMax_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ RHMax_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ airTempMin_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ airTempMin_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ airTempMax_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ airTempMax_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ... ##  $ soi                 : num [1:3505] -18.4 -17.9 -23.5 -28.4 -25.9 ... ##  $ cum_sdd             : num [1:3505] 173 173 173 173 173 ... ##  $ cum_gdd             : num [1:3505] 1129 1129 1129 1129 1129 ... plotIDs <- c('SCBI_013','SCBI_002',              'SERC_001','SERC_005',              'SERC_006','SERC_012',              'BLAN_012','BLAN_005') model_dat <- all_neon_tick_data %>%   dplyr::ungroup() %>%   dplyr::mutate(target = ixodes_scapularis) %>%   dplyr::filter(plotID %in% plotIDs) %>%   dplyr::select(Year, epiWeek, plotID, target) %>%   dplyr::mutate(epiWeek = as.numeric(epiWeek)) model_dat %>%   # Create all possible combos of plotID, Year and epiWeek;    # missing outcomes will be filled in as NA   dplyr::full_join(expand.grid(plotID = unique(model_dat$plotID),                                Year = unique(model_dat$Year),                                epiWeek = seq(1, 52))) %>%      # left_join back to original data so plotID and siteID will   # match up, in case you need the siteID for anything else later on   dplyr::left_join(all_neon_tick_data %>%                      dplyr::select(siteID, plotID) %>%                      dplyr::distinct()) -> model_dat ## Joining with `by = join_by(Year, epiWeek, plotID)` ## Joining with `by = join_by(plotID)` model_dat %>%   dplyr::mutate(series = plotID,                 y = target) %>%   dplyr::mutate(siteID = factor(siteID),                 series = factor(series)) %>%   dplyr::select(-target, -plotID) %>%   dplyr::arrange(Year, epiWeek, series) -> model_dat model_dat %>%   dplyr::ungroup() %>%   dplyr::group_by(series) %>%   dplyr::arrange(Year, epiWeek) %>%   dplyr::mutate(time = seq(1, dplyr::n())) %>%   dplyr::ungroup() -> model_dat levels(model_dat$series) ## [1] \\\"BLAN_005\\\" \\\"BLAN_012\\\" \\\"SCBI_002\\\" \\\"SCBI_013\\\" \\\"SERC_001\\\" \\\"SERC_005\\\" \\\"SERC_006\\\" ## [8] \\\"SERC_012\\\" get_mvgam_priors(y ~ 1,                  data = model_dat,                  family = poisson()) ##    param_name param_length  param_info                                  prior ## 1 (Intercept)            1 (Intercept) (Intercept) ~ student_t(3, -2.3, 2.5); ##                example_change new_lowerbound new_upperbound ## 1 (Intercept) ~ normal(0, 1);             NA             NA testmod <- mvgam(y ~ s(epiWeek, by = series, bs = 'cc') +                    s(series, bs = 're'),                  trend_model = 'AR1',                  data = model_dat,                  backend = 'cmdstanr',                  run_model = FALSE) str(testmod$model_data) ## List of 25 ##  $ y           : num [1:416, 1:8] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... ##  $ n           : int 416 ##  $ X           : num [1:3328, 1:73] 1 1 1 1 1 1 1 1 1 1 ... ##   ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. ..$ : chr [1:3328] \\\"1\\\" \\\"2\\\" \\\"3\\\" \\\"4\\\" ... ##   .. ..$ : chr [1:73] \\\"X.Intercept.\\\" \\\"V2\\\" \\\"V3\\\" \\\"V4\\\" ... ##  $ S1          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ zero        : num [1:73] 0 0 0 0 0 0 0 0 0 0 ... ##  $ S2          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ S3          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ S4          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ S5          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ S6          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ S7          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ S8          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ... ##  $ p_coefs     : Named num 0.747 ##   ..- attr(*, \\\"names\\\")= chr \\\"(Intercept)\\\" ##  $ p_taus      : num 424 ##  $ ytimes      : int [1:416, 1:8] 1 9 17 25 33 41 49 57 65 73 ... ##  $ n_series    : int 8 ##  $ sp          : Named num [1:9] 5.81 0.965 4.058 2.407 13.975 ... ##   ..- attr(*, \\\"names\\\")= chr [1:9] \\\"s(epiWeek):seriesBLAN_005\\\" \\\"s(epiWeek):seriesBLAN_012\\\" \\\"s(epiWeek):seriesSCBI_002\\\" \\\"s(epiWeek):seriesSCBI_013\\\" ... ##  $ y_observed  : num [1:416, 1:8] 0 0 0 0 0 0 0 0 0 0 ... ##  $ total_obs   : int 3328 ##  $ num_basis   : int 73 ##  $ n_sp        : num 9 ##  $ n_nonmissing: int 400 ##  $ obs_ind     : int [1:400] 89 93 98 101 115 118 121 124 127 130 ... ##  $ flat_ys     : num [1:400] 2 0 0 0 0 0 0 25 36 14 ... ##  $ flat_xs     : num [1:400, 1:73] 1 1 1 1 1 1 1 1 1 1 ... ##   ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. ..$ : chr [1:400] \\\"705\\\" \\\"737\\\" \\\"777\\\" \\\"801\\\" ... ##   .. ..$ : chr [1:73] \\\"X.Intercept.\\\" \\\"V2\\\" \\\"V3\\\" \\\"V4\\\" ... ##  - attr(*, \\\"trend_model\\\")= chr \\\"AR1\\\" code(testmod) ## // Stan model code generated by package mvgam ## data { ##   int<lower=0> total_obs; // total number of observations ##   int<lower=0> n; // number of timepoints per series ##   int<lower=0> n_sp; // number of smoothing parameters ##   int<lower=0> n_series; // number of series ##   int<lower=0> num_basis; // total number of basis coefficients ##   vector[num_basis] zero; // prior locations for basis coefficients ##   matrix[total_obs, num_basis] X; // mgcv GAM design matrix ##   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) ##   matrix[8, 8] S1; // mgcv smooth penalty matrix S1 ##   matrix[8, 8] S2; // mgcv smooth penalty matrix S2 ##   matrix[8, 8] S3; // mgcv smooth penalty matrix S3 ##   matrix[8, 8] S4; // mgcv smooth penalty matrix S4 ##   matrix[8, 8] S5; // mgcv smooth penalty matrix S5 ##   matrix[8, 8] S6; // mgcv smooth penalty matrix S6 ##   matrix[8, 8] S7; // mgcv smooth penalty matrix S7 ##   matrix[8, 8] S8; // mgcv smooth penalty matrix S8 ##   int<lower=0> n_nonmissing; // number of nonmissing observations ##   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations ##   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations ##   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations ## } ## parameters { ##   // raw basis coefficients ##   vector[num_basis] b_raw; ##    ##   // random effect variances ##   vector<lower=0>[1] sigma_raw; ##    ##   // random effect means ##   vector[1] mu_raw; ##    ##   // latent trend AR1 terms ##   vector<lower=-1.5, upper=1.5>[n_series] ar1; ##    ##   // latent trend variance parameters ##   vector<lower=0>[n_series] sigma; ##    ##   // latent trends ##   matrix[n, n_series] trend; ##    ##   // smoothing parameters ##   vector<lower=0>[n_sp] lambda; ## } ## transformed parameters { ##   // basis coefficients ##   vector[num_basis] b; ##   b[1 : 65] = b_raw[1 : 65]; ##   b[66 : 73] = mu_raw[1] + b_raw[66 : 73] * sigma_raw[1]; ## } ## model { ##   // prior for random effect population variances ##   sigma_raw ~ student_t(3, 0, 2.5); ##    ##   // prior for random effect population means ##   mu_raw ~ std_normal(); ##    ##   // prior for (Intercept)... ##   b_raw[1] ~ student_t(3, -2.3, 2.5); ##    ##   // prior for s(epiWeek):seriesBLAN_005... ##   b_raw[2 : 9] ~ multi_normal_prec(zero[2 : 9], S1[1 : 8, 1 : 8] * lambda[1]); ##    ##   // prior for s(epiWeek):seriesBLAN_012... ##   b_raw[10 : 17] ~ multi_normal_prec(zero[10 : 17], ##                                      S2[1 : 8, 1 : 8] * lambda[2]); ##    ##   // prior for s(epiWeek):seriesSCBI_002... ##   b_raw[18 : 25] ~ multi_normal_prec(zero[18 : 25], ##                                      S3[1 : 8, 1 : 8] * lambda[3]); ##    ##   // prior for s(epiWeek):seriesSCBI_013... ##   b_raw[26 : 33] ~ multi_normal_prec(zero[26 : 33], ##                                      S4[1 : 8, 1 : 8] * lambda[4]); ##    ##   // prior for s(epiWeek):seriesSERC_001... ##   b_raw[34 : 41] ~ multi_normal_prec(zero[34 : 41], ##                                      S5[1 : 8, 1 : 8] * lambda[5]); ##    ##   // prior for s(epiWeek):seriesSERC_005... ##   b_raw[42 : 49] ~ multi_normal_prec(zero[42 : 49], ##                                      S6[1 : 8, 1 : 8] * lambda[6]); ##    ##   // prior for s(epiWeek):seriesSERC_006... ##   b_raw[50 : 57] ~ multi_normal_prec(zero[50 : 57], ##                                      S7[1 : 8, 1 : 8] * lambda[7]); ##    ##   // prior for s(epiWeek):seriesSERC_012... ##   b_raw[58 : 65] ~ multi_normal_prec(zero[58 : 65], ##                                      S8[1 : 8, 1 : 8] * lambda[8]); ##    ##   // prior (non-centred) for s(series)... ##   b_raw[66 : 73] ~ std_normal(); ##    ##   // priors for AR parameters ##   ar1 ~ std_normal(); ##    ##   // priors for smoothing parameters ##   lambda ~ normal(5, 30); ##    ##   // priors for latent trend variance parameters ##   sigma ~ student_t(3, 0, 2.5); ##    ##   // trend estimates ##   trend[1, 1 : n_series] ~ normal(0, sigma); ##   for (s in 1 : n_series) { ##     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]); ##   } ##   { ##     // likelihood functions ##     vector[n_nonmissing] flat_trends; ##     flat_trends = to_vector(trend)[obs_ind]; ##     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0, ##                               append_row(b, 1.0)); ##   } ## } ## generated quantities { ##   vector[total_obs] eta; ##   matrix[n, n_series] mus; ##   vector[n_sp] rho; ##   vector[n_series] tau; ##   array[n, n_series] int ypred; ##   rho = log(lambda); ##   for (s in 1 : n_series) { ##     tau[s] = pow(sigma[s], -2.0); ##   } ##    ##   // posterior predictions ##   eta = X * b; ##   for (s in 1 : n_series) { ##     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; ##     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]); ##   } ## }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\",\"id\":\"simulating-discrete-time-series\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Simulating discrete time series\",\"title\":\"Forecasting and forecast evaluation in mvgam\",\"text\":\"begin simulating data show forecasts computed evaluated mvgam. sim_mvgam() function can used simulate series come variety response distributions well seasonal patterns /dynamic temporal patterns. simulate collection three time count-valued series. series share seasonal pattern different temporal dynamics. setting trend_model = 'GP' prop_trend = 0.75, generating time series smooth underlying temporal trends (evolving Gaussian Processes squared exponential kernel) moderate seasonal patterns. observations Poisson-distributed allow 10% observations missing. returned object list containing training testing data (sim_mvgam() automatically splits data folds us) together information data generating process used simulate data series case shared seasonal pattern, can visualise:  resulting time series similar might encounter dealing count-valued data can take small counts:  individual series, can plot training testing data, well specific features observed data:\",\"code\":\"set.seed(2345) simdat <- sim_mvgam(T = 100,                      n_series = 3,                      trend_model = 'GP',                     prop_trend = 0.75,                     family = poisson(),                     prop_missing = 0.10) str(simdat) ## List of 6 ##  $ data_train        :'data.frame':  225 obs. of  5 variables: ##   ..$ y     : int [1:225] 0 1 3 0 0 0 1 0 3 1 ... ##   ..$ season: int [1:225] 1 1 1 2 2 2 3 3 3 4 ... ##   ..$ year  : int [1:225] 1 1 1 1 1 1 1 1 1 1 ... ##   ..$ series: Factor w/ 3 levels \\\"series_1\\\",\\\"series_2\\\",..: 1 2 3 1 2 3 1 2 3 1 ... ##   ..$ time  : int [1:225] 1 1 1 2 2 2 3 3 3 4 ... ##  $ data_test         :'data.frame':  75 obs. of  5 variables: ##   ..$ y     : int [1:75] 0 1 1 0 0 0 2 2 0 NA ... ##   ..$ season: int [1:75] 4 4 4 5 5 5 6 6 6 7 ... ##   ..$ year  : int [1:75] 7 7 7 7 7 7 7 7 7 7 ... ##   ..$ series: Factor w/ 3 levels \\\"series_1\\\",\\\"series_2\\\",..: 1 2 3 1 2 3 1 2 3 1 ... ##   ..$ time  : int [1:75] 76 76 76 77 77 77 78 78 78 79 ... ##  $ true_corrs        : num [1:3, 1:3] 1 0.465 -0.577 0.465 1 ... ##  $ true_trends       : num [1:100, 1:3] -1.45 -1.54 -1.61 -1.67 -1.73 ... ##  $ global_seasonality: num [1:100] 0.0559 0.6249 1.3746 1.6805 0.5246 ... ##  $ trend_params      :List of 2 ##   ..$ alpha: num [1:3] 0.767 0.988 0.897 ##   ..$ rho  : num [1:3] 6.02 6.94 5.04 plot(simdat$global_seasonality[1:12],       type = 'l', lwd = 2,      ylab = 'Relative effect',      xlab = 'Season',      bty = 'l') plot_mvgam_series(data = simdat$data_train,                    series = 'all') plot_mvgam_series(data = simdat$data_train,                    newdata = simdat$data_test,                   series = 1) plot_mvgam_series(data = simdat$data_train,                    newdata = simdat$data_test,                   series = 2) plot_mvgam_series(data = simdat$data_train,                    newdata = simdat$data_test,                   series = 3)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\",\"id\":\"modelling-dynamics-with-splines\",\"dir\":\"Articles\",\"previous_headings\":\"Simulating discrete time series\",\"what\":\"Modelling dynamics with splines\",\"title\":\"Forecasting and forecast evaluation in mvgam\",\"text\":\"first model fit uses shared cyclic spline capture repeated seasonality, well series-specific splines time capture long-term dynamics. allow temporal splines fairly complex can capture much temporal variation possible: model fits without issue: can plot partial effects splines see estimated highly nonlinear\",\"code\":\"mod1 <- mvgam(y ~ s(season, bs = 'cc', k = 8) +                  s(time, by = series, bs = 'cr', k = 20),               knots = list(season = c(0.5, 12.5)),               trend_model = 'None',               data = simdat$data_train) summary(mod1, include_betas = FALSE) ## GAM formula: ## y ~ s(season, bs = \\\"cc\\\", k = 8) + s(time, by = series, bs = \\\"cr\\\",  ##     k = 20) ##  ## Family: ## poisson ##  ## Link function: ## log ##  ## Trend model: ## None ##  ## N series: ## 3  ##  ## N timepoints: ## 75  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM coefficient (beta) estimates: ##              2.5%   50%  97.5% Rhat n_eff ## (Intercept) -0.41 -0.21 -0.039    1   813 ##  ## Approximate significance of GAM observation smooths: ##                         edf Chi.sq p-value     ## s(season)              3.77   9.48 0.01603 *   ## s(time):seriesseries_1 6.50  13.64 0.09218 .   ## s(time):seriesseries_2 9.49 256.09 0.00021 *** ## s(time):seriesseries_3 5.93  16.79 0.04680 *   ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:39:55 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot(mod1, type = 'smooths')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\",\"id\":\"modelling-dynamics-with-gps\",\"dir\":\"Articles\",\"previous_headings\":\"Simulating discrete time series\",\"what\":\"Modelling dynamics with GPs\",\"title\":\"Forecasting and forecast evaluation in mvgam\",\"text\":\"showing produce evaluate forecasts, fit second model data two models can compared. model equivalent , except now use Gaussian Processes model series-specific dynamics. makes use gp() function brms, can fit Hilbert space approximate GPs. See ?brms::gp details. summary model now contains information GP parameters time series: can plot posteriors parameters, parameter matter, using bayesplot routines. First marginal deviation (\\\\(\\\\alpha\\\\)) parameters:  now length scale (\\\\(\\\\rho\\\\)) parameters:  can also plot nonlinear effects : can also plotted using marginaleffects utilities:  estimates temporal trends fairly similar two models, see produce similar forecasts\",\"code\":\"mod2 <- mvgam(y ~ s(season, bs = 'cc', k = 8) +                  gp(time, by = series, c = 5/4, k = 20,                    scale = FALSE),               knots = list(season = c(0.5, 12.5)),               trend_model = 'None',               data = simdat$data_train) summary(mod2, include_betas = FALSE) ## GAM formula: ## y ~ s(season, bs = \\\"cc\\\", k = 8) + gp(time, by = series, c = 5/4,  ##     k = 20, scale = FALSE) ##  ## Family: ## poisson ##  ## Link function: ## log ##  ## Trend model: ## None ##  ## N series: ## 3  ##  ## N timepoints: ## 75  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM coefficient (beta) estimates: ##             2.5%   50% 97.5% Rhat n_eff ## (Intercept) -1.1 -0.52  0.31    1   768 ##  ## GAM gp term marginal deviation (alpha) and length scale (rho) estimates: ##                               2.5%  50% 97.5% Rhat n_eff ## alpha_gp(time):seriesseries_1 0.21  0.8   2.1 1.01   763 ## alpha_gp(time):seriesseries_2 0.74  1.4   2.9 1.00  1028 ## alpha_gp(time):seriesseries_3 0.50  1.1   2.8 1.00  1026 ## rho_gp(time):seriesseries_1   1.20  5.1  23.0 1.00   681 ## rho_gp(time):seriesseries_2   2.20 10.0  17.0 1.00   644 ## rho_gp(time):seriesseries_3   1.50  8.8  23.0 1.00   819 ##  ## Approximate significance of GAM observation smooths: ##           edf Chi.sq p-value     ## s(season)   6     25 0.00016 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 4 of 2000 iterations ended with a divergence (0.2%) ##  *Try running with larger adapt_delta to remove the divergences ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:40:58 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) mcmc_plot(mod2, variable = c('alpha_gp'), regex = TRUE, type = 'areas') mcmc_plot(mod2, variable = c('rho_gp'), regex = TRUE, type = 'areas') plot(mod2, type = 'smooths') require('ggplot2') plot_predictions(mod2,                   condition = c('time', 'series', 'series'),                  type = 'link') +   theme(legend.position = 'none')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\",\"id\":\"forecasting-with-the-forecast-function\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Forecasting with the forecast() function\",\"title\":\"Forecasting and forecast evaluation in mvgam\",\"text\":\"Probabilistic forecasts can computed two main ways mvgam. first take model fit training data (two example models) produce temporal predictions posterior predictive distribution feeding newdata forecast() function. crucial newdata fed forecast() function follows sequentially data used fit model (internally checked package might headache data supplied specific time-order). calling forecast() function, option generate different kinds predictions (.e. predicting link scale, response scale produce expectations; see ?forecast.mvgam details). use default produce forecasts response scale, common way evaluate forecast distributions objects created class mvgam_forecast, contain information hindcast distributions, forecast distributions true observations series data: can plot forecasts series model using S3 plot method objects class:       Clearly two models produce equivalent forecasts. come back scoring forecasts moment.\",\"code\":\"fc_mod1 <- forecast(mod1, newdata = simdat$data_test) fc_mod2 <- forecast(mod2, newdata = simdat$data_test) str(fc_mod1) ## List of 16 ##  $ call              :Class 'formula'  language y ~ s(season, bs = \\\"cc\\\", k = 8) + s(time, by = series, bs = \\\"cr\\\", k = 20) ##   .. ..- attr(*, \\\".Environment\\\")=<environment: R_GlobalEnv>  ##  $ trend_call        : NULL ##  $ family            : chr \\\"poisson\\\" ##  $ family_pars       : NULL ##  $ trend_model       : chr \\\"None\\\" ##  $ drift             : logi FALSE ##  $ use_lv            : logi FALSE ##  $ fit_engine        : chr \\\"stan\\\" ##  $ type              : chr \\\"response\\\" ##  $ series_names      : Factor w/ 3 levels \\\"series_1\\\",\\\"series_2\\\",..: 1 2 3 ##  $ train_observations:List of 3 ##   ..$ series_1: int [1:75] 0 0 1 1 0 0 0 0 0 0 ... ##   ..$ series_2: int [1:75] 1 0 0 1 1 0 1 0 1 2 ... ##   ..$ series_3: int [1:75] 3 0 3 NA 2 1 1 1 1 3 ... ##  $ train_times       : int [1:75] 1 2 3 4 5 6 7 8 9 10 ... ##  $ test_observations :List of 3 ##   ..$ series_1: int [1:25] 0 0 2 NA 0 2 2 1 1 1 ... ##   ..$ series_2: int [1:25] 1 0 2 1 1 3 0 1 0 NA ... ##   ..$ series_3: int [1:25] 1 0 0 1 0 0 1 0 1 0 ... ##  $ test_times        : int [1:25] 76 77 78 79 80 81 82 83 84 85 ... ##  $ hindcasts         :List of 3 ##   ..$ series_1: num [1:2000, 1:75] 1 1 0 0 0 1 1 1 0 0 ... ##   .. ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. .. ..$ : NULL ##   .. .. ..$ : chr [1:75] \\\"ypred[1,1]\\\" \\\"ypred[2,1]\\\" \\\"ypred[3,1]\\\" \\\"ypred[4,1]\\\" ... ##   ..$ series_2: num [1:2000, 1:75] 0 0 0 0 0 0 0 1 0 0 ... ##   .. ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. .. ..$ : NULL ##   .. .. ..$ : chr [1:75] \\\"ypred[1,2]\\\" \\\"ypred[2,2]\\\" \\\"ypred[3,2]\\\" \\\"ypred[4,2]\\\" ... ##   ..$ series_3: num [1:2000, 1:75] 3 0 2 1 0 1 2 1 5 1 ... ##   .. ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. .. ..$ : NULL ##   .. .. ..$ : chr [1:75] \\\"ypred[1,3]\\\" \\\"ypred[2,3]\\\" \\\"ypred[3,3]\\\" \\\"ypred[4,3]\\\" ... ##  $ forecasts         :List of 3 ##   ..$ series_1: num [1:2000, 1:25] 1 3 2 1 0 0 1 1 0 0 ... ##   ..$ series_2: num [1:2000, 1:25] 6 0 0 0 0 2 0 0 0 0 ... ##   ..$ series_3: num [1:2000, 1:25] 0 1 1 3 3 1 3 2 4 2 ... ##  - attr(*, \\\"class\\\")= chr \\\"mvgam_forecast\\\" plot(fc_mod1, series = 1) ## Out of sample CRPS: ## [1] 14.62964 plot(fc_mod2, series = 1) ## Out of sample DRPS: ## [1] 10.92516 plot(fc_mod1, series = 2) ## Out of sample CRPS: ## [1] 84201962708 plot(fc_mod2, series = 2) ## Out of sample DRPS: ## [1] 14.31168 plot(fc_mod1, series = 3) ## Out of sample CRPS: ## [1] 32.44136 plot(fc_mod2, series = 3) ## Out of sample DRPS: ## [1] 15.44332\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\",\"id\":\"forecasting-with-newdata-in-mvgam\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Forecasting with newdata in mvgam()\",\"title\":\"Forecasting and forecast evaluation in mvgam\",\"text\":\"second way can produce forecasts mvgam feed testing data directly mvgam() function newdata. include testing data missing observations automatically predicted posterior predictive distribution using generated quantities block Stan. example, can refit mod2 include testing data automatic forecasts: model already contains forecast distribution, need feed newdata forecast() function: forecasts nearly identical calculated previously:\",\"code\":\"mod2 <- mvgam(y ~ s(season, bs = 'cc', k = 8) +                  gp(time, by = series, c = 5/4, k = 20,                    scale = FALSE),               knots = list(season = c(0.5, 12.5)),               trend_model = 'None',               data = simdat$data_train,               newdata = simdat$data_test) fc_mod2 <- forecast(mod2) plot(fc_mod2, series = 1) ## Out of sample DRPS: ## [1] 10.85762\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\",\"id\":\"scoring-forecast-distributions\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Scoring forecast distributions\",\"title\":\"Forecasting and forecast evaluation in mvgam\",\"text\":\"primary purpose mvgam_forecast class readily allow forecast evaluations series data, using variety possible scoring functions. See ?mvgam::score.mvgam_forecast view types scores available. useful scoring metric Continuous Rank Probability Score (CRPS). CRPS value similar might get calculated weighted absolute error using full forecast distribution. returned list contains data.frame series data shows CRPS score evaluation testing data, along useful information fit forecast distribution. particular, given logical value (1s 0s) telling us whether true value within pre-specified credible interval (.e. coverage forecast distribution). default interval width 0.9, hope values in_interval column take 1 approximately 90% time. value can changed wish compute different coverages, say using 60% interval: can also compare forecasts sample observations using Expected Log Predictive Density (ELPD; also known log score). ELPD strictly proper scoring rule can applied distributional forecast, compute need predictions link scale rather outcome scale. advantageous change type prediction can get using forecast() function: Finally, multiple time series may also make sense use multivariate proper scoring rule. mvgam offers two options: Energy score Variogram score. first penalizes forecast distributions less well calibrated truth, second penalizes forecasts capture observed true correlation structure. score use depends goals, easy compute: returned object still provides information interval coverage individual series, single score per horizon now (provided all_series slot): can use score(s) choice compare different models. example, can compute plot difference CRPS scores series data. , negative value means Gaussian Process model (mod2) better, positive value means spline model (mod1) better.    GP model consistently gives better forecasts, difference scores grows quickly forecast horizon increases. unexpected given way splines linearly extrapolate outside range training data\",\"code\":\"crps_mod1 <- score(fc_mod1, score = 'crps') str(crps_mod1) ## List of 4 ##  $ series_1  :'data.frame':  25 obs. of  5 variables: ##   ..$ score         : num [1:25] 0.1938 0.1366 1.355 NA 0.0348 ... ##   ..$ in_interval   : num [1:25] 1 1 1 NA 1 1 1 1 1 1 ... ##   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ... ##   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##   ..$ score_type    : chr [1:25] \\\"crps\\\" \\\"crps\\\" \\\"crps\\\" \\\"crps\\\" ... ##  $ series_2  :'data.frame':  25 obs. of  5 variables: ##   ..$ score         : num [1:25] 0.379 0.306 0.941 0.5 0.573 ... ##   ..$ in_interval   : num [1:25] 1 1 1 1 1 1 1 1 1 NA ... ##   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ... ##   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##   ..$ score_type    : chr [1:25] \\\"crps\\\" \\\"crps\\\" \\\"crps\\\" \\\"crps\\\" ... ##  $ series_3  :'data.frame':  25 obs. of  5 variables: ##   ..$ score         : num [1:25] 0.32 0.556 0.379 0.362 0.219 ... ##   ..$ in_interval   : num [1:25] 1 1 1 1 1 1 1 1 1 1 ... ##   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ... ##   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##   ..$ score_type    : chr [1:25] \\\"crps\\\" \\\"crps\\\" \\\"crps\\\" \\\"crps\\\" ... ##  $ all_series:'data.frame':  25 obs. of  3 variables: ##   ..$ score       : num [1:25] 0.892 0.999 2.675 NA 0.827 ... ##   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##   ..$ score_type  : chr [1:25] \\\"sum_crps\\\" \\\"sum_crps\\\" \\\"sum_crps\\\" \\\"sum_crps\\\" ... crps_mod1$series_1 ##         score in_interval interval_width eval_horizon score_type ## 1  0.19375525           1            0.9            1       crps ## 2  0.13663925           1            0.9            2       crps ## 3  1.35502175           1            0.9            3       crps ## 4          NA          NA            0.9            4       crps ## 5  0.03482775           1            0.9            5       crps ## 6  1.55416700           1            0.9            6       crps ## 7  1.51028900           1            0.9            7       crps ## 8  0.62121225           1            0.9            8       crps ## 9  0.62630125           1            0.9            9       crps ## 10 0.59853100           1            0.9           10       crps ## 11 1.30998625           1            0.9           11       crps ## 12 2.04829775           1            0.9           12       crps ## 13 0.61251800           1            0.9           13       crps ## 14 0.14052300           1            0.9           14       crps ## 15 0.65110800           1            0.9           15       crps ## 16 0.07973125           1            0.9           16       crps ## 17 0.07675600           1            0.9           17       crps ## 18 0.09382375           1            0.9           18       crps ## 19 0.12356725           1            0.9           19       crps ## 20         NA          NA            0.9           20       crps ## 21 0.20173600           1            0.9           21       crps ## 22 0.84066825           1            0.9           22       crps ## 23         NA          NA            0.9           23       crps ## 24 1.06489225           1            0.9           24       crps ## 25 0.75528825           1            0.9           25       crps crps_mod1 <- score(fc_mod1, score = 'crps', interval_width = 0.6) crps_mod1$series_1 ##         score in_interval interval_width eval_horizon score_type ## 1  0.19375525           1            0.6            1       crps ## 2  0.13663925           1            0.6            2       crps ## 3  1.35502175           0            0.6            3       crps ## 4          NA          NA            0.6            4       crps ## 5  0.03482775           1            0.6            5       crps ## 6  1.55416700           0            0.6            6       crps ## 7  1.51028900           0            0.6            7       crps ## 8  0.62121225           1            0.6            8       crps ## 9  0.62630125           1            0.6            9       crps ## 10 0.59853100           1            0.6           10       crps ## 11 1.30998625           0            0.6           11       crps ## 12 2.04829775           0            0.6           12       crps ## 13 0.61251800           1            0.6           13       crps ## 14 0.14052300           1            0.6           14       crps ## 15 0.65110800           1            0.6           15       crps ## 16 0.07973125           1            0.6           16       crps ## 17 0.07675600           1            0.6           17       crps ## 18 0.09382375           1            0.6           18       crps ## 19 0.12356725           1            0.6           19       crps ## 20         NA          NA            0.6           20       crps ## 21 0.20173600           1            0.6           21       crps ## 22 0.84066825           1            0.6           22       crps ## 23         NA          NA            0.6           23       crps ## 24 1.06489225           1            0.6           24       crps ## 25 0.75528825           1            0.6           25       crps link_mod1 <- forecast(mod1, newdata = simdat$data_test, type = 'link') score(link_mod1, score = 'elpd')$series_1 ##         score eval_horizon score_type ## 1  -0.5304414            1       elpd ## 2  -0.4298955            2       elpd ## 3  -2.9617583            3       elpd ## 4          NA            4       elpd ## 5  -0.2007644            5       elpd ## 6  -3.3781408            6       elpd ## 7  -3.2729088            7       elpd ## 8  -2.0363750            8       elpd ## 9  -2.0670612            9       elpd ## 10 -2.0844818           10       elpd ## 11 -3.0576463           11       elpd ## 12 -3.6291058           12       elpd ## 13 -2.1692669           13       elpd ## 14 -0.2960899           14       elpd ## 15 -2.3738851           15       elpd ## 16 -0.2160804           16       elpd ## 17 -0.2036782           17       elpd ## 18 -0.2115539           18       elpd ## 19 -0.2235072           19       elpd ## 20         NA           20       elpd ## 21 -0.2413680           21       elpd ## 22 -2.6791984           22       elpd ## 23         NA           23       elpd ## 24 -2.6851981           24       elpd ## 25 -0.2836901           25       elpd energy_mod2 <- score(fc_mod2, score = 'energy') str(energy_mod2) ## List of 4 ##  $ series_1  :'data.frame':  25 obs. of  3 variables: ##   ..$ in_interval   : num [1:25] 1 1 1 NA 1 1 1 1 1 1 ... ##   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ... ##   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##  $ series_2  :'data.frame':  25 obs. of  3 variables: ##   ..$ in_interval   : num [1:25] 1 1 1 1 1 1 1 1 1 NA ... ##   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ... ##   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##  $ series_3  :'data.frame':  25 obs. of  3 variables: ##   ..$ in_interval   : num [1:25] 1 1 1 1 1 1 1 1 1 1 ... ##   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ... ##   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##  $ all_series:'data.frame':  25 obs. of  3 variables: ##   ..$ score       : num [1:25] 0.773 1.147 1.226 NA 0.458 ... ##   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ... ##   ..$ score_type  : chr [1:25] \\\"energy\\\" \\\"energy\\\" \\\"energy\\\" \\\"energy\\\" ... energy_mod2$all_series ##        score eval_horizon score_type ## 1  0.7728517            1     energy ## 2  1.1469836            2     energy ## 3  1.2258781            3     energy ## 4         NA            4     energy ## 5  0.4577536            5     energy ## 6  1.8094487            6     energy ## 7  1.4887317            7     energy ## 8  0.7651593            8     energy ## 9  1.1180634            9     energy ## 10        NA           10     energy ## 11 1.5008324           11     energy ## 12 3.2142460           12     energy ## 13 1.6129732           13     energy ## 14 1.2704438           14     energy ## 15 1.1335958           15     energy ## 16 1.8717420           16     energy ## 17        NA           17     energy ## 18 0.7953392           18     energy ## 19 0.9919119           19     energy ## 20        NA           20     energy ## 21 1.2461964           21     energy ## 22 1.5170615           22     energy ## 23        NA           23     energy ## 24 2.3824552           24     energy ## 25 1.5314557           25     energy crps_mod1 <- score(fc_mod1, score = 'crps') crps_mod2 <- score(fc_mod2, score = 'crps')  diff_scores <- crps_mod2$series_1$score -   crps_mod1$series_1$score plot(diff_scores, pch = 16, cex = 1.25, col = 'darkred',       ylim = c(-1*max(abs(diff_scores), na.rm = TRUE),               max(abs(diff_scores), na.rm = TRUE)),      bty = 'l',      xlab = 'Forecast horizon',      ylab = expression(CRPS[GP]~-~CRPS[spline])) abline(h = 0, lty = 'dashed', lwd = 2) gp_better <- length(which(diff_scores < 0)) title(main = paste0('GP better in ', gp_better, ' of 25 evaluations',                     '\\\\nMean difference = ',                      round(mean(diff_scores, na.rm = TRUE), 2))) diff_scores <- crps_mod2$series_2$score -   crps_mod1$series_2$score plot(diff_scores, pch = 16, cex = 1.25, col = 'darkred',       ylim = c(-1*max(abs(diff_scores), na.rm = TRUE),               max(abs(diff_scores), na.rm = TRUE)),      bty = 'l',      xlab = 'Forecast horizon',      ylab = expression(CRPS[GP]~-~CRPS[spline])) abline(h = 0, lty = 'dashed', lwd = 2) gp_better <- length(which(diff_scores < 0)) title(main = paste0('GP better in ', gp_better, ' of 25 evaluations',                     '\\\\nMean difference = ',                      round(mean(diff_scores, na.rm = TRUE), 2))) diff_scores <- crps_mod2$series_3$score -   crps_mod1$series_3$score plot(diff_scores, pch = 16, cex = 1.25, col = 'darkred',       ylim = c(-1*max(abs(diff_scores), na.rm = TRUE),               max(abs(diff_scores), na.rm = TRUE)),      bty = 'l',      xlab = 'Forecast horizon',      ylab = expression(CRPS[GP]~-~CRPS[spline])) abline(h = 0, lty = 'dashed', lwd = 2) gp_better <- length(which(diff_scores < 0)) title(main = paste0('GP better in ', gp_better, ' of 25 evaluations',                     '\\\\nMean difference = ',                      round(mean(diff_scores, na.rm = TRUE), 2)))\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html\",\"id\":\"further-reading\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Further reading\",\"title\":\"Forecasting and forecast evaluation in mvgam\",\"text\":\"following papers resources offer useful material Bayesian forecasting proper scoring rules: Hyndman, Rob J., George Athanasopoulos. Forecasting: principles practice. OTexts, 2018. Gneiting, Tilmann, Adrian E. Raftery. Strictly proper scoring rules, prediction, estimation Journal American statistical Association 102.477 (2007) 359-378. Simonis, Juniper L., Ethan P. White, SK Morgan Ernest. Evaluating probabilistic ecological forecasts Ecology 102.8 (2021) e03431.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"dynamic-gams\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Dynamic GAMs\",\"title\":\"Overview of the mvgam package\",\"text\":\"mvgam designed propagate unobserved temporal processes capture latent dynamics observed time series. works state-space format, temporal trend evolving independently observation process. introduction package worked examples also shown seminar: Ecological Forecasting Dynamic Generalized Additive Models. Briefly, assume \\\\(\\\\tilde{\\\\boldsymbol{y}}_{,t}\\\\) conditional expectation response variable \\\\(\\\\boldsymbol{}\\\\) time \\\\(\\\\boldsymbol{t}\\\\). Assuming \\\\(\\\\boldsymbol{y_i}\\\\) drawn exponential distribution invertible link function, linear predictor multivariate Dynamic GAM can written : \\\\[~~~1:N_{series}~...\\\\] \\\\[~t~~1:N_{timepoints}~...\\\\] \\\\[g^{-1}(\\\\tilde{\\\\boldsymbol{y}}_{,t})=\\\\alpha_{}+\\\\sum\\\\limits_{j=1}^J\\\\boldsymbol{s}_{,j,t}\\\\boldsymbol{x}_{j,t}+\\\\boldsymbol{z}_{,t}\\\\,,\\\\] \\\\(\\\\alpha\\\\) unknown intercepts, \\\\(\\\\boldsymbol{s}\\\\)’s unknown smooth functions covariates (\\\\(\\\\boldsymbol{x}\\\\)’s), can potentially vary among response series, \\\\(\\\\boldsymbol{z}\\\\) dynamic latent processes. smooth function \\\\(\\\\boldsymbol{s_j}\\\\) composed basis expansions whose coefficients, must estimated, control functional relationship \\\\(\\\\boldsymbol{x}_{j}\\\\) \\\\(g^{-1}(\\\\tilde{\\\\boldsymbol{y}})\\\\). size basis expansion limits smooth’s potential complexity. larger set basis functions allows greater flexibility. Several advantages GAMs can model diversity response families, including discrete distributions (.e. Poisson, Negative Binomial, Gamma) accommodate common ecological features zero-inflation overdispersion, can formulated include hierarchical smoothing multivariate responses. mvgam supports number different observation families, summarized :\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"supported-observation-families\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Supported observation families\",\"title\":\"Overview of the mvgam package\",\"text\":\"supported observation families, extra parameters need estimated (.e. \\\\(\\\\sigma\\\\) Gaussian model \\\\(\\\\phi\\\\) Negative Binomial model) estimated independently series. Note default link functions currently changed mvgam.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"supported-temporal-dynamic-processes\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Supported temporal dynamic processes\",\"title\":\"Overview of the mvgam package\",\"text\":\"dynamic processes can take wide variety forms, can multivariate allow different time series interact correlated. using mvgam() function, user chooses different process models trend_model argument. Available process models described detail .\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"independent-random-walks\",\"dir\":\"Articles\",\"previous_headings\":\"Supported temporal dynamic processes\",\"what\":\"Independent Random Walks\",\"title\":\"Overview of the mvgam package\",\"text\":\"Use trend_model = 'RW' trend_model = RW() set model series data independent latent temporal dynamics form: \\\\[\\\\begin{align*} z_{,t} & \\\\sim \\\\text{Normal}(z_{,t-1}, \\\\sigma_i) \\\\end{align*}\\\\] Process error parameters \\\\(\\\\sigma\\\\) modeled independently series. moving average process required, use trend_model = RW(ma = TRUE) set following: \\\\[\\\\begin{align*} z_{,t} & = z_{,t-1} + \\\\theta_i * error_{,t-1} + error_{,t} \\\\\\\\ error_{,t} & \\\\sim \\\\text{Normal}(0, \\\\sigma_i) \\\\end{align*}\\\\] Moving average coefficients \\\\(\\\\theta\\\\) independently estimated series forced stationary default \\\\((abs(\\\\theta)<1)\\\\). moving averages order \\\\(q=1\\\\) currently allowed.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"multivariate-random-walks\",\"dir\":\"Articles\",\"previous_headings\":\"Supported temporal dynamic processes\",\"what\":\"Multivariate Random Walks\",\"title\":\"Overview of the mvgam package\",\"text\":\"one series included data \\\\((N_{series} > 1)\\\\), multivariate Random Walk can set using trend_model = RW(cor = TRUE), resulting following: \\\\[\\\\begin{align*} z_{t} & \\\\sim \\\\text{MVNormal}(z_{t-1}, \\\\Sigma) \\\\end{align*}\\\\] latent process estimate \\\\(z_t\\\\) now takes form vector. covariance matrix \\\\(\\\\Sigma\\\\) capture contemporaneously correlated process errors. parameterised using Cholesky factorization, requires priors series-level variances \\\\(\\\\sigma\\\\) strength correlations using Stan’s lkj_corr_cholesky distribution. Moving average terms can also included multivariate random walks, case moving average coefficients \\\\(\\\\theta\\\\) parameterised \\\\(N_{series} * N_{series}\\\\) matrix\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"autoregressive-processes\",\"dir\":\"Articles\",\"previous_headings\":\"Supported temporal dynamic processes\",\"what\":\"Autoregressive processes\",\"title\":\"Overview of the mvgam package\",\"text\":\"Autoregressive models \\\\(p=3\\\\), autoregressive coefficients estimated independently series, can used specifying trend_model = 'AR1', trend_model = 'AR2', trend_model = 'AR3', trend_model = AR(p = 1, 2, 3). example, univariate AR(1) model takes form: \\\\[\\\\begin{align*} z_{,t} & \\\\sim \\\\text{Normal}(ar1_i * z_{,t-1}, \\\\sigma_i) \\\\end{align*}\\\\] options Random Walks, additional options available placing priors autoregressive coefficients. default, coefficients forced stationarity, users can impose restriction changing upper lower bounds priors. See ?get_mvgam_priors details.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"vector-autoregressive-processes\",\"dir\":\"Articles\",\"previous_headings\":\"Supported temporal dynamic processes\",\"what\":\"Vector Autoregressive processes\",\"title\":\"Overview of the mvgam package\",\"text\":\"Vector Autoregression order \\\\(p=1\\\\) can specified \\\\(N_{series} > 1\\\\) using trend_model = 'VAR1' trend_model = VAR(). VAR(1) model takes form: \\\\[\\\\begin{align*} z_{t} & \\\\sim \\\\text{Normal}(* z_{t-1}, \\\\Sigma) \\\\end{align*}\\\\] \\\\(\\\\) \\\\(N_{series} * N_{series}\\\\) matrix autoregressive coefficients diagonals capture lagged self-dependence (.e. effect process time \\\\(t\\\\) estimate time \\\\(t+1\\\\)), -diagonals capture lagged cross-dependence (.e. effect process time \\\\(t\\\\) process another series time \\\\(t+1\\\\)). default, covariance matrix \\\\(\\\\Sigma\\\\) assume process error covariance fixing -diagonals \\\\(0\\\\). allow correlated errors, use trend_model = 'VAR1cor' trend_model = VAR(cor = TRUE). moving average order \\\\(q=1\\\\) can also included using trend_model = VAR(ma = TRUE, cor = TRUE). Note VAR models, stationarity process enforced structured prior distribution described detail Heaps 2022 Heaps, Sarah E. “Enforcing stationarity prior vector autoregressions.” Journal Computational Graphical Statistics 32.1 (2023): 74-83.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"gaussian-processes\",\"dir\":\"Articles\",\"previous_headings\":\"Supported temporal dynamic processes\",\"what\":\"Gaussian Processes\",\"title\":\"Overview of the mvgam package\",\"text\":\"final option modelling temporal dynamics use Gaussian Process squared exponential kernel. set independently series (currently multivariate GP option), using trend_model = 'GP'. dynamics latent process modelled : \\\\[\\\\begin{align*} z & \\\\sim \\\\text{MVNormal}(0, \\\\Sigma_{error}) \\\\\\\\ \\\\Sigma_{error}[t_i, t_j] & = \\\\alpha^2 * exp(-0.5 * ((|t_i - t_j| / \\\\rho))^2) \\\\end{align*}\\\\] latent dynamic process evolves complex, high-dimensional Multivariate Normal distribution depends \\\\(\\\\rho\\\\) (often called length scale parameter) control quickly correlations model’s errors decay function time. models, covariance decays exponentially fast squared distance (time) observations. functions also depend parameter \\\\(\\\\alpha\\\\), controls marginal variability temporal function points; words controls much GP term contributes linear predictor. mvgam capitalizes advances allow GPs approximated using Hilbert space basis functions, considerably speed computation little cost accuracy prediction performance.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"piecewise-logistic-and-linear-trends\",\"dir\":\"Articles\",\"previous_headings\":\"Supported temporal dynamic processes\",\"what\":\"Piecewise logistic and linear trends\",\"title\":\"Overview of the mvgam package\",\"text\":\"Modeling growth many types time series often similar modeling population growth natural ecosystems, series exhibits nonlinear growth saturates particular carrying capacity. logistic trend model available {mvgam} allows time-varying capacity \\\\(C(t)\\\\) well non-constant growth rate. Changes base growth rate \\\\(k\\\\) incorporated explicitly defining changepoints throughout training period growth rate allowed vary. changepoint vector \\\\(\\\\) represented vector 1s 0s, rate growth time \\\\(t\\\\) represented \\\\(k+(t)^T\\\\delta\\\\). Potential changepoints selected uniformly across training period, number changepoints, well flexibility potential rate changes changepoints, can controlled using trend_model = PW(). full piecewise logistic growth model : \\\\[\\\\begin{align*} z_t & = \\\\frac{C_t}{1 + \\\\exp(-(k+(t)^T\\\\delta)(t-(m+(t)^T\\\\gamma)))}  \\\\end{align*}\\\\] time series appear exhibit saturating growth, piece-wise constant rate growth can often provide useful trend model. piecewise linear trend defined : \\\\[\\\\begin{align*} z_t & = (k+(t)^T\\\\delta)t + (m+(t)^T\\\\gamma)  \\\\end{align*}\\\\] trend models, \\\\(m\\\\) offset parameter controls trend intercept. parameter, recommended include intercept observation formula identifiable. can read full description piecewise linear logistic trends paper Taylor Letham. Sean J. Taylor Benjamin Letham. “Forecasting scale.” American Statistician 72.1 (2018): 37-45.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"regression-formulae\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Regression formulae\",\"title\":\"Overview of the mvgam package\",\"text\":\"mvgam supports observation model regression formula, built mvgcv package, well optional process model regression formula. formulae supplied exactly like supplied glm() except smooth terms, s(), te(), ti() t2(), time-varying effects using dynamic(), monotonically increasing (using s(x, bs = 'moi')) decreasing splines (using s(x, bs = 'mod'); see ?smooth.construct.moi.smooth.spec details), well Gaussian Process functions using gp(), can added right hand side (. supported mvgam formulae). See ?mvgam_formulae guidance. setting State-Space models, optional process model formula can used (see State-Space model vignette shared latent states vignette guidance using trend formulae).\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"example-time-series-data\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Example time series data\",\"title\":\"Overview of the mvgam package\",\"text\":\"‘portal_data’ object contains time series rodent captures Portal Project, long-term monitoring study based near town Portal, Arizona. Researchers operating standardized set baited traps within 24 experimental plots site since 1970’s. Sampling follows lunar monthly cycle, observations occurring average 28 days apart. However, missing observations occur due difficulties accessing site (weather events, COVID disruptions etc…). can read full sampling protocol preprint Ernest et al Biorxiv. data come pre-loaded mvgam package, can read little help page using ?portal_data. working data, important inspect data structured, first using head: glimpse function dplyr also useful understanding variables structured focus analyses time series captures one specific rodent species, Desert Pocket Mouse Chaetodipus penicillatus. species interesting goes kind “hibernation” colder months, leading low captures winter period\",\"code\":\"data(\\\"portal_data\\\") head(portal_data) ##   moon DM DO PP OT year month mintemp precipitation     ndvi ## 1  329 10  6  0  2 2004     1  -9.710          37.8 1.465889 ## 2  330 14  8  1  0 2004     2  -5.924           8.7 1.558507 ## 3  331  9  1  2  1 2004     3  -0.220          43.5 1.337817 ## 4  332 NA NA NA NA 2004     4   1.931          23.9 1.658913 ## 5  333 15  8 10  1 2004     5   6.568           0.9 1.853656 ## 6  334 NA NA NA NA 2004     6  11.590           1.4 1.761330 dplyr::glimpse(portal_data) ## Rows: 199 ## Columns: 10 ## $ moon          <int> 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 3… ## $ DM            <int> 10, 14, 9, NA, 15, NA, NA, 9, 5, 8, NA, 14, 7, NA, NA, 9… ## $ DO            <int> 6, 8, 1, NA, 8, NA, NA, 3, 3, 4, NA, 3, 8, NA, NA, 3, NA… ## $ PP            <int> 0, 1, 2, NA, 10, NA, NA, 16, 18, 12, NA, 3, 2, NA, NA, 1… ## $ OT            <int> 2, 0, 1, NA, 1, NA, NA, 1, 0, 0, NA, 2, 1, NA, NA, 1, NA… ## $ year          <int> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 20… ## $ month         <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,… ## $ mintemp       <dbl> -9.710, -5.924, -0.220, 1.931, 6.568, 11.590, 14.370, 16… ## $ precipitation <dbl> 37.8, 8.7, 43.5, 23.9, 0.9, 1.4, 20.3, 91.0, 60.5, 25.2,… ## $ ndvi          <dbl> 1.4658889, 1.5585069, 1.3378172, 1.6589129, 1.8536561, 1…\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"manipulating-data-for-modelling\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Manipulating data for modelling\",\"title\":\"Overview of the mvgam package\",\"text\":\"Manipulating data ‘long’ format necessary modelling mvgam. ‘long’ format, mean series x time observation needs entry dataframe list object wish use data modelling. simple example can viewed simulating data using sim_mvgam function. See ?sim_mvgam details Notice four different time series simulated data, spread outcome values different columns. Rather, single column outcome variable, labelled y simulated data. also must supply variable labelled time ensure modelling software knows arrange time series building models. setup still allows us formulate multivariate time series models, can see State-Space vignette. steps needed shape portal_data object correct form. First, create time variable, select column representing counts target species (PP), select appropriate variables can use predictors data now contain six variables:series, factor indexing time series observation belongs toyear, year samplingtime, indicator time step observation belongs tocount, response variable representing number captures species PP sampling observationmintemp, monthly average minimum temperature time stepndvi, monthly average Normalized Difference Vegetation Index time step Now check data structure can also summarize multiple variables, helpful search data ranges identify missing values NAs response variable count. Let’s visualize data heatmap get sense distributed (NAs shown red bars plot)  observations generally thrown modelling packages . see work tutorials, mvgam keeps data predictions can automatically returned full dataset. time series descriptive features can plotted using plot_mvgam_series():\",\"code\":\"data <- sim_mvgam(n_series = 4, T = 24) head(data$data_train, 12) ##    y season year   series time ## 1  1      1    1 series_1    1 ## 2  3      1    1 series_2    1 ## 3  2      1    1 series_3    1 ## 4  1      1    1 series_4    1 ## 5  0      2    1 series_1    2 ## 6  1      2    1 series_2    2 ## 7  1      2    1 series_3    2 ## 8  0      2    1 series_4    2 ## 9  0      3    1 series_1    3 ## 10 1      3    1 series_2    3 ## 11 0      3    1 series_3    3 ## 12 1      3    1 series_4    3 portal_data %>%      # mvgam requires a 'time' variable be present in the data to index   # the temporal observations. This is especially important when tracking    # multiple time series. In the Portal data, the 'moon' variable indexes the   # lunar monthly timestep of the trapping sessions   dplyr::mutate(time = moon - (min(moon)) + 1) %>%      # We can also provide a more informative name for the outcome variable, which    # is counts of the 'PP' species (Chaetodipus penicillatus) across all control   # plots   dplyr::mutate(count = PP) %>%      # The other requirement for mvgam is a 'series' variable, which needs to be a   # factor variable to index which time series each row in the data belongs to.   # Again, this is more useful when you have multiple time series in the data   dplyr::mutate(series = as.factor('PP')) %>%      # Select the variables of interest to keep in the model_data   dplyr::select(series, year, time, count, mintemp, ndvi) -> model_data head(model_data) ##   series year time count mintemp     ndvi ## 1     PP 2004    1     0  -9.710 1.465889 ## 2     PP 2004    2     1  -5.924 1.558507 ## 3     PP 2004    3     2  -0.220 1.337817 ## 4     PP 2004    4    NA   1.931 1.658913 ## 5     PP 2004    5    10   6.568 1.853656 ## 6     PP 2004    6    NA  11.590 1.761330 dplyr::glimpse(model_data) ## Rows: 199 ## Columns: 6 ## $ series  <fct> PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP… ## $ year    <int> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 20… ## $ time    <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,… ## $ count   <int> 0, 1, 2, NA, 10, NA, NA, 16, 18, 12, NA, 3, 2, NA, NA, 13, NA,… ## $ mintemp <dbl> -9.710, -5.924, -0.220, 1.931, 6.568, 11.590, 14.370, 16.520, … ## $ ndvi    <dbl> 1.4658889, 1.5585069, 1.3378172, 1.6589129, 1.8536561, 1.76132… summary(model_data) ##  series        year           time           count          mintemp        ##  PP:199   Min.   :2004   Min.   :  1.0   Min.   : 0.00   Min.   :-24.000   ##           1st Qu.:2008   1st Qu.: 50.5   1st Qu.: 2.50   1st Qu.: -3.884   ##           Median :2012   Median :100.0   Median :12.00   Median :  2.130   ##           Mean   :2012   Mean   :100.0   Mean   :15.14   Mean   :  3.504   ##           3rd Qu.:2016   3rd Qu.:149.5   3rd Qu.:24.00   3rd Qu.: 12.310   ##           Max.   :2020   Max.   :199.0   Max.   :65.00   Max.   : 18.140   ##                                          NA's   :36                        ##       ndvi        ##  Min.   :0.2817   ##  1st Qu.:1.0741   ##  Median :1.3501   ##  Mean   :1.4709   ##  3rd Qu.:1.8178   ##  Max.   :3.9126   ## image(is.na(t(model_data %>%                 dplyr::arrange(dplyr::desc(time)))), axes = F,       col = c('grey80', 'darkred')) axis(3, at = seq(0,1, len = NCOL(model_data)), labels = colnames(model_data)) plot_mvgam_series(data = model_data, series = 1, y = 'count')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"glms-with-temporal-random-effects\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"GLMs with temporal random effects\",\"title\":\"Overview of the mvgam package\",\"text\":\"first task fit Generalized Linear Model (GLM) can adequately capture features count observations (integer data, lower bound zero, missing values) also attempting model temporal variation. almost ready fit first model, GLM Poisson observations, log link function random (hierarchical) intercepts year. allow us capture prior belief , although year unique, sampled population effects, years connected thus might contain valuable information one another. done capitalizing partial pooling properties hierarchical models. Hierarchical (also known random) effects offer many advantages modelling data grouping structures (.e. multiple species, locations, years etc…). ability incorporate time series models huge advantage traditional models ARIMA Exponential Smoothing. fit model, need convert year factor can use random effect basis mvgam. See ?smooth.terms ?smooth.construct.re.smooth.spec details re basis construction used mvgam mgcv Preview dataset ensure year now factor unique factor level year data now ready first mvgam model. syntax familiar users previously built models mgcv. refresher, see ?formula.gam examples ?gam. Random effects can specified using s wrapper re basis. Note can also suppress primary intercept using usual R formula syntax - 1. mvgam number possible observation families can used, see ?mvgam_families information. use Stan fitting engine, deploys Hamiltonian Monte Carlo (HMC) full Bayesian inference. default, 4 HMC chains run using warmup 500 iterations collecting 500 posterior samples chain. package also aim use Cmdstan backend possible, recommended users --date installation Cmdstan associated cmdstanr interface machines (note can set backend using backend argument: see ?mvgam details). Interested users consult Stan user’s guide information software enormous variety models can tackled HMC. model can described mathematically timepoint \\\\(t\\\\) follows: \\\\[\\\\begin{align*} \\\\boldsymbol{count}_t & \\\\sim \\\\text{Poisson}(\\\\lambda_t) \\\\\\\\ log(\\\\lambda_t) & = \\\\beta_{year[year_t]} \\\\\\\\ \\\\beta_{year} & \\\\sim \\\\text{Normal}(\\\\mu_{year}, \\\\sigma_{year}) \\\\end{align*}\\\\] \\\\(\\\\beta_{year}\\\\) effects drawn population distribution parameterized common mean \\\\((\\\\mu_{year})\\\\) variance \\\\((\\\\sigma_{year})\\\\). Priors model parameters can interrogated changed using similar functionality options available brms. example, default priors \\\\((\\\\mu_{year})\\\\) \\\\((\\\\sigma_{year})\\\\) can viewed using following code: See examples ?get_mvgam_priors find different ways priors can altered. model finished, first step inspect summary ensure major diagnostic warnings produced quickly summarise posterior distributions key parameters diagnostic messages bottom summary show HMC sampler encounter problems difficult posterior spaces. good sign. Posterior distributions model parameters can extracted way object class brmsfit can (see ?mvgam::mvgam_draws details). example, can extract coefficients related GAM linear predictor (.e. \\\\(\\\\beta\\\\)’s) data.frame using: model fitted mvgam, underlying Stan code can viewed using code function:\",\"code\":\"model_data %>%      # Create a 'year_fac' factor version of 'year'   dplyr::mutate(year_fac = factor(year)) -> model_data dplyr::glimpse(model_data) ## Rows: 199 ## Columns: 7 ## $ series   <fct> PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, P… ## $ year     <int> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2… ## $ time     <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18… ## $ count    <int> 0, 1, 2, NA, 10, NA, NA, 16, 18, 12, NA, 3, 2, NA, NA, 13, NA… ## $ mintemp  <dbl> -9.710, -5.924, -0.220, 1.931, 6.568, 11.590, 14.370, 16.520,… ## $ ndvi     <dbl> 1.4658889, 1.5585069, 1.3378172, 1.6589129, 1.8536561, 1.7613… ## $ year_fac <fct> 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2… levels(model_data$year_fac) ##  [1] \\\"2004\\\" \\\"2005\\\" \\\"2006\\\" \\\"2007\\\" \\\"2008\\\" \\\"2009\\\" \\\"2010\\\" \\\"2011\\\" \\\"2012\\\" \\\"2013\\\" ## [11] \\\"2014\\\" \\\"2015\\\" \\\"2016\\\" \\\"2017\\\" \\\"2018\\\" \\\"2019\\\" \\\"2020\\\" model1 <- mvgam(count ~ s(year_fac, bs = 're') - 1,                 family = poisson(),                 data = model_data) get_mvgam_priors(count ~ s(year_fac, bs = 're') - 1,                  family = poisson(),                  data = model_data) ##                      param_name param_length           param_info ## 1             vector[1] mu_raw;            1 s(year_fac) pop mean ## 2 vector<lower=0>[1] sigma_raw;            1   s(year_fac) pop sd ##                               prior                 example_change ## 1            mu_raw ~ std_normal();   mu_raw ~ normal(0.36, 0.77); ## 2 sigma_raw ~ student_t(3, 0, 2.5); sigma_raw ~ exponential(0.55); ##   new_lowerbound new_upperbound ## 1             NA             NA ## 2             NA             NA summary(model1) ## GAM formula: ## count ~ s(year_fac, bs = \\\"re\\\") - 1 ##  ## Family: ## poisson ##  ## Link function: ## log ##  ## Trend model: ## None ##  ## N series: ## 1  ##  ## N timepoints: ## 199  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM coefficient (beta) estimates: ##                 2.5% 50% 97.5% Rhat n_eff ## s(year_fac).1   1.80 2.1   2.3 1.00  2955 ## s(year_fac).2   2.50 2.7   2.8 1.00  3205 ## s(year_fac).3   3.00 3.1   3.2 1.00  2966 ## s(year_fac).4   3.10 3.3   3.4 1.00  2869 ## s(year_fac).5   1.90 2.1   2.3 1.00  3059 ## s(year_fac).6   1.50 1.8   2.0 1.00  2470 ## s(year_fac).7   1.80 2.0   2.3 1.00  2527 ## s(year_fac).8   2.80 3.0   3.1 1.00  3373 ## s(year_fac).9   3.10 3.3   3.4 1.00  2748 ## s(year_fac).10  2.60 2.8   2.9 1.00  2731 ## s(year_fac).11  3.00 3.1   3.2 1.00  3316 ## s(year_fac).12  3.10 3.2   3.3 1.00  2637 ## s(year_fac).13  2.00 2.2   2.5 1.00  2355 ## s(year_fac).14  2.50 2.6   2.8 1.00  3042 ## s(year_fac).15  1.90 2.2   2.4 1.00  2649 ## s(year_fac).16  1.90 2.1   2.3 1.00  3010 ## s(year_fac).17 -0.35 1.1   1.9 1.01   336 ##  ## GAM group-level estimates: ##                   2.5%  50% 97.5% Rhat n_eff ## mean(s(year_fac)) 2.00 2.40   2.8 1.05    83 ## sd(s(year_fac))   0.45 0.67   1.2 1.03   174 ##  ## Approximate significance of GAM observation smooths: ##              edf Chi.sq p-value     ## s(year_fac) 13.5  24694  <2e-16 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhats above 1.05 found for 1 parameters ##  *Diagnose further to investigate why the chains have not mixed ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:42:16 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) beta_post <- as.data.frame(model1, variable = 'betas') dplyr::glimpse(beta_post) ## Rows: 2,000 ## Columns: 17 ## $ `s(year_fac).1`  <dbl> 2.02205, 2.16924, 2.10487, 2.13665, 1.86345, 2.24392,… ## $ `s(year_fac).2`  <dbl> 2.73095, 2.71062, 2.75107, 2.65906, 2.80667, 2.54545,… ## $ `s(year_fac).3`  <dbl> 3.18207, 2.95422, 3.11397, 3.06990, 3.11219, 2.99228,… ## $ `s(year_fac).4`  <dbl> 3.21977, 3.13672, 3.16082, 3.15234, 3.26815, 3.32370,… ## $ `s(year_fac).5`  <dbl> 2.20712, 2.01768, 2.22813, 2.09890, 2.30518, 1.99217,… ## $ `s(year_fac).6`  <dbl> 1.81741, 1.73328, 1.86433, 1.70224, 1.84045, 1.74424,… ## $ `s(year_fac).7`  <dbl> 2.05394, 1.88082, 1.88431, 2.09144, 1.90318, 2.16052,… ## $ `s(year_fac).8`  <dbl> 2.97590, 2.85870, 2.99140, 2.96427, 3.05537, 2.89148,… ## $ `s(year_fac).9`  <dbl> 3.04001, 3.34879, 3.29032, 3.25937, 3.21418, 3.28780,… ## $ `s(year_fac).10` <dbl> 2.71676, 2.74633, 2.85746, 2.89187, 2.55747, 2.94397,… ## $ `s(year_fac).11` <dbl> 3.04156, 3.02516, 3.05404, 3.08662, 3.11559, 3.01671,… ## $ `s(year_fac).12` <dbl> 3.16241, 3.20121, 3.16180, 3.24250, 3.21637, 3.09950,… ## $ `s(year_fac).13` <dbl> 1.97840, 2.22098, 2.25286, 2.24841, 2.18589, 2.26861,… ## $ `s(year_fac).14` <dbl> 2.42902, 2.59880, 2.59650, 2.74709, 2.54397, 2.69848,… ## $ `s(year_fac).15` <dbl> 2.02345, 2.19903, 2.24971, 2.06536, 2.10172, 2.25418,… ## $ `s(year_fac).16` <dbl> 2.06523, 2.00776, 2.01068, 1.98364, 1.91786, 2.20502,… ## $ `s(year_fac).17` <dbl> 0.5891590, 0.6284760, 1.3589400, 1.0220400, -0.613518… code(model1) ## // Stan model code generated by package mvgam ## data { ##   int<lower=0> total_obs; // total number of observations ##   int<lower=0> n; // number of timepoints per series ##   int<lower=0> n_series; // number of series ##   int<lower=0> num_basis; // total number of basis coefficients ##   matrix[total_obs, num_basis] X; // mgcv GAM design matrix ##   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) ##   int<lower=0> n_nonmissing; // number of nonmissing observations ##   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations ##   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations ##   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations ## } ## parameters { ##   // raw basis coefficients ##   vector[num_basis] b_raw; ##    ##   // random effect variances ##   vector<lower=0>[1] sigma_raw; ##    ##   // random effect means ##   vector[1] mu_raw; ## } ## transformed parameters { ##   // basis coefficients ##   vector[num_basis] b; ##   b[1 : 17] = mu_raw[1] + b_raw[1 : 17] * sigma_raw[1]; ## } ## model { ##   // prior for random effect population variances ##   sigma_raw ~ student_t(3, 0, 2.5); ##    ##   // prior for random effect population means ##   mu_raw ~ std_normal(); ##    ##   // prior (non-centred) for s(year_fac)... ##   b_raw[1 : 17] ~ std_normal(); ##   { ##     // likelihood functions ##     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b); ##   } ## } ## generated quantities { ##   vector[total_obs] eta; ##   matrix[n, n_series] mus; ##   array[n, n_series] int ypred; ##    ##   // posterior predictions ##   eta = X * b; ##   for (s in 1 : n_series) { ##     mus[1 : n, s] = eta[ytimes[1 : n, s]]; ##     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]); ##   } ## }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"plotting-effects-and-residuals\",\"dir\":\"Articles\",\"previous_headings\":\"GLMs with temporal random effects\",\"what\":\"Plotting effects and residuals\",\"title\":\"Overview of the mvgam package\",\"text\":\"Now interrogating model. can get sense variation yearly intercepts summary , easier understand using targeted plots. Plot posterior distributions temporal random effects using plot.mvgam type = 're'. See ?plot.mvgam details types plots can produced fitted mvgam objects\",\"code\":\"plot(model1, type = 're')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"bayesplot-support\",\"dir\":\"Articles\",\"previous_headings\":\"GLMs with temporal random effects\",\"what\":\"bayesplot support\",\"title\":\"Overview of the mvgam package\",\"text\":\"can also capitalize useful MCMC plotting functions bayesplot package visualize posterior distributions diagnostics (see ?mvgam::mcmc_plot.mvgam details):  clearly variation yearly intercept estimates. translate time-varying predictions? understand , can plot posterior hindcasts model training period using plot.mvgam type = 'forecast'  wish extract hindcasts downstream analyses, hindcast function can used. return list object class mvgam_forecast. hindcasts slot, matrix posterior retrodictions returned series data (one series example): can also extract hindcasts linear predictor scale, case log scale (Poisson GLM used log link function). Sometimes can useful asking targeted questions drivers variation: Objects class mvgam_forecast associated plot function well:  plot can look bit confusing seems like linear interpolation end one year start next. just due way lines automatically connected base plots regression analysis, key question whether residuals show patterns can indicative un-modelled sources variation. GLMs, can use modified residual called Dunn-Smyth, randomized quantile, residual. Inspect Dunn-Smyth residuals model using plot.mvgam type = 'residuals'\",\"code\":\"mcmc_plot(object = model1,           variable = 'betas',           type = 'areas') plot(model1, type = 'forecast') hc <- hindcast(model1) str(hc) ## List of 15 ##  $ call              :Class 'formula'  language count ~ s(year_fac, bs = \\\"re\\\") - 1 ##   .. ..- attr(*, \\\".Environment\\\")=<environment: R_GlobalEnv>  ##  $ trend_call        : NULL ##  $ family            : chr \\\"poisson\\\" ##  $ trend_model       : chr \\\"None\\\" ##  $ drift             : logi FALSE ##  $ use_lv            : logi FALSE ##  $ fit_engine        : chr \\\"stan\\\" ##  $ type              : chr \\\"response\\\" ##  $ series_names      : chr \\\"PP\\\" ##  $ train_observations:List of 1 ##   ..$ PP: int [1:199] 0 1 2 NA 10 NA NA 16 18 12 ... ##  $ train_times       : num [1:199] 1 2 3 4 5 6 7 8 9 10 ... ##  $ test_observations : NULL ##  $ test_times        : NULL ##  $ hindcasts         :List of 1 ##   ..$ PP: num [1:2000, 1:199] 7 8 7 8 9 6 7 8 8 7 ... ##   .. ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. .. ..$ : NULL ##   .. .. ..$ : chr [1:199] \\\"ypred[1,1]\\\" \\\"ypred[2,1]\\\" \\\"ypred[3,1]\\\" \\\"ypred[4,1]\\\" ... ##  $ forecasts         : NULL ##  - attr(*, \\\"class\\\")= chr \\\"mvgam_forecast\\\" hc <- hindcast(model1, type = 'link') range(hc$hindcasts$PP) ## [1] -1.57385  3.46274 plot(hc) plot(model1, type = 'residuals')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"automatic-forecasting-for-new-data\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Automatic forecasting for new data\",\"title\":\"Overview of the mvgam package\",\"text\":\"temporal random effects sense “time”. , yearly random intercept restricted way similar previous yearly intercept. drawback becomes evident predict new year. , can repeat exercise time split data training testing sets re-running model. can supply test set newdata. splitting, make use filter function dplyr Repeating plots gives insight model’s hierarchical prior formulation provides structure needed sample values un-modelled years   can also view test data forecast plot see predictions capture temporal variation test set  hindcast function, can use forecast function automatically extract posterior distributions predictions. also returns object class mvgam_forecast, now contain hindcasts forecasts series data:\",\"code\":\"model_data %>%    dplyr::filter(time <= 160) -> data_train  model_data %>%    dplyr::filter(time > 160) -> data_test model1b <- mvgam(count ~ s(year_fac, bs = 're') - 1,                 family = poisson(),                 data = data_train,                 newdata = data_test) plot(model1b, type = 're') plot(model1b, type = 'forecast') ## Out of sample DRPS: ## [1] 183.3916 plot(model1b, type = 'forecast', newdata = data_test) ## Out of sample DRPS: ## [1] 183.3916 fc <- forecast(model1b) str(fc) ## List of 16 ##  $ call              :Class 'formula'  language count ~ s(year_fac, bs = \\\"re\\\") - 1 ##   .. ..- attr(*, \\\".Environment\\\")=<environment: R_GlobalEnv>  ##  $ trend_call        : NULL ##  $ family            : chr \\\"poisson\\\" ##  $ family_pars       : NULL ##  $ trend_model       : chr \\\"None\\\" ##  $ drift             : logi FALSE ##  $ use_lv            : logi FALSE ##  $ fit_engine        : chr \\\"stan\\\" ##  $ type              : chr \\\"response\\\" ##  $ series_names      : Factor w/ 1 level \\\"PP\\\": 1 ##  $ train_observations:List of 1 ##   ..$ PP: int [1:160] 0 1 2 NA 10 NA NA 16 18 12 ... ##  $ train_times       : num [1:160] 1 2 3 4 5 6 7 8 9 10 ... ##  $ test_observations :List of 1 ##   ..$ PP: int [1:39] NA 0 0 10 3 14 18 NA 28 46 ... ##  $ test_times        : num [1:39] 161 162 163 164 165 166 167 168 169 170 ... ##  $ hindcasts         :List of 1 ##   ..$ PP: num [1:2000, 1:160] 13 14 8 8 8 9 5 10 8 11 ... ##   .. ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. .. ..$ : NULL ##   .. .. ..$ : chr [1:160] \\\"ypred[1,1]\\\" \\\"ypred[2,1]\\\" \\\"ypred[3,1]\\\" \\\"ypred[4,1]\\\" ... ##  $ forecasts         :List of 1 ##   ..$ PP: num [1:2000, 1:39] 12 8 14 7 5 7 9 13 18 18 ... ##   .. ..- attr(*, \\\"dimnames\\\")=List of 2 ##   .. .. ..$ : NULL ##   .. .. ..$ : chr [1:39] \\\"ypred[161,1]\\\" \\\"ypred[162,1]\\\" \\\"ypred[163,1]\\\" \\\"ypred[164,1]\\\" ... ##  - attr(*, \\\"class\\\")= chr \\\"mvgam_forecast\\\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"adding-predictors-as-fixed-effects\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Adding predictors as “fixed” effects\",\"title\":\"Overview of the mvgam package\",\"text\":\"users familiar GLMs know nearly always wish include predictor variables may explain variation observations. Predictors easily incorporated GLMs / GAMs. , update model including parametric (fixed) effect ndvi linear predictor: model can described mathematically follows: \\\\[\\\\begin{align*} \\\\boldsymbol{count}_t & \\\\sim \\\\text{Poisson}(\\\\lambda_t) \\\\\\\\ log(\\\\lambda_t) & = \\\\beta_{year[year_t]} + \\\\beta_{ndvi} * \\\\boldsymbol{ndvi}_t \\\\\\\\ \\\\beta_{year} & \\\\sim \\\\text{Normal}(\\\\mu_{year}, \\\\sigma_{year}) \\\\\\\\ \\\\beta_{ndvi} & \\\\sim \\\\text{Normal}(0, 1) \\\\end{align*}\\\\] \\\\(\\\\beta_{year}\\\\) effects now another predictor \\\\((\\\\beta_{ndvi})\\\\) applies ndvi value timepoint \\\\(t\\\\). Inspect summary model Rather printing summary time, can also quickly look posterior empirical quantiles fixed effect ndvi (linear predictor coefficients) using coef: Look estimated effect ndvi using plot.mvgam type = 'pterms'  plot indicates positive linear effect ndvi log(counts). may easier visualise using histogram, especially parametric (linear) effects. can done first extracting posterior coefficients first example: posterior distribution effect ndvi stored ndvi column. quick histogram confirms inference log(counts) respond positively increases ndvi:\",\"code\":\"model2 <- mvgam(count ~ s(year_fac, bs = 're') +                    ndvi - 1,                 family = poisson(),                 data = data_train,                 newdata = data_test) summary(model2) ## GAM formula: ## count ~ ndvi + s(year_fac, bs = \\\"re\\\") - 1 ##  ## Family: ## poisson ##  ## Link function: ## log ##  ## Trend model: ## None ##  ## N series: ## 1  ##  ## N timepoints: ## 160  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM coefficient (beta) estimates: ##                2.5%  50% 97.5% Rhat n_eff ## ndvi           0.33 0.39  0.46    1  1756 ## s(year_fac).1  1.10 1.40  1.70    1  2498 ## s(year_fac).2  1.80 2.00  2.20    1  1899 ## s(year_fac).3  2.20 2.40  2.60    1  2121 ## s(year_fac).4  2.30 2.50  2.70    1  1856 ## s(year_fac).5  1.20 1.40  1.60    1  2233 ## s(year_fac).6  1.00 1.30  1.50    1  2526 ## s(year_fac).7  1.10 1.40  1.70    1  2680 ## s(year_fac).8  2.10 2.30  2.50    1  2153 ## s(year_fac).9  2.70 2.90  3.00    1  1972 ## s(year_fac).10 2.00 2.20  2.40    1  2604 ## s(year_fac).11 2.30 2.40  2.60    1  1854 ## s(year_fac).12 2.50 2.70  2.80    1  1903 ## s(year_fac).13 1.40 1.60  1.80    1  2583 ## s(year_fac).14 0.65 1.90  3.20    1  1119 ## s(year_fac).15 0.64 2.00  3.20    1  1504 ## s(year_fac).16 0.62 1.90  3.20    1  1567 ## s(year_fac).17 0.67 1.90  3.20    1  1558 ##  ## GAM group-level estimates: ##                   2.5%  50% 97.5% Rhat n_eff ## mean(s(year_fac)) 1.60 2.00  2.30    1   324 ## sd(s(year_fac))   0.41 0.59  0.97    1   566 ##  ## Approximate significance of GAM observation smooths: ##              edf Chi.sq p-value     ## s(year_fac) 11.1   2810  <2e-16 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:43:17 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) coef(model2) ##                     2.5%       50%     97.5% Rhat n_eff ## ndvi           0.3271847 0.3909765 0.4616437    1  1756 ## s(year_fac).1  1.1187235 1.3992000 1.6530420    1  2498 ## s(year_fac).2  1.7857993 1.9953950 2.1962138    1  1899 ## s(year_fac).3  2.1821677 2.3778000 2.5536588    1  2121 ## s(year_fac).4  2.3121757 2.5055300 2.6798547    1  1856 ## s(year_fac).5  1.1794423 1.4222500 1.6405437    1  2233 ## s(year_fac).6  1.0224750 1.2704150 1.5046850    1  2526 ## s(year_fac).7  1.1412090 1.4067450 1.6811802    1  2680 ## s(year_fac).8  2.0761087 2.2678950 2.4518065    1  2153 ## s(year_fac).9  2.7186492 2.8531300 2.9811495    1  1972 ## s(year_fac).10 1.9734253 2.1819550 2.3638582    1  2604 ## s(year_fac).11 2.2608057 2.4348950 2.5893710    1  1854 ## s(year_fac).12 2.5372990 2.6877500 2.8456120    1  1903 ## s(year_fac).13 1.3677138 1.6185450 1.8419897    1  2583 ## s(year_fac).14 0.6503578 1.9153950 3.1729187    1  1119 ## s(year_fac).15 0.6358526 1.9786850 3.2192620    1  1504 ## s(year_fac).16 0.6237738 1.9464300 3.2242947    1  1567 ## s(year_fac).17 0.6657770 1.9497650 3.2148592    1  1558 plot(model2, type = 'pterms') beta_post <- as.data.frame(model2, variable = 'betas') dplyr::glimpse(beta_post) ## Rows: 2,000 ## Columns: 18 ## $ ndvi             <dbl> 0.360717, 0.411538, 0.413833, 0.480704, 0.298674, 0.4… ## $ `s(year_fac).1`  <dbl> 1.49041, 1.43493, 1.24131, 1.33732, 1.56602, 1.23166,… ## $ `s(year_fac).2`  <dbl> 1.96377, 2.11210, 1.77387, 1.93891, 1.96497, 1.94449,… ## $ `s(year_fac).3`  <dbl> 2.52795, 2.23799, 2.27527, 2.16808, 2.61478, 2.21272,… ## $ `s(year_fac).4`  <dbl> 2.52199, 2.48918, 2.45488, 2.48689, 2.79409, 2.32144,… ## $ `s(year_fac).5`  <dbl> 1.52233, 1.39382, 1.39718, 1.29478, 1.61762, 1.35901,… ## $ `s(year_fac).6`  <dbl> 1.43621, 1.18094, 1.38381, 1.01295, 1.35752, 1.20577,… ## $ `s(year_fac).7`  <dbl> 1.55584, 1.43209, 1.36560, 1.26249, 1.50926, 1.29049,… ## $ `s(year_fac).8`  <dbl> 2.28523, 2.26367, 2.18857, 2.11143, 2.38672, 2.06916,… ## $ `s(year_fac).9`  <dbl> 2.99371, 2.77475, 2.91705, 2.68196, 2.93845, 2.74811,… ## $ `s(year_fac).10` <dbl> 2.21681, 2.08268, 2.21817, 1.98852, 2.31722, 1.99311,… ## $ `s(year_fac).11` <dbl> 2.56472, 2.29675, 2.42560, 2.31213, 2.58424, 2.13256,… ## $ `s(year_fac).12` <dbl> 2.66356, 2.64247, 2.80074, 2.54992, 2.72354, 2.59844,… ## $ `s(year_fac).13` <dbl> 1.61022, 1.66395, 1.51550, 1.44828, 1.73121, 1.49267,… ## $ `s(year_fac).14` <dbl> 1.444900, 2.214580, 0.623583, 2.347250, 2.071320, 1.4… ## $ `s(year_fac).15` <dbl> 2.69107, 1.49073, 2.14958, 2.48082, 1.90408, 1.67007,… ## $ `s(year_fac).16` <dbl> 3.213370, 2.255890, 1.332510, 1.902480, 2.153700, 1.3… ## $ `s(year_fac).17` <dbl> 2.515630, 1.667650, 2.299560, 1.601190, 2.895750, 1.5… hist(beta_post$ndvi,      xlim = c(-1 * max(abs(beta_post$ndvi)),               max(abs(beta_post$ndvi))),      col = 'darkred',      border = 'white',      xlab = expression(beta[NDVI]),      ylab = '',      yaxt = 'n',      main = '',      lwd = 2) abline(v = 0, lwd = 2.5)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"marginaleffects-support\",\"dir\":\"Articles\",\"previous_headings\":\"Adding predictors as “fixed” effects\",\"what\":\"marginaleffects support\",\"title\":\"Overview of the mvgam package\",\"text\":\"Given model used nonlinear link function (log link example), can still difficult fully understand relationship model estimating predictor response. Fortunately, marginaleffects package makes relatively straightforward. Objects class mvgam can used marginaleffects inspect contrasts, scenario-based predictions, conditional marginal effects, outcome scale. use plot_predictions function marginaleffects inspect conditional effect ndvi (use ?plot_predictions guidance modify plots):  Now easier get sense nonlinear positive relationship estimated ndvi count. Like brms, mvgam simple conditional_effects function make quick informative plots main effects. likely go-function quickly understanding patterns fitted mvgam models\",\"code\":\"plot_predictions(model2,                   condition = \\\"ndvi\\\",                  # include the observed count values                  # as points, and show rugs for the observed                  # ndvi and count values on the axes                  points = 0.5, rug = TRUE) plot(conditional_effects(model2), ask = FALSE)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"adding-predictors-as-smooths\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Adding predictors as smooths\",\"title\":\"Overview of the mvgam package\",\"text\":\"Smooth functions, using penalized splines, major feature mvgam. Nonlinear splines commonly viewed variations random effects coefficients control shape spline drawn joint, penalized distribution. strategy often used ecological time series analysis capture smooth temporal variation processes seek study. construct smoothing splines, workhorse package mgcv calculate set basis functions collectively control shape complexity resulting spline. often helpful visualize basis functions get better sense splines work. ’ll create set 6 basis functions represent possible variation effect time outcome.addition constructing basis functions, mgcv also creates penalty matrix \\\\(S\\\\), contains known coefficients work constrain wiggliness resulting smooth function. fitting GAM data, must estimate smoothing parameters (\\\\(\\\\lambda\\\\)) penalize matrices, resulting constrained basis coefficients smoother functions less likely overfit data. key fitting GAMs Bayesian framework, can jointly estimate \\\\(\\\\lambda\\\\)’s using informative priors prevent overfitting expand complexity models can tackle. see practice, can now fit model replaces yearly random effects smooth function time. need reasonably complex function (large k) try accommodate temporal variation observations. Following useful advice Gavin Simpson, use b-spline basis temporal smooth. longer intercepts year, also retain primary intercept term model (-1 formula now): model can described mathematically follows: \\\\[\\\\begin{align*} \\\\boldsymbol{count}_t & \\\\sim \\\\text{Poisson}(\\\\lambda_t) \\\\\\\\ log(\\\\lambda_t) & = f(\\\\boldsymbol{time})_t + \\\\beta_{ndvi} * \\\\boldsymbol{ndvi}_t  \\\\\\\\ f(\\\\boldsymbol{time}) & = \\\\sum_{k=1}^{K}b * \\\\beta_{smooth} \\\\\\\\ \\\\beta_{smooth} & \\\\sim \\\\text{MVNormal}(0, (\\\\Omega * \\\\lambda)^{-1}) \\\\\\\\ \\\\beta_{ndvi} & \\\\sim \\\\text{Normal}(0, 1) \\\\end{align*}\\\\] smooth function \\\\(f_{time}\\\\) built summing across set weighted basis functions. basis functions \\\\((b)\\\\) constructed using thin plate regression basis mgcv. weights \\\\((\\\\beta_{smooth})\\\\) drawn penalized multivariate normal distribution precision matrix \\\\((\\\\Omega\\\\)) multiplied smoothing penalty \\\\((\\\\lambda)\\\\). \\\\(\\\\lambda\\\\) becomes large, acts squeeze covariances among weights \\\\((\\\\beta_{smooth})\\\\), leading less wiggly spline. Note sometimes multiple smoothing penalties contribute covariance matrix, showing one simplicity. View summary summary now contains posterior estimates smoothing parameters well basis coefficients nonlinear effect time. can visualize conditional time effect using plot function type = 'smooths':  default plots shows posterior empirical quantiles, can also helpful view realizations underlying function (, line different potential curve drawn posterior possible curves):\",\"code\":\"model3 <- mvgam(count ~ s(time, bs = 'bs', k = 15) +                    ndvi,                 family = poisson(),                 data = data_train,                 newdata = data_test) summary(model3) ## GAM formula: ## count ~ s(time, bs = \\\"bs\\\", k = 15) + ndvi ##  ## Family: ## poisson ##  ## Link function: ## log ##  ## Trend model: ## None ##  ## N series: ## 1  ##  ## N timepoints: ## 160  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM coefficient (beta) estimates: ##              2.5%   50%  97.5% Rhat n_eff ## (Intercept)  2.00  2.10  2.200 1.00   950 ## ndvi         0.26  0.33  0.400 1.00   943 ## s(time).1   -2.10 -1.00  0.048 1.00   409 ## s(time).2    0.44  1.30  2.300 1.01   282 ## s(time).3   -0.56  0.50  1.500 1.01   289 ## s(time).4    1.50  2.50  3.600 1.01   265 ## s(time).5   -1.20 -0.16  0.880 1.01   286 ## s(time).6   -0.59  0.40  1.500 1.01   250 ## s(time).7   -1.50 -0.48  0.560 1.01   285 ## s(time).8    0.54  1.50  2.600 1.01   282 ## s(time).9    1.10  2.10  3.200 1.01   253 ## s(time).10  -0.40  0.58  1.600 1.01   276 ## s(time).11   0.80  1.80  2.900 1.01   262 ## s(time).12   0.61  1.50  2.500 1.01   277 ## s(time).13  -1.20 -0.30  0.680 1.01   337 ## s(time).14  -7.50 -4.20 -1.000 1.01   334 ##  ## Approximate significance of GAM observation smooths: ##         edf Chi.sq p-value     ## s(time) 9.8    774  <2e-16 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:44:04 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot(model3, type = 'smooths') plot(model3, type = 'smooths', realisations = TRUE,      n_realisations = 30)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"derivatives-of-smooths\",\"dir\":\"Articles\",\"previous_headings\":\"Adding predictors as smooths\",\"what\":\"Derivatives of smooths\",\"title\":\"Overview of the mvgam package\",\"text\":\"useful question modelling using GAMs identify function changing rapidly. address , can plot estimated 1st derivatives spline:  , values >0 indicate function increasing time point, values <0 indicate function declining. rapid declines appear happening around timepoints 50 toward end training period, example.\",\"code\":\"plot(model3, type = 'smooths', derivatives = TRUE)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"conditional-effects\",\"dir\":\"Articles\",\"previous_headings\":\"Adding predictors as smooths\",\"what\":\"Conditional effects\",\"title\":\"Overview of the mvgam package\",\"text\":\"Use conditional_effects useful plots outcome scale:  link scale:  Inspect underlying Stan code gain idea spline penalized: line // prior s(time)... shows spline basis coefficients drawn zero-centred multivariate normal distribution. precision matrix \\\\(S\\\\) penalized two different smoothing parameters (\\\\(\\\\lambda\\\\)’s) enforce smoothness reduce overfitting\",\"code\":\"plot(conditional_effects(model3), ask = FALSE) plot(conditional_effects(model3, type = 'link'), ask = FALSE) code(model3) ## // Stan model code generated by package mvgam ## data { ##   int<lower=0> total_obs; // total number of observations ##   int<lower=0> n; // number of timepoints per series ##   int<lower=0> n_sp; // number of smoothing parameters ##   int<lower=0> n_series; // number of series ##   int<lower=0> num_basis; // total number of basis coefficients ##   vector[num_basis] zero; // prior locations for basis coefficients ##   matrix[total_obs, num_basis] X; // mgcv GAM design matrix ##   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) ##   matrix[14, 28] S1; // mgcv smooth penalty matrix S1 ##   int<lower=0> n_nonmissing; // number of nonmissing observations ##   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations ##   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations ##   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations ## } ## parameters { ##   // raw basis coefficients ##   vector[num_basis] b_raw; ##    ##   // smoothing parameters ##   vector<lower=0>[n_sp] lambda; ## } ## transformed parameters { ##   // basis coefficients ##   vector[num_basis] b; ##   b[1 : num_basis] = b_raw[1 : num_basis]; ## } ## model { ##   // prior for (Intercept)... ##   b_raw[1] ~ student_t(3, 2.6, 2.5); ##    ##   // prior for ndvi... ##   b_raw[2] ~ student_t(3, 0, 2); ##    ##   // prior for s(time)... ##   b_raw[3 : 16] ~ multi_normal_prec(zero[3 : 16], ##                                     S1[1 : 14, 1 : 14] * lambda[1] ##                                     + S1[1 : 14, 15 : 28] * lambda[2]); ##    ##   // priors for smoothing parameters ##   lambda ~ normal(5, 30); ##   { ##     // likelihood functions ##     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b); ##   } ## } ## generated quantities { ##   vector[total_obs] eta; ##   matrix[n, n_series] mus; ##   vector[n_sp] rho; ##   array[n, n_series] int ypred; ##   rho = log(lambda); ##    ##   // posterior predictions ##   eta = X * b; ##   for (s in 1 : n_series) { ##     mus[1 : n, s] = eta[ytimes[1 : n, s]]; ##     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]); ##   } ## }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\",\"id\":\"latent-dynamics-in-mvgam\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Latent dynamics in mvgam\",\"title\":\"Overview of the mvgam package\",\"text\":\"Forecasts model ideal:  happening? forecasts driven almost entirely variation temporal spline, extrapolating linearly forever beyond edge training data. slight wiggles near end training set result wildly different forecasts. visualize , can plot extrapolated temporal functions --sample test set two models. extrapolated functions first model, 15 basis functions:  model well. Clearly need somehow account strong temporal autocorrelation modelling data without using smooth function time. Now onto another prominent feature mvgam: ability include (possibly latent) autocorrelated residuals regression models. , use trend_model argument (see ?mvgam_trends details different dynamic trend models supported). model use separate sub-model latent residuals evolve AR1 process (.e. error current time point function error previous time point, plus stochastic noise). also include smooth function ndvi model, rather parametric term used , showcase mvgam can include combinations smooths dynamic components: model can described mathematically follows: \\\\[\\\\begin{align*} \\\\boldsymbol{count}_t & \\\\sim \\\\text{Poisson}(\\\\lambda_t) \\\\\\\\ log(\\\\lambda_t) & = f(\\\\boldsymbol{ndvi})_t + z_t \\\\\\\\ z_t & \\\\sim \\\\text{Normal}(ar1 * z_{t-1}, \\\\sigma_{error}) \\\\\\\\ ar1 & \\\\sim \\\\text{Normal}(0, 1)[-1, 1] \\\\\\\\ \\\\sigma_{error} & \\\\sim \\\\text{Exponential}(2) \\\\\\\\ f(\\\\boldsymbol{ndvi}) & = \\\\sum_{k=1}^{K}b * \\\\beta_{smooth} \\\\\\\\ \\\\beta_{smooth} & \\\\sim \\\\text{MVNormal}(0, (\\\\Omega * \\\\lambda)^{-1}) \\\\end{align*}\\\\] term \\\\(z_t\\\\) captures autocorrelated latent residuals, modelled using AR1 process. can also notice model estimating autocorrelated errors full time period, even though time points missing observations. useful getting realistic estimates residual autocorrelation parameters. Summarise model see now returns posterior summaries latent AR1 process: View conditional smooths ndvi effect:  View posterior hindcasts / forecasts compare sample test data  trend evolving AR1 process, can also view:  -sample model performance can interrogated using leave-one-cross-validation utilities loo package (higher value preferred metric): higher estimated log predictive density (ELPD) value dynamic model suggests provides better fit -sample data. Though obvious model provides better forecasts, can quantify forecast performance models 3 4 using forecast score functions. compare models based Discrete Ranked Probability Scores (lower value preferred metric) strongly negative value suggests score dynamic model (model 4) much smaller score model smooth function time (model 3)\",\"code\":\"plot(model3, type = 'forecast', newdata = data_test) ## Out of sample DRPS: ## [1] 286.9079 plot_mvgam_smooth(model3, smooth = 's(time)',                   # feed newdata to the plot function to generate                   # predictions of the temporal smooth to the end of the                    # testing period                   newdata = data.frame(time = 1:max(data_test$time),                                        ndvi = 0)) abline(v = max(data_train$time), lty = 'dashed', lwd = 2) model4 <- mvgam(count ~ s(ndvi, k = 6),                 family = poisson(),                 data = data_train,                 newdata = data_test,                 trend_model = 'AR1') summary(model4) ## GAM formula: ## count ~ s(ndvi, k = 6) ##  ## Family: ## poisson ##  ## Link function: ## log ##  ## Trend model: ## AR1 ##  ## N series: ## 1  ##  ## N timepoints: ## 160  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM coefficient (beta) estimates: ##               2.5%    50% 97.5% Rhat n_eff ## (Intercept)  1.000  1.900 2.600 1.04    59 ## s(ndvi).1   -0.074  0.011 0.170 1.02   378 ## s(ndvi).2   -0.120  0.015 0.360 1.01   241 ## s(ndvi).3   -0.053 -0.002 0.049 1.00   872 ## s(ndvi).4   -0.240  0.120 1.500 1.02   183 ## s(ndvi).5   -0.097  0.150 0.350 1.01   491 ##  ## Approximate significance of GAM observation smooths: ##          edf Chi.sq p-value   ## s(ndvi) 1.22     80   0.072 . ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Latent trend parameter AR estimates: ##          2.5%  50% 97.5% Rhat n_eff ## ar1[1]   0.70 0.82  0.92 1.01   313 ## sigma[1] 0.67 0.80  0.96 1.01   476 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:45:08 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot_predictions(model4,                   condition = \\\"ndvi\\\",                  points = 0.5, rug = TRUE) plot(model4, type = 'forecast', newdata = data_test) ## Out of sample DRPS: ## [1] 150.4985 plot(model4, type = 'trend', newdata = data_test) loo_compare(model3, model4) ## Warning: Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details.  ## Warning: Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details. ##        elpd_diff se_diff ## model4    0.0       0.0  ## model3 -560.4      66.2 fc_mod3 <- forecast(model3) fc_mod4 <- forecast(model4) score_mod3 <- score(fc_mod3, score = 'drps') score_mod4 <- score(fc_mod4, score = 'drps') sum(score_mod4$PP$score, na.rm = TRUE) - sum(score_mod3$PP$score, na.rm = TRUE) ## [1] -136.4094\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\",\"id\":\"n-mixture-models\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"N-mixture models\",\"title\":\"N-mixtures in mvgam\",\"text\":\"N-mixture model fairly recent addition ecological modeller’s toolkit designed make inferences variation abundance species observations imperfect (Royle 2004). Briefly, assume \\\\(\\\\boldsymbol{Y_{,r}}\\\\) number individuals recorded site \\\\(\\\\) replicate sampling observation \\\\(r\\\\) (recorded non-negative integer). multiple replicate surveys done within short enough period satisfy assumption population remained closed (.e. substantial change true population size replicate surveys), can account fact observations aren’t perfect. done assuming replicate observations Binomial random variables parameterized true “latent” abundance \\\\(N\\\\) detection probability \\\\(p\\\\): \\\\[\\\\begin{align*} \\\\boldsymbol{Y_{,r}} & \\\\sim \\\\text{Binomial}(N_i, p_r) \\\\\\\\ N_{} & \\\\sim \\\\text{Poisson}(\\\\lambda_i)  \\\\end{align*}\\\\] Using set linear predictors, can estimate effects covariates \\\\(\\\\boldsymbol{X}\\\\) expected latent abundance (log link \\\\(\\\\lambda\\\\)) , jointly, effects possibly different covariates (call \\\\(\\\\boldsymbol{Q}\\\\)) detection probability (logit link \\\\(p\\\\)): \\\\[\\\\begin{align*} log(\\\\lambda) & = \\\\beta \\\\boldsymbol{X} \\\\\\\\ logit(p) & = \\\\gamma \\\\boldsymbol{Q}\\\\end{align*}\\\\] mvgam can handle type model designed propagate unobserved temporal processes evolve independently observation process State-space format. setup adapts well N-mixture models can thought State-space models latent state discrete variable representing “true” unknown population size. convenient can incorporate package’s diverse effect types (.e. multidimensional splines, time-varying effects, monotonic effects, random effects etc…) linear predictors. required work marginalization trick allows Stan’s sampling algorithms handle discrete parameters (see method “integrating ” discrete parameters works nice blog post Maxwell Joseph). family nmix() used set N-mixture models mvgam, still need little bit data wrangling ensure data set correct format (especially true one replicate survey per time period). important aspects : (1) set observation series trend_map arguments ensure replicate surveys mapped correct latent abundance model (2) inclusion cap variable defines maximum possible integer value use observation estimating latent abundance. two examples give reasonable overview can done.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\",\"id\":\"example-1-a-two-species-system-with-nonlinear-trends\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Example 1: a two-species system with nonlinear trends\",\"title\":\"N-mixtures in mvgam\",\"text\":\"First use simple simulation multiple replicate observations taken timepoint two different species. simulation produces observations single site six years, five replicate surveys per year. species simulated different nonlinear temporal trends different detection probabilities. now, detection probability fixed (.e. change time association covariates). Notice add cap variable, need static, define maximum possible value think latent abundance timepoint. simply needs large enough get reasonable idea latent N values likely, without adding much computational cost: data format isn’t difficult set , differ traditional multidimensional array setup commonly used fitting N-mixture models software packages. Next ensure species series IDs included factor variables, case ’d like allow certain effects vary species Preview dataset get idea structured:\",\"code\":\"set.seed(999) # Simulate observations for species 1, which shows a declining trend and 0.7 detection probability data.frame(site = 1,            # five replicates per year; six years            replicate = rep(1:5, 6),            time = sort(rep(1:6, 5)),            species = 'sp_1',            # true abundance declines nonlinearly            truth = c(rep(28, 5),                      rep(26, 5),                      rep(23, 5),                      rep(16, 5),                      rep(14, 5),                      rep(14, 5)),            # observations are taken with detection prob = 0.7            obs = c(rbinom(5, 28, 0.7),                    rbinom(5, 26, 0.7),                    rbinom(5, 23, 0.7),                    rbinom(5, 15, 0.7),                    rbinom(5, 14, 0.7),                    rbinom(5, 14, 0.7))) %>%   # add 'series' information, which is an identifier of site, replicate and species   dplyr::mutate(series = paste0('site_', site,                                 '_', species,                                 '_rep_', replicate),                 time = as.numeric(time),                 # add a 'cap' variable that defines the maximum latent N to                  # marginalize over when estimating latent abundance; in other words                 # how large do we realistically think the true abundance could be?                 cap = 100) %>%   dplyr::select(- replicate) -> testdat  # Now add another species that has a different temporal trend and a smaller  # detection probability (0.45 for this species) testdat = testdat %>%   dplyr::bind_rows(data.frame(site = 1,                               replicate = rep(1:5, 6),                               time = sort(rep(1:6, 5)),                               species = 'sp_2',                               truth = c(rep(4, 5),                                         rep(7, 5),                                         rep(15, 5),                                         rep(16, 5),                                         rep(19, 5),                                         rep(18, 5)),                               obs = c(rbinom(5, 4, 0.45),                                       rbinom(5, 7, 0.45),                                       rbinom(5, 15, 0.45),                                       rbinom(5, 16, 0.45),                                       rbinom(5, 19, 0.45),                                       rbinom(5, 18, 0.45))) %>%                      dplyr::mutate(series = paste0('site_', site,                                                    '_', species,                                                    '_rep_', replicate),                                    time = as.numeric(time),                                    cap = 50) %>%                      dplyr::select(-replicate)) testdat$species <- factor(testdat$species,                           levels = unique(testdat$species)) testdat$series <- factor(testdat$series,                          levels = unique(testdat$series)) dplyr::glimpse(testdat) ## Rows: 60 ## Columns: 7 ## $ site    <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,… ## $ time    <dbl> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,… ## $ species <fct> sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp… ## $ truth   <dbl> 28, 28, 28, 28, 28, 26, 26, 26, 26, 26, 23, 23, 23, 23, 23, 16… ## $ obs     <int> 20, 19, 23, 17, 18, 21, 18, 21, 19, 18, 17, 16, 20, 11, 19, 9,… ## $ series  <fct> site_1_sp_1_rep_1, site_1_sp_1_rep_2, site_1_sp_1_rep_3, site_… ## $ cap     <dbl> 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 10… head(testdat, 12) ##    site time species truth obs            series cap ## 1     1    1    sp_1    28  20 site_1_sp_1_rep_1 100 ## 2     1    1    sp_1    28  19 site_1_sp_1_rep_2 100 ## 3     1    1    sp_1    28  23 site_1_sp_1_rep_3 100 ## 4     1    1    sp_1    28  17 site_1_sp_1_rep_4 100 ## 5     1    1    sp_1    28  18 site_1_sp_1_rep_5 100 ## 6     1    2    sp_1    26  21 site_1_sp_1_rep_1 100 ## 7     1    2    sp_1    26  18 site_1_sp_1_rep_2 100 ## 8     1    2    sp_1    26  21 site_1_sp_1_rep_3 100 ## 9     1    2    sp_1    26  19 site_1_sp_1_rep_4 100 ## 10    1    2    sp_1    26  18 site_1_sp_1_rep_5 100 ## 11    1    3    sp_1    23  17 site_1_sp_1_rep_1 100 ## 12    1    3    sp_1    23  16 site_1_sp_1_rep_2 100\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\",\"id\":\"setting-up-the-trend_map\",\"dir\":\"Articles\",\"previous_headings\":\"Example 1: a two-species system with nonlinear trends\",\"what\":\"Setting up the trend_map\",\"title\":\"N-mixtures in mvgam\",\"text\":\"Finally, need set trend_map object. crucial allowing multiple observations linked latent process model (see information argument Shared latent states vignette. case, mapping operates species site state set replicate observations time point share exact latent abundance model: Notice replicates species 1 site 1 share process (.e. trend). ensure replicates Binomial draws latent N.\",\"code\":\"testdat %>%   # each unique combination of site*species is a separate process   dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%   dplyr::select(trend, series) %>%   dplyr::distinct() -> trend_map trend_map ##    trend            series ## 1      1 site_1_sp_1_rep_1 ## 2      1 site_1_sp_1_rep_2 ## 3      1 site_1_sp_1_rep_3 ## 4      1 site_1_sp_1_rep_4 ## 5      1 site_1_sp_1_rep_5 ## 6      2 site_1_sp_2_rep_1 ## 7      2 site_1_sp_2_rep_2 ## 8      2 site_1_sp_2_rep_3 ## 9      2 site_1_sp_2_rep_4 ## 10     2 site_1_sp_2_rep_5\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\",\"id\":\"modelling-with-the-nmix-family\",\"dir\":\"Articles\",\"previous_headings\":\"Example 1: a two-species system with nonlinear trends\",\"what\":\"Modelling with the nmix() family\",\"title\":\"N-mixtures in mvgam\",\"text\":\"Now ready fit model using mvgam(). model allow species different detection probabilities different temporal trends. use Cmdstan backend, default use Hamiltonian Monte Carlo full Bayesian inference View automatically-generated Stan code get sense marginalization latent N works summary model shows converged nicely loo() functionality works just mvgam models aid model comparison / selection Plot estimated smooths time species’ latent abundance process (log scale)  marginaleffects support allows useful prediction-based interrogations different scales. Objects use family nmix() additional prediction scales can used (.e. link, response, detection latent_N). example, estimated detection probabilities per species, shows model -estimated detection probability species 2 (originally simulated 0.45):  common goal N-mixture modelling estimate true latent abundance. model automatically generated predictions latent abundance conditional observations. can extract produce decent plots using small function Latent abundance plots vs simulated truths species shown . , red points show imperfect observations, black line shows true latent abundance, ribbons show credible intervals estimates:   can see estimates species correctly captured true temporal variation abundance. However, also apparent low detection probabilities (like species 2) make difficult accurately estimate latent abundance. likely improve estimates additional information inform estimates detection probability, covariates reflect ability take accurate measurements\",\"code\":\"mod <- mvgam(   # the observation formula sets up linear predictors for   # detection probability on the logit scale   formula = obs ~ species - 1,      # the trend_formula sets up the linear predictors for    # the latent abundance processes on the log scale   trend_formula = ~ s(time, by = trend, k = 4) + species,      # the trend_map takes care of the mapping   trend_map = trend_map,      # nmix() family and data   family = nmix(),   data = testdat,      # priors can be set in the usual way   priors = c(prior(std_normal(), class = b),              prior(normal(1, 1.5), class = Intercept_trend))) code(mod) ## // Stan model code generated by package mvgam ## functions { ##   /* Functions to return the log probability of a Poisson Binomial Mixture */ ##    ##   /* see Bollen et al 2023 for details (https://doi.org/10.1002/ece3.10595)*/ ##   real poisbin_lpmf(array[] int count, int k, array[] real lambda, ##                     array[] real p) { ##     if (max(count) > k) { ##       return negative_infinity(); ##     } ##     return poisson_log_lpmf(k | lambda) + binomial_logit_lpmf(count | k, p); ##   } ##   vector pb_logp(array[] int count, int max_k, array[] real lambda, ##                  array[] real p) { ##     int c_max = max(count); ##     if (max_k < c_max) { ##       reject(\\\"cap variable max_k must be >= observed counts\\\"); ##     } ##     vector[max_k + 1] lp; ##     for (k in 0 : (c_max - 1)) { ##       lp[k + 1] = negative_infinity(); ##     } ##     for (k in c_max : max_k) { ##       lp[k + 1] = poisbin_lpmf(count | k, lambda, p); ##     } ##     return lp; ##   } ##   real pb_lpmf(array[] int count, array[] int max_k, array[] real lambda, ##                array[] real p) { ##     // Take maximum of all supplied caps, in case they vary for some reason ##     int max_k_max = max(max_k); ##     vector[max_k_max + 1] lp; ##     lp = pb_logp(count, max_k_max, lambda, p); ##     return log_sum_exp(lp); ##   } ##   /* Functions to generate truncated Poisson variates */ ##   array[] int nmix_rng(array[] int count, array[] int max_k, ##                        array[] real lambda, array[] real p) { ##     // Take maximum of all supplied caps, in case they vary for some reason ##     int max_k_max = max(max_k); ##     vector[max_k_max + 1] lp; ##     lp = pb_logp(count, max_k_max, lambda, p); ##     return rep_array(categorical_rng(softmax(lp)) - 1, size(count)); ##   } ##   int trunc_pois_rng(int max_k, real lambda) { ##     real p_ub = poisson_cdf(max_k | lambda); ##     if (p_ub < 1e-9) { ##       return max_k; ##     } ##     real u = uniform_rng(0, p_ub); ##     int i = 0; ##     int X = 0; ##     real p = exp(-lambda); ##     real F = p; ##     while (1) { ##       if (u < F) { ##         X = i; ##         break; ##       } ##       i = i + 1; ##       p = lambda * p / i; ##       F = F + p; ##     } ##     return X; ##   } ## } ## data { ##   int<lower=0> total_obs; // total number of observations ##   int<lower=0> n; // number of timepoints per series ##   int<lower=0> n_sp_trend; // number of trend smoothing parameters ##   int<lower=0> n_lv; // number of dynamic factors ##   int<lower=0> n_series; // number of series ##   matrix[n_series, n_lv] Z; // matrix mapping series to latent states ##   int<lower=0> num_basis; // total number of basis coefficients ##   int<lower=0> num_basis_trend; // number of trend basis coefficients ##   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients ##   matrix[total_obs, num_basis] X; // mgcv GAM design matrix ##   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix ##   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) ##   array[n, n_lv] int ytimes_trend; ##   int<lower=0> n_nonmissing; // number of nonmissing observations ##   array[total_obs] int<lower=0> cap; // upper limits of latent abundances ##   array[total_obs] int ytimes_array; // sorted ytimes ##   array[n, n_series] int<lower=0> ytimes_pred; // time-ordered matrix for prediction ##   int<lower=0> K_groups; // number of unique replicated observations ##   int<lower=0> K_reps; // maximum number of replicate observations ##   array[K_groups] int<lower=0> K_starts; // col of K_inds where each group starts ##   array[K_groups] int<lower=0> K_stops; // col of K_inds where each group ends ##   array[K_groups, K_reps] int<lower=0> K_inds; // indices of replicated observations ##   matrix[3, 6] S_trend1; // mgcv smooth penalty matrix S_trend1 ##   matrix[3, 6] S_trend2; // mgcv smooth penalty matrix S_trend2 ##   array[total_obs] int<lower=0> flat_ys; // flattened observations ## } ## transformed data { ##    ## } ## parameters { ##   // raw basis coefficients ##   vector[num_basis] b_raw; ##   vector[num_basis_trend] b_raw_trend; ##    ##   // smoothing parameters ##   vector<lower=0>[n_sp_trend] lambda_trend; ## } ## transformed parameters { ##   // detection probability ##   vector[total_obs] p; ##    ##   // latent states ##   matrix[n, n_lv] LV; ##    ##   // latent states and loading matrix ##   vector[n * n_lv] trend_mus; ##   matrix[n, n_series] trend; ##   matrix[n_series, n_lv] lv_coefs; ##    ##   // basis coefficients ##   vector[num_basis] b; ##   vector[num_basis_trend] b_trend; ##    ##   // observation model basis coefficients ##   b[1 : num_basis] = b_raw[1 : num_basis]; ##    ##   // process model basis coefficients ##   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend]; ##    ##   // detection probability ##   p = X[ytimes_array,  : ] * b; ##    ##   // latent process linear predictors ##   trend_mus = X_trend * b_trend; ##   for (j in 1 : n_lv) { ##     LV[1 : n, j] = trend_mus[ytimes_trend[1 : n, j]]; ##   } ##    ##   // derived latent states ##   lv_coefs = Z; ##   for (i in 1 : n) { ##     for (s in 1 : n_series) { ##       trend[i, s] = dot_product(lv_coefs[s,  : ], LV[i,  : ]); ##     } ##   } ## } ## model { ##   // prior for speciessp_1... ##   b_raw[1] ~ std_normal(); ##    ##   // prior for speciessp_2... ##   b_raw[2] ~ std_normal(); ##    ##   // dynamic process models ##    ##   // prior for (Intercept)_trend... ##   b_raw_trend[1] ~ normal(1, 1.5); ##    ##   // prior for speciessp_2_trend... ##   b_raw_trend[2] ~ std_normal(); ##    ##   // prior for s(time):trendtrend1_trend... ##   b_raw_trend[3 : 5] ~ multi_normal_prec(zero_trend[3 : 5], ##                                          S_trend1[1 : 3, 1 : 3] ##                                          * lambda_trend[1] ##                                          + S_trend1[1 : 3, 4 : 6] ##                                            * lambda_trend[2]); ##    ##   // prior for s(time):trendtrend2_trend... ##   b_raw_trend[6 : 8] ~ multi_normal_prec(zero_trend[6 : 8], ##                                          S_trend2[1 : 3, 1 : 3] ##                                          * lambda_trend[3] ##                                          + S_trend2[1 : 3, 4 : 6] ##                                            * lambda_trend[4]); ##   lambda_trend ~ normal(5, 30); ##   { ##     // likelihood functions ##     vector[total_obs] flat_trends; ##     flat_trends = to_vector(trend); ##     for (k in 1 : K_groups) { ##       target += pb_lpmf(flat_ys[K_inds[k, K_starts[k] : K_stops[k]]] | cap[K_inds[k, K_starts[k] : K_stops[k]]], to_array_1d(flat_trends[K_inds[k, K_starts[k] : K_stops[k]]]), to_array_1d(p[K_inds[k, K_starts[k] : K_stops[k]]])); ##     } ##   } ## } ## generated quantities { ##   vector[total_obs] eta; ##   matrix[n, n_series] mus; ##   vector[n_sp_trend] rho_trend; ##   vector[n_lv] penalty; ##   array[n, n_series] int ypred; ##   array[n, n_series] int latent_ypred; ##   array[total_obs] int latent_truncpred; ##   vector[total_obs] flat_trends; ##   vector[total_obs] detprob; ##   detprob = inv_logit(p); ##   penalty = rep_vector(1e12, n_lv); ##   rho_trend = log(lambda_trend); ##    ##   // posterior predictions ##   eta = X * b; ##   { ##     flat_trends = to_vector(trend); ##      ##     // prediction for all timepoints that ignore detection prob ##     for (i in 1 : total_obs) { ##       latent_truncpred[i] = trunc_pois_rng(cap[i], exp(flat_trends[i])); ##     } ##      ##     // prediction for the nonmissing timepoints using actual obs ##     for (k in 1 : K_groups) { ##       latent_truncpred[K_inds[k, K_starts[k] : K_stops[k]]] = nmix_rng(flat_ys[K_inds[k, K_starts[k] : K_stops[k]]], ##                                                                     cap[K_inds[k, K_starts[k] : K_stops[k]]], ##                                                                     to_array_1d( ##                                                                     flat_trends[K_inds[k, K_starts[k] : K_stops[k]]]), ##                                                                     to_array_1d( ##                                                                     p[K_inds[k, K_starts[k] : K_stops[k]]])); ##     } ##     for (s in 1 : n_series) { ##       for (i in 1 : n) { ##         // true latent abundance ##         latent_ypred[i, s] = latent_truncpred[ytimes_pred[i, s]]; ##          ##         // observed abundance ##         ypred[i, s] = binomial_rng(latent_ypred[i, s], ##                                    detprob[ytimes_pred[i, s]]); ##          ##         // expected values ##         mus[i, s] = detprob[ytimes[i, s]] * latent_ypred[i, s]; ##       } ##     } ##   } ## } summary(mod) ## GAM observation formula: ## obs ~ species - 1 ##  ## GAM process formula: ## ~s(time, by = trend, k = 4) + species ##  ## Family: ## nmix ##  ## Link function: ## log ##  ## Trend model: ## None ##  ## N process models: ## 2  ##  ## N series: ## 10  ##  ## N timepoints: ## 6  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM observation model coefficient (beta) estimates: ##              2.5%  50% 97.5% Rhat n_eff ## speciessp_1 0.520 1.10   1.6    1   982 ## speciessp_2 0.031 0.71   1.2    1  1302 ##  ## GAM process model coefficient (beta) estimates: ##                               2.5%    50%  97.5% Rhat n_eff ## (Intercept)_trend            2.700  2.900  3.100    1   972 ## speciessp_2_trend           -1.100 -0.820 -0.530    1   881 ## s(time):trendtrend1.1_trend -0.061  0.027  0.220    1   821 ## s(time):trendtrend1.2_trend -0.150  0.028  0.250    1  1523 ## s(time):trendtrend1.3_trend -0.410 -0.280 -0.094    1  1102 ## s(time):trendtrend2.1_trend -0.310 -0.021  0.092    1   481 ## s(time):trendtrend2.2_trend -0.110  0.110  0.750    1   481 ## s(time):trendtrend2.3_trend  0.170  0.410  0.630    1   917 ##  ## Approximate significance of GAM process smooths: ##                        edf    F p-value    ## s(time):seriestrend1 0.596 0.26  0.0013 ** ## s(time):seriestrend2 0.881 0.41  0.0269 *  ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:46:52 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) loo(mod) ## Warning: Some Pareto k diagnostic values are slightly high. See help('pareto-k-diagnostic') for details. ##  ## Computed from 2000 by 60 log-likelihood matrix ##  ##          Estimate  SE ## elpd_loo   -140.0 3.2 ## p_loo         4.2 0.7 ## looic       280.0 6.3 ## ------ ## Monte Carlo SE of elpd_loo is 0.1. ##  ## Pareto k diagnostic values: ##                          Count Pct.    Min. n_eff ## (-Inf, 0.5]   (good)     57    95.0%   386        ##  (0.5, 0.7]   (ok)        3     5.0%   567        ##    (0.7, 1]   (bad)       0     0.0%   <NA>       ##    (1, Inf)   (very bad)  0     0.0%   <NA>       ##  ## All Pareto k estimates are ok (k < 0.7). ## See help('pareto-k-diagnostic') for details. plot(mod, type = 'smooths', trend_effects = TRUE) plot_predictions(mod, condition = 'species',                  type = 'detection') +   ylab('Pr(detection)') +   ylim(c(0, 1)) +   theme_classic() +   theme(legend.position = 'none') hc <- hindcast(mod, type = 'latent_N')  # Function to plot latent abundance estimates vs truth plot_latentN = function(hindcasts, data, species = 'sp_1'){   all_series <- unique(data %>%                          dplyr::filter(species == !!species) %>%                          dplyr::pull(series))      # Grab the first replicate that represents this series   # so we can get the true simulated values   series <- as.numeric(all_series[1])   truths <- data %>%     dplyr::arrange(time, series) %>%     dplyr::filter(series == !!levels(data$series)[series]) %>%     dplyr::pull(truth)      # In case some replicates have missing observations,   # pull out predictions for ALL replicates and average over them   hcs <- do.call(rbind, lapply(all_series, function(x){     ind <- which(names(hindcasts$hindcasts) %in% as.character(x))     hindcasts$hindcasts[[ind]]   }))      # Calculate posterior empirical quantiles of predictions   pred_quantiles <- data.frame(t(apply(hcs, 2, function(x)      quantile(x, probs = c(0.05, 0.2, 0.3, 0.4,                            0.5, 0.6, 0.7, 0.8, 0.95)))))   pred_quantiles$time <- 1:NROW(pred_quantiles)   pred_quantiles$truth <- truths      # Grab observations   data %>%     dplyr::filter(series %in% all_series) %>%     dplyr::select(time, obs) -> observations      # Plot   ggplot(pred_quantiles, aes(x = time, group = 1)) +     geom_ribbon(aes(ymin = X5., ymax = X95.), fill = \\\"#DCBCBC\\\") +      geom_ribbon(aes(ymin = X30., ymax = X70.), fill = \\\"#B97C7C\\\") +     geom_line(aes(x = time, y = truth),               colour = 'black', linewidth = 1) +     geom_point(aes(x = time, y = truth),                shape = 21, colour = 'white', fill = 'black',                size = 2.5) +     geom_jitter(data = observations, aes(x = time, y = obs),                 width = 0.06,                  shape = 21, fill = 'darkred', colour = 'white', size = 2.5) +     labs(y = 'Latent abundance (N)',          x = 'Time',          title = species) } plot_latentN(hc, testdat, species = 'sp_1') plot_latentN(hc, testdat, species = 'sp_2')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\",\"id\":\"example-2-a-two-species-system-with-nonlinear-trends\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Example 2: a two-species system with nonlinear trends\",\"title\":\"N-mixtures in mvgam\",\"text\":\"Now another example larger dataset. use data Jeff Doser’s simulation example wonderful spAbundance package. simulated data include one continuous site-level covariate, one factor site-level covariate two continuous sample-level covariates. example allow us examine can include possibly nonlinear effects latent process detection probability models. Download data grab observations / covariate measurements one species Next wrangle appropriate ‘long’ data format, adding indicators time series working mvgam. also add cap variable represent maximum latent N marginalize observation data include observations 225 sites three replicates per site, though observations missing final step data preparation course trend_map, sets mapping observation replicates latent abundance models. done way example Now ready fit model using mvgam(). use penalized splines continuous covariate effects detect possible nonlinear associations. also showcase mvgam can make use different approximation algorithms available Stan using meanfield variational Bayes approximator (reduces computation time substantially) Inspect model summary don’t bother looking estimates individual spline coefficients. Notice longer receive information convergence use MCMC sampling model can make use marginaleffects support interrogating model targeted predictions. First, can inspect estimated average detection probability Next investigate estimated effects covariates latent abundance using conditional_effects() function specifying type = 'link'; return plots expectation scale effect continuous covariate expected latent abundance  effect factor covariate expected latent abundance, estimated hierarchical random effect  Now can investigate estimated effects covariates detection probability using type = 'detection' covariate smooths estimated somewhat nonlinear logit scale according model summary (based approximate significances). inspecting conditional effects covariate probability scale intuitive useful   targeted predictions also easy marginaleffects support. example, can ask: detection probability change change detection covariates?  model found support important covariate effects, course ’d want interrogate well model predicts think possible spatial effects capture unmodelled variation latent abundance.\",\"code\":\"# Date link load(url('https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda')) data.one.sp <- dataNMixSim  # Pull out observations for one species data.one.sp$y <- data.one.sp$y[1, , ]  # Abundance covariates that don't change across repeat sampling observations abund.cov <- dataNMixSim$abund.covs[, 1] abund.factor <- as.factor(dataNMixSim$abund.covs[, 2])  # Detection covariates that can change across repeat sampling observations # Note that `NA`s are not allowed for covariates in mvgam, so we randomly # impute them here det.cov <- dataNMixSim$det.covs$det.cov.1[,] det.cov[is.na(det.cov)] <- rnorm(length(which(is.na(det.cov)))) det.cov2 <- dataNMixSim$det.covs$det.cov.2 det.cov2[is.na(det.cov2)] <- rnorm(length(which(is.na(det.cov2)))) mod_data <- do.call(rbind,                     lapply(1:NROW(data.one.sp$y), function(x){                       data.frame(y = data.one.sp$y[x,],                                  abund_cov = abund.cov[x],                                  abund_fac = abund.factor[x],                                  det_cov = det.cov[x,],                                  det_cov2 = det.cov2[x,],                                  replicate = 1:NCOL(data.one.sp$y),                                  site = paste0('site', x))                     })) %>%   dplyr::mutate(species = 'sp_1',                 series = as.factor(paste0(site, '_', species, '_', replicate))) %>%   dplyr::mutate(site = factor(site, levels = unique(site)),                 species = factor(species, levels = unique(species)),                 time = 1,                 cap = max(data.one.sp$y, na.rm = TRUE) + 20) NROW(mod_data) ## [1] 675 dplyr::glimpse(mod_data) ## Rows: 675 ## Columns: 11 ## $ y         <int> 1, NA, NA, NA, 2, 2, NA, 1, NA, NA, 0, 1, 0, 0, 0, 0, NA, NA… ## $ abund_cov <dbl> -0.3734384, -0.3734384, -0.3734384, 0.7064305, 0.7064305, 0.… ## $ abund_fac <fct> 3, 3, 3, 4, 4, 4, 9, 9, 9, 2, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, … ## $ det_cov   <dbl> -1.2827999, -0.6412036, 1.7083192, 0.7640157, 0.1954809, 0.9… ## $ det_cov2  <dbl> 2.030473137, 0.151511085, -0.439251153, -1.481393226, 1.0455… ## $ replicate <int> 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, … ## $ site      <fct> site1, site1, site1, site2, site2, site2, site3, site3, site… ## $ species   <fct> sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, … ## $ series    <fct> site1_sp_1_1, site1_sp_1_2, site1_sp_1_3, site2_sp_1_1, site… ## $ time      <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, … ## $ cap       <dbl> 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, … head(mod_data) ##    y  abund_cov abund_fac    det_cov   det_cov2 replicate  site species ## 1  1 -0.3734384         3 -1.2827999  2.0304731         1 site1    sp_1 ## 2 NA -0.3734384         3 -0.6412036  0.1515111         2 site1    sp_1 ## 3 NA -0.3734384         3  1.7083192 -0.4392512         3 site1    sp_1 ## 4 NA  0.7064305         4  0.7640157 -1.4813932         1 site2    sp_1 ## 5  2  0.7064305         4  0.1954809  1.0455536         2 site2    sp_1 ## 6  2  0.7064305         4  0.9673034  1.9197118         3 site2    sp_1 ##         series time cap ## 1 site1_sp_1_1    1  33 ## 2 site1_sp_1_2    1  33 ## 3 site1_sp_1_3    1  33 ## 4 site2_sp_1_1    1  33 ## 5 site2_sp_1_2    1  33 ## 6 site2_sp_1_3    1  33 mod_data %>%   # each unique combination of site*species is a separate process   dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%   dplyr::select(trend, series) %>%   dplyr::distinct() -> trend_map  trend_map %>%   dplyr::arrange(trend) %>%   head(12) ##    trend         series ## 1      1 site100_sp_1_1 ## 2      1 site100_sp_1_2 ## 3      1 site100_sp_1_3 ## 4      2 site101_sp_1_1 ## 5      2 site101_sp_1_2 ## 6      2 site101_sp_1_3 ## 7      3 site102_sp_1_1 ## 8      3 site102_sp_1_2 ## 9      3 site102_sp_1_3 ## 10     4 site103_sp_1_1 ## 11     4 site103_sp_1_2 ## 12     4 site103_sp_1_3 mod <- mvgam(   # effects of covariates on detection probability;   # here we use penalized splines for both continuous covariates   formula = y ~ s(det_cov, k = 3) + s(det_cov2, k = 3),      # effects of the covariates on latent abundance;   # here we use a penalized spline for the continuous covariate and   # hierarchical intercepts for the factor covariate   trend_formula = ~ s(abund_cov, k = 3) +     s(abund_fac, bs = 're'),      # link multiple observations to each site   trend_map = trend_map,      # nmix() family and supplied data   family = nmix(),   data = mod_data,      # standard normal priors on key regression parameters   priors = c(prior(std_normal(), class = 'b'),              prior(std_normal(), class = 'Intercept'),              prior(std_normal(), class = 'Intercept_trend')),      # use Stan's variational inference for quicker results   algorithm = 'meanfield',   samples = 1000) summary(mod, include_betas = FALSE) ## GAM observation formula: ## y ~ s(det_cov, k = 3) + s(det_cov2, k = 3) ##  ## GAM process formula: ## ~s(abund_cov, k = 3) + s(abund_fac, bs = \\\"re\\\") ##  ## Family: ## nmix ##  ## Link function: ## log ##  ## Trend model: ## None ##  ## N process models: ## 225  ##  ## N series: ## 675  ##  ## N timepoints: ## 1  ##  ## Status: ## Fitted using Stan  ## 1 chains, each with iter = 1000; warmup = ; thin = 1  ## Total post-warmup draws = 1000 ##  ##  ## GAM observation model coefficient (beta) estimates: ##             2.5%  50% 97.5% Rhat n.eff ## (Intercept) 0.35 0.75   1.2  NaN   NaN ##  ## Approximate significance of GAM observation smooths: ##              edf Chi.sq p-value     ## s(det_cov)  1.99   86.7 0.00086 *** ## s(det_cov2) 2.00  359.2 < 2e-16 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## GAM process model coefficient (beta) estimates: ##                   2.5% 50% 97.5% Rhat n.eff ## (Intercept)_trend 0.91 1.2   1.4  NaN   NaN ##  ## GAM process model group-level estimates: ##                           2.5%   50% 97.5% Rhat n.eff ## mean(s(abund_fac))_trend -1.70 -1.40 -1.20  NaN   NaN ## sd(s(abund_fac))_trend    0.17  0.28  0.48  NaN   NaN ##  ## Approximate significance of GAM process smooths: ##               edf    F p-value   ## s(abund_cov) 1.90 2.13   0.978   ## s(abund_fac) 8.87 1.28   0.039 * ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Posterior approximation used: no diagnostics to compute avg_predictions(mod, type = 'detection') ##  ##  Estimate 2.5 % 97.5 % ##     0.647 0.568  0.721 ##  ## Columns: estimate, conf.low, conf.high  ## Type:  detection abund_plots <- plot(conditional_effects(mod,                                         type = 'link',                                         effects = c('abund_cov',                                                     'abund_fac')),                     plot = FALSE) abund_plots[[1]] +   ylab('Expected latent abundance') abund_plots[[2]] +   ylab('Expected latent abundance') det_plots <- plot(conditional_effects(mod,                                       type = 'detection',                                       effects = c('det_cov',                                                   'det_cov2')),                   plot = FALSE) det_plots[[1]] +   ylab('Pr(detection)') det_plots[[2]] +   ylab('Pr(detection)') fivenum_round = function(x)round(fivenum(x, na.rm = TRUE), 2)  plot_predictions(mod,                   newdata = datagrid(det_cov = unique,                                     det_cov2 = fivenum_round),                  by = c('det_cov', 'det_cov2'),                  type = 'detection') +   theme_classic() +   ylab('Pr(detection)')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\",\"id\":\"further-reading\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Further reading\",\"title\":\"N-mixtures in mvgam\",\"text\":\"following papers resources offer useful material N-mixture models ecological population dynamics investigations: Guélat, Jérôme, Kéry, Marc. “Effects Spatial Autocorrelation Imperfect Detection Species Distribution Models.” Methods Ecology Evolution 9 (2018): 1614–25. Kéry, Marc, Royle Andrew J. “Applied hierarchical modeling ecology: Analysis distribution, abundance species richness R BUGS: Volume 2: Dynamic advanced models”. London, UK: Academic Press (2020). Royle, Andrew J. “N‐mixture models estimating population size spatially replicated counts.” Biometrics 60.1 (2004): 108-115.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"the-trend_map-argument\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"The trend_map argument\",\"title\":\"Shared latent states in mvgam\",\"text\":\"trend_map argument mvgam() function optional data.frame can used specify series depend latent process models (called “trends” mvgam). can particularly useful wish force multiple observed time series depend latent trend process, different observation processes. argument supplied, latent factor model set setting use_lv = TRUE using supplied trend_map set shared trends. Users familiar MARSS family packages recognize way specifying \\\\(Z\\\\) matrix. data.frame needs column names series trend, integer values trend column state trend series depend . series column single unique entry time series data, names perfectly match factor levels series variable data). example, simulate collection three integer-valued time series (using sim_mvgam), following trend_map force first two series share latent trend process: can see factor levels trend_map match data:\",\"code\":\"set.seed(122) simdat <- sim_mvgam(trend_model = 'AR1',                     prop_trend = 0.6,                     mu = c(0, 1, 2),                     family = poisson()) trend_map <- data.frame(series = unique(simdat$data_train$series),                         trend = c(1, 1, 2)) trend_map ##     series trend ## 1 series_1     1 ## 2 series_2     1 ## 3 series_3     2 all.equal(levels(trend_map$series), levels(simdat$data_train$series)) ## [1] TRUE\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"checking-trend_map-with-run_model-false\",\"dir\":\"Articles\",\"previous_headings\":\"The trend_map argument\",\"what\":\"Checking trend_map with run_model = FALSE\",\"title\":\"Shared latent states in mvgam\",\"text\":\"Supplying trend_map mvgam function simple model, setting run_model = FALSE, allows us inspect constructed Stan code data objects used condition model. set model series different observation process (different intercept per series case), two latent dynamic process models evolve independent AR1 processes also contain shared nonlinear smooth function capture repeated seasonality. model complicated show can learn shared independent effects collections time series mvgam framework: Inspecting Stan code shows model dynamic factor model loadings constructed reflect supplied trend_map: Notice line states “lv_coefs = Z;”. uses supplied \\\\(Z\\\\) matrix construct loading coefficients. supplied matrix now looks exactly like ’d use create similar model MARSS package:\",\"code\":\"fake_mod <- mvgam(y ~                      # observation model formula, which has a                      # different intercept per series                     series - 1,                                      # process model formula, which has a shared seasonal smooth                   # (each latent process model shares the SAME smooth)                   trend_formula = ~ s(season, bs = 'cc', k = 6),                                      # AR1 dynamics (each latent process model has DIFFERENT)                   # dynamics                   trend_model = 'AR1',                                      # supplied trend_map                   trend_map = trend_map,                                      # data and observation family                   family = poisson(),                   data = simdat$data_train,                   run_model = FALSE) code(fake_mod) ## // Stan model code generated by package mvgam ## data { ##   int<lower=0> total_obs; // total number of observations ##   int<lower=0> n; // number of timepoints per series ##   int<lower=0> n_sp_trend; // number of trend smoothing parameters ##   int<lower=0> n_lv; // number of dynamic factors ##   int<lower=0> n_series; // number of series ##   matrix[n_series, n_lv] Z; // matrix mapping series to latent states ##   int<lower=0> num_basis; // total number of basis coefficients ##   int<lower=0> num_basis_trend; // number of trend basis coefficients ##   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients ##   matrix[total_obs, num_basis] X; // mgcv GAM design matrix ##   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix ##   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) ##   array[n, n_lv] int ytimes_trend; ##   int<lower=0> n_nonmissing; // number of nonmissing observations ##   matrix[4, 4] S_trend1; // mgcv smooth penalty matrix S_trend1 ##   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations ##   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations ##   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations ## } ## transformed data { ##    ## } ## parameters { ##   // raw basis coefficients ##   vector[num_basis] b_raw; ##   vector[num_basis_trend] b_raw_trend; ##    ##   // latent state SD terms ##   vector<lower=0>[n_lv] sigma; ##    ##   // latent state AR1 terms ##   vector<lower=-1.5, upper=1.5>[n_lv] ar1; ##    ##   // latent states ##   matrix[n, n_lv] LV; ##    ##   // smoothing parameters ##   vector<lower=0>[n_sp_trend] lambda_trend; ## } ## transformed parameters { ##   // latent states and loading matrix ##   vector[n * n_lv] trend_mus; ##   matrix[n, n_series] trend; ##   matrix[n_series, n_lv] lv_coefs; ##    ##   // basis coefficients ##   vector[num_basis] b; ##   vector[num_basis_trend] b_trend; ##    ##   // observation model basis coefficients ##   b[1 : num_basis] = b_raw[1 : num_basis]; ##    ##   // process model basis coefficients ##   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend]; ##    ##   // latent process linear predictors ##   trend_mus = X_trend * b_trend; ##    ##   // derived latent states ##   lv_coefs = Z; ##   for (i in 1 : n) { ##     for (s in 1 : n_series) { ##       trend[i, s] = dot_product(lv_coefs[s,  : ], LV[i,  : ]); ##     } ##   } ## } ## model { ##   // prior for seriesseries_1... ##   b_raw[1] ~ student_t(3, 0, 2); ##    ##   // prior for seriesseries_2... ##   b_raw[2] ~ student_t(3, 0, 2); ##    ##   // prior for seriesseries_3... ##   b_raw[3] ~ student_t(3, 0, 2); ##    ##   // priors for AR parameters ##   ar1 ~ std_normal(); ##    ##   // priors for latent state SD parameters ##   sigma ~ student_t(3, 0, 2.5); ##    ##   // dynamic process models ##    ##   // prior for s(season)_trend... ##   b_raw_trend[1 : 4] ~ multi_normal_prec(zero_trend[1 : 4], ##                                          S_trend1[1 : 4, 1 : 4] ##                                          * lambda_trend[1]); ##   lambda_trend ~ normal(5, 30); ##   for (j in 1 : n_lv) { ##     LV[1, j] ~ normal(trend_mus[ytimes_trend[1, j]], sigma[j]); ##     for (i in 2 : n) { ##       LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]] ##                         + ar1[j] ##                           * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]), ##                         sigma[j]); ##     } ##   } ##   { ##     // likelihood functions ##     vector[n_nonmissing] flat_trends; ##     flat_trends = to_vector(trend)[obs_ind]; ##     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0, ##                               append_row(b, 1.0)); ##   } ## } ## generated quantities { ##   vector[total_obs] eta; ##   matrix[n, n_series] mus; ##   vector[n_sp_trend] rho_trend; ##   vector[n_lv] penalty; ##   array[n, n_series] int ypred; ##   penalty = 1.0 / (sigma .* sigma); ##   rho_trend = log(lambda_trend); ##    ##   // posterior predictions ##   eta = X * b; ##   for (s in 1 : n_series) { ##     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; ##     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]); ##   } ## } fake_mod$model_data$Z ##      [,1] [,2] ## [1,]    1    0 ## [2,]    1    0 ## [3,]    0    1\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"fitting-and-inspecting-the-model\",\"dir\":\"Articles\",\"previous_headings\":\"The trend_map argument\",\"what\":\"Fitting and inspecting the model\",\"title\":\"Shared latent states in mvgam\",\"text\":\"Though model doesn’t perfectly match data-generating process (allowed series different underlying dynamics), can still fit show resulting inferences look like: summary model informative shows two latent process models estimated, even though three observed time series. model converges well Quick plots main effects can made using conditional_effects():  Even informative plots latent processes. series 1 2 share exact estimates, estimates series 3 different:    However, forecasts series’ 1 2 differ different intercepts observation model\",\"code\":\"full_mod <- mvgam(y ~ series - 1,                   trend_formula = ~ s(season, bs = 'cc', k = 6),                   trend_model = 'AR1',                   trend_map = trend_map,                   family = poisson(),                   data = simdat$data_train) summary(full_mod) ## GAM observation formula: ## y ~ series - 1 ##  ## GAM process formula: ## ~s(season, bs = \\\"cc\\\", k = 6) ##  ## Family: ## poisson ##  ## Link function: ## log ##  ## Trend model: ## AR1 ##  ## N process models: ## 2  ##  ## N series: ## 3  ##  ## N timepoints: ## 75  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## GAM observation model coefficient (beta) estimates: ##                 2.5%   50% 97.5% Rhat n_eff ## seriesseries_1 -0.15 0.088  0.31 1.00  1895 ## seriesseries_2  0.92 1.100  1.20 1.00  1267 ## seriesseries_3  1.90 2.100  2.30 1.02   256 ##  ## Process model AR parameter estimates: ##         2.5%    50%  97.5% Rhat n_eff ## ar1[1] -0.72 -0.420 -0.056    1   676 ## ar1[2] -0.28 -0.011  0.280    1  1433 ##  ## Process error parameter estimates: ##          2.5%  50% 97.5% Rhat n_eff ## sigma[1] 0.33 0.49  0.67    1   487 ## sigma[2] 0.59 0.73  0.91    1   948 ##  ## GAM process model coefficient (beta) estimates: ##                    2.5%    50% 97.5% Rhat n_eff ## s(season).1_trend -0.22 -0.011  0.20    1  1612 ## s(season).2_trend -0.27 -0.045  0.18    1  1745 ## s(season).3_trend -0.15  0.074  0.29    1  1347 ## s(season).4_trend -0.15  0.067  0.28    1  1561 ##  ## Approximate significance of GAM process smooths: ##            edf   F p-value ## s(season) 1.52 0.1    0.91 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:55:17 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot(conditional_effects(full_mod, type = 'link'), ask = FALSE) plot(full_mod, type = 'trend', series = 1) plot(full_mod, type = 'trend', series = 2) plot(full_mod, type = 'trend', series = 3) plot(full_mod, type = 'forecast', series = 1) plot(full_mod, type = 'forecast', series = 2) plot(full_mod, type = 'forecast', series = 3)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"example-signal-detection\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Example: signal detection\",\"title\":\"Shared latent states in mvgam\",\"text\":\"Now explore complicated example. simulate true hidden signal trying track. signal depends nonlinearly covariate (called productivity, represents measure productive landscape ). signal also demonstrates fairly large amount temporal autocorrelation: Plot signal inspect ’s evolution time  plot relationship signal productivity covariate:  Next simulate three sensors trying track hidden signal. sensors different observation errors can depend nonlinearly second external covariate, called temperature example. makes use gamSim Plot sensor observations  now plot observed relationships three sensors temperature covariate\",\"code\":\"set.seed(543210) # simulate a nonlinear relationship using the mgcv function gamSim signal_dat <- gamSim(n = 100, eg = 1, scale = 1) ## Gu & Wahba 4 term additive model # productivity is one of the variables in the simulated data productivity <- signal_dat$x2  # simulate the true signal, which already has a nonlinear relationship # with productivity; we will add in a fairly strong AR1 process to  # contribute to the signal true_signal <- as.vector(scale(signal_dat$y) +                          arima.sim(100, model = list(ar = 0.8, sd = 0.1))) plot(true_signal, type = 'l',      bty = 'l', lwd = 2,      ylab = 'True signal',      xlab = 'Time') plot(true_signal ~ productivity,      pch = 16, bty = 'l',      ylab = 'True signal',      xlab = 'Productivity') set.seed(543210) sim_series = function(n_series = 3, true_signal){   temp_effects <- gamSim(n = 100, eg = 7, scale = 0.1)   temperature <- temp_effects$y   alphas <- rnorm(n_series, sd = 2)    do.call(rbind, lapply(seq_len(n_series), function(series){     data.frame(observed = rnorm(length(true_signal),                                 mean = alphas[series] +                                        1.5*as.vector(scale(temp_effects[, series + 1])) +                                        true_signal,                                 sd = runif(1, 1, 2)),                series = paste0('sensor_', series),                time = 1:length(true_signal),                temperature = temperature,                productivity = productivity,                true_signal = true_signal)    }))   } model_dat <- sim_series(true_signal = true_signal) %>%   dplyr::mutate(series = factor(series)) ## Gu & Wahba 4 term additive model, correlated predictors plot_mvgam_series(data = model_dat, y = 'observed',                   series = 'all') plot(observed ~ temperature, data = model_dat %>%    dplyr::filter(series == 'sensor_1'),    pch = 16, bty = 'l',    ylab = 'Sensor 1',    xlab = 'Temperature') plot(observed ~ temperature, data = model_dat %>%    dplyr::filter(series == 'sensor_2'),    pch = 16, bty = 'l',    ylab = 'Sensor 2',    xlab = 'Temperature') plot(observed ~ temperature, data = model_dat %>%    dplyr::filter(series == 'sensor_3'),    pch = 16, bty = 'l',    ylab = 'Sensor 3',    xlab = 'Temperature')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"the-shared-signal-model\",\"dir\":\"Articles\",\"previous_headings\":\"Example: signal detection\",\"what\":\"The shared signal model\",\"title\":\"Shared latent states in mvgam\",\"text\":\"Now can formulate fit model allows sensor’s observation error depend nonlinearly temperature allowing true signal depend nonlinearly productivity. fixing values trend column 1 trend_map, assuming observation sensors tracking latent signal. use informative priors two variance components (process error observation error), reflect prior belief observation error smaller overall true process error View reduced version model summary many spline coefficients model\",\"code\":\"mod <- mvgam(formula =                # formula for observations, allowing for different                # intercepts and hierarchical smooth effects of temperature                observed ~ series +                 s(temperature, k = 10) +                s(series, temperature, bs = 'sz', k = 8),                            trend_formula =                # formula for the latent signal, which can depend                # nonlinearly on productivity                ~ s(productivity, k = 8),                            trend_model =                # in addition to productivity effects, the signal is                # assumed to exhibit temporal autocorrelation                'AR1',                            trend_map =                # trend_map forces all sensors to track the same                # latent signal                data.frame(series = unique(model_dat$series),                           trend = c(1, 1, 1)),                            # informative priors on process error              # and observation error will help with convergence              priors = c(prior(normal(2, 0.5), class = sigma),                         prior(normal(1, 0.5), class = sigma_obs)),                            # Gaussian observations              family = gaussian(),              data = model_dat) summary(mod, include_betas = FALSE) ## GAM observation formula: ## observed ~ series + s(temperature, k = 10) + s(series, temperature,  ##     bs = \\\"sz\\\", k = 8) ##  ## GAM process formula: ## ~s(productivity, k = 8) ##  ## Family: ## gaussian ##  ## Link function: ## identity ##  ## Trend model: ## AR1 ##  ## N process models: ## 1  ##  ## N series: ## 3  ##  ## N timepoints: ## 100  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1100; warmup = 600; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## Observation error parameter estimates: ##              2.5% 50% 97.5% Rhat n_eff ## sigma_obs[1]  1.6 1.9   2.2    1  1757 ## sigma_obs[2]  1.4 1.7   2.0    1  1090 ## sigma_obs[3]  1.3 1.5   1.8    1  1339 ##  ## GAM observation model coefficient (beta) estimates: ##                 2.5%   50% 97.5% Rhat n_eff ## (Intercept)     0.72  1.70  2.50 1.01   360 ## seriessensor_2 -2.10 -0.96  0.32 1.00  1068 ## seriessensor_3 -3.40 -2.00 -0.39 1.00  1154 ##  ## Approximate significance of GAM observation smooths: ##                        edf     F p-value     ## s(temperature)        1.22 12.66 < 2e-16 *** ## s(series,temperature) 1.92  0.95 6.9e-06 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Process model AR parameter estimates: ##        2.5%  50% 97.5% Rhat n_eff ## ar1[1] 0.33 0.59  0.83    1   492 ##  ## Process error parameter estimates: ##          2.5% 50% 97.5% Rhat n_eff ## sigma[1] 0.72   1   1.3 1.01   392 ##  ## Approximate significance of GAM process smooths: ##                 edf    F p-value     ## s(productivity) 3.6 8.31 5.1e-05 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhats above 1.05 found for 28 parameters ##  *Diagnose further to investigate why the chains have not mixed ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:57:49 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"inspecting-effects-on-both-process-and-observation-models\",\"dir\":\"Articles\",\"previous_headings\":\"Example: signal detection\",\"what\":\"Inspecting effects on both process and observation models\",\"title\":\"Shared latent states in mvgam\",\"text\":\"Don’t pay much attention approximate p-values smooth terms. calculation values incredibly sensitive estimates smoothing parameters don’t tend find meaningful. meaningful, however, prediction-based plots smooth functions. example, estimated response underlying signal productivity:  estimated relationships sensor observations temperature covariate:  main effects can quickly plotted conditional_effects:  conditional_effects simply wrapper flexible plot_predictions function marginaleffects package. can get useful plots effects using function customisation:  successfully estimated effects, nonlinear, impact hidden process observations. single joint model. can always challenges models, particularly estimating process observation error time. example, pairs plot observation error sensor 1 hidden process error shows strong correlations might want deal using structured prior:  leave model -example\",\"code\":\"plot(mod, type = 'smooths', trend_effects = TRUE) plot(mod, type = 'smooths') plot(conditional_effects(mod, type = 'link'), ask = FALSE) plot_predictions(mod,                   condition = c('temperature', 'series', 'series'),                  points = 0.5) +   theme(legend.position = 'none') pairs(mod, variable = c('sigma[1]', 'sigma_obs[1]'))\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"recovering-the-hidden-signal\",\"dir\":\"Articles\",\"previous_headings\":\"Example: signal detection\",\"what\":\"Recovering the hidden signal\",\"title\":\"Shared latent states in mvgam\",\"text\":\"final key question whether can successfully recover true hidden signal. trend slot returned model parameters estimates signal, can easily plot using mvgam S3 method plot. can also overlay true values hidden signal, shows model done good job recovering :\",\"code\":\"plot(mod, type = 'trend')  # Overlay the true simulated signal points(true_signal, pch = 16, cex = 1, col = 'white') points(true_signal, pch = 16, cex = 0.8)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\",\"id\":\"further-reading\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Further reading\",\"title\":\"Shared latent states in mvgam\",\"text\":\"following papers resources offer lot useful material types State-Space models can applied practice: Holmes, Elizabeth E., Eric J. Ward, Wills Kellie. “MARSS: multivariate autoregressive state-space models analyzing time-series data.” R Journal. 4.1 (2012): 11. Ward, Eric J., et al. “Inferring spatial structure time‐series data: using multivariate state‐space models detect metapopulation structure California sea lions Gulf California, Mexico.” Journal Applied Ecology 47.1 (2010): 47-56. Auger‐Méthé, Marie, et al. “guide state–space modeling ecological time series.” Ecological Monographs 91.4 (2021): e01470.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"time-varying-effects\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Time-varying effects\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"Dynamic fixed-effect coefficients (often referred dynamic linear models) can readily incorporated GAMs / DGAMs. mvgam, dynamic() formula wrapper offers convenient interface set . plan incorporate range dynamic options (random walk, AR1 etc…) moment low-rank Gaussian Process (GP) smooths allowed (making use either gp basis mgcv Hilbert space approximate GPs). advantageous splines random walk effects several reasons. First, GPs force time-varying effect smooth. often makes sense reality, expect regression coefficient change rapidly one time point next. Second, GPs provide information ‘global’ dynamics time-varying effect length-scale parameters. means can use provide accurate forecasts effect expected change future, something couldn’t well used splines estimate effect. example illustrates.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"simulating-time-varying-effects\",\"dir\":\"Articles\",\"previous_headings\":\"Time-varying effects\",\"what\":\"Simulating time-varying effects\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"Simulate time-varying coefficient using squared exponential Gaussian Process function length scale \\\\(\\\\rho\\\\)=10. using internal function mvgam (sim_gp function): plot time-varying coefficient shows changes smoothly time:  Next need simulate values covariate, call temp (represent \\\\(temperature\\\\)). case just use standard normal distribution simulate covariate: Finally, simulate outcome variable, Gaussian observation process (observation error) time-varying effect \\\\(temperature\\\\)  Gather data data.frame fitting models, split data training testing folds. Plot series\",\"code\":\"set.seed(1111) N <- 200 beta_temp <- mvgam:::sim_gp(rnorm(1),                             alpha_gp = 0.75,                             rho_gp = 10,                             h = N) + 0.5 plot(beta_temp, type = 'l', lwd = 3,       bty = 'l', xlab = 'Time', ylab = 'Coefficient',      col = 'darkred') box(bty = 'l', lwd = 2) temp <- rnorm(N, sd = 1) out <- rnorm(N, mean = 4 + beta_temp * temp,              sd = 0.25) time <- seq_along(temp) plot(out,  type = 'l', lwd = 3,       bty = 'l', xlab = 'Time', ylab = 'Outcome',      col = 'darkred') box(bty = 'l', lwd = 2) data <- data.frame(out, temp, time) data_train <- data[1:190,] data_test <- data[191:200,] plot_mvgam_series(data = data_train, newdata = data_test, y = 'out')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"the-dynamic-function\",\"dir\":\"Articles\",\"previous_headings\":\"Time-varying effects\",\"what\":\"The dynamic() function\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"Time-varying coefficients can fairly easily set using s() gp() wrapper functions mvgam formulae fitting nonlinear effect time using covariate interest numeric variable (see ?mgcv::s ?brms::gp details). dynamic() formula wrapper offers way automate process, eventually allow broader variety time-varying effects (random walk AR processes). Depending arguments specified dynamic, either set low-rank GP smooth function using s() bs = 'gp' fixed value length scale parameter \\\\(\\\\rho\\\\), set Hilbert space approximate GP using gp() function c=5/4 \\\\(\\\\rho\\\\) estimated (see ?dynamic details). first example use s() option, mis-specify \\\\(\\\\rho\\\\) parameter , practice, never known. call dynamic() set following smooth: s(time, = temp, bs = \\\"gp\\\", m = c(-2, 8, 2), k = 40) Inspect model summary, shows dynamic() wrapper used construct low-rank Gaussian Process smooth function: model used spline gp basis, ’s smooths can visualised just like gam. Plot estimated time-varying coefficient -sample training period  can also plot estimates -sample --sample periods see Gaussian Process function produces sensible smooth forecasts. supply full dataset newdata argument plot_mvgam_smooth inspect posterior forecasts time-varying smooth function. Overlay true simulated function see model adequately estimated ’s dynamics training testing data partitions  can also use plot_predictions marginaleffects package visualise time-varying coefficient effect estimated different values \\\\(temperature\\\\):  results sensible forecasts observations well  syntax similar wish estimate parameters underlying Gaussian Process, time using Hilbert space approximation. simply omit rho argument dynamic make happen. set call similar gp(time, = 'temp', c = 5/4, k = 40). model summary now contains estimates marginal deviation length scale parameters underlying Gaussian Process function: Effects gp() terms can also plotted smooths:  plot plot_predictions() call show effect case similar estimated approximate GP smooth model :  Forecasts also similar:\",\"code\":\"mod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),              family = gaussian(),              data = data_train) summary(mod, include_betas = FALSE) ## GAM formula: ## out ~ s(time, by = temp, bs = \\\"gp\\\", m = c(-2, 8, 2), k = 40) ##  ## Family: ## gaussian ##  ## Link function: ## identity ##  ## Trend model: ## None ##  ## N series: ## 1  ##  ## N timepoints: ## 190  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## Observation error parameter estimates: ##              2.5%  50% 97.5% Rhat n_eff ## sigma_obs[1] 0.23 0.25  0.28    1  2222 ##  ## GAM coefficient (beta) estimates: ##             2.5% 50% 97.5% Rhat n_eff ## (Intercept)    4   4   4.1    1  2893 ##  ## Approximate significance of GAM observation smooths: ##              edf    F p-value     ## s(time):temp  14 55.2  <2e-16 *** ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:58:50 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot(mod, type = 'smooths') plot_mvgam_smooth(mod, smooth = 1, newdata = data) abline(v = 190, lty = 'dashed', lwd = 2) lines(beta_temp, lwd = 2.5, col = 'white') lines(beta_temp, lwd = 2) range_round = function(x){   round(range(x, na.rm = TRUE), 2) } plot_predictions(mod,                   newdata = datagrid(time = unique,                                     temp = range_round),                  by = c('time', 'temp', 'temp'),                  type = 'link') plot(mod, type = 'forecast', newdata = data_test) ## Out of sample CRPS: ## [1] 1.280347 mod <- mvgam(out ~ dynamic(temp, k = 40),              family = gaussian(),              data = data_train) summary(mod, include_betas = FALSE) ## GAM formula: ## out ~ gp(time, by = temp, c = 5/4, k = 40, scale = TRUE) ##  ## Family: ## gaussian ##  ## Link function: ## identity ##  ## Trend model: ## None ##  ## N series: ## 1  ##  ## N timepoints: ## 190  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## Observation error parameter estimates: ##              2.5%  50% 97.5% Rhat n_eff ## sigma_obs[1] 0.24 0.26  0.29    1  2151 ##  ## GAM coefficient (beta) estimates: ##             2.5% 50% 97.5% Rhat n_eff ## (Intercept)    4   4   4.1    1  2989 ##  ## GAM gp term marginal deviation (alpha) and length scale (rho) estimates: ##                      2.5%   50% 97.5% Rhat n_eff ## alpha_gp(time):temp 0.640 0.890 1.400 1.01   745 ## rho_gp(time):temp   0.028 0.053 0.069 1.00   888 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 1 of 2000 iterations ended with a divergence (0.05%) ##  *Try running with larger adapt_delta to remove the divergences ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 3:59:45 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot_mvgam_smooth(mod, smooth = 1, newdata = data) abline(v = 190, lty = 'dashed', lwd = 2) lines(beta_temp, lwd = 2.5, col = 'white') lines(beta_temp, lwd = 2) plot_predictions(mod,                   newdata = datagrid(time = unique,                                     temp = range_round),                  by = c('time', 'temp', 'temp'),                  type = 'link') plot(mod, type = 'forecast', newdata = data_test) ## Out of sample CRPS: ## [1] 1.667521\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"salmon-survival-example\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Salmon survival example\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"use openly available data marine survival Chinook salmon illustrate time-varying effects can used improve ecological time series models. Scheuerell Williams (2005) used dynamic linear model examine relationship marine survival Chinook salmon index ocean upwelling strength along west coast USA. authors hypothesized stronger upwelling April create better growing conditions phytoplankton, translate zooplankton provide better foraging opportunities juvenile salmon entering ocean. data survival measured proportional variable 42 years (1964–2005) available MARSS package: First need prepare data modelling. variable CUI.apr standardized make easier sampler estimate underlying GP parameters time-varying effect. also need convert survival back proportion, current form logit-transformed (time series packages handle proportional data). usual, also need create time indicator series indicator working mvgam: Inspect data Plot features outcome variable, shows proportional variable particular restrictions want model:\",\"code\":\"load(url('https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda')) dplyr::glimpse(SalmonSurvCUI) ## Rows: 42 ## Columns: 3 ## $ year    <int> 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 19… ## $ logit.s <dbl> -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82,… ## $ CUI.apr <int> 57, 5, 43, 11, 47, -21, 25, -2, -1, 43, 2, 35, 0, 1, -1, 6, -7… SalmonSurvCUI %>%   # create a time variable   dplyr::mutate(time = dplyr::row_number()) %>%    # create a series variable   dplyr::mutate(series = as.factor('salmon')) %>%    # z-score the covariate CUI.apr   dplyr::mutate(CUI.apr = as.vector(scale(CUI.apr))) %>%    # convert logit-transformed survival back to proportional   dplyr::mutate(survival = plogis(logit.s)) -> model_data dplyr::glimpse(model_data) ## Rows: 42 ## Columns: 6 ## $ year     <int> 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1… ## $ logit.s  <dbl> -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82… ## $ CUI.apr  <dbl> 2.37949804, 0.03330223, 1.74782994, 0.30401713, 1.92830654, -… ## $ time     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18… ## $ series   <fct> salmon, salmon, salmon, salmon, salmon, salmon, salmon, salmo… ## $ survival <dbl> 0.030472033, 0.034891409, 0.027119717, 0.046088827, 0.0263393… plot_mvgam_series(data = model_data, y = 'survival')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"a-state-space-beta-regression\",\"dir\":\"Articles\",\"previous_headings\":\"Salmon survival example\",\"what\":\"A State-Space Beta regression\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"mvgam can easily handle data bounded 0 1 Beta observation model (using mgcv function betar(), see ?mgcv::betar details). First fit simple State-Space model uses Random Walk dynamic process model predictors Beta observation model: summary model shows good behaviour Hamiltonian Monte Carlo sampler provides useful summaries Beta observation model parameters: plot underlying dynamic component shows easily handled temporal evolution time series:  Posterior hindcasts also good automatically respect observational data bounding 0 1:\",\"code\":\"mod0 <- mvgam(formula = survival ~ 1,              trend_model = 'RW',              family = betar(),              data = model_data) summary(mod0) ## GAM formula: ## survival ~ 1 ##  ## Family: ## beta ##  ## Link function: ## logit ##  ## Trend model: ## RW ##  ## N series: ## 1  ##  ## N timepoints: ## 42  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## Observation precision parameter estimates: ##        2.5% 50% 97.5% Rhat n_eff ## phi[1]  160 310   580 1.01   612 ##  ## GAM coefficient (beta) estimates: ##             2.5%  50% 97.5% Rhat n_eff ## (Intercept) -4.2 -3.4  -2.4 1.02   125 ##  ## Latent trend variance estimates: ##          2.5%  50% 97.5% Rhat n_eff ## sigma[1] 0.18 0.33  0.55 1.02   276 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhat looks reasonable for all parameters ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 4:00:41 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot(mod0, type = 'trend') plot(mod0, type = 'forecast')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"including-time-varying-upwelling-effects\",\"dir\":\"Articles\",\"previous_headings\":\"Salmon survival example\",\"what\":\"Including time-varying upwelling effects\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"Now can increase complexity model constructing fitting State-Space model time-varying effect coastal upwelling index addition autoregressive dynamics. use Beta observation model capture restrictions proportional observations, time include dynamic() effect CUI.apr latent process model. specify \\\\(\\\\rho\\\\) parameter, instead opting estimate using Hilbert space approximate GP: summary model now includes estimates time-varying GP parameters: estimates underlying dynamic process, hindcasts, haven’t changed much:   process error parameter \\\\(\\\\sigma\\\\) slightly smaller model first model:  process error need flexible second model? estimates dynamic process now informed partly time-varying effect upwelling, can visualise link scale using plot() trend_effects = TRUE:  outcome scale, range possible CUI.apr values, using plot_predictions():\",\"code\":\"mod1 <- mvgam(formula = survival ~ 1,               trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE),               trend_model = 'RW',               family = betar(),               data = model_data) summary(mod1, include_betas = FALSE) ## GAM observation formula: ## survival ~ 1 ##  ## GAM process formula: ## ~dynamic(CUI.apr, k = 25, scale = FALSE) ##  ## Family: ## beta ##  ## Link function: ## logit ##  ## Trend model: ## RW ##  ## N process models: ## 1  ##  ## N series: ## 1  ##  ## N timepoints: ## 42  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1000; warmup = 500; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## Observation precision parameter estimates: ##        2.5% 50% 97.5% Rhat n_eff ## phi[1]  190 360   670    1   858 ##  ## GAM observation model coefficient (beta) estimates: ##             2.5%  50% 97.5% Rhat n_eff ## (Intercept) -4.1 -3.2  -2.2 1.07    64 ##  ## Process error parameter estimates: ##          2.5%  50% 97.5% Rhat n_eff ## sigma[1] 0.18 0.31  0.51 1.02   274 ##  ## GAM process model gp term marginal deviation (alpha) and length scale (rho) estimates: ##                                2.5%  50% 97.5% Rhat n_eff ## alpha_gp_time_byCUI_apr_trend 0.028 0.32   1.5 1.02   205 ## rho_gp_time_byCUI_apr_trend   1.400 6.50  40.0 1.02   236 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhats above 1.05 found for 30 parameters ##  *Diagnose further to investigate why the chains have not mixed ## 89 of 2000 iterations ended with a divergence (4.45%) ##  *Try running with larger adapt_delta to remove the divergences ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## E-FMI indicated no pathological behavior ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 4:01:44 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot(mod1, type = 'trend') plot(mod1, type = 'forecast') # Extract estimates of the process error 'sigma' for each model mod0_sigma <- as.data.frame(mod0, variable = 'sigma', regex = TRUE) %>%   dplyr::mutate(model = 'Mod0') mod1_sigma <- as.data.frame(mod1, variable = 'sigma', regex = TRUE) %>%   dplyr::mutate(model = 'Mod1') sigmas <- rbind(mod0_sigma, mod1_sigma)  # Plot using ggplot2 library(ggplot2) ggplot(sigmas, aes(y = `sigma[1]`, fill = model)) +   geom_density(alpha = 0.3, colour = NA) +   coord_flip() plot(mod1, type = 'smooth', trend_effects = TRUE) plot_predictions(mod1, newdata = datagrid(CUI.apr = range_round,                                           time = unique),                  by = c('time', 'CUI.apr', 'CUI.apr'))\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"comparing-model-predictive-performances\",\"dir\":\"Articles\",\"previous_headings\":\"Salmon survival example\",\"what\":\"Comparing model predictive performances\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"key question fitting multiple time series models whether one provides better predictions . several options mvgam exploring quantitatively. First, can compare models based -sample approximate leave-one-cross-validation implemented popular loo package: second model larger Expected Log Predictive Density (ELPD), meaning slightly favoured simpler model include time-varying upwelling effect. However, two models certainly differ much. metric compares -sample performance, hoping use models produce reasonable forecasts. Luckily, mvgam also routines comparing models using approximate leave-future-cross-validation. refit models reduced training set (starting time point 30) produce approximate 1-step ahead forecasts. forecasts used estimate forecast ELPD expanding training set one time point time. use Pareto-smoothed importance sampling reweight posterior predictions, acting kind particle filter don’t need refit model often (can read process works Bürkner et al. 2020). model time-varying upwelling effect tends provides better 1-step ahead forecasts, higher total forecast ELPD can also plot ELPDs model contrast. , values less zero suggest time-varying predictor model (Mod1) gives better 1-step ahead forecasts:  useful exercise expand model think kinds predictors might impact measurement error, easily implemented observation formula mvgam. now, leave model -.\",\"code\":\"loo_compare(mod0, mod1) ## Warning: Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details.  ## Warning: Some Pareto k diagnostic values are too high. See help('pareto-k-diagnostic') for details. ##      elpd_diff se_diff ## mod1  0.0       0.0    ## mod0 -2.3       1.6 lfo_mod0 <- lfo_cv(mod0, min_t = 30) lfo_mod1 <- lfo_cv(mod1, min_t = 30) sum(lfo_mod0$elpds) ## [1] 34.73176 sum(lfo_mod1$elpds) ## [1] 36.05325 plot(x = 1:length(lfo_mod0$elpds) + 30,      y = lfo_mod0$elpds - lfo_mod1$elpds,      ylab = 'ELPDmod0 - ELPDmod1',      xlab = 'Evaluation time point',      pch = 16,      col = 'darkred',      bty = 'l') abline(h = 0, lty = 'dashed')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html\",\"id\":\"further-reading\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Further reading\",\"title\":\"Time-varying effects in mvgam\",\"text\":\"following papers resources offer lot useful material dynamic linear models can applied / evaluated practice: Bürkner, PC, Gabry, J Vehtari, Approximate leave-future-cross-validation Bayesian time series models. Journal Statistical Computation Simulation. 90:14 (2020) 2499-2523. Herrero, Asier, et al. individual landscape back: time‐varying effects climate herbivory tree sapling growth distribution limits. Journal Ecology 104.2 (2016): 430-442. Holmes, Elizabeth E., Eric J. Ward, Wills Kellie. “MARSS: multivariate autoregressive state-space models analyzing time-series data.” R Journal. 4.1 (2012): 11. Scheuerell, Mark D., John G. Williams. Forecasting climate induced changes survival Snake River Spring/Summer Chinook Salmon (Oncorhynchus Tshawytscha) Fisheries Oceanography 14 (2005): 448–57.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\",\"id\":\"state-space-models\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"State-Space Models\",\"title\":\"State-Space models in mvgam\",\"text\":\"State-Space models allow us separately make inferences underlying dynamic process model interested (.e. evolution time series collection time series) observation model (.e. way survey / measure underlying process). extremely useful ecology observations always imperfect / noisy measurements thing interested measuring. also helpful often know covariates impact ability measure accurately (.e. take accurate counts rodents thunderstorm happening) covariate impact underlying process (highly unlikely rodent abundance responds one storm, instead probably responds longer-term weather climate variation). State-Space model allows us model components single unified modelling framework. major advantage mvgam can include nonlinear effects random effects model components also capturing dynamic processes.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\",\"id\":\"lake-washington-plankton-data\",\"dir\":\"Articles\",\"previous_headings\":\"State-Space Models\",\"what\":\"Lake Washington plankton data\",\"title\":\"State-Space models in mvgam\",\"text\":\"data use illustrate can fit State-Space models mvgam long-term monitoring study plankton counts (cells per mL) taken Lake Washington Washington, USA. data available part MARSS package can downloaded using following: work five different groups plankton: usual, preparing data correct format mvgam modelling takes little bit wrangling dplyr: Inspect data structure Note z-scored counts example make easier specify priors (though completely necessary; often better build model respects properties actual outcome variables)  always helpful check data NAs attempting models:  missing observations, isn’t issue modelling mvgam. useful property understand counts tend highly seasonal. plots z-scored counts z-scored temperature measurements lake month:    try capture seasonality process model, easy given flexibility GAMs. Next split data training testing splits: Now time fit models. requires bit thinking can best tackle seasonal variation likely dependence structure data. algae interacting part complex system within lake, certainly expect lagged cross-dependencies underling dynamics. capture seasonal variation, multivariate dynamic model forced try capture , lead poor convergence unstable results (feasibly capture cyclic dynamics complex multi-species Lotka-Volterra model, ordinary differential equation approaches beyond scope mvgam).\",\"code\":\"load(url('https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda')) outcomes <- c('Greens', 'Bluegreens', 'Diatoms', 'Unicells', 'Other.algae') # loop across each plankton group to create the long datframe plankton_data <- do.call(rbind, lapply(outcomes, function(x){      # create a group-specific dataframe with counts labelled 'y'   # and the group name in the 'series' variable   data.frame(year = lakeWAplanktonTrans[, 'Year'],              month = lakeWAplanktonTrans[, 'Month'],              y = lakeWAplanktonTrans[, x],              series = x,              temp = lakeWAplanktonTrans[, 'Temp'])})) %>%      # change the 'series' label to a factor   dplyr::mutate(series = factor(series)) %>%      # filter to only include some years in the data   dplyr::filter(year >= 1965 & year < 1975) %>%   dplyr::arrange(year, month) %>%   dplyr::group_by(series) %>%      # z-score the counts so they are approximately standard normal   dplyr::mutate(y = as.vector(scale(y))) %>%      # add the time indicator   dplyr::mutate(time = dplyr::row_number()) %>%   dplyr::ungroup() head(plankton_data) ## # A tibble: 6 × 6 ##    year month       y series       temp  time ##   <dbl> <dbl>   <dbl> <fct>       <dbl> <int> ## 1  1965     1 -0.542  Greens      -1.23     1 ## 2  1965     1 -0.344  Bluegreens  -1.23     1 ## 3  1965     1 -0.0768 Diatoms     -1.23     1 ## 4  1965     1 -1.52   Unicells    -1.23     1 ## 5  1965     1 -0.491  Other.algae -1.23     1 ## 6  1965     2 NA      Greens      -1.32     2 dplyr::glimpse(plankton_data) ## Rows: 600 ## Columns: 6 ## $ year   <dbl> 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 196… ## $ month  <dbl> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, … ## $ y      <dbl> -0.54241769, -0.34410776, -0.07684901, -1.52243490, -0.49055442… ## $ series <fct> Greens, Bluegreens, Diatoms, Unicells, Other.algae, Greens, Blu… ## $ temp   <dbl> -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.… ## $ time   <int> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, … plot_mvgam_series(data = plankton_data, series = 'all') image(is.na(t(plankton_data)), axes = F,       col = c('grey80', 'darkred')) axis(3, at = seq(0,1, len = NCOL(plankton_data)),       labels = colnames(plankton_data)) plankton_data %>%   dplyr::filter(series == 'Other.algae') %>%   ggplot(aes(x = time, y = temp)) +   geom_line(size = 1.1) +   geom_line(aes(y = y), col = 'white',             size = 1.3) +   geom_line(aes(y = y), col = 'darkred',             size = 1.1) +   ylab('z-score') +   xlab('Time') +   ggtitle('Temperature (black) vs Other algae (red)') ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. ## ℹ Please use `linewidth` instead. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated. plankton_data %>%   dplyr::filter(series == 'Diatoms') %>%   ggplot(aes(x = time, y = temp)) +   geom_line(size = 1.1) +   geom_line(aes(y = y), col = 'white',             size = 1.3) +   geom_line(aes(y = y), col = 'darkred',             size = 1.1) +   ylab('z-score') +   xlab('Time') +   ggtitle('Temperature (black) vs Diatoms (red)') plankton_data %>%   dplyr::filter(series == 'Greens') %>%   ggplot(aes(x = time, y = temp)) +   geom_line(size = 1.1) +   geom_line(aes(y = y), col = 'white',             size = 1.3) +   geom_line(aes(y = y), col = 'darkred',             size = 1.1) +   ylab('z-score') +   xlab('Time') +   ggtitle('Temperature (black) vs Greens (red)') plankton_train <- plankton_data %>%   dplyr::filter(time <= 112) plankton_test <- plankton_data %>%   dplyr::filter(time > 112)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\",\"id\":\"capturing-seasonality\",\"dir\":\"Articles\",\"previous_headings\":\"State-Space Models\",\"what\":\"Capturing seasonality\",\"title\":\"State-Space models in mvgam\",\"text\":\"First fit model include dynamic component, just see can reproduce seasonal variation observations. model introduces hierarchical multidimensional smooths, time series share “global” tensor product month temp variables, capturing expectation algal seasonality responds temperature variation. response depend year temperatures recorded (.e. response warm temperatures Spring different response warm temperatures Autumn). model also fits series-specific deviation smooths (.e. one tensor product per series) capture algal group’s seasonality differs overall “global” seasonality. Note include series-specific intercepts model series z-scored mean 0. “global” tensor product smooth function can quickly visualized:  plot, red indicates -average linear predictors white indicates -average. can plot deviation smooths algal group see vary “global” pattern:      multidimensional smooths done good job capturing seasonal variation observations:      basic model gives us confidence can capture seasonal variation observations. model captured remaining temporal dynamics, obvious inspect Dunn-Smyth residuals series:\",\"code\":\"notrend_mod <- mvgam(y ~                         # tensor of temp and month to capture                        # \\\"global\\\" seasonality                        te(temp, month, k = c(4, 4)) +                                                # series-specific deviation tensor products                        te(temp, month, k = c(4, 4), by = series),                      family = gaussian(),                      data = plankton_train,                      newdata = plankton_test,                      trend_model = 'None') plot_mvgam_smooth(notrend_mod, smooth = 1) plot_mvgam_smooth(notrend_mod, smooth = 2) plot_mvgam_smooth(notrend_mod, smooth = 3) plot_mvgam_smooth(notrend_mod, smooth = 4) plot_mvgam_smooth(notrend_mod, smooth = 5) plot_mvgam_smooth(notrend_mod, smooth = 6) plot(notrend_mod, type = 'forecast', series = 1) ## Out of sample CRPS: ## [1] 6.808547 plot(notrend_mod, type = 'forecast', series = 2) ## Out of sample CRPS: ## [1] 6.747564 plot(notrend_mod, type = 'forecast', series = 3) ## Out of sample CRPS: ## [1] 4.123851 plot(notrend_mod, type = 'forecast', series = 4) ## Out of sample CRPS: ## [1] 3.597626 plot(notrend_mod, type = 'forecast', series = 5) ## Out of sample CRPS: ## [1] 2.838391 plot(notrend_mod, type = 'residuals', series = 1) plot(notrend_mod, type = 'residuals', series = 2) plot(notrend_mod, type = 'residuals', series = 3) plot(notrend_mod, type = 'residuals', series = 4) plot(notrend_mod, type = 'residuals', series = 5)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\",\"id\":\"multiseries-dynamics\",\"dir\":\"Articles\",\"previous_headings\":\"State-Space Models\",\"what\":\"Multiseries dynamics\",\"title\":\"State-Space models in mvgam\",\"text\":\"Now time get multivariate State-Space models. fit two models can incorporate lagged cross-dependencies latent process models. first model assumes process errors operate independently one another, second assumes may contemporaneous correlations process errors. models include Vector Autoregressive component process means, can model complex community dynamics. models can described mathematically follows: \\\\[\\\\begin{align*} \\\\boldsymbol{count}_t & \\\\sim \\\\text{Normal}(\\\\mu_{obs[t]}, \\\\sigma_{obs}) \\\\\\\\ \\\\mu_{obs[t]} & = process_t \\\\\\\\ process_t & \\\\sim \\\\text{MVNormal}(\\\\mu_{process[t]}, \\\\Sigma_{process}) \\\\\\\\ \\\\mu_{process[t]} & = VAR * process_{t-1} + f_{global}(\\\\boldsymbol{month},\\\\boldsymbol{temp})_t + f_{series}(\\\\boldsymbol{month},\\\\boldsymbol{temp})_t \\\\\\\\ f_{global}(\\\\boldsymbol{month},\\\\boldsymbol{temp}) & = \\\\sum_{k=1}^{K}b_{global} * \\\\beta_{global} \\\\\\\\ f_{series}(\\\\boldsymbol{month},\\\\boldsymbol{temp}) & = \\\\sum_{k=1}^{K}b_{series} * \\\\beta_{series} \\\\end{align*}\\\\] can see terms observation model apart underlying process model. easily add covariates observation model felt explain systematic observation errors. also assume independent observation processes (covariance structure observation errors \\\\(\\\\sigma_{obs}\\\\)). present, mvgam support multivariate observation models. feature added future versions. However underlying process model multivariate, lot going . component Vector Autoregressive part, process mean time \\\\(t\\\\) \\\\((\\\\mu_{process[t]})\\\\) vector evolves function vector-valued process model time \\\\(t-1\\\\). \\\\(VAR\\\\) matrix captures dynamics self-dependencies diagonal possibly asymmetric cross-dependencies -diagonals, also incorporating nonlinear smooth functions capture seasonality series. contemporaneous process errors modeled \\\\(\\\\Sigma_{process}\\\\), can constrained process errors independent (.e. setting -diagonals 0) can fully parameterized using Cholesky decomposition (using Stan’s \\\\(LKJcorr\\\\) distribution place prior strength inter-species correlations). interested inner-workings, mvgam makes use recent breakthrough Sarah Heaps enforce stationarity Bayesian VAR processes. advantageous often don’t expect forecast variance increase without bound forever future, many estimated VARs tend behave way. Ok lot take . Let’s fit models try inspect going assume. first, need update mvgam’s default priors observation process errors. default, mvgam uses fairly wide Student-T prior parameters avoid overly informative. observations z-scored expect large process observation errors. However, also expect small observation errors either know measurements perfect. let’s update priors parameters. , get see formula latent process (.e. trend) model used mvgam: Get names parameters whose priors can modified: default prior distributions: Setting priors easy mvgam can use brms routines. use informative Normal priors error components, impose lower bound 0.2 observation errors: may noticed something else unique model: intercept term observation formula. shared intercept parameter can sometimes unidentifiable respect latent VAR process, particularly series similar long-run averages (case z-scored). often get better convergence State-Space models drop parameter. mvgam accomplishes fixing coefficient intercept zero. Now can fit first model, assumes process errors contemporaneously uncorrelated\",\"code\":\"priors <- get_mvgam_priors(   # observation formula, which has no terms in it   y ~ -1,      # process model formula, which includes the smooth functions   trend_formula = ~ te(temp, month, k = c(4, 4)) +     te(temp, month, k = c(4, 4), by = trend),      # VAR1 model with uncorrelated process errors   trend_model = 'VAR1',   family = gaussian(),   data = plankton_train) priors[, 3] ##  [1] \\\"(Intercept)\\\"                                                                                                                                                                                                                                                            ##  [2] \\\"process error sd\\\"                                                                                                                                                                                                                                                       ##  [3] \\\"diagonal autocorrelation population mean\\\"                                                                                                                                                                                                                               ##  [4] \\\"off-diagonal autocorrelation population mean\\\"                                                                                                                                                                                                                           ##  [5] \\\"diagonal autocorrelation population variance\\\"                                                                                                                                                                                                                           ##  [6] \\\"off-diagonal autocorrelation population variance\\\"                                                                                                                                                                                                                       ##  [7] \\\"shape1 for diagonal autocorrelation precision\\\"                                                                                                                                                                                                                          ##  [8] \\\"shape1 for off-diagonal autocorrelation precision\\\"                                                                                                                                                                                                                      ##  [9] \\\"shape2 for diagonal autocorrelation precision\\\"                                                                                                                                                                                                                          ## [10] \\\"shape2 for off-diagonal autocorrelation precision\\\"                                                                                                                                                                                                                      ## [11] \\\"observation error sd\\\"                                                                                                                                                                                                                                                   ## [12] \\\"te(temp,month) smooth parameters, te(temp,month):trendtrend1 smooth parameters, te(temp,month):trendtrend2 smooth parameters, te(temp,month):trendtrend3 smooth parameters, te(temp,month):trendtrend4 smooth parameters, te(temp,month):trendtrend5 smooth parameters\\\" priors[, 4] ##  [1] \\\"(Intercept) ~ student_t(3, -0.1, 2.5);\\\" ##  [2] \\\"sigma ~ student_t(3, 0, 2.5);\\\"          ##  [3] \\\"es[1] = 0;\\\"                             ##  [4] \\\"es[2] = 0;\\\"                             ##  [5] \\\"fs[1] = sqrt(0.455);\\\"                   ##  [6] \\\"fs[2] = sqrt(0.455);\\\"                   ##  [7] \\\"gs[1] = 1.365;\\\"                         ##  [8] \\\"gs[2] = 1.365;\\\"                         ##  [9] \\\"hs[1] = 0.071175;\\\"                      ## [10] \\\"hs[2] = 0.071175;\\\"                      ## [11] \\\"sigma_obs ~ student_t(3, 0, 2.5);\\\"      ## [12] \\\"lambda_trend ~ normal(5, 30);\\\" priors <- c(prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),             prior(normal(0.5, 0.25), class = sigma)) var_mod <- mvgam(     # observation formula, which is empty   y ~ -1,      # process model formula, which includes the smooth functions   trend_formula = ~ te(temp, month, k = c(4, 4)) +     te(temp, month, k = c(4, 4), by = trend),      # VAR1 model with uncorrelated process errors   trend_model = 'VAR1',   family = gaussian(),   data = plankton_train,   newdata = plankton_test,      # include the updated priors   priors = priors)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\",\"id\":\"inspecting-ss-models\",\"dir\":\"Articles\",\"previous_headings\":\"State-Space Models\",\"what\":\"Inspecting SS models\",\"title\":\"State-Space models in mvgam\",\"text\":\"model’s summary bit different mvgam summaries. separates parameters based whether belong observation model latent process model. may often covariates impact observations latent process, can fairly complex models component. notice parameters fully converged, particularly VAR coefficients (called output) process errors (Sigma). Note set include_betas = FALSE stop summary printing output spline coefficients, can dense hard interpret: convergence model isn’t fabulous (moment). can plot smooth functions, time operate process model. can see plot using trend_effects = TRUE plotting functions:  VAR matrix particular interest , captures lagged dependencies cross-dependencies latent process model:  Unfortunately bayesplot doesn’t know matrix parameters see actually transpose VAR matrix. little bit wrangling gives us histograms correct order:  lot happening matrix. cell captures lagged effect process column process row next timestep. example, effect cell [1,3], quite strongly negative, means increase process series 3 (Greens) time \\\\(t\\\\) expected lead subsequent decrease process series 1 (Bluegreens) time \\\\(t+1\\\\). latent process model now capturing effects smooth seasonal effects, trend plot shows best estimate true count time point:   process error \\\\((\\\\Sigma)\\\\) captures unmodelled variation process models. , fixed -diagonals 0, histograms look like flat boxes:  observation error estimates \\\\((\\\\sigma_{obs})\\\\) represent much model thinks might miss true count take imperfect measurements:  still bit hard identify overall, especially trying estimate process observation error. Often need make strong assumptions important determining unexplained variation observations.\",\"code\":\"summary(var_mod, include_betas = FALSE) ## GAM observation formula: ## y ~ 1 ##  ## GAM process formula: ## ~te(temp, month, k = c(4, 4)) + te(temp, month, k = c(4, 4),  ##     by = trend) ##  ## Family: ## gaussian ##  ## Link function: ## identity ##  ## Trend model: ## VAR1 ##  ## N process models: ## 5  ##  ## N series: ## 5  ##  ## N timepoints: ## 112  ##  ## Status: ## Fitted using Stan  ## 4 chains, each with iter = 1500; warmup = 1000; thin = 1  ## Total post-warmup draws = 2000 ##  ##  ## Observation error parameter estimates: ##              2.5%  50% 97.5% Rhat n_eff ## sigma_obs[1] 0.20 0.25  0.34 1.01   367 ## sigma_obs[2] 0.25 0.40  0.53 1.03   151 ## sigma_obs[3] 0.41 0.64  0.82 1.09    53 ## sigma_obs[4] 0.23 0.37  0.49 1.01   191 ## sigma_obs[5] 0.32 0.43  0.54 1.02   330 ##  ## GAM observation model coefficient (beta) estimates: ##             2.5% 50% 97.5% Rhat n_eff ## (Intercept)    0   0     0  NaN   NaN ##  ## Process model VAR parameter estimates: ##          2.5%    50% 97.5% Rhat n_eff ## A[1,1] -0.014  0.520 0.880 1.05    83 ## A[1,2] -0.340 -0.028 0.200 1.01   384 ## A[1,3] -0.490 -0.042 0.360 1.01   382 ## A[1,4] -0.300  0.029 0.390 1.01   412 ## A[1,5] -0.092  0.130 0.510 1.03   153 ## A[2,1] -0.150  0.019 0.230 1.01   522 ## A[2,2]  0.610  0.790 0.920 1.03   272 ## A[2,3] -0.390 -0.130 0.051 1.02   223 ## A[2,4] -0.038  0.110 0.350 1.03   254 ## A[2,5] -0.060  0.056 0.200 1.01   467 ## A[3,1] -0.240  0.022 0.600 1.05    66 ## A[3,2] -0.490 -0.200 0.027 1.03   193 ## A[3,3]  0.062  0.410 0.730 1.01   233 ## A[3,4] -0.030  0.230 0.610 1.03   206 ## A[3,5] -0.089  0.120 0.360 1.02   180 ## A[4,1] -0.130  0.057 0.400 1.01   342 ## A[4,2] -0.094  0.057 0.270 1.01   368 ## A[4,3] -0.410 -0.110 0.140 1.02   281 ## A[4,4]  0.470  0.740 0.950 1.01   333 ## A[4,5] -0.210 -0.039 0.110 1.01   513 ## A[5,1] -0.190  0.080 0.760 1.07    63 ## A[5,2] -0.410 -0.120 0.080 1.04   163 ## A[5,3] -0.620 -0.180 0.130 1.02   190 ## A[5,4] -0.050  0.190 0.590 1.04   134 ## A[5,5]  0.510  0.730 0.920 1.01   417 ##  ## Process error parameter estimates: ##             2.5%  50% 97.5% Rhat n_eff ## Sigma[1,1] 0.040 0.26  0.66 1.11    46 ## Sigma[1,2] 0.000 0.00  0.00  NaN   NaN ## Sigma[1,3] 0.000 0.00  0.00  NaN   NaN ## Sigma[1,4] 0.000 0.00  0.00  NaN   NaN ## Sigma[1,5] 0.000 0.00  0.00  NaN   NaN ## Sigma[2,1] 0.000 0.00  0.00  NaN   NaN ## Sigma[2,2] 0.064 0.11  0.18 1.00   528 ## Sigma[2,3] 0.000 0.00  0.00  NaN   NaN ## Sigma[2,4] 0.000 0.00  0.00  NaN   NaN ## Sigma[2,5] 0.000 0.00  0.00  NaN   NaN ## Sigma[3,1] 0.000 0.00  0.00  NaN   NaN ## Sigma[3,2] 0.000 0.00  0.00  NaN   NaN ## Sigma[3,3] 0.062 0.16  0.29 1.04   115 ## Sigma[3,4] 0.000 0.00  0.00  NaN   NaN ## Sigma[3,5] 0.000 0.00  0.00  NaN   NaN ## Sigma[4,1] 0.000 0.00  0.00  NaN   NaN ## Sigma[4,2] 0.000 0.00  0.00  NaN   NaN ## Sigma[4,3] 0.000 0.00  0.00  NaN   NaN ## Sigma[4,4] 0.054 0.13  0.26 1.02   209 ## Sigma[4,5] 0.000 0.00  0.00  NaN   NaN ## Sigma[5,1] 0.000 0.00  0.00  NaN   NaN ## Sigma[5,2] 0.000 0.00  0.00  NaN   NaN ## Sigma[5,3] 0.000 0.00  0.00  NaN   NaN ## Sigma[5,4] 0.000 0.00  0.00  NaN   NaN ## Sigma[5,5] 0.100 0.21  0.35 1.01   310 ##  ## Approximate significance of GAM process smooths: ##                               edf    F p-value    ## te(temp,month)              4.303 0.74  0.0780 .  ## te(temp,month):seriestrend1 0.777 0.03  1.0000    ## te(temp,month):seriestrend2 1.773 0.11  0.9687    ## te(temp,month):seriestrend3 5.408 1.84  0.0026 ** ## te(temp,month):seriestrend4 1.290 0.24  0.8507    ## te(temp,month):seriestrend5 2.231 0.08  0.9907    ## --- ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ##  ## Stan MCMC diagnostics: ## n_eff / iter looks reasonable for all parameters ## Rhats above 1.05 found for 20 parameters ##  *Diagnose further to investigate why the chains have not mixed ## 0 of 2000 iterations ended with a divergence (0%) ## 0 of 2000 iterations saturated the maximum tree depth of 12 (0%) ## Chain 4: E-FMI = 0.1994 ##  *E-FMI below 0.2 indicates you may need to reparameterize your model ##  ## Samples were drawn using NUTS(diag_e) at Mon Jan 29 4:07:53 PM 2024. ## For each parameter, n_eff is a crude measure of effective sample size, ## and Rhat is the potential scale reduction factor on split MCMC chains ## (at convergence, Rhat = 1) plot(var_mod, 'smooths', trend_effects = TRUE) mcmc_plot(var_mod, variable = 'A', regex = TRUE, type = 'hist') A_pars <- matrix(NA, nrow = 5, ncol = 5) for(i in 1:5){   for(j in 1:5){     A_pars[i, j] <- paste0('A[', i, ',', j, ']')   } } mcmc_plot(var_mod,            variable = as.vector(t(A_pars)),            type = 'hist') plot(var_mod, type = 'trend', series = 1) plot(var_mod, type = 'trend', series = 3) Sigma_pars <- matrix(NA, nrow = 5, ncol = 5) for(i in 1:5){   for(j in 1:5){     Sigma_pars[i, j] <- paste0('Sigma[', i, ',', j, ']')   } } mcmc_plot(var_mod,            variable = as.vector(t(Sigma_pars)),            type = 'hist') mcmc_plot(var_mod, variable = 'sigma_obs', regex = TRUE, type = 'hist')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\",\"id\":\"correlated-process-errors\",\"dir\":\"Articles\",\"previous_headings\":\"State-Space Models\",\"what\":\"Correlated process errors\",\"title\":\"State-Space models in mvgam\",\"text\":\"Let’s see estimates improve allow process errors correlated. , need first update priors observation errors: now can fit correlated process error model Plot convergence diagnostics two models, shows models display similar levels convergence:   \\\\((\\\\Sigma)\\\\) matrix now captures evidence contemporaneously correlated process error:  symmetric matrix tells us support correlated process errors. example, series 1 3 (Bluegreens Greens) show negatively correlated process errors, series 1 4 (Bluegreens .algae) show positively correlated errors. easier interpret estimates convert covariance matrix correlation matrix. compute posterior median process error correlations: model able capture correlated errors, VAR matrix changed slightly:  still evidence lagged cross-dependence, interactions now pulled toward zero. model better? Forecasts don’t appear differ much, least qualitatively (forecasts three series, model):       can compute variogram score sample forecasts get sense model better job capturing dependence structure true evaluation set:  can also compute energy score sample forecasts get sense model provides forecasts better calibrated:  models tend provide similar forecasts, though correlated error model slightly better overall. probably need use extensive rolling forecast evaluation exercise felt like needed choose one production. mvgam offers utilities (.e. see ?lfo_cv guidance).\",\"code\":\"priors <- c(prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),             prior(normal(0.5, 0.25), class = sigma)) varcor_mod <- mvgam(     # observation formula, which remains empty   y ~ -1,      # process model formula, which includes the smooth functions   trend_formula = ~ te(temp, month, k = c(4, 4)) +     te(temp, month, k = c(4, 4), by = trend),      # VAR1 model with correlated process errors   trend_model = 'VAR1cor',   family = gaussian(),   data = plankton_train,   newdata = plankton_test,      # include the updated priors   priors = priors) mcmc_plot(varcor_mod, type = 'rhat') +   labs(title = 'VAR1cor') mcmc_plot(var_mod, type = 'rhat') +   labs(title = 'VAR1') Sigma_pars <- matrix(NA, nrow = 5, ncol = 5) for(i in 1:5){   for(j in 1:5){     Sigma_pars[i, j] <- paste0('Sigma[', i, ',', j, ']')   } } mcmc_plot(varcor_mod,            variable = as.vector(t(Sigma_pars)),            type = 'hist') Sigma_post <- as.matrix(varcor_mod, variable = 'Sigma', regex = TRUE) median_correlations <- cov2cor(matrix(apply(Sigma_post, 2, median),                                       nrow = 5, ncol = 5)) rownames(median_correlations) <- colnames(median_correlations) <- levels(plankton_train$series)  round(median_correlations, 2) ##             Bluegreens Diatoms Greens Other.algae Unicells ## Bluegreens        1.00   -0.04   0.16       -0.03     0.34 ## Diatoms          -0.04    1.00  -0.20        0.50     0.16 ## Greens            0.16   -0.20   1.00        0.19     0.48 ## Other.algae      -0.03    0.50   0.19        1.00     0.29 ## Unicells          0.34    0.16   0.48        0.29     1.00 A_pars <- matrix(NA, nrow = 5, ncol = 5) for(i in 1:5){   for(j in 1:5){     A_pars[i, j] <- paste0('A[', i, ',', j, ']')   } } mcmc_plot(varcor_mod,            variable = as.vector(t(A_pars)),            type = 'hist') plot(var_mod, type = 'forecast', series = 1, newdata = plankton_test) ## Out of sample CRPS: ## [1] 3.04799 plot(varcor_mod, type = 'forecast', series = 1, newdata = plankton_test) ## Out of sample CRPS: ## [1] 3.10641 plot(var_mod, type = 'forecast', series = 2, newdata = plankton_test) ## Out of sample CRPS: ## [1] 5.87983 plot(varcor_mod, type = 'forecast', series = 2, newdata = plankton_test) ## Out of sample CRPS: ## [1] 5.566324 plot(var_mod, type = 'forecast', series = 3, newdata = plankton_test) ## Out of sample CRPS: ## [1] 3.985545 plot(varcor_mod, type = 'forecast', series = 3, newdata = plankton_test) ## Out of sample CRPS: ## [1] 3.975588 # create forecast objects for each model fcvar <- forecast(var_mod) fcvarcor <- forecast(varcor_mod)  # plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better diff_scores <- score(fcvarcor, score = 'variogram')$all_series$score -   score(fcvar, score = 'variogram')$all_series$score plot(diff_scores, pch = 16, cex = 1.25, col = 'darkred',       ylim = c(-1*max(abs(diff_scores), na.rm = TRUE),               max(abs(diff_scores), na.rm = TRUE)),      bty = 'l',      xlab = 'Forecast horizon',      ylab = expression(variogram[VAR1cor]~-~variogram[VAR1])) abline(h = 0, lty = 'dashed') # plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better diff_scores <- score(fcvarcor, score = 'energy')$all_series$score -   score(fcvar, score = 'energy')$all_series$score plot(diff_scores, pch = 16, cex = 1.25, col = 'darkred',       ylim = c(-1*max(abs(diff_scores), na.rm = TRUE),               max(abs(diff_scores), na.rm = TRUE)),      bty = 'l',      xlab = 'Forecast horizon',      ylab = expression(energy[VAR1cor]~-~energy[VAR1])) abline(h = 0, lty = 'dashed')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\",\"id\":\"further-reading\",\"dir\":\"Articles\",\"previous_headings\":\"State-Space Models\",\"what\":\"Further reading\",\"title\":\"State-Space models in mvgam\",\"text\":\"following papers resources offer lot useful material multivariate State-Space models can applied practice: Heaps, Sarah E. “Enforcing stationarity prior vector autoregressions.” Journal Computational Graphical Statistics 32.1 (2023): 74-83. Hannaford, Naomi E., et al. “sparse Bayesian hierarchical vector autoregressive model microbial dynamics wastewater treatment plant.” Computational Statistics & Data Analysis 179 (2023): 107659. Holmes, Elizabeth E., Eric J. Ward, Wills Kellie. “MARSS: multivariate autoregressive state-space models analyzing time-series data.” R Journal. 4.1 (2012): 11. Ward, Eric J., et al. “Inferring spatial structure time‐series data: using multivariate state‐space models detect metapopulation structure California sea lions Gulf California, Mexico.” Journal Applied Ecology 47.1 (2010): 47-56. Auger‐Méthé, Marie, et al. “guide state–space modeling ecological time series.” Ecological Monographs 91.4 (2021): e01470.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/authors.html\",\"id\":null,\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Authors\",\"title\":\"Authors and Citation\",\"text\":\"Nicholas J Clark. Author, maintainer.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/authors.html\",\"id\":\"citation\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Citation\",\"title\":\"Authors and Citation\",\"text\":\"Nicholas J. Clark, Konstans Wells (2022). Dynamic Generalized Additive Models (DGAMs) forecasting discrete ecological time series Methods Ecology Evolution DOI: https://doi.org/10.1111/2041-210X.13974\",\"code\":\"@Article{,   title = {Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series},   author = {Nicholas J. Clark and Konstans Wells},   journal = {Methods in Ecology and Evolution},   year = {2022},   url = {https://doi.org/10.1111/2041-210X.13974}, }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/index.html\",\"id\":\"mvgam\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"mvgam\",\"title\":\"Multivariate (Dynamic) Generalized Additive Models\",\"text\":\"MultiVariate (Dynamic) Generalized Addivite Models goal mvgam use Bayesian framework estimate parameters Dynamic Generalized Additive Models (DGAMs) time series dynamic trend components. package provides interface fit Bayesian DGAMs using either JAGS Stan backend, note users strongly encouraged opt Stan JAGS. formula syntax based package mgcv provide familiar GAM modelling interface. motivation package primary objectives described detail Clark & Wells 2022 (published Methods Ecology Evolution). introduction package worked examples also shown seminar: Ecological Forecasting Dynamic Generalized Additive Models.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/index.html\",\"id\":\"installation\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Installation\",\"title\":\"Multivariate (Dynamic) Generalized Additive Models\",\"text\":\"Install development version GitHub using: devtools::install_github(\\\"nicholasjclark/mvgam\\\"). Note actually condition models MCMC sampling, either JAGS software must installed (along R packages rjags runjags) Stan software must installed (along either rstan /cmdstanr). rstan listed dependency mvgam ensure installation less difficult. users wish fit models using mvgam, please refer installation links JAGS , Stan rstan , Stan cmdstandr . need fairly recent version Stan ensure model syntax recognized. see warnings variable \\\"array\\\" exist, usually sign need update version Stan. highly recommend use Cmdstan cmdstanr interface backend. Cmdstan easier install, date new features, uses less memory Rstan. See documentation Cmdstan team information.\",\"code\":\"\"},{\"path\":[]},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/index.html\",\"id\":\"getting-started\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Getting started\",\"title\":\"Multivariate (Dynamic) Generalized Additive Models\",\"text\":\"mvgam originally designed analyse forecast non-negative integer-valued data (counts). data traditionally challenging analyse existing time-series analysis packages. development mvgam resulted support growing number observation families extend types data. Currently, package can handle data following families: gaussian() real-valued data student_t() heavy-tailed real-valued data lognormal() non-negative real-valued data Gamma() non-negative real-valued data betar() proportional data (0,1) poisson() count data nb() overdispersed count data nmix() count data imperfect detection tweedie() overdispersed count data Note poisson(), nb(), tweedie() available using JAGS. families, apart tweedie(), supported using Stan. See ??mvgam_families information. simple example simulating modelling proportional data Beta observations set seasonal series independent Gaussian Process dynamic trends: Plot series see evolve time  Fit DGAM series uses hierarchical cyclic seasonal smooth term capture variation seasonality among series. model also includes series-specific latent Gaussian Processes squared exponential covariance functions capture temporal dynamics Plot estimated posterior hindcast forecast distributions series  Various S3 functions can used inspect parameter estimates, plot smooth functions residuals, evaluate models posterior predictive checks forecast comparisons. Please see package documentation detailed examples.\",\"code\":\"data <- sim_mvgam(family = betar(),                  T = 80,                  trend_model = 'GP',                  trend_rel = 0.5,                   seasonality = 'shared') plot_mvgam_series(data = data$data_train, series = 'all') mod <- mvgam(y ~ s(season, bs = 'cc', k = 7) +                s(season, by = series, m = 1, k = 5),              trend_model = 'GP',              data = data$data_train,              newdata = data$data_test,              family = betar()) layout(matrix(1:4, nrow = 2, byrow = TRUE)) for(i in 1:3){   plot(mod, type = 'forecast', series = i) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/index.html\",\"id\":\"vignettes\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Vignettes\",\"title\":\"Multivariate (Dynamic) Generalized Additive Models\",\"text\":\"can set build_vignettes = TRUE installing either devtools::install_github remotes::install_github, aware slow installation drastically. Instead, can always access vignette htmls online https://nicholasjclark.github.io/mvgam/articles/\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/index.html\",\"id\":\"other-resources\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Other resources\",\"title\":\"Multivariate (Dynamic) Generalized Additive Models\",\"text\":\"number case studies compiled highlight DGAMs can estimated using MCMC sampling: Ecological Forecasting Dynamic Generalized Additive Models mvgam case study 1: model comparison data assimilation mvgam case study 2: multivariate models mvgam case study 3: distributed lag models package can also used generate necessary data structures, initial value functions modelling code necessary fit DGAMs using Stan JAGS. can helpful users wish make changes model better suit bespoke research / analysis goals. following resources can helpful troubleshoot: Stan Discourse JAGS Discourse\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/LICENSE.html\",\"id\":null,\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"MIT License\",\"title\":\"MIT License\",\"text\":\"Copyright (c) 2021 Nicholas Clark Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/add_tweedie_lines.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Tweedie JAGS modifications — add_tweedie_lines\",\"title\":\"Tweedie JAGS modifications — add_tweedie_lines\",\"text\":\"Tweedie JAGS modifications\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/add_tweedie_lines.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Tweedie JAGS modifications — add_tweedie_lines\",\"text\":\"\",\"code\":\"add_tweedie_lines(model_file, upper_bounds)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/add_tweedie_lines.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Tweedie JAGS modifications — add_tweedie_lines\",\"text\":\"model_file template JAGS model file modified upper_bounds Optional upper bounds truncated observation likelihood\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/add_tweedie_lines.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Tweedie JAGS modifications — add_tweedie_lines\",\"text\":\"modified JAGS model file\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/all_neon_tick_data.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"NEON Amblyomma and Ixodes tick abundance survey data — all_neon_tick_data\",\"title\":\"NEON Amblyomma and Ixodes tick abundance survey data — all_neon_tick_data\",\"text\":\"dataset containing timeseries Amblyomma americanum Ixodes scapularis nymph abundances NEON sites\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/all_neon_tick_data.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"NEON Amblyomma and Ixodes tick abundance survey data — all_neon_tick_data\",\"text\":\"\",\"code\":\"all_neon_tick_data\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/all_neon_tick_data.html\",\"id\":\"format\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Format\",\"title\":\"NEON Amblyomma and Ixodes tick abundance survey data — all_neon_tick_data\",\"text\":\"tibble/dataframe containing covariate information alongside main fields : Year Year sampling epiWeek Epidemiological week sampling plot_ID NEON plot ID survey location siteID NEON site ID survey location amblyomma_americanum Counts . americanum nymphs ixodes_scapularis Counts . scapularis nymphs\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/all_neon_tick_data.html\",\"id\":\"source\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Source\",\"title\":\"NEON Amblyomma and Ixodes tick abundance survey data — all_neon_tick_data\",\"text\":\"https://www.neonscience.org/data\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/code.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Print the model code from an mvgam object — code\",\"title\":\"Print the model code from an mvgam object — code\",\"text\":\"Print model code mvgam object\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/code.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Print the model code from an mvgam object — code\",\"text\":\"\",\"code\":\"code(object)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/code.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Print the model code from an mvgam object — code\",\"text\":\"object list object returned mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/code.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Print the model code from an mvgam object — code\",\"text\":\"character string containing model code tidy format\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"title\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"text\":\"Display conditional effects one numeric /categorical predictors mvgam models, including two-way interaction effects.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam conditional_effects(   x,   effects = NULL,   type = \\\"response\\\",   points = TRUE,   rug = TRUE,   ... )  # S3 method for mvgam_conditional_effects plot(x, plot = TRUE, ask = FALSE, ...)  # S3 method for mvgam_conditional_effects print(x, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"text\":\"x Object class mvgam mvgam_conditional_effects effects optional character vector naming effects (main effects interactions) compute conditional plots. Interactions specified : variable names. NULL (default), plots generated main effects two-way interactions estimated model. specifying effects manually, two-way interactions (including grouping variables) may plotted even originally modeled. type character specifying scale predictions. value link (default) linear predictor calculated link scale. expected used, predictions reflect expectation response (mean) ignore uncertainty observation process. response used, predictions take uncertainty observation process account return predictions outcome scale. Two special cases also allowed: type latent_N return estimated latent abundances N-mixture distribution, type detection return estimated detection probability N-mixture distribution points Logical. Indicates original data points added, type == 'response'. Default TRUE. rug Logical. Indicates displays tick marks plotted axes mark distribution raw data, type == 'response'. Default TRUE. ... arguments pass plot_predictions plot Logical; indicates plots plotted directly active graphic device. Defaults TRUE. ask Logical. Indicates user prompted new page plotted. used plot TRUE. Default FALSE.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"text\":\"conditional_effects returns object class mvgam_conditional_effects named list one slot per effect containing ggplot object, can customized using ggplot2 package. corresponding plot method draw plots active graphic device\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"text\":\"function acts wrapper flexible plot_predictions. creating conditional_effects particular predictor (interaction two predictors), one choose values predictors condition . default, mean used continuous variables reference category used factors. Use plot_predictions change create bespoke conditional effects plots.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Display Conditional Effects of Predictors — conditional_effects.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data simdat <- sim_mvgam(family = poisson(),                     seasonality = 'hierarchical')  # Fit a model mod <- mvgam(y ~ s(season, by = series) + year:series,              family = poisson(),              data = simdat$data_train)  # Plot all main effects on the response scale plot(conditional_effects(mod), ask = FALSE)  # Change the prediction interval to 70% using plot_predictions() argument # 'conf_level' plot(conditional_effects(mod, conf_level = 0.7), ask = FALSE)  # Plot all main effects on the link scale plot(conditional_effects(mod, type = 'link'), ask = FALSE)  # Works the same for smooth terms set.seed(0) dat <- mgcv::gamSim(1, n = 200, scale = 2) dat$time <- 1:NROW(dat) mod <- mvgam(y ~ s(x0) + s(x1) + s(x2) + s(x3),             data = dat,             family = gaussian()) conditional_effects(mod) conditional_effects(mod, conf_level = 0.5, type = 'link') }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/dynamic.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Defining dynamic coefficients in mvgam formulae — dynamic\",\"title\":\"Defining dynamic coefficients in mvgam formulae — dynamic\",\"text\":\"Set time-varying (dynamic) coefficients use mvgam models. Currently, low-rank Gaussian Process smooths available estimating dynamics time-varying coefficient.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/dynamic.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Defining dynamic coefficients in mvgam formulae — dynamic\",\"text\":\"\",\"code\":\"dynamic(variable, k, rho = 5, stationary = TRUE, scale = TRUE)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/dynamic.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Defining dynamic coefficients in mvgam formulae — dynamic\",\"text\":\"variable variable dynamic smooth function k Optional number basis functions computing approximate GPs. missing, k set large possible accurately estimate nonlinear function rho Either positive numeric stating length scale used approximating squared exponential Gaussian Process smooth (see gp.smooth details) missing, case length scale estimated setting Hilbert space approximate GP stationary Logical. TRUE (default) rho supplied, latent Gaussian Process smooth linear trend component. FALSE, linear trend covariate added Gaussian Process smooth. Leave TRUE believe coefficient evolving much trend, linear component basis functions can hard penalize zero. sometimes causes divergence issues Stan. See gp.smooth details. Ignored rho missing (case Hilbert space approximate GP used) scale Logical; TRUE (default) rho missing, predictors scaled maximum Euclidean distance two points 1. often improves sampling speed convergence. Scaling also affects estimated length-scale parameters resemble scaled predictors (original predictors) scale TRUE.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/dynamic.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Defining dynamic coefficients in mvgam formulae — dynamic\",\"text\":\"mvgam currently sets dynamic coefficients low-rank squared exponential Gaussian Process smooths via call s(time, = variable, bs = \\\"gp\\\", m = c(2, rho, 2)). smooths, specified reasonable values length scale parameter, give realistic sample forecasts standard splines thin plate cubic. user must set value rho, currently support estimating value mgcv. may big problem, estimating latent length scales often difficult anyway. rho parameter thought prior smoothness latent dynamic coefficient function (higher values rho lead smoother functions temporal covariance structure. Values k set automatically ensure enough basis functions used approximate expected wiggliness underlying dynamic function (k increase rho decreases)\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/dynamic.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Defining dynamic coefficients in mvgam formulae — dynamic\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/dynamic.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Defining dynamic coefficients in mvgam formulae — dynamic\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate a time-varying coefficient \\\\ #(as a Gaussian Process with length scale = 10) set.seed(1111) N <- 200 beta <- mvgam:::sim_gp(rnorm(1),                       alpha_gp = 0.75,                       rho_gp = 10,                       h = N) + 0.5 plot(beta, type = 'l', lwd = 3,     bty = 'l', xlab = 'Time',     ylab = 'Coefficient',     col = 'darkred')  # Simulate the predictor as a standard normal predictor <- rnorm(N, sd = 1)  # Simulate a Gaussian outcome variable out <- rnorm(N, mean = 4 + beta * predictor,             sd = 0.25) time <- seq_along(predictor) plot(out,  type = 'l', lwd = 3,     bty = 'l', xlab = 'Time', ylab = 'Outcome',     col = 'darkred')  # Gather into a data.frame and fit a dynamic coefficient mmodel data <- data.frame(out, predictor, time)  # Split into training and testing data_train <- data[1:190,] data_test <- data[191:200,]  # Fit a model using the dynamic function mod <- mvgam(out ~             # mis-specify the length scale slightly as this             # won't be known in practice             dynamic(predictor, rho = 8, stationary = TRUE),            family = gaussian(),            data = data_train)  # Inspect the summary summary(mod)  # Plot the time-varying coefficient estimates plot(mod, type = 'smooths')  # Extrapolate the coefficient forward in time plot_mvgam_smooth(mod, smooth = 1, newdata = data) abline(v = 190, lty = 'dashed', lwd = 2)  # Overlay the true simulated time-varying coefficient lines(beta, lwd = 2.5, col = 'white') lines(beta, lwd = 2) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/evaluate_mvgams.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\",\"title\":\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\",\"text\":\"Evaluate forecasts fitted mvgam objects\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/evaluate_mvgams.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\",\"text\":\"\",\"code\":\"eval_mvgam(   object,   n_samples = 5000,   eval_timepoint = 3,   fc_horizon = 3,   n_cores = 2,   score = \\\"drps\\\",   log = FALSE,   weights )  roll_eval_mvgam(   object,   n_evaluations = 5,   evaluation_seq,   n_samples = 5000,   fc_horizon = 3,   n_cores = 2,   score = \\\"drps\\\",   log = FALSE,   weights )  compare_mvgams(   model1,   model2,   n_samples = 1000,   fc_horizon = 3,   n_evaluations = 10,   n_cores = 2,   score = \\\"drps\\\",   log = FALSE,   weights )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/evaluate_mvgams.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\",\"text\":\"object list object returned mvgam n_samples integer specifying number samples generate model's posterior distribution eval_timepoint integer indexing timepoint represents last 'observed' set outcome data fc_horizon integer specifying length forecast horizon evaluating forecasts n_cores integer specifying number cores generating particle forecasts parallel score character specifying type ranked probability score use evaluation. Options : variogram, drps crps log logical. forecasts truths logged prior scoring? often appropriate comparing performance models series vary observation ranges weights optional vector weights (length(weights) == n_series) weighting pairwise correlations evaluating variogram score multivariate forecasts. Useful -weighting series larger magnitude observations less interest forecasting. Ignored score != 'variogram' n_evaluations integer specifying total number evaluations perform evaluation_seq Optional integer sequence specifying exact set timepoints evaluating model's forecasts. sequence values <3 > max(training timepoints) - fc_horizon model1 list object returned mvgam representing first model evaluated model2 list object returned mvgam representing second model evaluated\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/evaluate_mvgams.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\",\"text\":\"eval_mvgam, list object containing information specific evaluations series (using drps crps score) vector scores using variogram. roll_eval_mvgam, list object containing information specific evaluations series well total evaluation summary (taken summing forecast score series evaluation averaging coverages evaluation) compare_mvgams, series plots comparing forecast Rank Probability Scores competing model. lower score preferred. Note however possible select model ultimately perform poorly true --sample forecasting. example wiggly smooth function 'year' included model function learned prior evaluating rolling window forecasts, model generate tight predictions result. forecasting ahead timepoints model seen (.e. next year), smooth function end extrapolating, sometimes strange unexpected ways. therefore recommended use smooth functions covariates adequately measured data (.e. 'seasonality', example) reduce possible extrapolation smooths let latent trends mvgam model capture temporal dependencies data. trends time series models provide much stable forecasts\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/evaluate_mvgams.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\",\"text\":\"eval_mvgam generates set samples representing fixed parameters estimated full mvgam model latent trend states given point time. trends rolled forward total fc_horizon timesteps according estimated state space dynamics generate '--sample' forecast evaluated true observations horizon window. function therefore simulates situation model's parameters already estimated observed data evaluation timepoint like generate forecasts latent trends observed timepoint. Evaluation involves calculating appropriate Rank Probability Score binary indicator whether true value lies within forecast's 90% prediction interval roll_eval_mvgam sets sequence evaluation timepoints along rolling window iteratively calls eval_mvgam evaluate '--sample' forecasts. Evaluation involves calculating Discrete Rank Probability Score binary indicator whether true value lies within forecast's 90% prediction interval compare_mvgams automates evaluation compare two fitted models using rolling window forecast evaluation provides series summary plots facilitate model selection. essentially wrapper roll_eval_mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/evaluate_mvgams.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Evaluate forecasts from fitted mvgam objects — evaluate_mvgams\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate from a Poisson-AR2 model with a seasonal smooth set.seed(100) dat <- sim_mvgam(T = 75,                 n_series = 1,                 prop_trend = 0.75,                  trend_model = 'AR2',                  family = poisson())  # Plot the time series plot_mvgam_series(data = dat$data_train,                  newdata = dat$data_test,                  series = 1)  # Fit an appropriate model mod_ar2 <- mvgam(y ~ s(season, bs = 'cc'),                trend_model = 'AR2',                family = poisson(),                data = dat$data_train,                newdata = dat$data_test)  # Fit a less appropriate model mod_rw <- mvgam(y ~ s(season, bs = 'cc'),               trend_model = 'RW',               family = poisson(),               data = dat$data_train,               newdata = dat$data_test)  # Compare Discrete Ranked Probability Scores for the testing period fc_ar2 <- forecast(mod_ar2) fc_rw <- forecast(mod_rw) score_ar2 <- score(fc_ar2, score = 'drps') score_rw <- score(fc_rw, score = 'drps') sum(score_ar2$series_1$score) sum(score_rw$series_1$score)  # Use rolling evaluation for approximate comparisons of 3-step ahead # forecasts across the training period compare_mvgams(mod_ar2,               mod_rw,               fc_horizon = 3,               n_samples = 1000,               n_evaluations = 5)  # Now use approximate leave-future-out CV to compare # rolling forecasts; start at time point 40 to reduce # computational time and to ensure enough data is available # for estimating model parameters lfo_ar2 <- lfo_cv(mod_ar2,                  min_t = 40,                  fc_horizon = 3) lfo_rw <- lfo_cv(mod_rw,                 min_t = 40,                 fc_horizon = 3)  # Plot Pareto-K values and ELPD estimates plot(lfo_ar2) plot(lfo_rw)  # Proportion of timepoints in which AR2 model gives # better forecasts length(which((lfo_ar2$elpds - lfo_rw$elpds) > 0)) /       length(lfo_ar2$elpds)  # A higher total ELPD is preferred lfo_ar2$sum_ELPD lfo_rw$sum_ELPD }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/fitted.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Expected Values of the Posterior Predictive Distribution — fitted.mvgam\",\"title\":\"Expected Values of the Posterior Predictive Distribution — fitted.mvgam\",\"text\":\"method extracts posterior estimates fitted values (.e. actual predictions, included estimates trend states, obtained fitting model). also includes option obtaining summaries computed draws.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/fitted.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Expected Values of the Posterior Predictive Distribution — fitted.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam fitted(   object,   process_error = TRUE,   scale = c(\\\"response\\\", \\\"linear\\\"),   summary = TRUE,   robust = FALSE,   probs = c(0.025, 0.975),   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/fitted.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Expected Values of the Posterior Predictive Distribution — fitted.mvgam\",\"text\":\"object object class mvgam process_error Logical. TRUE dynamic trend model fit, expected uncertainty process model accounted using draws latent trend SD parameters. FALSE, uncertainty latent trend component ignored calculating predictions scale Either \\\"response\\\" \\\"linear\\\". \\\"response\\\", results returned scale response variable. \\\"linear\\\", results returned scale linear predictor term, without applying inverse link function transformations. summary summary statistics returned instead raw values? Default TRUE.. robust FALSE (default) mean used measure central tendency standard deviation measure variability. TRUE, median median absolute deviation (MAD) applied instead. used summary TRUE. probs percentiles computed quantile function. used summary TRUE. ... arguments passed prepare_predictions control several aspects data validation prediction.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/fitted.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Expected Values of the Posterior Predictive Distribution — fitted.mvgam\",\"text\":\"array predicted mean response values. summary = FALSE output resembles posterior_epred.mvgam predict.mvgam. summary = TRUE output n_observations x E matrix. number summary statistics E equal 2 +   length(probs): Estimate column contains point estimates (either mean median depending argument robust), Est.Error column contains uncertainty estimates (either standard deviation median absolute deviation depending argument robust). remaining columns starting Q contain quantile estimates specified via argument probs.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/fitted.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Expected Values of the Posterior Predictive Distribution — fitted.mvgam\",\"text\":\"method gives actual fitted values model (.e. see generate hindcasts fitted model using hindcast.mvgam type = 'expected'). predictions can overly precise flexible dynamic trend component included model. contrast set predict functions (.e. posterior_epred.mvgam predict.mvgam), assume dynamic trend component reached stationarity returning hypothetical predictions\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/fitted.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Expected Values of the Posterior Predictive Distribution — fitted.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data and fit a model simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Extract fitted values (posterior expectations) expectations <- fitted(mod) str(expectations) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/forecast.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\",\"title\":\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\",\"text\":\"Extract compute hindcasts forecasts fitted mvgam object\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/forecast.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\",\"text\":\"\",\"code\":\"forecast(object, ...)  # S3 method for mvgam forecast(   object,   newdata,   data_test,   series = \\\"all\\\",   n_cores = 1,   type = \\\"response\\\",   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/forecast.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() ... Ignored newdata Optional dataframe list test data containing least 'series' 'time' addition variables included linear predictor original formula. included, covariate information newdata used generate forecasts fitted model equations. newdata originally included call mvgam, forecasts already produced generative model simply extracted plotted. However newdata supplied original model call, assumption made newdata supplied comes sequentially data supplied data original model (.e. assume time gap last observation series 1 data first observation series 1 newdata) data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows series Either integer specifying series set forecast, character string '', specifying series forecast. preferable fitted model contained multivariate trends (either dynamic factor VAR process), saves recomputing full set trends series individually n_cores integer specifying number cores generating forecasts parallel type value link (default) linear predictor calculated link scale. expected used, predictions reflect expectation response (mean) ignore uncertainty observation process. response used, predictions take uncertainty observation process account return predictions outcome scale. variance used, variance response respect mean (mean-variance relationship) returned. Two special cases also allowed: type latent_N return estimated latent abundances N-mixture distribution, type detection return estimated detection probability N-mixture distribution\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/forecast.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\",\"text\":\"object class mvgam_forecast containing hindcast forecast distributions. See mvgam_forecast-class details.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/forecast.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\",\"text\":\"Posterior predictions drawn fitted mvgam used simulate forecast distribution\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/forecast.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Extract or compute hindcasts and forecasts for a fitted mvgam object — forecast.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { simdat <- sim_mvgam(n_series = 3, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Hindcasts on response scale hc <- hindcast(mod) str(hc) plot(hc, series = 1) plot(hc, series = 2) plot(hc, series = 3)  # Forecasts on response scale fc <- forecast(mod, newdata = simdat$data_test) str(fc) plot(fc, series = 1) plot(fc, series = 2) plot(fc, series = 3)  # Forecasts as expectations fc <- forecast(mod, newdata = simdat$data_test, type = 'expected') plot(fc, series = 1) plot(fc, series = 2) plot(fc, series = 3)  }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/formula.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extract formulae from mvgam objects — formula.mvgam\",\"title\":\"Extract formulae from mvgam objects — formula.mvgam\",\"text\":\"Extract formulae mvgam objects\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/formula.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Extract formulae from mvgam objects — formula.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam formula(x, trend_effects = FALSE, ...)  # S3 method for mvgam_prefit formula(x, trend_effects = FALSE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/formula.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Extract formulae from mvgam objects — formula.mvgam\",\"text\":\"x mvgam mvgam_prefit object trend_effects logical, return formula observation model (FALSE) underlying process model (ifTRUE) ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/formula.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Extract formulae from mvgam objects — formula.mvgam\",\"text\":\"formula object\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/formula.mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Extract formulae from mvgam objects — formula.mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_monitor_pars.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Return parameters to monitor during modelling — get_monitor_pars\",\"title\":\"Return parameters to monitor during modelling — get_monitor_pars\",\"text\":\"Return parameters monitor modelling\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_monitor_pars.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Return parameters to monitor during modelling — get_monitor_pars\",\"text\":\"\",\"code\":\"get_monitor_pars(family, smooths_included = TRUE, use_lv, trend_model, drift)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_monitor_pars.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Return parameters to monitor during modelling — get_monitor_pars\",\"text\":\"family character smooths_included Logical. smooth terms included model formula? use_lv Logical (use latent variable trends ) trend_model type trend model used drift Logical (drift term estimated )\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_monitor_pars.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Return parameters to monitor during modelling — get_monitor_pars\",\"text\":\"string parameters monitor\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"function lists parameters can prior distributions changed given mvgam model, well listing default distributions\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"\",\"code\":\"get_mvgam_priors(   formula,   trend_formula,   data,   data_train,   family = \\\"poisson\\\",   use_lv = FALSE,   n_lv,   use_stan = TRUE,   trend_model = \\\"None\\\",   trend_map,   drift = FALSE )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"formula character string specifying GAM observation model formula. exactly like formula GLM except smooth terms, s(), te(), ti(), t2(), well time-varying dynamic() terms, can added right hand side specify linear predictor depends smooth functions predictors (linear functionals ). nmix() family models, formula used set linear predictor detection probability. Details formula syntax used mvgam can found mvgam_formulae trend_formula optional character string specifying GAM process model formula. supplied, linear predictor modelled latent trends capture process model evolution separately observation model. response variable specified left-hand side formula (.e. valid option ~ season + s(year)). Also note use identifier series formula specify effects vary across time series. Instead use trend. ensure models trend_map supplied still work consistently (.e. allowing effects vary across process models, even time series share underlying process model). feature currently available RW(), AR() VAR() trend models. nmix() family models, trend_formula used set linear predictor underlying latent abundance data dataframe list containing model response variable covariates required GAM formula optional trend_formula. include columns: series (factor index series IDs;number levels identical number unique series labels (.e. n_series = length(levels(data$series)))) time (numeric integer index time point observation). variables included linear predictor formula must also present data_train Deprecated. Still works place data users recommended use data instead seamless integration R workflows family family specifying exponential observation family series. Currently supported families : nb() count data poisson() count data gaussian() real-valued data betar() proportional data (0,1) lognormal() non-negative real-valued data student_t() real-valued data Gamma() non-negative real-valued data nmix() count data imperfect detection modeled via State-Space N-Mixture model. latent states Poisson, capturing 'true' latent abundance, observation process Binomial account imperfect detection. See mvgam_families example use family Note nb() poisson() available using JAGS backend. Default poisson(). See mvgam_families details use_lv logical. TRUE, use dynamic factors estimate series' latent trends reduced dimension format. available RW(), AR() GP() trend models. Defaults FALSE n_lv integer number latent dynamic factors use use_lv == TRUE. > n_series. Defaults arbitrarily min(2, floor(n_series / 2)) use_stan Logical. TRUE, model compiled sampled using Hamiltonian Monte Carlo call cmdstan_model call stan. Note many options using Stan vs JAGS trend_model character  function specifying time series dynamics latent trend. Options : None (latent trend component; .e. GAM component contributes linear predictor, observation process source error; similarly estimated gam) 'RW' RW() 'AR1' AR(p = 1) 'AR2' AR(p = 2) 'AR3' AR(p = 3) 'VAR1'  VAR()(available Stan) 'PWlogistic, 'PWlinear' PW() (available Stan) 'GP' GP() (Gaussian Process squared exponential kernel; available Stan) trend types apart GP() PW(), moving average /correlated process error terms can also estimated (example, RW(cor = TRUE) set multivariate Random Walk n_series > 1). See mvgam_trends details trend_map Optional data.frame specifying series depend latent trends. Useful allowing multiple series depend latent trend process, different observation processes. supplied, latent factor model set setting use_lv = TRUE using mapping set shared trends. Needs column names series trend, integer values trend column state trend series depend . series column single unique entry series data (names perfectly match factor levels series variable data). See examples details drift logical estimate drift parameter latent trend components. Useful latent trend expected broadly follow non-zero slope. available RW() AR() trend models. Note latent trend less stationary, drift parameter can become unidentifiable, especially intercept term included GAM linear predictor (default calling jagam). Drift parameters also likely unidentifiable using dynamic factor models. Therefore defaults FALSE\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"either data.frame containing prior definitions (suitable priors can altered user) NULL, indicating priors model can modified mvgam interface\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"Users can supply model formula, prior fitting model, default priors can inspected altered. make alterations, change contents prior column supplying data.frame mvgam function using argument priors. using Stan backend, users can also modify parameter bounds modifying new_lowerbound /new_upperbound columns. necessary using restrictive distributions parameters, Beta distribution trend sd parameters example (Beta support  (0,1)), upperbound 1. Another option make use prior modification functions brms (.e. prior) change prior distributions bounds (just use name parameter like change class argument; see examples )\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":\"note\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Note\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"prior, new_lowerbound /new_upperbound columns output altered defining user-defined priors mvgam model. Use familiar underlying probabilistic programming language. sanity checks done ensure code legal (.e. check lower bounds smaller upper bounds, example)\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Extract information on default prior distributions for an mvgam model — get_mvgam_priors\",\"text\":\"\",\"code\":\"# Simulate three integer-valued time series library(mvgam) dat <- sim_mvgam(trend_rel = 0.5)  # Get a model file that uses default mvgam priors for inspection (not always necessary, # but this can be useful for testing whether your updated priors are written correctly) mod_default <- mvgam(y ~ s(series, bs = 're') +               s(season, bs = 'cc') - 1,               family = 'nb',               data = dat$data_train,               trend_model = 'AR2',               run_model = FALSE)  # Inspect the model file with default mvgam priors code(mod_default) #> // Stan model code generated by package mvgam #> functions { #>   vector rep_each(vector x, int K) { #>     int N = rows(x); #>     vector[N * K] y; #>     int pos = 1; #>     for (n in 1 : N) { #>       for (k in 1 : K) { #>         y[pos] = x[n]; #>         pos += 1; #>       } #>     } #>     return y; #>   } #> } #> data { #>   int<lower=0> total_obs; // total number of observations #>   int<lower=0> n; // number of timepoints per series #>   int<lower=0> n_sp; // number of smoothing parameters #>   int<lower=0> n_series; // number of series #>   int<lower=0> num_basis; // total number of basis coefficients #>   vector[num_basis] zero; // prior locations for basis coefficients #>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix #>   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) #>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1 #>   int<lower=0> n_nonmissing; // number of nonmissing observations #>   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations #>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations #>   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations #> } #> parameters { #>   // raw basis coefficients #>   vector[num_basis] b_raw; #>    #>   // random effect variances #>   vector<lower=0>[1] sigma_raw; #>    #>   // random effect means #>   vector[1] mu_raw; #>    #>   // negative binomial overdispersion #>   vector<lower=0>[n_series] phi_inv; #>    #>   // latent trend AR1 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar1; #>    #>   // latent trend AR2 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar2; #>    #>   // latent trend variance parameters #>   vector<lower=0>[n_series] sigma; #>    #>   // latent trends #>   matrix[n, n_series] trend; #>    #>   // smoothing parameters #>   vector<lower=0>[n_sp] lambda; #> } #> transformed parameters { #>   // basis coefficients #>   vector[num_basis] b; #>   b[1 : 8] = b_raw[1 : 8]; #>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1]; #> } #> model { #>   // prior for random effect population variances #>   sigma_raw ~ student_t(3, 0, 2.5); #>    #>   // prior for random effect population means #>   mu_raw ~ std_normal(); #>    #>   // prior for s(season)... #>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]); #>    #>   // prior (non-centred) for s(series)... #>   b_raw[9 : 11] ~ std_normal(); #>    #>   // priors for AR parameters #>   ar1 ~ std_normal(); #>   ar2 ~ std_normal(); #>    #>   // priors for smoothing parameters #>   lambda ~ normal(5, 30); #>    #>   // priors for overdispersion parameters #>   phi_inv ~ student_t(3, 0, 0.1); #>    #>   // priors for latent trend variance parameters #>   sigma ~ student_t(3, 0, 2.5); #>    #>   // trend estimates #>   trend[1, 1 : n_series] ~ normal(0, sigma); #>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma); #>   for (s in 1 : n_series) { #>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s] #>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]); #>   } #>   { #>     // likelihood functions #>     vector[n_nonmissing] flat_trends; #>     array[n_nonmissing] real flat_phis; #>     flat_trends = to_vector(trend)[obs_ind]; #>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]); #>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends) #>                                  * append_row(b, 1.0)), #>                              inv(flat_phis)); #>   } #> } #> generated quantities { #>   vector[total_obs] eta; #>   matrix[n, n_series] mus; #>   vector[n_sp] rho; #>   vector[n_series] tau; #>   array[n, n_series] int ypred; #>   matrix[n, n_series] phi_vec; #>   vector[n_series] phi; #>   phi = inv(phi_inv); #>   for (s in 1 : n_series) { #>     phi_vec[1 : n, s] = rep_vector(phi[s], n); #>   } #>   rho = log(lambda); #>   for (s in 1 : n_series) { #>     tau[s] = pow(sigma[s], -2.0); #>   } #>    #>   // posterior predictions #>   eta = X * b; #>   for (s in 1 : n_series) { #>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; #>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]); #>   } #> } #>  #>   # Look at which priors can be updated in mvgam test_priors <- get_mvgam_priors(y ~ s(series, bs = 're') +                               s(season, bs = 'cc') - 1,                               family = 'nb',                               data = dat$data_train,                               trend_model = 'AR2') test_priors #>                                    param_name param_length #> 1               vector<lower=0>[n_sp] lambda;            2 #> 2                           vector[1] mu_raw;            1 #> 3               vector<lower=0>[1] sigma_raw;            1 #> 4 vector<lower=-1.5,upper=1.5>[n_series] ar1;            3 #> 5 vector<lower=-1.5,upper=1.5>[n_series] ar2;            3 #> 6            vector<lower=0>[n_series] sigma;            3 #> 7          vector<lower=0>[n_series] phi_inv;            3 #>                    param_info                             prior #> 1 s(season) smooth parameters           lambda ~ normal(5, 30); #> 2          s(series) pop mean            mu_raw ~ std_normal(); #> 3            s(series) pop sd sigma_raw ~ student_t(3, 0, 2.5); #> 4       trend AR1 coefficient               ar1 ~ std_normal(); #> 5       trend AR2 coefficient               ar2 ~ std_normal(); #> 6                    trend sd     sigma ~ student_t(3, 0, 2.5); #> 7   inverse of NB dispsersion   phi_inv ~ student_t(3, 0, 0.1); #>                   example_change new_lowerbound new_upperbound #> 1    lambda ~ exponential(0.03);             NA             NA #> 2   mu_raw ~ normal(0.56, 0.85);             NA             NA #> 3 sigma_raw ~ exponential(0.28);             NA             NA #> 4      ar1 ~ normal(0.03, 0.94);             NA             NA #> 5      ar2 ~ normal(0.08, 0.56);             NA             NA #> 6     sigma ~ exponential(0.97);             NA             NA #> 7  phi_inv ~ normal(0.75, 0.12);             NA             NA  # Make a few changes; first, change the population mean for the series-level # random intercepts test_priors$prior[2] <- 'mu_raw ~ normal(0.2, 0.5);'  # Now use stronger regularisation for the series-level AR2 coefficients test_priors$prior[5] <- 'ar2 ~ normal(0, 0.25);'  # Check that the changes are made to the model file without any warnings by # setting 'run_model = FALSE' mod <- mvgam(y ~ s(series, bs = 're') +             s(season, bs = 'cc') - 1,             family = 'nb',             data = dat$data_train,             trend_model = 'AR2',             priors = test_priors,             run_model = FALSE)             code(mod) #> // Stan model code generated by package mvgam #> functions { #>   vector rep_each(vector x, int K) { #>     int N = rows(x); #>     vector[N * K] y; #>     int pos = 1; #>     for (n in 1 : N) { #>       for (k in 1 : K) { #>         y[pos] = x[n]; #>         pos += 1; #>       } #>     } #>     return y; #>   } #> } #> data { #>   int<lower=0> total_obs; // total number of observations #>   int<lower=0> n; // number of timepoints per series #>   int<lower=0> n_sp; // number of smoothing parameters #>   int<lower=0> n_series; // number of series #>   int<lower=0> num_basis; // total number of basis coefficients #>   vector[num_basis] zero; // prior locations for basis coefficients #>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix #>   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) #>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1 #>   int<lower=0> n_nonmissing; // number of nonmissing observations #>   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations #>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations #>   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations #> } #> parameters { #>   // raw basis coefficients #>   vector[num_basis] b_raw; #>    #>   // random effect variances #>   vector<lower=0>[1] sigma_raw; #>    #>   // random effect means #>   vector[1] mu_raw; #>    #>   // negative binomial overdispersion #>   vector<lower=0>[n_series] phi_inv; #>    #>   // latent trend AR1 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar1; #>    #>   // latent trend AR2 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar2; #>    #>   // latent trend variance parameters #>   vector<lower=0>[n_series] sigma; #>    #>   // latent trends #>   matrix[n, n_series] trend; #>    #>   // smoothing parameters #>   vector<lower=0>[n_sp] lambda; #> } #> transformed parameters { #>   // basis coefficients #>   vector[num_basis] b; #>   b[1 : 8] = b_raw[1 : 8]; #>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1]; #> } #> model { #>   // prior for random effect population variances #>   sigma_raw ~ student_t(3, 0, 2.5); #>    #>   // prior for random effect population means #>   mu_raw ~ normal(0.2, 0.5); #>    #>   // prior for s(season)... #>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]); #>    #>   // prior (non-centred) for s(series)... #>   b_raw[9 : 11] ~ std_normal(); #>    #>   // priors for AR parameters #>   ar1 ~ std_normal(); #>   ar2 ~ normal(0, 0.25); #>    #>   // priors for smoothing parameters #>   lambda ~ normal(5, 30); #>    #>   // priors for overdispersion parameters #>   phi_inv ~ student_t(3, 0, 0.1); #>    #>   // priors for latent trend variance parameters #>   sigma ~ student_t(3, 0, 2.5); #>    #>   // trend estimates #>   trend[1, 1 : n_series] ~ normal(0, sigma); #>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma); #>   for (s in 1 : n_series) { #>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s] #>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]); #>   } #>   { #>     // likelihood functions #>     vector[n_nonmissing] flat_trends; #>     array[n_nonmissing] real flat_phis; #>     flat_trends = to_vector(trend)[obs_ind]; #>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]); #>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends) #>                                  * append_row(b, 1.0)), #>                              inv(flat_phis)); #>   } #> } #> generated quantities { #>   vector[total_obs] eta; #>   matrix[n, n_series] mus; #>   vector[n_sp] rho; #>   vector[n_series] tau; #>   array[n, n_series] int ypred; #>   matrix[n, n_series] phi_vec; #>   vector[n_series] phi; #>   phi = inv(phi_inv); #>   for (s in 1 : n_series) { #>     phi_vec[1 : n, s] = rep_vector(phi[s], n); #>   } #>   rho = log(lambda); #>   for (s in 1 : n_series) { #>     tau[s] = pow(sigma[s], -2.0); #>   } #>    #>   // posterior predictions #>   eta = X * b; #>   for (s in 1 : n_series) { #>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; #>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]); #>   } #> } #>  #>   # No warnings, the model is ready for fitting now in the usual way with the addition # of the 'priors' argument  # The same can be done using brms functions; here we will also change the ar1 prior # and put some bounds on the ar coefficients to enforce stationarity; we set the # prior using the 'class' argument in all brms prior functions brmsprior <- c(prior(normal(0.2, 0.5), class = mu_raw),               prior(normal(0, 0.25), class = ar1, lb = -1, ub = 1),               prior(normal(0, 0.25), class = ar2, lb = -1, ub = 1)) brmsprior #>             prior  class coef group resp dpar nlpar   lb   ub source #>  normal(0.2, 0.5) mu_raw                            <NA> <NA>   user #>   normal(0, 0.25)    ar1                              -1    1   user #>   normal(0, 0.25)    ar2                              -1    1   user  mod <- mvgam(y ~ s(series, bs = 're') +             s(season, bs = 'cc') - 1,           family = 'nb',           data = dat$data_train,           trend_model = 'AR2',           priors = brmsprior,           run_model = FALSE) code(mod) #> // Stan model code generated by package mvgam #> functions { #>   vector rep_each(vector x, int K) { #>     int N = rows(x); #>     vector[N * K] y; #>     int pos = 1; #>     for (n in 1 : N) { #>       for (k in 1 : K) { #>         y[pos] = x[n]; #>         pos += 1; #>       } #>     } #>     return y; #>   } #> } #> data { #>   int<lower=0> total_obs; // total number of observations #>   int<lower=0> n; // number of timepoints per series #>   int<lower=0> n_sp; // number of smoothing parameters #>   int<lower=0> n_series; // number of series #>   int<lower=0> num_basis; // total number of basis coefficients #>   vector[num_basis] zero; // prior locations for basis coefficients #>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix #>   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) #>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1 #>   int<lower=0> n_nonmissing; // number of nonmissing observations #>   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations #>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations #>   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations #> } #> parameters { #>   // raw basis coefficients #>   vector[num_basis] b_raw; #>    #>   // random effect variances #>   vector<lower=0>[1] sigma_raw; #>    #>   // random effect means #>   vector[1] mu_raw; #>    #>   // negative binomial overdispersion #>   vector<lower=0>[n_series] phi_inv; #>    #>   // latent trend AR1 terms #>   vector<lower=-1, upper=1>[n_series] ar1; #>    #>   // latent trend AR2 terms #>   vector<lower=-1, upper=1>[n_series] ar2; #>    #>   // latent trend variance parameters #>   vector<lower=0>[n_series] sigma; #>    #>   // latent trends #>   matrix[n, n_series] trend; #>    #>   // smoothing parameters #>   vector<lower=0>[n_sp] lambda; #> } #> transformed parameters { #>   // basis coefficients #>   vector[num_basis] b; #>   b[1 : 8] = b_raw[1 : 8]; #>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1]; #> } #> model { #>   // prior for random effect population variances #>   sigma_raw ~ student_t(3, 0, 2.5); #>    #>   // prior for random effect population means #>   mu_raw ~ normal(0.2, 0.5); #>    #>   // prior for s(season)... #>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]); #>    #>   // prior (non-centred) for s(series)... #>   b_raw[9 : 11] ~ std_normal(); #>    #>   // priors for AR parameters #>   ar1 ~ normal(0, 0.25); #>   ar2 ~ normal(0, 0.25); #>    #>   // priors for smoothing parameters #>   lambda ~ normal(5, 30); #>    #>   // priors for overdispersion parameters #>   phi_inv ~ student_t(3, 0, 0.1); #>    #>   // priors for latent trend variance parameters #>   sigma ~ student_t(3, 0, 2.5); #>    #>   // trend estimates #>   trend[1, 1 : n_series] ~ normal(0, sigma); #>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma); #>   for (s in 1 : n_series) { #>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s] #>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]); #>   } #>   { #>     // likelihood functions #>     vector[n_nonmissing] flat_trends; #>     array[n_nonmissing] real flat_phis; #>     flat_trends = to_vector(trend)[obs_ind]; #>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]); #>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends) #>                                  * append_row(b, 1.0)), #>                              inv(flat_phis)); #>   } #> } #> generated quantities { #>   vector[total_obs] eta; #>   matrix[n, n_series] mus; #>   vector[n_sp] rho; #>   vector[n_series] tau; #>   array[n, n_series] int ypred; #>   matrix[n, n_series] phi_vec; #>   vector[n_series] phi; #>   phi = inv(phi_inv); #>   for (s in 1 : n_series) { #>     phi_vec[1 : n, s] = rep_vector(phi[s], n); #>   } #>   rho = log(lambda); #>   for (s in 1 : n_series) { #>     tau[s] = pow(sigma[s], -2.0); #>   } #>    #>   // posterior predictions #>   eta = X * b; #>   for (s in 1 : n_series) { #>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; #>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]); #>   } #> } #>  #>   # Look at what is returned when an incorrect spelling is used test_priors$prior[5] <- 'ar2_bananas ~ normal(0, 0.25);' mod <- mvgam(y ~ s(series, bs = 're') +             s(season, bs = 'cc') - 1,             family = 'nb',             data = dat$data_train,             trend_model = 'AR2',             priors = test_priors,             run_model = FALSE) #> Warning: no match found in model_file for parameter: ar2_bananas code(mod) #> // Stan model code generated by package mvgam #> functions { #>   vector rep_each(vector x, int K) { #>     int N = rows(x); #>     vector[N * K] y; #>     int pos = 1; #>     for (n in 1 : N) { #>       for (k in 1 : K) { #>         y[pos] = x[n]; #>         pos += 1; #>       } #>     } #>     return y; #>   } #> } #> data { #>   int<lower=0> total_obs; // total number of observations #>   int<lower=0> n; // number of timepoints per series #>   int<lower=0> n_sp; // number of smoothing parameters #>   int<lower=0> n_series; // number of series #>   int<lower=0> num_basis; // total number of basis coefficients #>   vector[num_basis] zero; // prior locations for basis coefficients #>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix #>   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) #>   matrix[8, 8] S1; // mgcv smooth penalty matrix S1 #>   int<lower=0> n_nonmissing; // number of nonmissing observations #>   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations #>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations #>   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations #> } #> parameters { #>   // raw basis coefficients #>   vector[num_basis] b_raw; #>    #>   // random effect variances #>   vector<lower=0>[1] sigma_raw; #>    #>   // random effect means #>   vector[1] mu_raw; #>    #>   // negative binomial overdispersion #>   vector<lower=0>[n_series] phi_inv; #>    #>   // latent trend AR1 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar1; #>    #>   // latent trend AR2 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar2; #>    #>   // latent trend variance parameters #>   vector<lower=0>[n_series] sigma; #>    #>   // latent trends #>   matrix[n, n_series] trend; #>    #>   // smoothing parameters #>   vector<lower=0>[n_sp] lambda; #> } #> transformed parameters { #>   // basis coefficients #>   vector[num_basis] b; #>   b[1 : 8] = b_raw[1 : 8]; #>   b[9 : 11] = mu_raw[1] + b_raw[9 : 11] * sigma_raw[1]; #> } #> model { #>   // prior for random effect population variances #>   sigma_raw ~ student_t(3, 0, 2.5); #>    #>   // prior for random effect population means #>   mu_raw ~ normal(0.2, 0.5); #>    #>   // prior for s(season)... #>   b_raw[1 : 8] ~ multi_normal_prec(zero[1 : 8], S1[1 : 8, 1 : 8] * lambda[1]); #>    #>   // prior (non-centred) for s(series)... #>   b_raw[9 : 11] ~ std_normal(); #>    #>   // priors for AR parameters #>   ar1 ~ std_normal(); #>   ar2 ~ std_normal(); #>    #>   // priors for smoothing parameters #>   lambda ~ normal(5, 30); #>    #>   // priors for overdispersion parameters #>   phi_inv ~ student_t(3, 0, 0.1); #>    #>   // priors for latent trend variance parameters #>   sigma ~ student_t(3, 0, 2.5); #>    #>   // trend estimates #>   trend[1, 1 : n_series] ~ normal(0, sigma); #>   trend[2, 1 : n_series] ~ normal(trend[1, 1 : n_series] * ar1, sigma); #>   for (s in 1 : n_series) { #>     trend[3 : n, s] ~ normal(ar1[s] * trend[2 : (n - 1), s] #>                              + ar2[s] * trend[1 : (n - 2), s], sigma[s]); #>   } #>   { #>     // likelihood functions #>     vector[n_nonmissing] flat_trends; #>     array[n_nonmissing] real flat_phis; #>     flat_trends = to_vector(trend)[obs_ind]; #>     flat_phis = to_array_1d(rep_each(phi_inv, n)[obs_ind]); #>     flat_ys ~ neg_binomial_2(exp(append_col(flat_xs, flat_trends) #>                                  * append_row(b, 1.0)), #>                              inv(flat_phis)); #>   } #> } #> generated quantities { #>   vector[total_obs] eta; #>   matrix[n, n_series] mus; #>   vector[n_sp] rho; #>   vector[n_series] tau; #>   array[n, n_series] int ypred; #>   matrix[n, n_series] phi_vec; #>   vector[n_series] phi; #>   phi = inv(phi_inv); #>   for (s in 1 : n_series) { #>     phi_vec[1 : n, s] = rep_vector(phi[s], n); #>   } #>   rho = log(lambda); #>   for (s in 1 : n_series) { #>     tau[s] = pow(sigma[s], -2.0); #>   } #>    #>   // posterior predictions #>   eta = X * b; #>   for (s in 1 : n_series) { #>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; #>     ypred[1 : n, s] = neg_binomial_2_rng(exp(mus[1 : n, s]), phi_vec[1 : n, s]); #>   } #> } #>  #>   # Example of changing parametric (fixed effect) priors simdat <- sim_mvgam()  # Add a fake covariate simdat$data_train$cov <- rnorm(NROW(simdat$data_train))  priors <- get_mvgam_priors(y ~ cov + s(season),                           data = simdat$data_train,                           family = poisson(),                           trend_model = 'AR1')  # Change priors for the intercept and fake covariate effects priors$prior[1] <- '(Intercept) ~ normal(0, 1);' priors$prior[2] <- 'cov ~ normal(0, 0.1);'  mod2 <- mvgam(y ~ cov + s(season),              data = simdat$data_train,              trend_model = 'AR1',              family = poisson(),              priors = priors,              run_model = FALSE) code(mod2) #> // Stan model code generated by package mvgam #> data { #>   int<lower=0> total_obs; // total number of observations #>   int<lower=0> n; // number of timepoints per series #>   int<lower=0> n_sp; // number of smoothing parameters #>   int<lower=0> n_series; // number of series #>   int<lower=0> num_basis; // total number of basis coefficients #>   vector[num_basis] zero; // prior locations for basis coefficients #>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix #>   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) #>   matrix[9, 18] S1; // mgcv smooth penalty matrix S1 #>   int<lower=0> n_nonmissing; // number of nonmissing observations #>   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations #>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations #>   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations #> } #> parameters { #>   // raw basis coefficients #>   vector[num_basis] b_raw; #>    #>   // latent trend AR1 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar1; #>    #>   // latent trend variance parameters #>   vector<lower=0>[n_series] sigma; #>    #>   // latent trends #>   matrix[n, n_series] trend; #>    #>   // smoothing parameters #>   vector<lower=0>[n_sp] lambda; #> } #> transformed parameters { #>   // basis coefficients #>   vector[num_basis] b; #>   b[1 : num_basis] = b_raw[1 : num_basis]; #> } #> model { #>   // prior for (Intercept)... #>   b_raw[1] ~ normal(0, 1); #>    #>   // prior for cov... #>   b_raw[2] ~ normal(0, 0.1); #>    #>   // prior for s(season)... #>   b_raw[3 : 11] ~ multi_normal_prec(zero[3 : 11], #>                                     S1[1 : 9, 1 : 9] * lambda[1] #>                                     + S1[1 : 9, 10 : 18] * lambda[2]); #>    #>   // priors for AR parameters #>   ar1 ~ std_normal(); #>    #>   // priors for smoothing parameters #>   lambda ~ normal(5, 30); #>    #>   // priors for latent trend variance parameters #>   sigma ~ student_t(3, 0, 2.5); #>    #>   // trend estimates #>   trend[1, 1 : n_series] ~ normal(0, sigma); #>   for (s in 1 : n_series) { #>     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]); #>   } #>   { #>     // likelihood functions #>     vector[n_nonmissing] flat_trends; #>     flat_trends = to_vector(trend)[obs_ind]; #>     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0, #>                               append_row(b, 1.0)); #>   } #> } #> generated quantities { #>   vector[total_obs] eta; #>   matrix[n, n_series] mus; #>   vector[n_sp] rho; #>   vector[n_series] tau; #>   array[n, n_series] int ypred; #>   rho = log(lambda); #>   for (s in 1 : n_series) { #>     tau[s] = pow(sigma[s], -2.0); #>   } #>    #>   // posterior predictions #>   eta = X * b; #>   for (s in 1 : n_series) { #>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; #>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]); #>   } #> } #>  #>   # Likewise using brms utilities (note that you can use # Intercept rather than `(Intercept)`) to change priors on the intercept brmsprior <- c(prior(normal(0.2, 0.5), class = cov),               prior(normal(0, 0.25), class = Intercept)) brmsprior #>             prior     class coef group resp dpar nlpar   lb   ub source #>  normal(0.2, 0.5)       cov                            <NA> <NA>   user #>   normal(0, 0.25) Intercept                            <NA> <NA>   user  mod2 <- mvgam(y ~ cov + s(season),              data = simdat$data_train,              trend_model = 'AR1',              family = poisson(),              priors = brmsprior,              run_model = FALSE) code(mod2) #> // Stan model code generated by package mvgam #> data { #>   int<lower=0> total_obs; // total number of observations #>   int<lower=0> n; // number of timepoints per series #>   int<lower=0> n_sp; // number of smoothing parameters #>   int<lower=0> n_series; // number of series #>   int<lower=0> num_basis; // total number of basis coefficients #>   vector[num_basis] zero; // prior locations for basis coefficients #>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix #>   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) #>   matrix[9, 18] S1; // mgcv smooth penalty matrix S1 #>   int<lower=0> n_nonmissing; // number of nonmissing observations #>   array[n_nonmissing] int<lower=0> flat_ys; // flattened nonmissing observations #>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations #>   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations #> } #> parameters { #>   // raw basis coefficients #>   vector[num_basis] b_raw; #>    #>   // latent trend AR1 terms #>   vector<lower=-1.5, upper=1.5>[n_series] ar1; #>    #>   // latent trend variance parameters #>   vector<lower=0>[n_series] sigma; #>    #>   // latent trends #>   matrix[n, n_series] trend; #>    #>   // smoothing parameters #>   vector<lower=0>[n_sp] lambda; #> } #> transformed parameters { #>   // basis coefficients #>   vector[num_basis] b; #>   b[1 : num_basis] = b_raw[1 : num_basis]; #> } #> model { #>   // prior for (Intercept)... #>   b_raw[1] ~ normal(0, 0.25); #>    #>   // prior for cov... #>   b_raw[2] ~ normal(0.2, 0.5); #>    #>   // prior for s(season)... #>   b_raw[3 : 11] ~ multi_normal_prec(zero[3 : 11], #>                                     S1[1 : 9, 1 : 9] * lambda[1] #>                                     + S1[1 : 9, 10 : 18] * lambda[2]); #>    #>   // priors for AR parameters #>   ar1 ~ std_normal(); #>    #>   // priors for smoothing parameters #>   lambda ~ normal(5, 30); #>    #>   // priors for latent trend variance parameters #>   sigma ~ student_t(3, 0, 2.5); #>    #>   // trend estimates #>   trend[1, 1 : n_series] ~ normal(0, sigma); #>   for (s in 1 : n_series) { #>     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]); #>   } #>   { #>     // likelihood functions #>     vector[n_nonmissing] flat_trends; #>     flat_trends = to_vector(trend)[obs_ind]; #>     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0, #>                               append_row(b, 1.0)); #>   } #> } #> generated quantities { #>   vector[total_obs] eta; #>   matrix[n, n_series] mus; #>   vector[n_sp] rho; #>   vector[n_series] tau; #>   array[n, n_series] int ypred; #>   rho = log(lambda); #>   for (s in 1 : n_series) { #>     tau[s] = pow(sigma[s], -2.0); #>   } #>    #>   // posterior predictions #>   eta = X * b; #>   for (s in 1 : n_series) { #>     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s]; #>     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]); #>   } #> } #>  #>   # The \\\"class = 'b'\\\" shortcut can be used to put the same prior on all # 'fixed' effect coefficients (apart from any intercepts) set.seed(0) dat <- mgcv::gamSim(1, n = 200, scale = 2) #> Gu & Wahba 4 term additive model dat$time <- 1:NROW(dat) mod <- mvgam(y ~ x0 + x1 + s(x2) + s(x3),             priors = prior(normal(0, 0.75), class = 'b'),             data = dat,             family = gaussian(),             run_model = FALSE) code(mod) #> // Stan model code generated by package mvgam #> functions { #>   vector rep_each(vector x, int K) { #>     int N = rows(x); #>     vector[N * K] y; #>     int pos = 1; #>     for (n in 1 : N) { #>       for (k in 1 : K) { #>         y[pos] = x[n]; #>         pos += 1; #>       } #>     } #>     return y; #>   } #> } #> data { #>   int<lower=0> total_obs; // total number of observations #>   int<lower=0> n; // number of timepoints per series #>   int<lower=0> n_sp; // number of smoothing parameters #>   int<lower=0> n_series; // number of series #>   int<lower=0> num_basis; // total number of basis coefficients #>   vector[num_basis] zero; // prior locations for basis coefficients #>   matrix[total_obs, num_basis] X; // mgcv GAM design matrix #>   array[n, n_series] int<lower=0> ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?) #>   matrix[9, 18] S1; // mgcv smooth penalty matrix S1 #>   matrix[9, 18] S2; // mgcv smooth penalty matrix S2 #>   int<lower=0> n_nonmissing; // number of nonmissing observations #>   vector[n_nonmissing] flat_ys; // flattened nonmissing observations #>   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations #>   array[n_nonmissing] int<lower=0> obs_ind; // indices of nonmissing observations #> } #> parameters { #>   // raw basis coefficients #>   vector[num_basis] b_raw; #>    #>   // gaussian observation error #>   vector<lower=0>[n_series] sigma_obs; #>    #>   // smoothing parameters #>   vector<lower=0>[n_sp] lambda; #> } #> transformed parameters { #>   // basis coefficients #>   vector[num_basis] b; #>   b[1 : num_basis] = b_raw[1 : num_basis]; #> } #> model { #>   // prior for (Intercept)... #>   b_raw[1] ~ student_t(3, 7.4, 3.7); #>    #>   // prior for x0... #>   b_raw[2] ~ normal(0, 0.75); #>    #>   // prior for x1... #>   b_raw[3] ~ normal(0, 0.75); #>    #>   // prior for s(x2)... #>   b_raw[4 : 12] ~ multi_normal_prec(zero[4 : 12], #>                                     S1[1 : 9, 1 : 9] * lambda[1] #>                                     + S1[1 : 9, 10 : 18] * lambda[2]); #>    #>   // prior for s(x3)... #>   b_raw[13 : 21] ~ multi_normal_prec(zero[13 : 21], #>                                      S2[1 : 9, 1 : 9] * lambda[3] #>                                      + S2[1 : 9, 10 : 18] * lambda[4]); #>    #>   // priors for smoothing parameters #>   lambda ~ normal(5, 30); #>    #>   // priors for observation error parameters #>   sigma_obs ~ student_t(3, 0, 3.7); #>   { #>     // likelihood functions #>     vector[n_nonmissing] flat_sigma_obs; #>     flat_sigma_obs = rep_each(sigma_obs, n)[obs_ind]; #>     flat_ys ~ normal_id_glm(flat_xs, 0.0, b, flat_sigma_obs); #>   } #> } #> generated quantities { #>   vector[total_obs] eta; #>   matrix[n, n_series] sigma_obs_vec; #>   matrix[n, n_series] mus; #>   vector[n_sp] rho; #>   array[n, n_series] real ypred; #>   rho = log(lambda); #>    #>   // posterior predictions #>   eta = X * b; #>   for (s in 1 : n_series) { #>     sigma_obs_vec[1 : n, s] = rep_vector(sigma_obs[s], n); #>   } #>   for (s in 1 : n_series) { #>     mus[1 : n, s] = eta[ytimes[1 : n, s]]; #>     ypred[1 : n, s] = normal_rng(mus[1 : n, s], sigma_obs_vec[1 : n, s]); #>   } #> } #>  #>\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/GP.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Specify dynamic Gaussian processes — GP\",\"title\":\"Specify dynamic Gaussian processes — GP\",\"text\":\"Set low-rank approximate Gaussian Process trend models using Hilbert basis expansions mvgam. function evaluate arguments – exists purely help set model particular GP trend models.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/GP.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Specify dynamic Gaussian processes — GP\",\"text\":\"\",\"code\":\"GP()\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/GP.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Specify dynamic Gaussian processes — GP\",\"text\":\"object class mvgam_trend, contains list arguments interpreted parsing functions mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/GP.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Specify dynamic Gaussian processes — GP\",\"text\":\"GP trend estimated series using Hilbert space approximate Gaussian Processes. mvgam, latent squared exponential GP trends approximated using default 20 basis functions using multiplicative factor c = 5/4, saves computational costs compared fitting full GPs adequately estimating GP alpha rho parameters.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/hindcast.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\",\"title\":\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\",\"text\":\"Extract hindcasts fitted mvgam object\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/hindcast.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\",\"text\":\"\",\"code\":\"hindcast(object, ...)  # S3 method for mvgam hindcast(object, series = \\\"all\\\", type = \\\"response\\\", ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/hindcast.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() ... Ignored series Either integer specifying series set forecast, character string '', specifying series forecast. preferable fitted model contained multivariate trends (either dynamic factor VAR process), saves recomputing full set trends series individually type value link (default) linear predictor calculated link scale. expected used, predictions reflect expectation response (mean) ignore uncertainty observation process. response used, predictions take uncertainty observation process account return predictions outcome scale. variance used, variance response respect mean (mean-variance relationship) returned. Two special cases also allowed: type latent_N return estimated latent abundances N-mixture distribution, type detection return estimated detection probability N-mixture distribution\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/hindcast.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\",\"text\":\"object class mvgam_forecast containing hindcast distributions. See mvgam_forecast-class details. #'@seealso forecast.mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/hindcast.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\",\"text\":\"Posterior retrodictions drawn fitted mvgam organized convenient format\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/hindcast.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Extract hindcasts for a fitted mvgam object — hindcast.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { simdat <- sim_mvgam(n_series = 3, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Hindcasts on response scale hc <- hindcast(mod) str(hc) plot(hc, series = 1) plot(hc, series = 2) plot(hc, series = 3)  # Hindcasts as expectations hc <- hindcast(mod, type = 'expected') str(hc) plot(hc, series = 1) plot(hc, series = 2) plot(hc, series = 3)  # Estimated latent trends hc <- hindcast(mod, type = 'trend') str(hc) plot(hc, series = 1) plot(hc, series = 2) plot(hc, series = 3) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/index-mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Index mvgam objects — index-mvgam\",\"title\":\"Index mvgam objects — index-mvgam\",\"text\":\"Index mvgam objects\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/index-mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Index mvgam objects — index-mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam variables(x, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/index-mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Index mvgam objects — index-mvgam\",\"text\":\"x list object returned mvgam. See mvgam() ... Arguments passed individual methods (applicable).\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"Approximate leave-future-cross-validation fitted mvgam objects\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"\",\"code\":\"lfo_cv(object, ...)  # S3 method for mvgam lfo_cv(object, data, min_t, fc_horizon = 1, pareto_k_threshold = 0.7, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() ... Ignored data dataframe list containing model response variable covariates required GAM formula. include columns: 'series' (character factor index series IDs) 'time' (numeric index time point observation). variables included linear predictor formula must also present min_t Integer specifying minimum training time required making predictions data. Default either 30, whatever training time allows least 10 lfo-cv calculations (.e. pmin(max(data$time) - 10, 30)) fc_horizon Integer specifying number time steps ahead evaluating forecasts pareto_k_threshold Proportion specifying threshold Pareto shape parameter considered unstable, triggering model refit. Default 0.7\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"list class mvgam_lfo containing approximate ELPD scores, Pareto-k shape values 'specified pareto_k_threshold\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"Approximate leave-future-cross-validation uses expanding training window scheme evaluate model forecasting ability. steps used function mirror laid lfo vignette loo package, written Paul Bürkner, Jonah Gabry, Aki Vehtari. First, refit model using first min_t observations perform single exact fc_horizon-ahead forecast step. forecast evaluated min_t + fc_horizon sample observations using Expected Log Predictive Density (ELPD). Next, approximate successive round expanding window forecasts moving forward one step time 1:N_evaluations re-weighting draws model's posterior predictive distribution using Pareto Smoothed Importance Sampling (PSIS). iteration , PSIS weights obtained next observation included model re-fit (.e. last observation training data, min_t + ). importance ratios stable, consider approximation adequate use re-weighted posterior's forecast evaluating next holdout set testing observations ((min_t + + 1):(min_t + + fc_horizon)). point importance ratio variability become large importance sampling fail. indicated estimated shape parameter k generalized Pareto distribution crossing certain threshold pareto_k_threshold. refit model using observations time failure. restart process iterate forward next refit triggered (Bürkner et al. 2020).\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":\"references\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"References\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"Paul-Christian Bürkner, Jonah Gabry & Aki Vehtari (2020). Approximate leave-future-cross-validation Bayesian time series models Journal Statistical Computation Simulation. 90:14, 2499-2523.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Approximate leave-future-out cross-validation of fitted mvgam objects — lfo_cv.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate from a Poisson-AR2 model with a seasonal smooth set.seed(100) dat <- sim_mvgam(T = 75,                 n_series = 1,                 prop_trend = 0.75,                 trend_model = 'AR2',                 family = poisson())  # Plot the time series plot_mvgam_series(data = dat$data_train,                  newdata = dat$data_test,                  series = 1)  # Fit an appropriate model mod_ar2 <- mvgam(y ~ s(season, bs = 'cc'),                trend_model = 'AR2',                family = poisson(),                data = dat$data_train,                newdata = dat$data_test)  # Fit a less appropriate model mod_rw <- mvgam(y ~ s(season, bs = 'cc'),               trend_model = 'RW',               family = poisson(),               data = dat$data_train,               newdata = dat$data_test)  # Compare Discrete Ranked Probability Scores for the testing period fc_ar2 <- forecast(mod_ar2) fc_rw <- forecast(mod_rw) score_ar2 <- score(fc_ar2, score = 'drps') score_rw <- score(fc_rw, score = 'drps') sum(score_ar2$series_1$score) sum(score_rw$series_1$score)  # Now use approximate leave-future-out CV to compare # rolling forecasts; start at time point 40 to reduce # computational time and to ensure enough data is available # for estimating model parameters lfo_ar2 <- lfo_cv(mod_ar2,                  min_t = 40,                  fc_horizon = 3) lfo_rw <- lfo_cv(mod_rw,                 min_t = 40,                 fc_horizon = 3)  # Plot Pareto-K values and ELPD estimates plot(lfo_ar2) plot(lfo_rw)  # Proportion of timepoints in which AR2 model gives # better forecasts length(which((lfo_ar2$elpds - lfo_rw$elpds) > 0)) /       length(lfo_ar2$elpds)  # A higher total ELPD is preferred lfo_ar2$sum_ELPD lfo_rw$sum_ELPD }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/logLik.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam\",\"title\":\"Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam\",\"text\":\"Compute pointwise Log-Likelihoods fitted mvgam objects\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/logLik.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam logLik(object, linpreds, newdata, family_pars, include_forecast = TRUE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/logLik.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam\",\"text\":\"object list object returned mvgam linpreds Optional matrix linear predictor draws use calculating poitwise log-likelihoods newdata Optional data.frame list object specifying series column linpreds belongs . linpreds supplied, newdata must also supplied family_pars Optional list containing posterior draws family-specific parameters (.e. shape, scale overdispersion parameters). Required linpreds newdata supplied include_forecast Logical. newdata fed model compute forecasts, log-likelihood draws observations also returned. Defaults TRUE ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/logLik.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam\",\"text\":\"matrix dimension n_samples x n_observations containing pointwise log-likelihood draws observations newdata. newdata supplied, log-likelihood draws returned observations originally fed model (training observations , supplied original model via newdata argument mvgam, testing observations)\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/logLik.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Compute pointwise Log-Likelihoods from fitted mvgam objects — logLik.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data and fit a model simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Extract logLikelihood values lls <- logLik(mod) str(lls) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/loo.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"LOO information criteria for mvgam models — loo.mvgam\",\"title\":\"LOO information criteria for mvgam models — loo.mvgam\",\"text\":\"Extract LOOIC (leave-one-information criterion) using loo::loo()\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/loo.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"LOO information criteria for mvgam models — loo.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam loo(x, ...)  # S3 method for mvgam loo_compare(x, ..., model_names = NULL)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/loo.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"LOO information criteria for mvgam models — loo.mvgam\",\"text\":\"x Object class mvgam ... mvgam objects. model_names NULL (default) use model names derived deparsing call. Otherwise use passed values model names.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/loo.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"LOO information criteria for mvgam models — loo.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate 4 time series with hierarchical seasonality # and independent AR1 dynamic processes set.seed(111) simdat <- sim_mvgam(seasonality = 'hierarchical',                    trend_model = 'AR1',                    family = gaussian())  # Fit a model with shared seasonality mod1 <- mvgam(y ~ s(season, bs = 'cc', k = 6),              data = rbind(simdat$data_train,              simdat$data_test),              family = gaussian()) plot(mod1, type = 'smooths') loo(mod1)  # Now fit a model with hierarchical seasonality mod2 <- update(mod1,               formula = y ~ s(season, bs = 'cc', k = 6) +               s(season, series, bs = 'fs',               xt = list(bs = 'cc'), k = 4)) plot(mod2, type = 'smooths') loo(mod2)  # Now add a AR1 dynamic errors to mod2 mod3 <- update(mod2, trend_model = 'AR1') plot(mod3, type = 'smooths') plot(mod3, type = 'trend') loo(mod3)  # Compare models using LOO loo_compare(mod1, mod2, mod3) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Calculate trend correlations based on mvgam latent factor loadings — lv_correlations\",\"title\":\"Calculate trend correlations based on mvgam latent factor loadings — lv_correlations\",\"text\":\"function uses samples latent trends series fitted mvgam model calculates correlations among series' trends\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Calculate trend correlations based on mvgam latent factor loadings — lv_correlations\",\"text\":\"\",\"code\":\"lv_correlations(object)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Calculate trend correlations based on mvgam latent factor loadings — lv_correlations\",\"text\":\"object list object returned mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Calculate trend correlations based on mvgam latent factor loadings — lv_correlations\",\"text\":\"list object containing mean posterior correlations full array posterior correlations\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mcmc_plot.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"MCMC plots as implemented in bayesplot — mcmc_plot.mvgam\",\"title\":\"MCMC plots as implemented in bayesplot — mcmc_plot.mvgam\",\"text\":\"Convenient way call MCMC plotting functions implemented bayesplot package\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mcmc_plot.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"MCMC plots as implemented in bayesplot — mcmc_plot.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam mcmc_plot(   object,   type = \\\"intervals\\\",   variable = NULL,   regex = FALSE,   use_alias = TRUE,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mcmc_plot.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"MCMC plots as implemented in bayesplot — mcmc_plot.mvgam\",\"text\":\"object R object typically class brmsfit type type plot. Supported types (names) hist, dens, hist_by_chain, dens_overlay, violin, intervals, areas, areas_ridges, combo, acf, acf_bar, trace, trace_highlight, scatter, hex, pairs, violin, rhat, rhat_hist, neff, neff_hist nuts_energy. overview various plot types see MCMC-overview. variable Names variables (parameters) plot, given character vector regular expression (regex = TRUE). default, hopefully large selection variables plotted. regex Logical; Indicates whether variable treated regular expressions. Defaults FALSE. use_alias Logical. informative names parameters available (.e. beta coefficients b smoothing parameters rho), replace uninformative names informative alias. Defaults TRUE ... Additional arguments passed plotting functions. See MCMC-overview details.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mcmc_plot.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"MCMC plots as implemented in bayesplot — mcmc_plot.mvgam\",\"text\":\"ggplot object can customized using ggplot2 package.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mcmc_plot.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"MCMC plots as implemented in bayesplot — mcmc_plot.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train) mcmc_plot(mod) mcmc_plot(mod, type = 'neff_hist') mcmc_plot(mod, variable = 'betas', type = 'areas') mcmc_plot(mod, variable = 'trend_params', type = 'combo') }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/model.frame.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extract model.frame from a fitted mvgam object — model.frame.mvgam\",\"title\":\"Extract model.frame from a fitted mvgam object — model.frame.mvgam\",\"text\":\"Extract model.frame fitted mvgam object\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/model.frame.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Extract model.frame from a fitted mvgam object — model.frame.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam model.frame(formula, trend_effects = FALSE, ...)  # S3 method for mvgam_prefit model.frame(formula, trend_effects = FALSE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/model.frame.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Extract model.frame from a fitted mvgam object — model.frame.mvgam\",\"text\":\"formula model formula terms     object R object. trend_effects logical, return model.frame observation model (FALSE) underlying process model (ifTRUE) ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/model.frame.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Extract model.frame from a fitted mvgam object — model.frame.mvgam\",\"text\":\"matrix containing fitted model frame\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/model.frame.mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Extract model.frame from a fitted mvgam object — model.frame.mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"Uses constructors package splines2 build monotonically increasing decreasing splines. Details also Wang & Yan (2021).\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"\",\"code\":\"# S3 method for moi.smooth.spec smooth.construct(object, data, knots)  # S3 method for mod.smooth.spec smooth.construct(object, data, knots)  # S3 method for moi.smooth Predict.matrix(object, data)  # S3 method for mod.smooth Predict.matrix(object, data)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"object smooth specification object, usually generated term s(x, bs = \\\"moi\\\", ...) s(x, bs = \\\"mod\\\", ...) data list containing just data (including variable) required term,              names corresponding object$term (object$). variable              last element. knots list containing knots supplied basis setup --- order names data.               Can NULL. See details information.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"object class \\\"moi.smooth\\\" \\\"mod.smooth\\\". addition usual elements smooth class documented smooth.construct, object contain slot called boundary defines endpoints beyond spline begin extrapolating (extrapolation flat due first order penalty placed smooth function)\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"constructor normally called directly, rather used internally mvgam. supplied knots spline placed evenly throughout covariate values term refers: example, fitting 101 data 11 knot spline x knot every 10th (ordered) x value. spline implementation closed-form -spline basis based recursion formula given Ramsay (1988), basis coefficients must constrained either non-negative (monotonically increasing functions) non-positive (monotonically decreasing)  Take note using either monotonic basis, number basis functions k must supplied even integer due manner monotonic basis functions constructed\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"note\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Note\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"constructor result valid smooth using call gam bam, however resulting functions guaranteed monotonic constraints basis coefficients enforced\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"references\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"References\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"Wang, Wenjie, Jun Yan. \\\"Shape-Restricted Regression Splines R Package splines2.\\\" Journal Data Science 19.3 (2021).  Ramsay, J. O. (1988). Monotone regression splines action. Statistical Science, 3(4), 425--441.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/monotonic.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Monotonic splines in mvgam — smooth.construct.moi.smooth.spec\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate data from a monotonically increasing function set.seed(123123) x <- runif(80) * 4 - 1 x <- sort(x) f <- exp(4 * x) / (1 + exp(4 * x)) y <- f + rnorm(80) * 0.1 plot(x, y)  # A standard TRPS smooth doesn't capture monotonicity mod_data <- data.frame(y = y, x = x) mod <- gam(y ~ s(x, k = 16),            data = mod_data,            family = gaussian())  library(marginaleffects) plot_predictions(mod,                  by = 'x',                  newdata = data.frame(x = seq(min(x) - 0.5,                                               max(x) + 0.5,                                               length.out = 100)),                  points = 0.5)  # Using the 'moi' basis in mvgam rectifies this mod_data$time <- 1:NROW(mod_data) mod2 <- mvgam(y ~ s(x, bs = 'moi', k = 18),              data = mod_data,              family = gaussian())  plot_predictions(mod2,                  by = 'x',                  newdata = data.frame(x = seq(min(x) - 0.5,                                               max(x) + 0.5,                                               length.out = 100)),                  points = 0.5)  plot(mod2, type = 'smooth', realisations = TRUE)  # 'by' terms that produce a different smooth for each level of the 'by' # factor are also allowed set.seed(123123) x <- runif(80) * 4 - 1 x <- sort(x)  # Two different monotonic smooths, one for each factor level f <- exp(4 * x) / (1 + exp(4 * x)) f2 <- exp(3.5 * x) / (1 + exp(3 * x)) fac <- c(rep('a', 80), rep('b', 80)) y <- c(f + rnorm(80) * 0.1,        f2 + rnorm(80) * 0.2) plot(x, y[1:80]) plot(x, y[81:160])  # Gather all data into a data.frame, including the factor 'by' variable mod_data <- data.frame(y, x, fac = as.factor(fac)) mod_data$time <- 1:NROW(mod_data)  # Fit a model with different smooths per factor level mod <- mvgam(y ~ s(x, bs = 'moi', by = fac, k = 8),              data = mod_data,              family = gaussian())  # Visualise the different monotonic functions plot_predictions(mod, condition = c('x', 'fac', 'fac'),                  points = 0.5) plot(mod, type = 'smooth', realisations = TRUE) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam-class.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Fitted mvgam object description — mvgam-class\",\"title\":\"Fitted mvgam object description — mvgam-class\",\"text\":\"fitted mvgam object returned function mvgam. Run methods(class = \\\"mvgam\\\") see overview available methods.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam-class.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Fitted mvgam object description — mvgam-class\",\"text\":\"mvgam object contains following elements: call original observation model formula trend_call trend_formula supplied, original trend model formula returned. Otherwise NULL family character description observation distribution trend_model character description latent trend model trend_map data.frame describing mapping trend states observations, supplied original model. Otherwise NULL drift Logical specifying whether drift term used trend model priors model priors updated defaults, prior dataframe returned. Otherwise NULL model_output MCMC object returned fitting engine. model fitted using Stan, object class stanfit (see stanfit-class details). JAGS used backend, object class runjags (see runjags-class details) model_file character string model file used describe model either Stan JAGS syntax model_data return_model_data set TRUE fitting model, list object containing data objects needed condition model returned. item list described detail top model_file. Otherwise NULL inits return_model_data set TRUE fitting model, initial value functions used initialise MCMC chains returned. Otherwise NULL monitor_pars parameters monitored MCMC sampling returned character vector sp_names character vector specifying names smoothing parameter mgcv_model object class gam containing mgcv version observation model. object used generating linear predictor matrix making predictions new data. coefficients model object contain posterior median coefficients GAM linear predictor, used generating plots smooth functions mvgam currently handle (plots three-dimensional smooths). model therefore used inference. See gamObject details trend_mgcv_model trend_formula supplied, object class gam containing mgcv version trend model. Otherwise NULL ytimes matrix object used model fitting indexing series timepoints observed row supplied data. Used internally downstream plotting prediction functions resids named list object containing posterior draws Dunn-Smyth randomized quantile residuals use_lv Logical flag indicating whether latent dynamic factors used model n_lv use_lv == TRUE, number latent dynamic factors used model upper_bounds bounds supplied original model fit, returned. Otherwise NULL obs_data original data object (either list dataframe) supplied model fitting. test_data test data supplied (argument newdata original model), returned. Othwerise NULL fit_engine Character describing fit engine, either stan jags backend Character describing backend used modelling, either rstan, cmdstanr rjags algorithm Character describing algorithm used finding posterior, either sampling, laplace, pathfinder, meanfield fullrank max_treedepth model fitted using Stan, value supplied maximum treedepth tuning parameter returned (see stan details). Otherwise NULL adapt_delta model fitted using Stan, value supplied adapt_delta tuning parameter returned (see stan details). Otherwise NULL\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam-class.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Fitted mvgam object description — mvgam-class\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"function estimates posterior distribution Generalised Additive Models (GAMs) can include smooth spline functions, specified GAM formula, well latent temporal processes, specified trend_model. modelling options include State-Space representations allow covariates dynamic processes occur latent 'State' level also capturing observation-level effects. Prior specifications flexible explicitly encourage users apply prior distributions actually reflect beliefs. addition, model fits can easily assessed compared posterior predictive checks, forecast comparisons leave-one-/ leave-future-cross-validation.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"\",\"code\":\"mvgam(   formula,   trend_formula,   knots,   trend_knots,   data,   data_train,   newdata,   data_test,   run_model = TRUE,   prior_simulation = FALSE,   return_model_data = FALSE,   family = \\\"poisson\\\",   use_lv = FALSE,   n_lv,   trend_map,   trend_model = \\\"None\\\",   drift = FALSE,   chains = 4,   burnin = 500,   samples = 500,   thin = 1,   parallel = TRUE,   threads = 1,   priors,   refit = FALSE,   lfo = FALSE,   use_stan = TRUE,   backend = getOption(\\\"brms.backend\\\", \\\"cmdstanr\\\"),   algorithm = getOption(\\\"brms.algorithm\\\", \\\"sampling\\\"),   autoformat = TRUE,   save_all_pars = FALSE,   max_treedepth,   adapt_delta,   jags_path,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"formula character string specifying GAM observation model formula. exactly like formula GLM except smooth terms, s(), te(), ti(), t2(), well time-varying dynamic() terms, can added right hand side specify linear predictor depends smooth functions predictors (linear functionals ). nmix() family models, formula used set linear predictor detection probability. Details formula syntax used mvgam can found mvgam_formulae trend_formula optional character string specifying GAM process model formula. supplied, linear predictor modelled latent trends capture process model evolution separately observation model. response variable specified left-hand side formula (.e. valid option ~ season + s(year)). Also note use identifier series formula specify effects vary across time series. Instead use trend. ensure models trend_map supplied still work consistently (.e. allowing effects vary across process models, even time series share underlying process model). feature currently available RW(), AR() VAR() trend models. nmix() family models, trend_formula used set linear predictor underlying latent abundance knots optional list containing user specified knot values used basis construction. bases user simply supplies knots used, must match k value supplied (note number knots always just k). Different terms can use different numbers knots, unless share covariate trend_knots knots , optional list knot values smooth functions within trend_formula data dataframe list containing model response variable covariates required GAM formula optional trend_formula. include columns: series (factor index series IDs;number levels identical number unique series labels (.e. n_series = length(levels(data$series)))) time (numeric integer index time point observation). variables included linear predictor formula must also present data_train Deprecated. Still works place data users recommended use data instead seamless integration R workflows newdata Optional dataframe list test data containing least series time addition variables included linear predictor formula. included, observations variable y set NA fitting model posterior simulations can obtained data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows run_model logical. FALSE, model fitted instead function return model file data / initial values needed fit model outside mvgam prior_simulation logical. TRUE, observations fed model, instead simulations prior distributions returned return_model_data logical. TRUE, list data needed fit model returned, along initial values smooth AR parameters, model fitted. helpful users wish modify model file add stochastic elements currently avaiable mvgam. Default FALSE reduce size returned object, unless run_model == FALSE family family specifying exponential observation family series. Currently supported families : nb() count data poisson() count data gaussian() real-valued data betar() proportional data (0,1) lognormal() non-negative real-valued data student_t() real-valued data Gamma() non-negative real-valued data nmix() count data imperfect detection modeled via State-Space N-Mixture model. latent states Poisson, capturing 'true' latent abundance, observation process Binomial account imperfect detection. See mvgam_families example use family Note nb() poisson() available using JAGS backend. Default poisson(). See mvgam_families details use_lv logical. TRUE, use dynamic factors estimate series' latent trends reduced dimension format. available RW(), AR() GP() trend models. Defaults FALSE n_lv integer number latent dynamic factors use use_lv == TRUE. > n_series. Defaults arbitrarily min(2, floor(n_series / 2)) trend_map Optional data.frame specifying series depend latent trends. Useful allowing multiple series depend latent trend process, different observation processes. supplied, latent factor model set setting use_lv = TRUE using mapping set shared trends. Needs column names series trend, integer values trend column state trend series depend . series column single unique entry series data (names perfectly match factor levels series variable data). See examples details trend_model character  function specifying time series dynamics latent trend. Options : None (latent trend component; .e. GAM component contributes linear predictor, observation process source error; similarly estimated gam) 'RW' RW() 'AR1' AR(p = 1) 'AR2' AR(p = 2) 'AR3' AR(p = 3) 'VAR1'  VAR()(available Stan) 'PWlogistic, 'PWlinear' PW() (available Stan) 'GP' GP() (Gaussian Process squared exponential kernel; available Stan) trend types apart GP() PW(), moving average /correlated process error terms can also estimated (example, RW(cor = TRUE) set multivariate Random Walk n_series > 1). See mvgam_trends details drift logical estimate drift parameter latent trend components. Useful latent trend expected broadly follow non-zero slope. available RW() AR() trend models. Note latent trend less stationary, drift parameter can become unidentifiable, especially intercept term included GAM linear predictor (default calling jagam). Drift parameters also likely unidentifiable using dynamic factor models. Therefore defaults FALSE chains integer specifying number parallel chains model. Ignored algorithm %% c('meanfield', 'fullrank', 'pathfinder', 'laplace') burnin integer specifying number warmup iterations Markov chain run tune sampling algorithms. Ignored algorithm %% c('meanfield', 'fullrank', 'pathfinder', 'laplace') samples integer specifying number post-warmup iterations Markov chain run sampling posterior distribution thin Thinning interval monitors.  Ignored algorithm %% c('meanfield', 'fullrank', 'pathfinder', 'laplace') parallel logical specifying whether multiple cores used generating MCMC simulations parallel. TRUE, number cores use min(c(chains, parallel::detectCores() - 1)) threads integer Experimental option use multithreading within-chain parallelisation Stan. recommend use experienced Stan's reduce_sum function slow running model sped means. available using Cmdstan backend priors optional data.frame prior definitions (JAGS Stan syntax). using Stan, can also object class brmsprior (see. prior details). See get_mvgam_priors 'Details' information changing default prior distributions refit Logical indicating whether refit, called using update.mvgam. Users leave FALSE lfo Logical indicating whether part call lfo_cv.mvgam. Returns lighter version model residuals fewer monitored parameters speed post-processing. downstream functions work properly, users always leave set FALSE use_stan Logical. TRUE, model compiled sampled using Hamiltonian Monte Carlo call cmdstan_model call stan. Note many options using Stan vs JAGS backend Character string naming package use backend fitting Stan model (use_stan = TRUE). Options \\\"cmdstanr\\\" (default) \\\"rstan\\\". Can set globally current R session via \\\"brms.backend\\\" option (see options). Details rstan cmdstanr packages available https://mc-stan.org/rstan/ https://mc-stan.org/cmdstanr/, respectively algorithm Character string naming estimation approach use. Options \\\"sampling\\\" MCMC (default), \\\"meanfield\\\" variational inference factorized normal distributions, \\\"fullrank\\\" variational inference multivariate normal distribution, \\\"laplace\\\" Laplace approximation (available using cmdstanr backend) \\\"pathfinder\\\" pathfinder algorithm (currently available using cmdstanr backend). Can set globally current R session via \\\"brms.algorithm\\\" option (see options). Limited testing suggests \\\"meanfield\\\" performs best non-MCMC approximations dynamic GAMs, possibly difficulties estimating covariances among many spline parameters latent trend parameters. rigorous testing carried autoformat Logical. Use stanc parser automatically format Stan code check deprecations. Defaults TRUE save_all_pars Logical flag indicate draws variables defined Stan's parameters block saved (default FALSE). max_treedepth positive integer placing cap number simulation steps evaluated iteration use_stan == TRUE. Default 12. Increasing value can sometimes help exploration complex posterior geometries, rarely fruitful go max_treedepth 14 adapt_delta positive numeric 0 1 defining target average proposal acceptance probability Stan's adaptation period, use_stan == TRUE. Default 0.8. general need change adapt_delta unless see warning message divergent transitions, case can increase adapt_delta default value closer 1 (e.g. 0.95 0.99, 0.99 0.999, etc). step size used numerical integrator function adapt_delta increasing adapt_delta result smaller step size fewer divergences. Increasing adapt_delta typically result slower sampler, always lead robust sampler jags_path Optional character vector specifying path location JAGS executable (.exe) use modelling use_stan == FALSE. missing, path recovered call findjags ... arguments passed Stan. backend = \\\"rstan\\\" arguments passed sampling vb. backend = \\\"cmdstanr\\\" arguments passed cmdstanr::sample, cmdstanr::variational, cmdstanr::laplace cmdstanr::pathfinder method\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"list object class mvgam containing model output, text representation model file, mgcv model output (easily generating simulations unsampled covariate values), Dunn-Smyth residuals series key information needed functions package. See mvgam-class details. Use methods(class = \\\"mvgam\\\") overview available methods.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"Dynamic GAMs useful wish predict future values time series show temporal dependence want rely extrapolating smooth term (can sometimes lead unpredictable unrealistic behaviours). addition, smooths can often try wiggle excessively capture autocorrelation present time series, exacerbates problem forecasting ahead. GAMs naturally viewed Bayesian lens, often must model time series show complex distributional features missing data, parameters mvgam models estimated Bayesian framework using Markov Chain Monte Carlo default. general overview provided primary vignettes: vignette(\\\"mvgam_overview\\\") vignette(\\\"data_in_mvgam\\\"). full list available vignettes see vignette(package = \\\"mvgam\\\") Formula syntax: Details formula syntax used mvgam can found mvgam_formulae. Note possible supply empty formula predictors intercepts observation model (.e. y ~ 0 y ~ -1). case, intercept-observation model set intercept coefficient fixed zero. can handy wish fit pure State-Space models variation dynamic trend controls average expectation, /intercepts non-identifiable (piecewise trends, see examples ) Families link functions: Details families supported mvgam can found mvgam_families. Trend models: Details latent trend models supported mvgam can found mvgam_trends. Priors: jagam model file generated formula modified include latent temporal processes. Default priors intercepts scale parameters generated using practice brms. Prior distributions important model parameters can altered user inspect model sensitivities given priors (see get_mvgam_priors details). Note latent trends estimated link scale choose priors accordingly. However control model specification can accomplished first using mvgam baseline, editing returned model accordingly. model file can edited run outside mvgam setting run_model = FALSE encouraged complex modelling tasks. Note, priors formally checked ensure right syntax respective probabilistic modelling framework, user ensure correct (.e. use dnorm normal densities JAGS, mean precision parameterisation; use normal normal densities Stan, mean standard deviation parameterisation) Random effects: smooth terms using random effect basis (smooth.construct.re.smooth.spec), non-centred parameterisation automatically employed avoid degeneracies common hierarchical models. Note however centred versions may perform better series particularly informative, foray Bayesian modelling, worth building understanding model's assumptions limitations following principled workflow. Also note models parameterised using drop.unused.levels = FALSE jagam ensure predictions can made levels supplied factor variable Observation level parameters: one series included data observation family contains one parameter used, additional observation family parameters (.e. phi nb() sigma gaussian()) estimated independently series. Factor regularisation: using dynamic factor model trends JAGS factor precisions given regularized penalty priors theoretically allow factors dropped model squeezing increasing factors' variances zero. done help protect selecting many latent factors needed capture dependencies data, can often advantageous set n_lv slightly larger number. However larger numbers factors come additional computational costs balanced well. using Stan, factors parameterised fixed variance parameters Residuals: series, randomized quantile (.e. Dunn-Smyth) residuals calculated inspecting model diagnostics fitted model appropriate Dunn-Smyth residuals standard normal distribution autocorrelation evident. particular observation missing, residual calculated comparing independent draws model's posterior distribution Using Stan: mvgam primarily designed use Hamiltonian Monte Carlo parameter estimation via software Stan (using either cmdstanr rstan interface). great advantages using Stan Gibbs / Metropolis Hastings samplers, includes option estimate smooth latent trends via Hilbert space approximate Gaussian Processes. often makes sense ecological series, expect change smoothly. mvgam, latent squared exponential GP trends approximated using default 20 basis functions, saves computational costs compared fitting full GPs adequately estimating GP alpha rho parameters. many advantages Stan JAGS, development package applied Stan. includes planned addition response distributions, plans handle zero-inflation, plans incorporate greater variety trend models. Users strongly encouraged opt Stan JAGS proceeding workflows\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":\"references\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"References\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"Nicholas J Clark & Konstans Wells (2020). Dynamic generalised additive models (DGAMs) forecasting discrete ecological time series. Methods Ecology Evolution. 14:3, 771-784.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Fit a Bayesian dynamic GAM to a univariate or multivariate set of time series — mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate a collection of three time series that have shared seasonal dynamics dat <- sim_mvgam(T = 80, n_series = 3, prop_missing = 0.1,                 prop_trend = 0.6)  # Plot key summary statistics for a single series plot_mvgam_series(data = dat$data_train, series = 1)  # Plot all series together plot_mvgam_series(data = dat$data_train, series = 'all')  # Formulate a model using Stan where series share a cyclic smooth for # seasonality and each series has an independent random walk temporal process; # Set run_model = FALSE to inspect the returned objects mod1 <- mvgam(formula = y ~ s(season, bs = 'cc'),              data = dat$data_train,              trend_model = 'RW',              family = 'poisson',              use_stan = TRUE,              run_model = FALSE)  # View the model code in Stan language code(mod1)  # Inspect the data objects needed to condition the model str(mod1$model_data)  # The following code can be used to run the model outside of mvgam; first using rstan model_data <- mod1$model_data library(rstan) fit <- stan(model_code = mod1$model_file,            data = model_data)  # Now using cmdstanr library(cmdstanr) model_data <- mod1$model_data cmd_mod <- cmdstan_model(write_stan_file(mod1$model_file),                         stanc_options = list('canonicalize=deprecations,braces,parentheses')) cmd_mod$print() fit <- cmd_mod$sample(data = model_data,                      chains = 4,                      parallel_chains = 4,                      refresh = 100)  # Now fit the model using mvgam with the Stan backend mod1 <- mvgam(formula = y ~ s(season, bs = 'cc'),               data = dat$data_train,               trend_model = 'RW',               family = poisson(),               use_stan = TRUE)  # Extract the model summary summary(mod1)  # Plot the estimated historical trend and forecast for one series plot(mod1, type = 'trend', series = 1) plot(mod1, type = 'forecast', series = 1)  # Residual diagnostics plot(mod1, type = 'residuals', series = 1) resids <- residuals(mod1) str(resids)  # Compute the forecast using covariate information in data_test fc <- forecast(mod1, newdata = dat$data_test) str(fc) plot(fc)  # Plot the estimated seasonal smooth function plot(mod1, type = 'smooths')  # Plot estimated first derivatives of the smooth plot(mod1, type = 'smooths', derivatives = TRUE)  # Plot partial residuals of the smooth plot(mod1, type = 'smooths', residuals = TRUE)  # Plot posterior realisations for the smooth plot(mod1, type = 'smooths', realisations = TRUE)  # Plot conditional response predictions using marginaleffects plot(conditional_effects(mod1), ask = FALSE) plot_predictions(mod1, condition = 'season', points = 0.5)  # Extract observation model beta coefficient draws as a data.frame beta_draws_df <- as.data.frame(mod1, variable = 'betas') head(beta_draws_df) str(beta_draws_df)  # Investigate model fit loo(mod1)   # Example of supplying a trend_map so that some series can share # latent trend processes sim <- sim_mvgam(n_series = 3) mod_data <- sim$data_train  # Here, we specify only two latent trends; series 1 and 2 share a trend, # while series 3 has it's own unique latent trend trend_map <- data.frame(series = unique(mod_data$series),                        trend = c(1,1,2))  # Fit the model using AR1 trends mod <- mvgam(y ~ s(season, bs = 'cc'),               trend_map = trend_map,               trend_model = 'AR1',               data = mod_data,               return_model_data = TRUE)  # The mapping matrix is now supplied as data to the model in the 'Z' element mod1$model_data$Z code(mod)  # The first two series share an identical latent trend; the third is different plot(mod, type = 'trend', series = 1) plot(mod, type = 'trend', series = 2) plot(mod, type = 'trend', series = 3)  # Example of how to use dynamic coefficients # Simulate a time-varying coefficient for the effect of temperature set.seed(3) N = 200 beta_temp <- vector(length = N) beta_temp[1] <- 0.4 for(i in 2:N){   beta_temp[i] <- rnorm(1, mean = beta_temp[i - 1], sd = 0.025) }  # Simulate a covariate called 'temp' temp <- rnorm(N, sd = 1)  # Simulate the Gaussian observation process out <- rnorm(N, mean = 4 + beta_temp * temp,              sd = 0.5)  # Gather necessary data into a data.frame; split into training / testing data = data.frame(out, temp, time = seq_along(temp)) data_train <- data[1:180,] data_test <- data[181:200,]  # Fit the model using the dynamic() formula helper mod <- mvgam(formula = out ~ dynamic(temp, rho = 8),              family = gaussian(),              data = data_train,              newdata = data_test)  # Inspect the model summary, forecast and time-varying coefficient distribution summary(mod) plot(mod, type = 'smooths') plot(mod, type = 'forecast', newdata = data_test)  # Propagating the smooth term shows how the coefficient is expected to evolve plot_mvgam_smooth(mod, smooth = 1, newdata = data) abline(v = 180, lty = 'dashed', lwd = 2)   # Example showing how to incorporate an offset; simulate some count data # with different means per series set.seed(100) dat <- sim_mvgam(prop_trend = 0, mu = c(0, 2, 2), seasonality = 'hierarchical')  # Add offset terms to the training and testing data dat$data_train$offset <- 0.5 * as.numeric(dat$data_train$series) dat$data_test$offset <- 0.5 * as.numeric(dat$data_test$series)  # Fit a model that includes the offset in the linear predictor as well as # hierarchical seasonal smooths mod <- mvgam(formula = y ~ offset(offset) +               s(series, bs = 're') +               s(season, bs = 'cc') +               s(season, by = series, m = 1, k = 5),              data = dat$data_train,              trend_model = 'None',              use_stan = TRUE)  # Inspect the model file to see the modification to the linear predictor # (eta) mod$model_file  # Forecasts for the first two series will differ in magnitude layout(matrix(1:2, ncol = 2)) plot(mod, type = 'forecast', series = 1, newdata = dat$data_test,      ylim = c(0, 75)) plot(mod, type = 'forecast', series = 2, newdata = dat$data_test,      ylim = c(0, 75)) layout(1)  # Changing the offset for the testing data should lead to changes in # the forecast dat$data_test$offset <- dat$data_test$offset - 2 plot(mod, 'forecast', newdata = dat$data_test)  # Relative Risks can be computed by fixing the offset to the same value # for each series dat$data_test$offset <- rep(1, NROW(dat$data_test)) preds_rr <- predict(mod, type = 'link', newdata = dat$data_test) series1_inds <- which(dat$data_test$series == 'series_1') series2_inds <- which(dat$data_test$series == 'series_2')  # Relative Risks are now more comparable among series layout(matrix(1:2, ncol = 2)) plot(preds_rr[1, series1_inds], type = 'l', col = 'grey75',      ylim = range(preds_rr),      ylab = 'Series1 Relative Risk', xlab = 'Time') for(i in 2:50){  lines(preds_rr[i, series1_inds], col = 'grey75') }  plot(preds_rr[1, series2_inds], type = 'l', col = 'darkred',      ylim = range(preds_rr),      ylab = 'Series2 Relative Risk', xlab = 'Time') for(i in 2:50){  lines(preds_rr[i, series2_inds], col = 'darkred')  } layout(1)  # Example of logistic growth with possible changepoints # Simple logistic growth model dNt = function(r, N, k){    r * N * (k - N) }  # Iterate growth through time Nt = function(r, N, t, k) { for (i in 1:(t - 1)) {   # population at next time step is current population + growth,  # but we introduce several 'shocks' as changepoints  if(i %in% c(5, 15, 25, 41, 45, 60, 80)){    N[i + 1] <- max(1, N[i] + dNt(r + runif(1, -0.1, 0.1),                                  N[i], k))    } else {    N[i + 1] <- max(1, N[i] + dNt(r, N[i], k))    }   }  N }  # Simulate expected values set.seed(11) expected <- Nt(0.004, 2, 100, 30) plot(expected, xlab = 'Time')  # Take Poisson draws y <- rpois(100, expected) plot(y, xlab = 'Time')  # Assemble data into dataframe and model. We set a # fixed carrying capacity of 35 for this example, but note that # this value is not required to be fixed at each timepoint mod_data <- data.frame(y = y,                        time = 1:100,                        cap = 35,                        series = as.factor('series_1')) plot_mvgam_series(data = mod_data)  # The intercept is nonidentifiable when using piecewise # trends because the trend functions have their own offset # parameters 'm'; it is recommended to always drop intercepts # when using these trend models mod <- mvgam(y ~ 0,              trend_model = PW(growth = 'logistic'),              family = poisson(),              data = mod_data) summary(mod)  # Plot the posterior hindcast plot(mod, type = 'forecast')  # View the changepoints with ggplot2 utilities library(ggplot2) mcmc_plot(mod, variable = 'delta_trend',           regex = TRUE) + scale_y_discrete(labels = mod$trend_model$changepoints) + labs(y = 'Potential changepoint',      x = 'Rate change') }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_diagnostics.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\",\"title\":\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\",\"text\":\"Extract quantities can used diagnose sampling behavior algorithms applied Stan back-end mvgam.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_diagnostics.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\",\"text\":\"\",\"code\":\"# S3 method for mvgam nuts_params(object, pars = NULL, ...)  # S3 method for mvgam log_posterior(object, ...)  # S3 method for mvgam rhat(x, pars = NULL, ...)  # S3 method for mvgam neff_ratio(object, pars = NULL, ...)  # S3 method for mvgam neff_ratio(object, pars = NULL, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_diagnostics.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\",\"text\":\"object, x mvgam object. pars optional character vector parameter names. nuts_params NUTS sampler parameter names rather model parameters. pars omitted parameters included. ... Arguments passed individual methods.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_diagnostics.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\",\"text\":\"exact form output depends method.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_diagnostics.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\",\"text\":\"details see bayesplot-extractors.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_diagnostics.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Extract diagnostic quantities of mvgam models — mvgam_diagnostics\",\"text\":\"\",\"code\":\"if (FALSE) { simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train) np <- nuts_params(mod) head(np)  # extract the number of divergence transitions sum(subset(np, Parameter == \\\"divergent__\\\")$Value)  head(neff_ratio(mod)) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_draws.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extract posterior draws from fitted mvgam objects — mvgam_draws\",\"title\":\"Extract posterior draws from fitted mvgam objects — mvgam_draws\",\"text\":\"Extract posterior draws conventional formats data.frames, matrices, arrays.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_draws.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Extract posterior draws from fitted mvgam objects — mvgam_draws\",\"text\":\"\",\"code\":\"# S3 method for mvgam as.data.frame(   x,   row.names = NULL,   optional = TRUE,   variable = \\\"betas\\\",   use_alias = TRUE,   regex = FALSE,   ... )  # S3 method for mvgam as.matrix(x, variable = \\\"betas\\\", regex = FALSE, use_alias = TRUE, ...)  # S3 method for mvgam as.array(x, variable = \\\"betas\\\", regex = FALSE, use_alias = TRUE, ...)  # S3 method for mvgam as_draws(   x,   variable = NULL,   regex = FALSE,   inc_warmup = FALSE,   use_alias = TRUE,   ... )  # S3 method for mvgam as_draws_matrix(   x,   variable = NULL,   regex = FALSE,   inc_warmup = FALSE,   use_alias = TRUE,   ... )  # S3 method for mvgam as_draws_df(   x,   variable = NULL,   regex = FALSE,   inc_warmup = FALSE,   use_alias = TRUE,   ... )  # S3 method for mvgam as_draws_array(   x,   variable = NULL,   regex = FALSE,   inc_warmup = FALSE,   use_alias = TRUE,   ... )  # S3 method for mvgam as_draws_list(   x,   variable = NULL,   regex = FALSE,   inc_warmup = FALSE,   use_alias = TRUE,   ... )  # S3 method for mvgam as_draws_rvars(x, variable = NULL, regex = FALSE, inc_warmup = FALSE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_draws.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Extract posterior draws from fitted mvgam objects — mvgam_draws\",\"text\":\"x list object class mvgam row.names Ignored optional Ignored variable character specifying parameters extract. Can either one following options: obs_params (parameters specific observation model, overdispsersions negative binomial models observation error SD gaussian / student-t models) betas (beta coefficients GAM observation model linear predictor; default) smooth_params (smoothing parameters GAM observation model) linpreds (estimated linear predictors whatever link scale used model) trend_params (parameters governing trend dynamics, AR parameters, trend SD parameters Gaussian Process parameters) trend_betas (beta coefficients GAM latent process model linear predictor; available trend_formula supplied original model) trend_smooth_params (process model GAM smoothing parameters; available trend_formula supplied original model) trend_linpreds (process model linear predictors identity scale; available trend_formula supplied original model) can character vector providing variables extract use_alias Logical. informative names parameters available (.e. beta coefficients b smoothing parameters rho), replace uninformative names informative alias. Defaults TRUE regex Logical. using one prespecified options extractions, variable treated (vector ) regular expressions? variable x matching least one regular expressions selected. Defaults FALSE. ... Ignored inc_warmup warmup draws included? Defaults FALSE.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_draws.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Extract posterior draws from fitted mvgam objects — mvgam_draws\",\"text\":\"data.frame, matrix, array containing posterior draws.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_draws.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Extract posterior draws from fitted mvgam objects — mvgam_draws\",\"text\":\"\",\"code\":\"if (FALSE) { sim <- sim_mvgam(family = Gamma()) mod1 <- mvgam(y ~ s(season, bs = 'cc'),              trend_model = 'AR1',              data = sim$data_train,              family = Gamma()) beta_draws_df <- as.data.frame(mod1, variable = 'betas') head(beta_draws_df) str(beta_draws_df)  beta_draws_mat <- as.matrix(mod1, variable = 'betas') head(beta_draws_mat) str(beta_draws_mat)  shape_pars <- as.matrix(mod1, variable = 'shape', regex = TRUE) head(shape_pars)}\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_families.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Supported mvgam families — mvgam_families\",\"title\":\"Supported mvgam families — mvgam_families\",\"text\":\"Supported mvgam families\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_families.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Supported mvgam families — mvgam_families\",\"text\":\"\",\"code\":\"tweedie(link = \\\"log\\\")  student_t(link = \\\"identity\\\")  nmix(link = \\\"log\\\")\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_families.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Supported mvgam families — mvgam_families\",\"text\":\"link specification family link function. present changed\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_families.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Supported mvgam families — mvgam_families\",\"text\":\"mvgam currently supports following standard observation families: gaussian identity link, real-valued data poisson log-link, count data Gamma log-link, non-negative real-valued data addition, following extended families mgcv brms packages supported: betar logit-link, proportional data (0,1) nb log-link, count data lognormal identity-link, non-negative real-valued data Finally, mvgam supports three extended families described : tweedie log-link, count data (power parameter p fixed 1.5) student_t() (student) identity-link, real-valued data nmix count data imperfect detection modeled via State-Space N-Mixture model. latent states Poisson (log link), capturing 'true' latent abundance, observation process Binomial account imperfect detection. observation formula models used set linear predictor detection probability (logit link). See example detailed worked explanation nmix() family poisson(), nb(), tweedie() available using JAGS. families, apart tweedie(), supported using Stan. Note currently possible change default link functions mvgam, call change silently ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_families.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Supported mvgam families — mvgam_families\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_families.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Supported mvgam families — mvgam_families\",\"text\":\"\",\"code\":\"if (FALSE) { # An N-mixture example using family nmix() # Simulate data from a Poisson-Binomial N-Mixture model # True abundance is predicted by a single nonlinear function of temperature # as well as a nonlinear long-term trend (as a Gaussian Process function) set.seed(123) gamdat <- gamSim(n = 80); N <- NROW(gamdat) abund_linpred <- gamdat$y; temperature <- gamdat$x2 trend <- mvgam:::sim_gp(rnorm(3, 0, 0.1), alpha_gp = 3,                         rho_gp = 16, h = N) true_abund <- floor(10 + abund_linpred + trend)  # Detection probability increases linearly with decreasing rainfall rainfall <- rnorm(N) detect_linpred <- 0.4 + -0.55 * rainfall detect_prob <- plogis(detect_linpred)  # Simulate observed counts obs_abund <- rbinom(N, size = true_abund, prob = detect_prob)  # Plot true and observed time series plot(true_abund,      type = 'l',      ylab = 'Abundance',      xlab = 'Time',      ylim = c(0, max(true_abund)),      bty = 'l',      lwd = 2) lines(obs_abund, col = 'darkred', lwd = 2) title(main = 'True = black; observed = red')  # Gather data into a dataframe suitable for mvgam modelling; # This will require a 'cap' variable specifying the maximum K to marginalise # over when estimating latent abundance (it does NOT have to be a fixed value) model_dat <- data.frame(obs_abund,                         temperature,                         rainfall,                         cap = max(obs_abund) + 20,                         time = 1:N,                         series = as.factor('series1'))  # Training and testing folds data_train <- model_dat %>% dplyr::filter(time <= 74) data_test <- model_dat %>% dplyr::filter(time > 74)  # Fit a model with informative priors on the two intercept parameters # and on the length scale of the GP temporal trend parameter # Note that the 'trend_formula' applies to the latent count process # (a Poisson process with log-link), while the 'formula' applies to the # detection probability (logit link) mod <- mvgam(formula = obs_abund ~ rainfall,              trend_formula = ~ s(temperature, k = 5) +                gp(time, k = 10, c = 5/4, scale = FALSE),              family = nmix(),              data = data_train,              newdata = data_test,              priors = c(prior(std_normal(), class = '(Intercept)'),                         prior(normal(2, 2), class = '(Intercept)_trend'),                         prior(normal(15, 5), class = 'rho_gp_trend(time)')))  # Model summary and diagnostics summary(mod) plot(mod, type = 'residuals')  # Intercept parameters mcmc_plot(mod,           variable = \\\"Intercept\\\",           regex = TRUE,           type = 'hist')  # Hindcasts and forecasts of latent abundance (with truth overlain) fc <- forecast(mod, type = 'latent_N') plot(fc); points(true_abund, pch = 16, cex = 0.8)  # Latent abundance predictions are restricted based on 'cap' max(model_dat$cap); range(fc$forecasts[[1]])  # Hindcasts and forecasts of detection probability (with truth overlain) fc <- forecast(mod, type = 'detection') plot(fc); points(detect_prob, pch = 16, cex = 0.8)  # Hindcasts and forecasts of observations # (after accounting for detection error) fc <- forecast(mod, type = 'response') plot(fc)  # Hindcasts and forecasts of response expectations # (with truth overlain) fc <- forecast(object = mod, type = 'expected') plot(fc); points(detect_prob * true_abund, pch = 16, cex = 0.8)  # Plot conditional effects library(ggplot2)  # Effects on true abundance can be visualised using type = 'link' abund_plots <- plot(conditional_effects(mod,                                         type = 'link',                                         effects = c('temperature', 'time')),                     plot = FALSE)  # Effect of temperature on abundance abund_plots[[1]] +   ylab('Latent abundance')  # Long-term trend in abundance abund_plots[[2]] +   ylab('Latent abundance')  # Effect of rainfall on detection probability det_plot <- plot(conditional_effects(mod,                                      type = 'detection',                                      effects = 'rainfall'),                  plot = FALSE) det_plot[[1]] +   ylab('Pr(detection)')  # More targeted plots can use marginaleffects capabilities; # Here visualise how response predictions might change # if we considered different possible 'cap' limits on latent # abundance and different rainfall measurements plot_predictions(mod, condition = list('temperature',                                        cap = c(15, 20, 40),                                        rainfall = c(-1, 1)),                 type = 'response',                 conf_level = 0.5) +  ylab('Observed abundance') +  theme_classic() }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_forecast-class.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"mvgam_forecast object description — mvgam_forecast-class\",\"title\":\"mvgam_forecast object description — mvgam_forecast-class\",\"text\":\"mvgam_forecast object returned function hindcast forecast. Run methods(class = \\\"mvgam_forecast\\\") see overview available methods.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_forecast-class.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"mvgam_forecast object description — mvgam_forecast-class\",\"text\":\"mvgam_forecast object contains following elements: call original observation model formula trend_call trend_formula supplied, original trend model formula returned. Otherwise NULL family character description observation distribution family_pars list containing draws family-specific parameters (.e. shape, scale overdispersion parameters). returned type = link. Otherwise NULL trend_model character description latent trend model drift Logical specifying whether drift term used trend model use_lv Logical flag indicating whether latent dynamic factors used model fit_engine Character describing fit engine, either stan jags type type predictions included (either link, response trend) series_names Names time series, taken levels(data$series) original model fit train_observations list training observation vectors length n_series train_times vector unique training times test_observations forecast function used, list test observation vectors length n_series. Otherwise NULL test_times forecast function used, vector unique validation (testing) times. Otherwise NULL hindcasts list posterior hindcast distributions length n_series. forecasts forecast function used, list posterior forecast distributions length n_series. Otherwise NULL\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_forecast-class.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"mvgam_forecast object description — mvgam_forecast-class\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_formulae.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details of formula specifications in mvgam — mvgam_formulae\",\"title\":\"Details of formula specifications in mvgam — mvgam_formulae\",\"text\":\"Details formula specifications mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_formulae.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Details of formula specifications in mvgam — mvgam_formulae\",\"text\":\"mvgam accept observation model formula optional process model formula (via argument trend_formula). Neither formulae can specified lists, contrary accepted behaviour mgcv brms models.  Note possible supply empty formula predictors intercepts observation model (.e. y ~ 0 y ~ -1). case, intercept-observation model set intercept coefficient fixed zero. can handy wish fit pure State-Space models variation dynamic trend controls average expectation, /intercepts non-identifiable.  formulae supplied mvgam exactly like supplied glm except smooth terms, s, te, ti t2, time-varying effects using dynamic, monotonically increasing (using s(x, bs = 'moi')) decreasing splines (using s(x, bs = 'mod'); see smooth.construct.moi.smooth.spec details), well Gaussian Process functions using gp, can added right hand side (. supported mvgam formulae).  details specifying different kinds smooth functions, control behaviours modifying potential complexities / penalties behave, can found extensive documentation mgcv package.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_formulae.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Details of formula specifications in mvgam — mvgam_formulae\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_marginaleffects.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Helper functions for mvgam marginaleffects calculations — mvgam_marginaleffects\",\"title\":\"Helper functions for mvgam marginaleffects calculations — mvgam_marginaleffects\",\"text\":\"Helper functions mvgam marginaleffects calculations Functions needed working marginaleffects Functions needed getting data / objects insight\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_marginaleffects.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Helper functions for mvgam marginaleffects calculations — mvgam_marginaleffects\",\"text\":\"\",\"code\":\"# S3 method for mvgam get_coef(model, trend_effects = FALSE, ...)  # S3 method for mvgam set_coef(model, coefs, trend_effects = FALSE, ...)  # S3 method for mvgam get_vcov(model, vcov = NULL, ...)  # S3 method for mvgam get_predict(model, newdata, type = \\\"response\\\", process_error = FALSE, ...)  # S3 method for mvgam get_data(x, source = \\\"environment\\\", verbose = TRUE, ...)  # S3 method for mvgam_prefit get_data(x, source = \\\"environment\\\", verbose = TRUE, ...)  # S3 method for mvgam find_predictors(   x,   effects = c(\\\"fixed\\\", \\\"random\\\", \\\"all\\\"),   component = c(\\\"all\\\", \\\"conditional\\\", \\\"zi\\\", \\\"zero_inflated\\\", \\\"dispersion\\\", \\\"instruments\\\",     \\\"correlation\\\", \\\"smooth_terms\\\"),   flatten = FALSE,   verbose = TRUE,   ... )  # S3 method for mvgam_prefit find_predictors(   x,   effects = c(\\\"fixed\\\", \\\"random\\\", \\\"all\\\"),   component = c(\\\"all\\\", \\\"conditional\\\", \\\"zi\\\", \\\"zero_inflated\\\", \\\"dispersion\\\", \\\"instruments\\\",     \\\"correlation\\\", \\\"smooth_terms\\\"),   flatten = FALSE,   verbose = TRUE,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_marginaleffects.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Helper functions for mvgam marginaleffects calculations — mvgam_marginaleffects\",\"text\":\"model Model object trend_effects logical, extract process model component (applicable trend_formula specified model) ... Additional arguments passed predict() method supplied modeling package.arguments particularly useful mixed-effects bayesian models (see online vignettes marginaleffects website). Available arguments can vary model model, depending range supported arguments modeling package. See \\\"Model-Specific Arguments\\\" section ?slopes documentation non-exhaustive list available arguments. coefs vector coefficients insert model object vcov Type uncertainty estimates report (e.g., robust standard errors). Acceptable values: FALSE: compute standard errors. can speed computation considerably. TRUE: Unit-level standard errors using default vcov(model) variance-covariance matrix. String indicates kind uncertainty estimates return. Heteroskedasticity-consistent: \\\"HC\\\", \\\"HC0\\\", \\\"HC1\\\", \\\"HC2\\\", \\\"HC3\\\", \\\"HC4\\\", \\\"HC4m\\\", \\\"HC5\\\". See ?sandwich::vcovHC Heteroskedasticity autocorrelation consistent: \\\"HAC\\\" Mixed-Models degrees freedom: \\\"satterthwaite\\\", \\\"kenward-roger\\\" : \\\"NeweyWest\\\", \\\"KernHAC\\\", \\\"OPG\\\". See sandwich package documentation. One-sided formula indicates name cluster variables (e.g., ~unit_id). formula passed cluster argument sandwich::vcovCL function. Square covariance matrix Function returns covariance matrix (e.g., stats::vcov(model)) newdata Grid predictor values evaluate slopes. Warning: Please avoid modifying dataset fitting model calling marginaleffects function. can sometimes lead unexpected results. NULL (default): Unit-level slopes observed value dataset (empirical distribution). dataset retrieved using insight::get_data(), tries extract data environment. may produce unexpected results original data frame altered since fitting model. datagrid() call specify custom grid regressors. example: newdata = datagrid(cyl = c(4, 6)): cyl variable equal 4 6 regressors fixed means modes. See Examples section datagrid() documentation. string: \\\"mean\\\": Marginal Effects Mean. Slopes predictor held mean mode. \\\"median\\\": Marginal Effects Median. Slopes predictor held median mode. \\\"marginalmeans\\\": Marginal Effects Marginal Means. See Details section . \\\"tukey\\\": Marginal Effects Tukey's 5 numbers. \\\"grid\\\": Marginal Effects grid representative numbers (Tukey's 5 numbers unique values categorical predictors). type string indicates type (scale) predictions used compute contrasts slopes. can differ based model type, typically string : \\\"response\\\", \\\"link\\\", \\\"probs\\\", \\\"zero\\\". unsupported string entered, model-specific list acceptable values returned error message. type NULL, first entry error message used default. process_error logical. TRUE, uncertainty latent process (trend) model incorporated predictions x fitted model. source String, indicating data recovered. source = \\\"environment\\\" (default), data recovered environment (e.g. data workspace). option usually fastest way getting data ensures original variables used model fitting returned. Note always current data recovered environment. Hence, data modified model fitting (e.g., variables recoded rows filtered), returned data may longer equal model data. source = \\\"frame\\\" (\\\"mf\\\"), data taken model frame. transformed variables back-transformed, possible. option returns data even available environment, however, certain edge cases back-transforming original data may fail. source = \\\"environment\\\" fails recover data, tries extract data model frame; source = \\\"frame\\\" data extracted model frame, data recovered environment. ways returns observations missing data variables used model fitting. verbose Toggle messages warnings. effects model data fixed effects (\\\"fixed\\\"), random effects (\\\"random\\\") (\\\"\\\") returned? applies mixed gee models. component predictor variables, predictor variables conditional model, zero-inflated part model, dispersion term instrumental variables returned? Applies models zero-inflated /dispersion formula, models instrumental variable (called fixed-effects regressions). May abbreviated. Note conditional component also called count mean component, depending model. flatten Logical, TRUE, values returned character vector, list. Duplicated values removed.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_marginaleffects.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Helper functions for mvgam marginaleffects calculations — mvgam_marginaleffects\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_trends.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Supported mvgam trend models — mvgam_trends\",\"title\":\"Supported mvgam trend models — mvgam_trends\",\"text\":\"Supported mvgam trend models\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_trends.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Supported mvgam trend models — mvgam_trends\",\"text\":\"mvgam currently supports following dynamic trend models: None (latent trend component; .e. GAM component contributes linear predictor, observation process source error; similarly estimated gam) RW() AR(p = 1, 2, 3) VAR()(available Stan) PW() (piecewise linear logistic trends; available Stan) GP() (Gaussian Process squared exponential kernel; available Stan) types apart GP() PW(), moving average /correlated process error terms can also estimated (example, RW(cor = TRUE) set multivariate Random Walk data contains >1 series). Character strings can also supplied instead various trend functions. full list possible models currently supported : 'RW' 'RWMA' 'RWcor' 'RWMAcor' 'AR1' 'AR1MA' 'AR1cor' 'AR1MAcor' 'AR2' 'AR2MA' 'AR2cor' 'AR2MAcor' 'AR3' 'AR3MA' 'AR3cor' 'AR3MAcor' 'VAR' 'VARcor' 'VAR1' ('VAR') 'VAR1cor' ('VARcor') 'VARMA' 'VARMAcor' 'VARMA1,1cor' 'PWlinear' 'PWlogistic' 'GP' 'None' Note RW, AR1, AR2 AR3 available using JAGS. trend models supported using Stan. Dynamic factor models can used latent factors evolve either RW, AR1-3 GP. VAR models (.e. VAR VARcor models), users can either fix trend error covariances 0 (using VAR) estimate potentially allow contemporaneously correlated errors using VARcor. VAR models, stationarity latent process enforced prior using parameterisation given Heaps (2022). Stationarity enforced using AR1, AR2 AR3 models, though can changed user specifying lower upper bounds autoregressive parameters using functionality get_mvgam_priors priors argument mvgam. Piecewise trends follow formulation popular prophet package produced Facebook, users can allow changepoints control potential flexibility trend. See Taylor Letham (2018) details\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/mvgam_trends.html\",\"id\":\"references\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"References\",\"title\":\"Supported mvgam trend models — mvgam_trends\",\"text\":\"Sarah E. Heaps (2022) Enforcing stationarity prior Vector Autoregressions. Journal Computational Graphical Statistics. 32:1, 1-10. Sean J. Taylor Benjamin Letham (2018) Forecasting scale. American Statistician 72.1, 37-45.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pairs.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Create a matrix of output plots from a mvgam object — pairs.mvgam\",\"title\":\"Create a matrix of output plots from a mvgam object — pairs.mvgam\",\"text\":\"pairs method customized MCMC output.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pairs.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Create a matrix of output plots from a mvgam object — pairs.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam pairs(x, variable = NULL, regex = FALSE, use_alias = TRUE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pairs.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Create a matrix of output plots from a mvgam object — pairs.mvgam\",\"text\":\"x object class mvgam variable Names variables (parameters) plot, given character vector regular expression (regex = TRUE). default, hopefully large selection variables plotted. regex Logical; Indicates whether variable treated regular expressions. Defaults FALSE. use_alias Logical. informative names parameters available (.e. beta coefficients b smoothing parameters rho), replace uninformative names informative alias. Defaults TRUE ... arguments passed mcmc_pairs.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pairs.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Create a matrix of output plots from a mvgam object — pairs.mvgam\",\"text\":\"detailed description see mcmc_pairs.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pairs.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Create a matrix of output plots from a mvgam object — pairs.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train) pairs(mod) pairs(mod, variable = c('ar1', 'sigma'), regex = TRUE) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_fc.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Forecast from a particle filtered mvgam object — pfilter_mvgam_fc\",\"title\":\"Forecast from a particle filtered mvgam object — pfilter_mvgam_fc\",\"text\":\"function generates forecast set particles capture unique proposal current state system modelled mvgam object. covariate timepoint information data_test used generate GAM component forecast, trends run forward time according state space dynamics. forecast weighted ensemble, weights determined particle's proposal likelihood prior recent assimilation step\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_fc.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Forecast from a particle filtered mvgam object — pfilter_mvgam_fc\",\"text\":\"\",\"code\":\"pfilter_mvgam_fc(   file_path = \\\"pfilter\\\",   n_cores = 2,   newdata,   data_test,   plot_legend = TRUE,   legend_position = \\\"topleft\\\",   ylim,   return_forecasts = FALSE )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_fc.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Forecast from a particle filtered mvgam object — pfilter_mvgam_fc\",\"text\":\"file_path character string specifying file path particles saved n_cores integer specifying number cores generating particle forecasts parallel newdata dataframe list test data containing least 'series' time', addition variables included linear predictor formula data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows plot_legend logical stating whether include legend highlight observations used calibration assimilated particle filter legend_position legend location may specified setting x single keyword list \\\"bottomright\\\", \\\"bottom\\\", \\\"bottomleft\\\", \\\"left\\\", \\\"topleft\\\", \\\"top\\\", \\\"topright\\\", \\\"right\\\" \\\"center\\\". places legend inside plot frame given location. ylim Optional vector y-axis limits (min, max). limits used plots return_forecasts logical. TRUE, returned list object contain plots forecasts well forecast objects (matrix dimension n_particles x horizon)\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_fc.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Forecast from a particle filtered mvgam object — pfilter_mvgam_fc\",\"text\":\"named list containing functions call base R plots series' forecast. Optionally actual forecasts returned within list separate list matrices\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_init.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Initiate particles for online filtering from a fitted mvgam object — pfilter_mvgam_init\",\"title\":\"Initiate particles for online filtering from a fitted mvgam object — pfilter_mvgam_init\",\"text\":\"function generates set particles captures unique proposal current state system. next observation data_assim assimilated particles weighted proposal's multivariate composite likelihood update model's forecast distribution\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_init.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Initiate particles for online filtering from a fitted mvgam object — pfilter_mvgam_init\",\"text\":\"\",\"code\":\"pfilter_mvgam_init(   object,   newdata,   data_assim,   n_particles = 1000,   file_path = \\\"pfilter\\\",   n_cores = 2 )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_init.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Initiate particles for online filtering from a fitted mvgam object — pfilter_mvgam_init\",\"text\":\"object list object returned mvgam newdata dataframe list test data containing least one observation per series (beyond last observation seen model object) assimilated particle filter. least contain 'series' 'time' one-step ahead horizon, addition variables included linear predictor object data_assim Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows n_particles integer specifying number unique particles generate tracking latent system state file_path character string specifying file path saving initiated particles n_cores integer specifying number cores generating particle forecasts parallel\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_init.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Initiate particles for online filtering from a fitted mvgam object — pfilter_mvgam_init\",\"text\":\"list object length = n_particles containing information parameters current state estimates particle generated saved, along important information original model, .rda object file_path\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_online.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Automatic online particle filtering for assimilating new observations into a fitted mvgam model — pfilter_mvgam_online\",\"title\":\"Automatic online particle filtering for assimilating new observations into a fitted mvgam model — pfilter_mvgam_online\",\"text\":\"function operates sequentially new observations data_assim update posterior forecast distribution. wrapper calls pfilter_mvgam_smooth. iteration, next observation assimilated particles weighted proposal's multivariate composite likelihood\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_online.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Automatic online particle filtering for assimilating new observations into a fitted mvgam model — pfilter_mvgam_online\",\"text\":\"\",\"code\":\"pfilter_mvgam_online(   newdata,   data_assim,   file_path = \\\"pfilter\\\",   threshold = 0.5,   use_resampling = FALSE,   kernel_lambda = 0.25,   n_cores = 1 )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_online.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Automatic online particle filtering for assimilating new observations into a fitted mvgam model — pfilter_mvgam_online\",\"text\":\"newdata dataframe list test data containing least one observation per series (beyond last observation seen model initialising particles pfilter_mvgam_init previous calls pfilter_mvgam_online. least contain 'series' 'time' one-step ahead horizon, addition variables included linear predictor object data_assim Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows file_path character string specifying file path locating particles threshold proportional numeric specifying Effective Sample Size limit resampling particles triggered (calculated ESS / n_particles) use_resampling == TRUE. 0 1 use_resampling logical specifying whether resampling used ESS falls specified threshold. Default option FALSE, relying instead kernel smoothing maintain particle diversity kernel_lambda proportional numeric specifying strength kernel smoothing use pulling low weight particles toward high likelihood state space. 0 1 n_cores integer specifying number cores generating particle forecasts parallel\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_online.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Automatic online particle filtering for assimilating new observations into a fitted mvgam model — pfilter_mvgam_online\",\"text\":\"list object length = n_particles containing information parameters current state estimates particle generated saved, along important information original model, .rda object file_path\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_smooth.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing — pfilter_mvgam_smooth\",\"title\":\"Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing — pfilter_mvgam_smooth\",\"text\":\"function operates new observation next_assim update posterior forecast distribution. next observation assimilated particle weights updated light recent multivariate composite likelihood. Low weight particles smoothed towards high weight state space using importance sampling, options given using resampling high weight particles Effective Sample Size falls user-specified threshold\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_smooth.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing — pfilter_mvgam_smooth\",\"text\":\"\",\"code\":\"pfilter_mvgam_smooth(   particles,   mgcv_model,   next_assim,   threshold = 0.25,   n_cores = 1,   use_resampling = FALSE,   kernel_lambda = 0.5 )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_smooth.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing — pfilter_mvgam_smooth\",\"text\":\"particles list particles run one observation prior observation next_assim mgcv_model gam model returned call link{mvgam} next_assim dataframe test data containing one observation per series (beyond last observation seen model initialising particles pfilter_mvgam_init previous calls pfilter_mvgam_online. least contain 'series' 'time' one-step ahead horizon, addition variables included linear predictor object threshold proportional numeric specifying Effective Sample Size limit resampling particles triggered (calculated ESS / n_particles) use_resampling == TRUE. 0 1 n_cores integer specifying number cores generating particle forecasts parallel use_resampling logical specifying whether resampling used ESS falls specified threshold. Note resampling can result loss original model's diversity GAM beta coefficients, may undesirable consequences forecast distribution. use_resampling TRUE, effort made remedy assigning randomly sampled draws GAM beta coefficients original model's distribution particle. however guarantee loss diversity, especially successive resampling take place. Default option therefore FALSE kernel_lambda proportional numeric specifying strength smoothing use pulling low weight particles toward high likelihood state space. 0 1\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_smooth.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Assimilate new observations into a fitted mvgam model using resampling and kernel smoothing — pfilter_mvgam_smooth\",\"text\":\"list object length = n_particles containing information parameters current state estimates particle\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/piecewise_trends.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Specify piecewise linear or logistic trends — PW\",\"title\":\"Specify piecewise linear or logistic trends — PW\",\"text\":\"Set piecewise linear logistic trend models mvgam. functions evaluate arguments – exist purely help set model particular piecewise trend models.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/piecewise_trends.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Specify piecewise linear or logistic trends — PW\",\"text\":\"\",\"code\":\"PW(   n_changepoints = 10,   changepoint_range = 0.8,   changepoint_scale = 0.05,   growth = \\\"linear\\\" )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/piecewise_trends.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Specify piecewise linear or logistic trends — PW\",\"text\":\"n_changepoints non-negative integer specifying number potential changepoints. Potential changepoints selected uniformly first changepoint_range proportion timepoints data. Default 10 changepoint_range Proportion history data trend changepoints estimated. Defaults 0.8 first 80%. changepoint_scale Parameter modulating flexibility automatic changepoint selection altering scale parameter Laplace distribution. resulting prior double_exponential(0, changepoint_scale). Large values allow many changepoints flexible trend, small values allow changepoints. Default 0.05. growth Character string specifying either 'linear' 'logistic' growth trend. 'logistic', variable labelled cap MUST data specify maximum saturation point trend (see details examples mvgam information). Default 'linear'.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/piecewise_trends.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Specify piecewise linear or logistic trends — PW\",\"text\":\"object class mvgam_trend, contains list arguments interpreted parsing functions mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/piecewise_trends.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Specify piecewise linear or logistic trends — PW\",\"text\":\"Offsets intercepts: trend models, offset parameter included trend estimation process. parameter incredibly difficult identify also include intercept observation formula. reason, highly recommended drop intercept formula (.e. y ~ x + 0 y ~ x - 1, x optional predictor terms). Logistic growth cap variable: forecasting growth, often maximum achievable point time series can reach. example, total market size, total population size carrying capacity population dynamics. can advantageous forecast saturate near point predictions sensible. function allows make forecasts using logistic growth trend model, specified carrying capacity. Note capacity need static time, can vary series x timepoint combination necessary. must supply cap value observation data using growth = 'logistic'. observation families use non-identity link function, cap value internally transformed link scale (.e. specified cap log transformed using poisson() nb() family). therefore important specify cap values scale outcome. Note also missing values allowed cap.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/piecewise_trends.html\",\"id\":\"references\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"References\",\"title\":\"Specify piecewise linear or logistic trends — PW\",\"text\":\"Taylor, Sean J., Benjamin Letham. \\\"Forecasting scale.\\\" American Statistician 72.1 (2018): 37-45.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pipe.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Pipe operator — %>%\",\"title\":\"Pipe operator — %>%\",\"text\":\"See magrittr::%>% details.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pipe.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Pipe operator — %>%\",\"text\":\"\",\"code\":\"lhs %>% rhs\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pipe.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Pipe operator — %>%\",\"text\":\"lhs value magrittr placeholder. rhs function call using magrittr semantics.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/pipe.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Pipe operator — %>%\",\"text\":\"result calling rhs(lhs).\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Default mvgam plots — plot.mvgam\",\"title\":\"Default mvgam plots — plot.mvgam\",\"text\":\"function takes fitted mvgam object produces plots smooth functions, forecasts, trends uncertainty components\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Default mvgam plots — plot.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam plot(   x,   type = \\\"residuals\\\",   series = 1,   residuals = FALSE,   newdata,   data_test,   trend_effects = FALSE,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Default mvgam plots — plot.mvgam\",\"text\":\"x list object returned mvgam. See mvgam() type character specifying type plot return. Options : series, residuals, smooths, re (random effect smooths), pterms (parametric effects), forecast, trend, uncertainty, factors series integer specifying series set plotted. ignored type == 're' residuals logical. TRUE type = 'smooths', posterior quantiles partial residuals added plots 1-D smooths series ribbon rectangles. Partial residuals smooth term median Dunn-Smyth residuals obtained dropping term concerned model, leaving estimates fixed (.e. estimates term plus original median Dunn-Smyth residuals). Note mvgam works Dunn-Smyth residuals working residuals, used mgcv, magnitudes partial residuals different expect plot.gam. Interpretation similar though, partial residuals evenly scattered around smooth function function well estimated newdata Optional dataframe list test data containing least 'series' 'time' addition variables included linear predictor original formula. argument optional plotting sample forecast period observations (type = forecast) required plotting uncertainty components (type = uncertainty). data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows trend_effects logical. TRUE trend_formula used model fitting, terms trend (.e. process) model plotted ... Additional arguments individual plotting function.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Default mvgam plots — plot.mvgam\",\"text\":\"base R plot set plots\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Default mvgam plots — plot.mvgam\",\"text\":\"plots useful getting overview fitted model estimated random effects smooth functions, individual plotting functions functions marginaleffects package offer far customisation.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Default mvgam plots — plot.mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Default mvgam plots — plot.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some time series dat <- sim_mvgam(T = 80, n_series = 3)  # Fit a basic model mod <- mvgam(y ~ s(season, bs = 'cc') + s(series, bs = 're'),             data = dat$data_train,             trend_model = 'RW')  # Plot predictions and residuals for each series plot(mod, type = 'forecast', series = 1) plot(mod, type = 'forecast', series = 2) plot(mod, type = 'forecast', series = 3) plot(mod, type = 'residuals', series = 1) plot(mod, type = 'residuals', series = 2) plot(mod, type = 'residuals', series = 3)  # Plot model effects plot(mod, type = 'smooths') plot(mod, type = 're')  # More flexible plots with marginaleffects utilities plot_predictions(mod, condition = 'season', type = 'link') plot_predictions(mod,                 condition = c('season', 'series', 'series'),                 type = 'link') plot_predictions(mod, condition = 'series', type = 'link')  # When using a State-Space model with predictors on the process # model, set trend_effects = TRUE to visualise process effects mod <- mvgam(y ~ -1,             trend_formula = ~ s(season, bs = 'cc'),             data = dat$data_train,             trend_model = 'RW') plot(mod, type = 'smooths', trend_effects = TRUE)  # But marginaleffects functions work without any modification plot_predictions(mod, condition = 'season', type = 'link')  }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam_lfo.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot Pareto-k and ELPD values from a leave-future-out object — plot.mvgam_lfo\",\"title\":\"Plot Pareto-k and ELPD values from a leave-future-out object — plot.mvgam_lfo\",\"text\":\"function takes object class mvgam_lfo create several informative diagnostic plots\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam_lfo.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot Pareto-k and ELPD values from a leave-future-out object — plot.mvgam_lfo\",\"text\":\"\",\"code\":\"# S3 method for mvgam_lfo plot(x, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam_lfo.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot Pareto-k and ELPD values from a leave-future-out object — plot.mvgam_lfo\",\"text\":\"x object class mvgam_lfo ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot.mvgam_lfo.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Plot Pareto-k and ELPD values from a leave-future-out object — plot.mvgam_lfo\",\"text\":\"base R plot Pareto-k ELPD values evaluation timepoints. Pareto-k plot, dashed red line indicates specified threshold chosen triggering model refits. ELPD plot, dashed red line indicated bottom 10% quantile ELPD values. Points threshold may represent outliers difficult forecast\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_effects.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Effect plot as implemented in marginaleffects — plot_effects.mvgam\",\"title\":\"Effect plot as implemented in marginaleffects — plot_effects.mvgam\",\"text\":\"Convenient way call marginal conditional effect plotting functions implemented marginaleffects package\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_effects.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Effect plot as implemented in marginaleffects — plot_effects.mvgam\",\"text\":\"\",\"code\":\"plot_effects(object, ...)  # S3 method for mvgam plot_effects(   object,   condition = NULL,   by = NULL,   newdata = NULL,   type = NULL,   conf_level = 0.95,   wts = NULL,   transform = NULL,   points = 0,   rug = FALSE,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_effects.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Effect plot as implemented in marginaleffects — plot_effects.mvgam\",\"text\":\"... Additional arguments passed predict() method supplied modeling package.arguments particularly useful mixed-effects bayesian models (see online vignettes marginaleffects website). Available arguments can vary model model, depending range supported arguments modeling package. See \\\"Model-Specific Arguments\\\" section ?marginaleffects documentation non-exhaustive list available arguments. condition Conditional predictions Character vector (max length 3): Names predictors display. Named list (max length 3): List names correspond predictors. List elements can : Numeric vector Function returns numeric vector set unique categorical values Shortcut strings common reference values: \\\"minmax\\\", \\\"quartile\\\", \\\"threenum\\\" 1: x-axis. 2: color/shape. 3: facets. Numeric variables positions 2 3 summarized Tukey's five numbers ?stats::fivenum Marginal predictions Character vector (max length 3): Names categorical predictors marginalize across. 1: x-axis. 2: color. 3: facets. newdata newdata NULL, grid determined condition argument. newdata NULL, argument behaves way predictions() function. type string indicates type (scale) predictions used compute contrasts slopes. can differ based model type, typically string : \\\"response\\\", \\\"link\\\", \\\"probs\\\", \\\"zero\\\". unsupported string entered, model-specific list acceptable values returned error message. type NULL, default value used. default first model-related row marginaleffects:::type_dictionary dataframe. conf_level numeric value 0 1. Confidence level use build confidence interval. wts string numeric: weights use computing average contrasts slopes. weights affect averaging avg_*() argument, unit-level estimates . Internally, estimates weights passed weighted.mean() function. string: column name weights variable newdata. supplying column name wts, recommended supply original data (including weights variable) explicitly newdata. numeric: vector length equal number rows original data newdata (supplied). transform function applied unit-level adjusted predictions confidence intervals just function returns results. bayesian models, function applied individual draws posterior distribution, computing summaries. points Number 0 1 controls transparency raw data points. 0 (default) display points. rug TRUE displays tick marks axes mark distribution raw data.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_effects.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Effect plot as implemented in marginaleffects — plot_effects.mvgam\",\"text\":\"ggplot object can customized using ggplot2 package\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_factors.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\",\"title\":\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\",\"text\":\"function takes fitted mvgam object returns plots summary statistics latent dynamic factors\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_factors.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\",\"text\":\"\",\"code\":\"plot_mvgam_factors(object, plot = TRUE)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_factors.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\",\"text\":\"object list object returned mvgam. See mvgam() plot logical specifying whether factors plotted\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_factors.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\",\"text\":\"dataframe factor contributions , optionally, series base R plots\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_factors.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\",\"text\":\"model object estimated using dynamic factors, possible factors contributed estimated trends. due regularisation penalty acts independently factor's Gaussian precision, squeeze un-needed factors white noise process (effectively dropping factor model). function, factor tested null hypothesis white noise calculating sum factor's 2nd derivatives. factor larger contribution larger sum due weaker penalty factor's precision. plot == TRUE, factors also plotted.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_factors.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Latent factor summaries for a fitted mvgam object — plot_mvgam_factors\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_forecasts.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot mvgam posterior predictions for a specified series — plot_mvgam_forecasts\",\"title\":\"Plot mvgam posterior predictions for a specified series — plot_mvgam_forecasts\",\"text\":\"Plot mvgam posterior predictions specified series\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_forecasts.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot mvgam posterior predictions for a specified series — plot_mvgam_forecasts\",\"text\":\"\",\"code\":\"plot_mvgam_fc(   object,   series = 1,   newdata,   data_test,   realisations = FALSE,   n_realisations = 15,   hide_xlabels = FALSE,   xlab,   ylab,   ylim,   n_cores = 1,   return_forecasts = FALSE,   return_score = FALSE,   ... )  # S3 method for mvgam_forecast plot(   x,   series = 1,   realisations = FALSE,   n_realisations = 15,   hide_xlabels = FALSE,   xlab,   ylab,   ylim,   return_score = FALSE,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_forecasts.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot mvgam posterior predictions for a specified series — plot_mvgam_forecasts\",\"text\":\"object list object returned mvgam. See mvgam() series integer specifying series set plotted newdata Optional dataframe list test data containing least 'series' 'time' addition variables included linear predictor original formula. included, covariate information newdata used generate forecasts fitted model equations. newdata originally included call mvgam, forecasts already produced generative model simply extracted plotted. However newdata supplied original model call, assumption made newdata supplied comes sequentially data supplied data original model (.e. assume time gap last observation series 1 data first observation series 1 newdata). newdata contains observations column y, observations used compute Discrete Rank Probability Score forecast distribution data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows realisations logical. TRUE, forecast realisations shown spaghetti plot, making easier visualise diversity possible forecasts. FALSE, default, empirical quantiles forecast distribution shown n_realisations integer specifying number posterior realisations plot, realisations = TRUE. Ignored otherwise hide_xlabels logical. TRUE, xlabels printed allow user add custom labels using axis base R xlab label x axis. ylab label y axis. ylim Optional vector y-axis limits (min, max) n_cores integer specifying number cores generating forecasts parallel return_forecasts logical. TRUE, function plot forecast well returning forecast object (matrix dimension n_samples x horizon) return_score logical. TRUE sample test data provided newdata, probabilistic score calculated returned. score used depend observation family fitted model. Discrete families (poisson, negative binomial, tweedie) use Discrete Rank Probability Score. families use Continuous Rank Probability Score. value returned sum scores within sample forecast horizon ... par graphical parameters. x Object class mvgam_forecast\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_forecasts.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Plot mvgam posterior predictions for a specified series — plot_mvgam_forecasts\",\"text\":\"base R graphics plot optional list containing forecast distribution sample probabilistic forecast score\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_forecasts.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Plot mvgam posterior predictions for a specified series — plot_mvgam_forecasts\",\"text\":\"plot_mvgam_fc draws posterior predictions object class mvgam calculates posterior empirical quantiles. plot.mvgam_forecast takes object class mvgam_forecast, forecasts already computed, plots resulting forecast distribution. realisations = FALSE, posterior quantiles plotted along true observed data used train model. Otherwise, spaghetti plot returned show possible forecast paths.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_pterms.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot mvgam parametric term partial effects — plot_mvgam_pterms\",\"title\":\"Plot mvgam parametric term partial effects — plot_mvgam_pterms\",\"text\":\"function plots posterior empirical quantiles partial effects parametric terms\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_pterms.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot mvgam parametric term partial effects — plot_mvgam_pterms\",\"text\":\"\",\"code\":\"plot_mvgam_pterms(object, trend_effects = FALSE)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_pterms.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot mvgam parametric term partial effects — plot_mvgam_pterms\",\"text\":\"object list object returned mvgam. See mvgam() trend_effects logical. TRUE trend_formula used model fitting, terms trend (.e. process) model plotted\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_pterms.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Plot mvgam parametric term partial effects — plot_mvgam_pterms\",\"text\":\"base R graphics plot\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_pterms.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Plot mvgam parametric term partial effects — plot_mvgam_pterms\",\"text\":\"Posterior empirical quantiles parametric term's partial effect estimates (link scale) calculated visualised ribbon plots. effects can interpreted partial effect parametric term contributes terms model set 0\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_randomeffects.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot mvgam random effect terms — plot_mvgam_randomeffects\",\"title\":\"Plot mvgam random effect terms — plot_mvgam_randomeffects\",\"text\":\"function plots posterior empirical quantiles random effect smooths (bs = re)\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_randomeffects.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot mvgam random effect terms — plot_mvgam_randomeffects\",\"text\":\"\",\"code\":\"plot_mvgam_randomeffects(object, trend_effects = FALSE)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_randomeffects.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot mvgam random effect terms — plot_mvgam_randomeffects\",\"text\":\"object list object returned mvgam. See mvgam() trend_effects logical. TRUE trend_formula used model fitting, terms trend (.e. process) model plotted\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_randomeffects.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Plot mvgam random effect terms — plot_mvgam_randomeffects\",\"text\":\"base R graphics plot\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_randomeffects.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Plot mvgam random effect terms — plot_mvgam_randomeffects\",\"text\":\"Posterior empirical quantiles random effect coefficient estimates (link scale) calculated visualised ribbon plots. Labels coefficients taken levels original factor variable used specify smooth model's formula\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_resids.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\",\"title\":\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\",\"text\":\"function takes fitted mvgam object returns various residual diagnostic plots\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_resids.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\",\"text\":\"\",\"code\":\"plot_mvgam_resids(object, series = 1, newdata, data_test)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_resids.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\",\"text\":\"object list object returned mvgam. See mvgam() series integer specifying series set plotted newdata Optional dataframe list test data containing least 'series', 'y', 'time' addition variables included linear predictor formula. included, covariate information newdata used generate forecasts fitted model equations. newdata originally included call mvgam, forecasts already produced generative model simply extracted used calculate residuals. However newdata supplied original model call, assumption made newdata supplied comes sequentially data supplied data original model (.e. assume time gap last observation series 1 data_train first observation series 1 newdata). data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_resids.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\",\"text\":\"series base R plots\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_resids.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\",\"text\":\"total four base R plots generated examine Dunn-Smyth residuals specified series. Plots include residuals vs fitted values plot, Q-Q plot, two plots check remaining temporal autocorrelation residuals. Note, plots use posterior medians fitted values / residuals, uncertainty represented.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_resids.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Residual diagnostics for a fitted mvgam object — plot_mvgam_resids\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_series.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot observed time series used for mvgam modelling — plot_mvgam_series\",\"title\":\"Plot observed time series used for mvgam modelling — plot_mvgam_series\",\"text\":\"function takes either fitted mvgam object data_train object produces plots observed time series, ACF, CDF histograms exploratory data analysis\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_series.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot observed time series used for mvgam modelling — plot_mvgam_series\",\"text\":\"\",\"code\":\"plot_mvgam_series(   object,   data,   data_train,   newdata,   data_test,   y = \\\"y\\\",   lines = TRUE,   series = 1,   n_bins,   log_scale = FALSE )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_series.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot observed time series used for mvgam modelling — plot_mvgam_series\",\"text\":\"object Optional list object returned mvgam. Either object data_train must supplied. data Optional dataframe list training data containing least 'series' 'time'. Use argument training data gathered correct format mvgam modelling model yet fitted. data_train Deprecated. Still works place data users recommended use data instead seamless integration R workflows newdata Optional dataframe list test data containing least 'series' 'time' forecast horizon, addition variables included linear predictor formula. included, observed values test data compared model's forecast distribution exploring biases model predictions. data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows y Character. name outcome variable supplied data? Defaults 'y' lines Logical. TRUE, line plots used visualising time series. FALSE, points used. series Either integer specifying series set plotted string '', plots series available supplied data n_bins integer specifying number bins use binning observed values plotting histogram. Default use number bins returned call hist base R log_scale logical. series == '', flag used control whether time series plot shown log scale (using log(Y + 1)). can useful visualising many series may different observed ranges. Default FALSE\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_series.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Plot observed time series used for mvgam modelling — plot_mvgam_series\",\"text\":\"set base R graphics plots. series integer, plots show observed time series, autocorrelation cumulative distribution functions, histogram series. series == '', set observed time series plots returned series shown plot single focal series highlighted, remaining series shown faint gray lines.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_series.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Plot observed time series used for mvgam modelling — plot_mvgam_series\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_smooth.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot mvgam smooth terms — plot_mvgam_smooth\",\"title\":\"Plot mvgam smooth terms — plot_mvgam_smooth\",\"text\":\"function plots posterior empirical quantiles series-specific smooth term\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_smooth.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot mvgam smooth terms — plot_mvgam_smooth\",\"text\":\"\",\"code\":\"plot_mvgam_smooth(   object,   trend_effects = FALSE,   series = 1,   smooth,   residuals = FALSE,   n_resid_bins = 25,   realisations = FALSE,   n_realisations = 15,   derivatives = FALSE,   newdata )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_smooth.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot mvgam smooth terms — plot_mvgam_smooth\",\"text\":\"object list object returned mvgam. See mvgam() trend_effects logical. TRUE trend_formula used model fitting, terms trend (.e. process) model plotted series integer specifying series set plotted smooth either character integer specifying smooth term plotted residuals logical. TRUE posterior quantiles partial residuals added plots 1-D smooths series ribbon rectangles. Partial residuals smooth term median Dunn-Smyth residuals obtained dropping term concerned model, leaving estimates fixed (.e. estimates term plus original median Dunn-Smyth residuals). Note mvgam works Dunn-Smyth residuals working residuals, used mgcv, magnitudes partial residuals different expect plot.gam. Interpretation similar though, partial residuals evenly scattered around smooth function function well estimated n_resid_bins integer specifying number bins group covariate plotting partial residuals. Setting argument high can make messy plots difficult interpret, setting low likely mask potentially useful patterns partial residuals. Default 25 realisations logical. TRUE, posterior realisations shown spaghetti plot, making easier visualise diversity possible functions. FALSE, default, empirical quantiles posterior distribution shown n_realisations integer specifying number posterior realisations plot, realisations = TRUE. Ignored otherwise derivatives logical. TRUE, additional plot returned show estimated 1st derivative specified smooth (Note, works univariate smooths) newdata Optional dataframe predicting smooth, containing least 'series' addition variables included linear predictor original model's formula. Note currently supported plotting univariate smooths\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_smooth.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Plot mvgam smooth terms — plot_mvgam_smooth\",\"text\":\"base R graphics plot\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_smooth.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Plot mvgam smooth terms — plot_mvgam_smooth\",\"text\":\"Smooth functions shown empirical quantiles (spaghetti plots) posterior partial expectations across sequence 500 values variable's min max, zeroing effects variables. present, univariate bivariate smooth plots allowed, though note bivariate smooths rely default behaviour plot.gam. nuanced visualisation, supply newdata just predicting gam model\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_trend.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot mvgam latent trend for a specified series — plot_mvgam_trend\",\"title\":\"Plot mvgam latent trend for a specified series — plot_mvgam_trend\",\"text\":\"Plot mvgam latent trend specified series\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_trend.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot mvgam latent trend for a specified series — plot_mvgam_trend\",\"text\":\"\",\"code\":\"plot_mvgam_trend(   object,   series = 1,   newdata,   data_test,   realisations = FALSE,   n_realisations = 15,   n_cores = 1,   derivatives = FALSE,   hide_xlabels = FALSE,   xlab,   ylab,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_trend.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot mvgam latent trend for a specified series — plot_mvgam_trend\",\"text\":\"object list object returned mvgam. See mvgam() series integer specifying series set plotted newdata Optional dataframe list test data containing least 'series' 'time' addition variables included linear predictor original formula. data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows realisations logical. TRUE, posterior trend realisations shown spaghetti plot, making easier visualise diversity possible trend paths. FALSE, default, empirical quantiles posterior distribution shown n_realisations integer specifying number posterior realisations plot, realisations = TRUE. Ignored otherwise n_cores integer specifying number cores generating trend forecasts parallel derivatives logical. TRUE, additional plot returned show estimated 1st derivative estimated trend hide_xlabels logical. TRUE, xlabels printed allow user add custom labels using axis base R. Ignored derivatives = TRUE xlab label x axis. ylab label y axis. ... par graphical parameters.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_uncertainty.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot mvgam forecast uncertainty contributions for a specified series — plot_mvgam_uncertainty\",\"title\":\"Plot mvgam forecast uncertainty contributions for a specified series — plot_mvgam_uncertainty\",\"text\":\"Plot mvgam forecast uncertainty contributions specified series\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_uncertainty.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot mvgam forecast uncertainty contributions for a specified series — plot_mvgam_uncertainty\",\"text\":\"\",\"code\":\"plot_mvgam_uncertainty(   object,   series = 1,   newdata,   data_test,   legend_position = \\\"topleft\\\",   hide_xlabels = FALSE )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_uncertainty.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot mvgam forecast uncertainty contributions for a specified series — plot_mvgam_uncertainty\",\"text\":\"object list object returned mvgam. See mvgam() series integer specifying series set plotted newdata dataframe list containing least 'series' 'time' forecast horizon, addition variables included linear predictor formula data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows legend_position location may also specified setting x single keyword list: \\\"none\\\", \\\"bottomright\\\", \\\"bottom\\\", \\\"bottomleft\\\", \\\"left\\\", \\\"topleft\\\", \\\"top\\\", \\\"topright\\\", \\\"right\\\" \\\"center\\\". places legend inside plot frame given location (\\\"none\\\"). hide_xlabels logical. TRUE, xlabels printed allow user add custom labels using axis base R\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/portal_data.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Portal Project rodent capture survey data — portal_data\",\"title\":\"Portal Project rodent capture survey data — portal_data\",\"text\":\"dataset containing timeseries total captures (across control plots) select rodent species Portal Project\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/portal_data.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Portal Project rodent capture survey data — portal_data\",\"text\":\"\",\"code\":\"portal_data\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/portal_data.html\",\"id\":\"format\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Format\",\"title\":\"Portal Project rodent capture survey data — portal_data\",\"text\":\"dataframe containing following fields: moon time sampling lunar cycles DM Total captures species Dipodomys merriami Total captures species Dipodomys ordii PP Total captures species Chaetodipus penicillatus OT Total captures species Onychomys torridus year Sampling year month Sampling month mintemp Monthly mean minimum temperature precipitation Monthly mean precipitation ndvi Monthly mean Normalised Difference Vegetation Index\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/portal_data.html\",\"id\":\"source\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Source\",\"title\":\"Portal Project rodent capture survey data — portal_data\",\"text\":\"https://github.com/weecology/PortalData/blob/main/SiteandMethods/Methods.md\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_epred.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Draws from the Expected Value of the Posterior Predictive Distribution — posterior_epred.mvgam\",\"title\":\"Draws from the Expected Value of the Posterior Predictive Distribution — posterior_epred.mvgam\",\"text\":\"Compute posterior draws expected value posterior predictive distribution (.e. conditional expectation). Can performed data used fit model (posterior predictive checks) new data. definition, predictions smaller variance posterior predictions performed posterior_predict.mvgam method. uncertainty expected value posterior predictive distribution incorporated draws computed posterior_epred residual error ignored . However, estimated means methods averaged across draws similar.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_epred.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Draws from the Expected Value of the Posterior Predictive Distribution — posterior_epred.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam posterior_epred(object, newdata, data_test, process_error = TRUE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_epred.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Draws from the Expected Value of the Posterior Predictive Distribution — posterior_epred.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() newdata Optional dataframe list test data containing variables included linear predictor formula. supplied, predictions generated original observations used model fit. data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows process_error Logical. TRUE newdata supplied, expected uncertainty process model accounted using draws latent trend SD parameters. FALSE, uncertainty latent trend component ignored calculating predictions. newdata supplied, draws fitted model's posterior predictive distribution used (always include uncertainty latent trend components) ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_epred.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Draws from the Expected Value of the Posterior Predictive Distribution — posterior_epred.mvgam\",\"text\":\"matrix dimension n_samples x new_obs, n_samples number posterior samples fitted object n_obs number observations newdata\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_epred.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Draws from the Expected Value of the Posterior Predictive Distribution — posterior_epred.mvgam\",\"text\":\"Note types predictions models include trend_formula, uncertainty dynamic trend component can ignored setting process_error = FALSE. However, trend_formula supplied model, predictions component ignored. process_error = TRUE, trend predictions ignore autocorrelation coefficients GP length scale coefficients, ultimately assuming process stationary. method similar types posterior predictions returned brms models using autocorrelated error predictions newdata. function therefore suited posterior simulation GAM components mvgam model, forecasting functions plot_mvgam_fc forecast.mvgam better suited generate h-step ahead forecasts respect temporal dynamics estimated latent trends.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_epred.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Draws from the Expected Value of the Posterior Predictive Distribution — posterior_epred.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data and fit a model simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Compute posterior expectations expectations <- posterior_epred(mod) str(expectations) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_linpred.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Posterior Draws of the Linear Predictor — posterior_linpred.mvgam\",\"title\":\"Posterior Draws of the Linear Predictor — posterior_linpred.mvgam\",\"text\":\"Compute posterior draws linear predictor, draws applying link functions transformations. Can performed data used fit model (posterior predictive checks) new data.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_linpred.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Posterior Draws of the Linear Predictor — posterior_linpred.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam posterior_linpred(   object,   transform = FALSE,   newdata,   data_test,   process_error = TRUE,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_linpred.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Posterior Draws of the Linear Predictor — posterior_linpred.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() transform Logical; FALSE (default), draws linear predictor returned. TRUE, draws transformed linear predictor, .e. conditional expectation, returned. newdata Optional dataframe list test data containing variables included linear predictor formula. supplied, predictions generated original observations used model fit. data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows process_error Logical. TRUE newdata supplied, expected uncertainty process model accounted using draws latent trend SD parameters. FALSE, uncertainty latent trend component ignored calculating predictions. newdata supplied, draws fitted model's posterior predictive distribution used (always include uncertainty latent trend components) ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_linpred.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Posterior Draws of the Linear Predictor — posterior_linpred.mvgam\",\"text\":\"matrix dimension n_samples x new_obs, n_samples number posterior samples fitted object n_obs number observations newdata\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_linpred.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Posterior Draws of the Linear Predictor — posterior_linpred.mvgam\",\"text\":\"Note types predictions models include trend_formula, uncertainty dynamic trend component can ignored setting process_error = FALSE. However, trend_formula supplied model, predictions component ignored. process_error = TRUE, trend predictions ignore autocorrelation coefficients GP length scale coefficients, ultimately assuming process stationary. method similar types posterior predictions returned brms models using autocorrelated error predictions newdata. function therefore suited posterior simulation GAM components mvgam model, forecasting functions plot_mvgam_fc forecast.mvgam better suited generate h-step ahead forecasts respect temporal dynamics estimated latent trends.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_linpred.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Posterior Draws of the Linear Predictor — posterior_linpred.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data and fit a model simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Extract linear predictor values linpreds <- posterior_linpred(mod) str(linpreds) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_predict.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Draws from the Posterior Predictive Distribution — posterior_predict.mvgam\",\"title\":\"Draws from the Posterior Predictive Distribution — posterior_predict.mvgam\",\"text\":\"Compute posterior draws posterior predictive distribution. Can performed data used fit model (posterior predictive checks) new data. definition, draws higher variance draws expected value posterior predictive distribution computed posterior_epred.mvgam. residual error incorporated posterior_predict. However, estimated means methods averaged across draws similar.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_predict.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Draws from the Posterior Predictive Distribution — posterior_predict.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam posterior_predict(object, newdata, data_test, process_error = TRUE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_predict.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Draws from the Posterior Predictive Distribution — posterior_predict.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() newdata Optional dataframe list test data containing variables included linear predictor formula. supplied, predictions generated original observations used model fit. data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows process_error Logical. TRUE newdata supplied, expected uncertainty process model accounted using draws latent trend SD parameters. FALSE, uncertainty latent trend component ignored calculating predictions. newdata supplied, draws fitted model's posterior predictive distribution used (always include uncertainty latent trend components) ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_predict.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Draws from the Posterior Predictive Distribution — posterior_predict.mvgam\",\"text\":\"matrix dimension n_samples x new_obs, n_samples number posterior samples fitted object n_obs number observations newdata\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_predict.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Draws from the Posterior Predictive Distribution — posterior_predict.mvgam\",\"text\":\"Note types predictions models include trend_formula, uncertainty dynamic trend component can ignored setting process_error = FALSE. However, trend_formula supplied model, predictions component ignored. process_error = TRUE, trend predictions ignore autocorrelation coefficients GP length scale coefficients, ultimately assuming process stationary. method similar types posterior predictions returned brms models using autocorrelated error predictions newdata. function therefore suited posterior simulation GAM components mvgam model, forecasting functions plot_mvgam_fc forecast.mvgam better suited generate h-step ahead forecasts respect temporal dynamics estimated latent trends.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/posterior_predict.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Draws from the Posterior Predictive Distribution — posterior_predict.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data and fit a model simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Compute posterior predictions predictions <- posterior_predict(mod) str(predictions) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/ppc.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Plot mvgam posterior predictive checks for a specified series — ppc.mvgam\",\"title\":\"Plot mvgam posterior predictive checks for a specified series — ppc.mvgam\",\"text\":\"Plot mvgam posterior predictive checks specified series\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/ppc.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Plot mvgam posterior predictive checks for a specified series — ppc.mvgam\",\"text\":\"\",\"code\":\"ppc(object, ...)  # S3 method for mvgam ppc(   object,   newdata,   data_test,   series = 1,   type = \\\"hist\\\",   n_bins,   legend_position,   xlab,   ylab,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/ppc.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Plot mvgam posterior predictive checks for a specified series — ppc.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() ... par graphical parameters. newdata Optional dataframe list test data containing least 'series' 'time' forecast horizon, addition variables included linear predictor formula. included, observed values test data compared model's forecast distribution exploring biases model predictions. Note useful newdata also included fitting original model. data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows series integer specifying series set plotted type character specifying type posterior predictive check calculate plot. Valid options : 'rootogram', 'mean', 'hist', 'density', 'prop_zero', 'pit' 'cdf' n_bins integer specifying number bins use binning observed values plotting rootogram histogram. Default 50 bins rootogram, means >50 unique observed values, bins used prevent overplotting facilitate interpretation. Default histogram use number bins returned call hist base R legend_position location may also specified setting x single keyword list \\\"bottomright\\\", \\\"bottom\\\", \\\"bottomleft\\\", \\\"left\\\", \\\"topleft\\\", \\\"top\\\", \\\"topright\\\", \\\"right\\\" \\\"center\\\". places legend inside plot frame given location. alternatively, use \\\"none\\\" hide legend. xlab label x axis. ylab label y axis.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/ppc.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Plot mvgam posterior predictive checks for a specified series — ppc.mvgam\",\"text\":\"base R graphics plot showing either posterior rootogram (type == 'rootogram'), predicted vs observed mean series (type == 'mean'), predicted vs observed proportion zeroes series (type == 'prop_zero'),predicted vs observed histogram series (type == 'hist'), kernel density empirical CDF estimates posterior predictions (type == 'density' type == 'cdf') Probability Integral Transform histogram (type == 'pit').\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/ppc.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Plot mvgam posterior predictive checks for a specified series — ppc.mvgam\",\"text\":\"Posterior predictions drawn fitted mvgam compared empirical distribution observed data specified series help evaluate model's ability generate unbiased predictions. plots apart 'rootogram', posterior predictions can also compared sample observations long observations included 'data_test' original model fit supplied . Rootograms currently plotted using 'hanging' style\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/ppc.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Plot mvgam posterior predictive checks for a specified series — ppc.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some smooth effects and fit a model set.seed(0) dat <- mgcv::gamSim(1, n = 200, scale = 2) dat$time <- 1:NROW(dat) mod <- mvgam(y ~ s(x0) + s(x1) + s(x2) + s(x3),             data = dat,             family = gaussian())  # Posterior checks ppc(mod, type = 'hist') ppc(mod, type = 'density') ppc(mod, type = 'cdf') }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/predict.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Predict from the GAM component of an mvgam model — predict.mvgam\",\"title\":\"Predict from the GAM component of an mvgam model — predict.mvgam\",\"text\":\"Predict GAM component mvgam model\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/predict.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Predict from the GAM component of an mvgam model — predict.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam predict(object, newdata, data_test, type = \\\"link\\\", process_error = TRUE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/predict.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Predict from the GAM component of an mvgam model — predict.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() newdata Optional dataframe list test data containing variables included linear predictor formula. supplied, predictions generated original observations used model fit. data_test Deprecated. Still works place newdata users recommended use newdata instead seamless integration R workflows type value link (default) linear predictor calculated link scale. expected used, predictions reflect expectation response (mean) ignore uncertainty observation process. response used, predictions take uncertainty observation process account return predictions outcome scale. variance used, variance response respect mean (mean-variance relationship) returned. Two special cases also allowed: type latent_N return estimated latent abundances N-mixture distribution, type detection return estimated detection probability N-mixture distribution process_error Logical. TRUE dynamic trend model fit, expected uncertainty process model accounted using draws latent trend SD parameters. FALSE, uncertainty latent trend component ignored calculating predictions ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/predict.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Predict from the GAM component of an mvgam model — predict.mvgam\",\"text\":\"matrix dimension n_samples x new_obs, n_samples number posterior samples fitted object n_obs number test observations newdata\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/predict.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Predict from the GAM component of an mvgam model — predict.mvgam\",\"text\":\"Note types predictions models include trend_formula, uncertainty dynamic trend component can ignored setting process_error = FALSE. However, trend_formula supplied model, predictions component ignored. process_error = TRUE, trend predictions ignore autocorrelation coefficients GP length scale coefficients, ultimately assuming process stationary. method similar types posterior predictions returned brms models using autocorrelated error predictions newdata. function therefore suited posterior simulation GAM components mvgam model, forecasting functions plot_mvgam_fc forecast.mvgam better suited generate h-step ahead forecasts respect temporal dynamics estimated latent trends.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/print.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Summary for a fitted mvgam object — print.mvgam\",\"title\":\"Summary for a fitted mvgam object — print.mvgam\",\"text\":\"function takes fitted mvgam object prints quick summary\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/print.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Summary for a fitted mvgam object — print.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam print(x, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/print.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Summary for a fitted mvgam object — print.mvgam\",\"text\":\"x list object returned mvgam ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/print.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Summary for a fitted mvgam object — print.mvgam\",\"text\":\"list printed -screen\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/print.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Summary for a fitted mvgam object — print.mvgam\",\"text\":\"brief summary model's call printed\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/print.mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Summary for a fitted mvgam object — print.mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/residuals.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Posterior draws of mvgam residuals — residuals.mvgam\",\"title\":\"Posterior draws of mvgam residuals — residuals.mvgam\",\"text\":\"method extracts posterior draws Dunn-Smyth (randomized quantile) residuals order data supplied model. included additional arguments obtaining summaries computed residuals\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/residuals.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Posterior draws of mvgam residuals — residuals.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam residuals(object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/residuals.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Posterior draws of mvgam residuals — residuals.mvgam\",\"text\":\"object object class mvgam summary summary statistics returned instead raw values? Default TRUE.. robust FALSE (default) mean used measure central tendency standard deviation measure variability. TRUE, median median absolute deviation (MAD) applied instead. used summary TRUE. probs percentiles computed quantile function. used summary TRUE. ... arguments passed prepare_predictions control several aspects data validation prediction.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/residuals.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Posterior draws of mvgam residuals — residuals.mvgam\",\"text\":\"array randomized quantile residual values. summary = FALSE output resembles posterior_epred.mvgam predict.mvgam. summary = TRUE output n_observations x E matrix. number summary statistics E equal 2 +   length(probs): Estimate column contains point estimates (either mean median depending argument robust), Est.Error column contains uncertainty estimates (either standard deviation median absolute deviation depending argument robust). remaining columns starting Q contain quantile estimates specified via argument probs.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/residuals.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Posterior draws of mvgam residuals — residuals.mvgam\",\"text\":\"method gives residuals Dunn-Smyth (randomized quantile) residuals. observations missing (.e. NA) original data missing values residuals\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/residuals.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Posterior draws of mvgam residuals — residuals.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data and fit a model simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train)  # Extract posterior residuals resids <- residuals(mod) str(resids) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/RW.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Specify autoregressive dynamic processes — RW\",\"title\":\"Specify autoregressive dynamic processes — RW\",\"text\":\"Set autoregressive autoregressive moving average trend models mvgam. functions evaluate arguments – exist purely help set model particular autoregressive trend models.\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/RW.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Specify autoregressive dynamic processes — RW\",\"text\":\"\",\"code\":\"RW(ma = FALSE, cor = FALSE)  AR(p = 1, ma = FALSE, cor = FALSE)  VAR(ma = FALSE, cor = FALSE)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/RW.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Specify autoregressive dynamic processes — RW\",\"text\":\"ma Logical Include moving average terms order 1? Default FALSE. cor Logical Include correlated process errors part multivariate normal process model? TRUE n_series > 1 supplied data, fully structured covariance matrix estimated process errors. Default FALSE. p non-negative integer specifying autoregressive (AR) order. Default 1. currently larger 3\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/RW.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Specify autoregressive dynamic processes — RW\",\"text\":\"object class mvgam_trend, contains list arguments interpreted parsing functions mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/score.mvgam_forecast.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Compute probabilistic forecast scores for mvgam objects — score.mvgam_forecast\",\"title\":\"Compute probabilistic forecast scores for mvgam objects — score.mvgam_forecast\",\"text\":\"Compute probabilistic forecast scores mvgam objects\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/score.mvgam_forecast.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Compute probabilistic forecast scores for mvgam objects — score.mvgam_forecast\",\"text\":\"\",\"code\":\"# S3 method for mvgam_forecast score(   object,   score = \\\"crps\\\",   log = FALSE,   weights,   interval_width = 0.9,   n_cores = 1,   ... )  score(object, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/score.mvgam_forecast.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Compute probabilistic forecast scores for mvgam objects — score.mvgam_forecast\",\"text\":\"object mvgam_forecast object. See forecast.mvgam(). score character specifying type proper scoring rule use evaluation. Options : sis (.e. Scaled Interval Score), energy, variogram, elpd (.e. Expected log pointwise Predictive Density), drps (.e. Discrete Rank Probability Score) crps (Continuous Rank Probability Score). Note choosing elpd, supplied object must forecasts link scale expectations can calculated prior scoring. scores, forecasts supplied response scale (.e. posterior predictions) log logical. forecasts truths logged prior scoring? often appropriate comparing performance models series vary observation ranges weights optional vector weights (length(weights) == n_series) weighting pairwise correlations evaluating variogram score multivariate forecasts. Useful -weighting series larger magnitude observations less interest forecasting. Ignored score != 'variogram' interval_width proportional value [0.05,0.95] defining forecast interval calculating coverage , score = 'sis', calculating interval score n_cores integer specifying number cores calculating scores parallel ... Ignored\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/score.mvgam_forecast.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Compute probabilistic forecast scores for mvgam objects — score.mvgam_forecast\",\"text\":\"list containing scores interval coverages per forecast horizon. score %% c('drps', 'crps', 'elpd'), list also contain return sum series-level scores per horizon. score %% c('energy','variogram'), series-level scores computed score returned series. scores apart elpd, in_interval column series-level slot binary indicator whether true value within forecast's corresponding posterior empirical quantiles. Intervals calculated using elpd forecasts contain linear predictors\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/score.mvgam_forecast.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Compute probabilistic forecast scores for mvgam objects — score.mvgam_forecast\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate observations for three count-valued time series data <- sim_mvgam() # Fit a dynamic model using 'newdata' to automatically produce forecasts mod <- mvgam(y ~ 1,             trend_model = 'RW',             data = data$data_train,             newdata = data$data_test)  # Extract forecasts into a 'mvgam_forecast' object fc <- forecast(mod)  # Compute Discrete Rank Probability Scores and 0.90 interval coverages fc_scores <- score(fc, score = 'drps') str(fc_scores) }\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/series_to_mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"This function converts univariate or multivariate time series (xts or ts objects)\\r\\nto the format necessary for mvgam — series_to_mvgam\",\"title\":\"This function converts univariate or multivariate time series (xts or ts objects)\\r\\nto the format necessary for mvgam — series_to_mvgam\",\"text\":\"function converts univariate multivariate time series (xts ts objects) format necessary mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/series_to_mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"This function converts univariate or multivariate time series (xts or ts objects)\\r\\nto the format necessary for mvgam — series_to_mvgam\",\"text\":\"\",\"code\":\"series_to_mvgam(series, freq, train_prop = 0.85)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/series_to_mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"This function converts univariate or multivariate time series (xts or ts objects)\\r\\nto the format necessary for mvgam — series_to_mvgam\",\"text\":\"series xts ts object converted mvgam format freq integer. seasonal frequency series train_prop numeric stating proportion data use training. 0.25 0.95\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/series_to_mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"This function converts univariate or multivariate time series (xts or ts objects)\\r\\nto the format necessary for mvgam — series_to_mvgam\",\"text\":\"list object containing outputs needed mvgam, including 'data_train' 'data_test'\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/series_to_mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"This function converts univariate or multivariate time series (xts or ts objects)\\r\\nto the format necessary for mvgam — series_to_mvgam\",\"text\":\"\",\"code\":\"# A ts object example data(\\\"sunspots\\\") series <- cbind(sunspots, sunspots) colnames(series) <- c('blood', 'bone') head(series) #>      blood bone #> [1,]  58.0 58.0 #> [2,]  62.6 62.6 #> [3,]  70.0 70.0 #> [4,]  55.7 55.7 #> [5,]  85.0 85.0 #> [6,]  83.5 83.5 series_to_mvgam(series, frequency(series), 0.85) #> $data_train #>          y season year                date series time #> 1     58.0      1 1749 1749-01-01 00:00:00  blood    1 #> 2     58.0      1 1749 1749-01-01 00:00:00   bone    1 #> 3     62.6      2 1749 1749-01-31 10:00:00  blood    2 #> 4     62.6      2 1749 1749-01-31 10:00:00   bone    2 #> 5     70.0      3 1749 1749-03-02 20:00:01  blood    3 #> 6     70.0      3 1749 1749-03-02 20:00:01   bone    3 #> 7     55.7      4 1749 1749-04-02 06:00:00  blood    4 #> 8     55.7      4 1749 1749-04-02 06:00:00   bone    4 #> 9     85.0      5 1749 1749-05-02 16:00:00  blood    5 #> 10    85.0      5 1749 1749-05-02 16:00:00   bone    5 #> 11    83.5      6 1749 1749-06-02 02:00:01  blood    6 #> 12    83.5      6 1749 1749-06-02 02:00:01   bone    6 #> 13    94.8      7 1749 1749-07-02 12:00:00  blood    7 #> 14    94.8      7 1749 1749-07-02 12:00:00   bone    7 #> 15    66.3      8 1749 1749-08-01 22:00:00  blood    8 #> 16    66.3      8 1749 1749-08-01 22:00:00   bone    8 #> 17    75.9      9 1749 1749-09-01 08:00:01  blood    9 #> 18    75.9      9 1749 1749-09-01 08:00:01   bone    9 #> 19    75.5     10 1749 1749-10-01 18:00:00  blood   10 #> 20    75.5     10 1749 1749-10-01 18:00:00   bone   10 #> 21   158.6     11 1749 1749-11-01 04:00:00  blood   11 #> 22   158.6     11 1749 1749-11-01 04:00:00   bone   11 #> 23    85.2     12 1749 1749-12-01 14:00:01  blood   12 #> 24    85.2     12 1749 1749-12-01 14:00:01   bone   12 #> 25    73.3      1 1750 1750-01-01 00:00:00  blood   13 #> 26    73.3      1 1750 1750-01-01 00:00:00   bone   13 #> 27    75.9      2 1750 1750-01-31 10:00:00  blood   14 #> 28    75.9      2 1750 1750-01-31 10:00:00   bone   14 #> 29    89.2      3 1750 1750-03-02 20:00:01  blood   15 #> 30    89.2      3 1750 1750-03-02 20:00:01   bone   15 #> 31    88.3      4 1750 1750-04-02 06:00:00  blood   16 #> 32    88.3      4 1750 1750-04-02 06:00:00   bone   16 #> 33    90.0      5 1750 1750-05-02 16:00:00  blood   17 #> 34    90.0      5 1750 1750-05-02 16:00:00   bone   17 #> 35   100.0      6 1750 1750-06-02 02:00:01  blood   18 #> 36   100.0      6 1750 1750-06-02 02:00:01   bone   18 #> 37    85.4      7 1750 1750-07-02 12:00:00  blood   19 #> 38    85.4      7 1750 1750-07-02 12:00:00   bone   19 #> 39   103.0      8 1750 1750-08-01 22:00:00  blood   20 #> 40   103.0      8 1750 1750-08-01 22:00:00   bone   20 #> 41    91.2      9 1750 1750-09-01 08:00:01  blood   21 #> 42    91.2      9 1750 1750-09-01 08:00:01   bone   21 #> 43    65.7     10 1750 1750-10-01 18:00:00  blood   22 #> 44    65.7     10 1750 1750-10-01 18:00:00   bone   22 #> 45    63.3     11 1750 1750-11-01 04:00:00  blood   23 #> 46    63.3     11 1750 1750-11-01 04:00:00   bone   23 #> 47    75.4     12 1750 1750-12-01 14:00:01  blood   24 #> 48    75.4     12 1750 1750-12-01 14:00:01   bone   24 #> 49    70.0      1 1751 1751-01-01 00:00:00  blood   25 #> 50    70.0      1 1751 1751-01-01 00:00:00   bone   25 #> 51    43.5      2 1751 1751-01-31 10:00:00  blood   26 #> 52    43.5      2 1751 1751-01-31 10:00:00   bone   26 #> 53    45.3      3 1751 1751-03-02 20:00:01  blood   27 #> 54    45.3      3 1751 1751-03-02 20:00:01   bone   27 #> 55    56.4      4 1751 1751-04-02 06:00:00  blood   28 #> 56    56.4      4 1751 1751-04-02 06:00:00   bone   28 #> 57    60.7      5 1751 1751-05-02 16:00:00  blood   29 #> 58    60.7      5 1751 1751-05-02 16:00:00   bone   29 #> 59    50.7      6 1751 1751-06-02 02:00:01  blood   30 #> 60    50.7      6 1751 1751-06-02 02:00:01   bone   30 #> 61    66.3      7 1751 1751-07-02 12:00:00  blood   31 #> 62    66.3      7 1751 1751-07-02 12:00:00   bone   31 #> 63    59.8      8 1751 1751-08-01 22:00:00  blood   32 #> 64    59.8      8 1751 1751-08-01 22:00:00   bone   32 #> 65    23.5      9 1751 1751-09-01 08:00:01  blood   33 #> 66    23.5      9 1751 1751-09-01 08:00:01   bone   33 #> 67    23.2     10 1751 1751-10-01 18:00:00  blood   34 #> 68    23.2     10 1751 1751-10-01 18:00:00   bone   34 #> 69    28.5     11 1751 1751-11-01 04:00:00  blood   35 #> 70    28.5     11 1751 1751-11-01 04:00:00   bone   35 #> 71    44.0     12 1751 1751-12-01 14:00:01  blood   36 #> 72    44.0     12 1751 1751-12-01 14:00:01   bone   36 #> 73    35.0      1 1752 1752-01-01 00:00:00  blood   37 #> 74    35.0      1 1752 1752-01-01 00:00:00   bone   37 #> 75    50.0      2 1752 1752-01-31 12:00:00  blood   38 #> 76    50.0      2 1752 1752-01-31 12:00:00   bone   38 #> 77    71.0      3 1752 1752-03-02 00:00:01  blood   39 #> 78    71.0      3 1752 1752-03-02 00:00:01   bone   39 #> 79    59.3      4 1752 1752-04-01 12:00:00  blood   40 #> 80    59.3      4 1752 1752-04-01 12:00:00   bone   40 #> 81    59.7      5 1752 1752-05-02 00:00:00  blood   41 #> 82    59.7      5 1752 1752-05-02 00:00:00   bone   41 #> 83    39.6      6 1752 1752-06-01 12:00:01  blood   42 #> 84    39.6      6 1752 1752-06-01 12:00:01   bone   42 #> 85    78.4      7 1752 1752-07-02 00:00:00  blood   43 #> 86    78.4      7 1752 1752-07-02 00:00:00   bone   43 #> 87    29.3      8 1752 1752-08-01 12:00:00  blood   44 #> 88    29.3      8 1752 1752-08-01 12:00:00   bone   44 #> 89    27.1      9 1752 1752-09-01 00:00:01  blood   45 #> 90    27.1      9 1752 1752-09-01 00:00:01   bone   45 #> 91    46.6     10 1752 1752-10-01 12:00:00  blood   46 #> 92    46.6     10 1752 1752-10-01 12:00:00   bone   46 #> 93    37.6     11 1752 1752-11-01 00:00:00  blood   47 #> 94    37.6     11 1752 1752-11-01 00:00:00   bone   47 #> 95    40.0     12 1752 1752-12-01 12:00:01  blood   48 #> 96    40.0     12 1752 1752-12-01 12:00:01   bone   48 #> 97    44.0      1 1753 1753-01-01 00:00:00  blood   49 #> 98    44.0      1 1753 1753-01-01 00:00:00   bone   49 #> 99    32.0      2 1753 1753-01-31 10:00:00  blood   50 #> 100   32.0      2 1753 1753-01-31 10:00:00   bone   50 #> 101   45.7      3 1753 1753-03-02 20:00:01  blood   51 #> 102   45.7      3 1753 1753-03-02 20:00:01   bone   51 #> 103   38.0      4 1753 1753-04-02 06:00:00  blood   52 #> 104   38.0      4 1753 1753-04-02 06:00:00   bone   52 #> 105   36.0      5 1753 1753-05-02 16:00:00  blood   53 #> 106   36.0      5 1753 1753-05-02 16:00:00   bone   53 #> 107   31.7      6 1753 1753-06-02 02:00:01  blood   54 #> 108   31.7      6 1753 1753-06-02 02:00:01   bone   54 #> 109   22.2      7 1753 1753-07-02 12:00:00  blood   55 #> 110   22.2      7 1753 1753-07-02 12:00:00   bone   55 #> 111   39.0      8 1753 1753-08-01 22:00:00  blood   56 #> 112   39.0      8 1753 1753-08-01 22:00:00   bone   56 #> 113   28.0      9 1753 1753-09-01 08:00:01  blood   57 #> 114   28.0      9 1753 1753-09-01 08:00:01   bone   57 #> 115   25.0     10 1753 1753-10-01 18:00:00  blood   58 #> 116   25.0     10 1753 1753-10-01 18:00:00   bone   58 #> 117   20.0     11 1753 1753-11-01 04:00:00  blood   59 #> 118   20.0     11 1753 1753-11-01 04:00:00   bone   59 #> 119    6.7     12 1753 1753-12-01 14:00:01  blood   60 #> 120    6.7     12 1753 1753-12-01 14:00:01   bone   60 #> 121    0.0      1 1754 1754-01-01 00:00:00  blood   61 #> 122    0.0      1 1754 1754-01-01 00:00:00   bone   61 #> 123    3.0      2 1754 1754-01-31 10:00:00  blood   62 #> 124    3.0      2 1754 1754-01-31 10:00:00   bone   62 #> 125    1.7      3 1754 1754-03-02 20:00:01  blood   63 #> 126    1.7      3 1754 1754-03-02 20:00:01   bone   63 #> 127   13.7      4 1754 1754-04-02 06:00:00  blood   64 #> 128   13.7      4 1754 1754-04-02 06:00:00   bone   64 #> 129   20.7      5 1754 1754-05-02 16:00:00  blood   65 #> 130   20.7      5 1754 1754-05-02 16:00:00   bone   65 #> 131   26.7      6 1754 1754-06-02 02:00:01  blood   66 #> 132   26.7      6 1754 1754-06-02 02:00:01   bone   66 #> 133   18.8      7 1754 1754-07-02 12:00:00  blood   67 #> 134   18.8      7 1754 1754-07-02 12:00:00   bone   67 #> 135   12.3      8 1754 1754-08-01 22:00:00  blood   68 #> 136   12.3      8 1754 1754-08-01 22:00:00   bone   68 #> 137    8.2      9 1754 1754-09-01 08:00:01  blood   69 #> 138    8.2      9 1754 1754-09-01 08:00:01   bone   69 #> 139   24.1     10 1754 1754-10-01 18:00:00  blood   70 #> 140   24.1     10 1754 1754-10-01 18:00:00   bone   70 #> 141   13.2     11 1754 1754-11-01 04:00:00  blood   71 #> 142   13.2     11 1754 1754-11-01 04:00:00   bone   71 #> 143    4.2     12 1754 1754-12-01 14:00:01  blood   72 #> 144    4.2     12 1754 1754-12-01 14:00:01   bone   72 #> 145   10.2      1 1755 1755-01-01 00:00:00  blood   73 #> 146   10.2      1 1755 1755-01-01 00:00:00   bone   73 #> 147   11.2      2 1755 1755-01-31 10:00:00  blood   74 #> 148   11.2      2 1755 1755-01-31 10:00:00   bone   74 #> 149    6.8      3 1755 1755-03-02 20:00:01  blood   75 #> 150    6.8      3 1755 1755-03-02 20:00:01   bone   75 #> 151    6.5      4 1755 1755-04-02 06:00:00  blood   76 #> 152    6.5      4 1755 1755-04-02 06:00:00   bone   76 #> 153    0.0      5 1755 1755-05-02 16:00:00  blood   77 #> 154    0.0      5 1755 1755-05-02 16:00:00   bone   77 #> 155    0.0      6 1755 1755-06-02 02:00:01  blood   78 #> 156    0.0      6 1755 1755-06-02 02:00:01   bone   78 #> 157    8.6      7 1755 1755-07-02 12:00:00  blood   79 #> 158    8.6      7 1755 1755-07-02 12:00:00   bone   79 #> 159    3.2      8 1755 1755-08-01 22:00:00  blood   80 #> 160    3.2      8 1755 1755-08-01 22:00:00   bone   80 #> 161   17.8      9 1755 1755-09-01 08:00:01  blood   81 #> 162   17.8      9 1755 1755-09-01 08:00:01   bone   81 #> 163   23.7     10 1755 1755-10-01 18:00:00  blood   82 #> 164   23.7     10 1755 1755-10-01 18:00:00   bone   82 #> 165    6.8     11 1755 1755-11-01 04:00:00  blood   83 #> 166    6.8     11 1755 1755-11-01 04:00:00   bone   83 #> 167   20.0     12 1755 1755-12-01 14:00:01  blood   84 #> 168   20.0     12 1755 1755-12-01 14:00:01   bone   84 #> 169   12.5      1 1756 1756-01-01 00:00:00  blood   85 #> 170   12.5      1 1756 1756-01-01 00:00:00   bone   85 #> 171    7.1      2 1756 1756-01-31 12:00:00  blood   86 #> 172    7.1      2 1756 1756-01-31 12:00:00   bone   86 #> 173    5.4      3 1756 1756-03-02 00:00:01  blood   87 #> 174    5.4      3 1756 1756-03-02 00:00:01   bone   87 #> 175    9.4      4 1756 1756-04-01 12:00:00  blood   88 #> 176    9.4      4 1756 1756-04-01 12:00:00   bone   88 #> 177   12.5      5 1756 1756-05-02 00:00:00  blood   89 #> 178   12.5      5 1756 1756-05-02 00:00:00   bone   89 #> 179   12.9      6 1756 1756-06-01 12:00:01  blood   90 #> 180   12.9      6 1756 1756-06-01 12:00:01   bone   90 #> 181    3.6      7 1756 1756-07-02 00:00:00  blood   91 #> 182    3.6      7 1756 1756-07-02 00:00:00   bone   91 #> 183    6.4      8 1756 1756-08-01 12:00:00  blood   92 #> 184    6.4      8 1756 1756-08-01 12:00:00   bone   92 #> 185   11.8      9 1756 1756-09-01 00:00:01  blood   93 #> 186   11.8      9 1756 1756-09-01 00:00:01   bone   93 #> 187   14.3     10 1756 1756-10-01 12:00:00  blood   94 #> 188   14.3     10 1756 1756-10-01 12:00:00   bone   94 #> 189   17.0     11 1756 1756-11-01 00:00:00  blood   95 #> 190   17.0     11 1756 1756-11-01 00:00:00   bone   95 #> 191    9.4     12 1756 1756-12-01 12:00:01  blood   96 #> 192    9.4     12 1756 1756-12-01 12:00:01   bone   96 #> 193   14.1      1 1757 1757-01-01 00:00:00  blood   97 #> 194   14.1      1 1757 1757-01-01 00:00:00   bone   97 #> 195   21.2      2 1757 1757-01-31 10:00:00  blood   98 #> 196   21.2      2 1757 1757-01-31 10:00:00   bone   98 #> 197   26.2      3 1757 1757-03-02 20:00:01  blood   99 #> 198   26.2      3 1757 1757-03-02 20:00:01   bone   99 #> 199   30.0      4 1757 1757-04-02 06:00:00  blood  100 #> 200   30.0      4 1757 1757-04-02 06:00:00   bone  100 #> 201   38.1      5 1757 1757-05-02 16:00:00  blood  101 #> 202   38.1      5 1757 1757-05-02 16:00:00   bone  101 #> 203   12.8      6 1757 1757-06-02 02:00:01  blood  102 #> 204   12.8      6 1757 1757-06-02 02:00:01   bone  102 #> 205   25.0      7 1757 1757-07-02 12:00:00  blood  103 #> 206   25.0      7 1757 1757-07-02 12:00:00   bone  103 #> 207   51.3      8 1757 1757-08-01 22:00:00  blood  104 #> 208   51.3      8 1757 1757-08-01 22:00:00   bone  104 #> 209   39.7      9 1757 1757-09-01 08:00:01  blood  105 #> 210   39.7      9 1757 1757-09-01 08:00:01   bone  105 #> 211   32.5     10 1757 1757-10-01 18:00:00  blood  106 #> 212   32.5     10 1757 1757-10-01 18:00:00   bone  106 #> 213   64.7     11 1757 1757-11-01 04:00:00  blood  107 #> 214   64.7     11 1757 1757-11-01 04:00:00   bone  107 #> 215   33.5     12 1757 1757-12-01 14:00:01  blood  108 #> 216   33.5     12 1757 1757-12-01 14:00:01   bone  108 #> 217   37.6      1 1758 1758-01-01 00:00:00  blood  109 #> 218   37.6      1 1758 1758-01-01 00:00:00   bone  109 #> 219   52.0      2 1758 1758-01-31 10:00:00  blood  110 #> 220   52.0      2 1758 1758-01-31 10:00:00   bone  110 #> 221   49.0      3 1758 1758-03-02 20:00:01  blood  111 #> 222   49.0      3 1758 1758-03-02 20:00:01   bone  111 #> 223   72.3      4 1758 1758-04-02 06:00:00  blood  112 #> 224   72.3      4 1758 1758-04-02 06:00:00   bone  112 #> 225   46.4      5 1758 1758-05-02 16:00:00  blood  113 #> 226   46.4      5 1758 1758-05-02 16:00:00   bone  113 #> 227   45.0      6 1758 1758-06-02 02:00:01  blood  114 #> 228   45.0      6 1758 1758-06-02 02:00:01   bone  114 #> 229   44.0      7 1758 1758-07-02 12:00:00  blood  115 #> 230   44.0      7 1758 1758-07-02 12:00:00   bone  115 #> 231   38.7      8 1758 1758-08-01 22:00:00  blood  116 #> 232   38.7      8 1758 1758-08-01 22:00:00   bone  116 #> 233   62.5      9 1758 1758-09-01 08:00:01  blood  117 #> 234   62.5      9 1758 1758-09-01 08:00:01   bone  117 #> 235   37.7     10 1758 1758-10-01 18:00:00  blood  118 #> 236   37.7     10 1758 1758-10-01 18:00:00   bone  118 #> 237   43.0     11 1758 1758-11-01 04:00:00  blood  119 #> 238   43.0     11 1758 1758-11-01 04:00:00   bone  119 #> 239   43.0     12 1758 1758-12-01 14:00:01  blood  120 #> 240   43.0     12 1758 1758-12-01 14:00:01   bone  120 #> 241   48.3      1 1759 1759-01-01 00:00:00  blood  121 #> 242   48.3      1 1759 1759-01-01 00:00:00   bone  121 #> 243   44.0      2 1759 1759-01-31 10:00:00  blood  122 #> 244   44.0      2 1759 1759-01-31 10:00:00   bone  122 #> 245   46.8      3 1759 1759-03-02 20:00:01  blood  123 #> 246   46.8      3 1759 1759-03-02 20:00:01   bone  123 #> 247   47.0      4 1759 1759-04-02 06:00:00  blood  124 #> 248   47.0      4 1759 1759-04-02 06:00:00   bone  124 #> 249   49.0      5 1759 1759-05-02 16:00:00  blood  125 #> 250   49.0      5 1759 1759-05-02 16:00:00   bone  125 #> 251   50.0      6 1759 1759-06-02 02:00:01  blood  126 #> 252   50.0      6 1759 1759-06-02 02:00:01   bone  126 #> 253   51.0      7 1759 1759-07-02 12:00:00  blood  127 #> 254   51.0      7 1759 1759-07-02 12:00:00   bone  127 #> 255   71.3      8 1759 1759-08-01 22:00:00  blood  128 #> 256   71.3      8 1759 1759-08-01 22:00:00   bone  128 #> 257   77.2      9 1759 1759-09-01 08:00:01  blood  129 #> 258   77.2      9 1759 1759-09-01 08:00:01   bone  129 #> 259   59.7     10 1759 1759-10-01 18:00:00  blood  130 #> 260   59.7     10 1759 1759-10-01 18:00:00   bone  130 #> 261   46.3     11 1759 1759-11-01 04:00:00  blood  131 #> 262   46.3     11 1759 1759-11-01 04:00:00   bone  131 #> 263   57.0     12 1759 1759-12-01 14:00:01  blood  132 #> 264   57.0     12 1759 1759-12-01 14:00:01   bone  132 #> 265   67.3      1 1760 1760-01-01 00:00:00  blood  133 #> 266   67.3      1 1760 1760-01-01 00:00:00   bone  133 #> 267   59.5      2 1760 1760-01-31 12:00:00  blood  134 #> 268   59.5      2 1760 1760-01-31 12:00:00   bone  134 #> 269   74.7      3 1760 1760-03-02 00:00:01  blood  135 #> 270   74.7      3 1760 1760-03-02 00:00:01   bone  135 #> 271   58.3      4 1760 1760-04-01 12:00:00  blood  136 #> 272   58.3      4 1760 1760-04-01 12:00:00   bone  136 #> 273   72.0      5 1760 1760-05-02 00:00:00  blood  137 #> 274   72.0      5 1760 1760-05-02 00:00:00   bone  137 #> 275   48.3      6 1760 1760-06-01 12:00:01  blood  138 #> 276   48.3      6 1760 1760-06-01 12:00:01   bone  138 #> 277   66.0      7 1760 1760-07-02 00:00:00  blood  139 #> 278   66.0      7 1760 1760-07-02 00:00:00   bone  139 #> 279   75.6      8 1760 1760-08-01 12:00:00  blood  140 #> 280   75.6      8 1760 1760-08-01 12:00:00   bone  140 #> 281   61.3      9 1760 1760-09-01 00:00:01  blood  141 #> 282   61.3      9 1760 1760-09-01 00:00:01   bone  141 #> 283   50.6     10 1760 1760-10-01 12:00:00  blood  142 #> 284   50.6     10 1760 1760-10-01 12:00:00   bone  142 #> 285   59.7     11 1760 1760-11-01 00:00:00  blood  143 #> 286   59.7     11 1760 1760-11-01 00:00:00   bone  143 #> 287   61.0     12 1760 1760-12-01 12:00:01  blood  144 #> 288   61.0     12 1760 1760-12-01 12:00:01   bone  144 #> 289   70.0      1 1761 1761-01-01 00:00:00  blood  145 #> 290   70.0      1 1761 1761-01-01 00:00:00   bone  145 #> 291   91.0      2 1761 1761-01-31 10:00:00  blood  146 #> 292   91.0      2 1761 1761-01-31 10:00:00   bone  146 #> 293   80.7      3 1761 1761-03-02 20:00:01  blood  147 #> 294   80.7      3 1761 1761-03-02 20:00:01   bone  147 #> 295   71.7      4 1761 1761-04-02 06:00:00  blood  148 #> 296   71.7      4 1761 1761-04-02 06:00:00   bone  148 #> 297  107.2      5 1761 1761-05-02 16:00:00  blood  149 #> 298  107.2      5 1761 1761-05-02 16:00:00   bone  149 #> 299   99.3      6 1761 1761-06-02 02:00:01  blood  150 #> 300   99.3      6 1761 1761-06-02 02:00:01   bone  150 #> 301   94.1      7 1761 1761-07-02 12:00:00  blood  151 #> 302   94.1      7 1761 1761-07-02 12:00:00   bone  151 #> 303   91.1      8 1761 1761-08-01 22:00:00  blood  152 #> 304   91.1      8 1761 1761-08-01 22:00:00   bone  152 #> 305  100.7      9 1761 1761-09-01 08:00:01  blood  153 #> 306  100.7      9 1761 1761-09-01 08:00:01   bone  153 #> 307   88.7     10 1761 1761-10-01 18:00:00  blood  154 #> 308   88.7     10 1761 1761-10-01 18:00:00   bone  154 #> 309   89.7     11 1761 1761-11-01 04:00:00  blood  155 #> 310   89.7     11 1761 1761-11-01 04:00:00   bone  155 #> 311   46.0     12 1761 1761-12-01 14:00:01  blood  156 #> 312   46.0     12 1761 1761-12-01 14:00:01   bone  156 #> 313   43.8      1 1762 1762-01-01 00:00:00  blood  157 #> 314   43.8      1 1762 1762-01-01 00:00:00   bone  157 #> 315   72.8      2 1762 1762-01-31 10:00:00  blood  158 #> 316   72.8      2 1762 1762-01-31 10:00:00   bone  158 #> 317   45.7      3 1762 1762-03-02 20:00:01  blood  159 #> 318   45.7      3 1762 1762-03-02 20:00:01   bone  159 #> 319   60.2      4 1762 1762-04-02 06:00:00  blood  160 #> 320   60.2      4 1762 1762-04-02 06:00:00   bone  160 #> 321   39.9      5 1762 1762-05-02 16:00:00  blood  161 #> 322   39.9      5 1762 1762-05-02 16:00:00   bone  161 #> 323   77.1      6 1762 1762-06-02 02:00:01  blood  162 #> 324   77.1      6 1762 1762-06-02 02:00:01   bone  162 #> 325   33.8      7 1762 1762-07-02 12:00:00  blood  163 #> 326   33.8      7 1762 1762-07-02 12:00:00   bone  163 #> 327   67.7      8 1762 1762-08-01 22:00:00  blood  164 #> 328   67.7      8 1762 1762-08-01 22:00:00   bone  164 #> 329   68.5      9 1762 1762-09-01 08:00:01  blood  165 #> 330   68.5      9 1762 1762-09-01 08:00:01   bone  165 #> 331   69.3     10 1762 1762-10-01 18:00:00  blood  166 #> 332   69.3     10 1762 1762-10-01 18:00:00   bone  166 #> 333   77.8     11 1762 1762-11-01 04:00:00  blood  167 #> 334   77.8     11 1762 1762-11-01 04:00:00   bone  167 #> 335   77.2     12 1762 1762-12-01 14:00:01  blood  168 #> 336   77.2     12 1762 1762-12-01 14:00:01   bone  168 #> 337   56.5      1 1763 1763-01-01 00:00:00  blood  169 #> 338   56.5      1 1763 1763-01-01 00:00:00   bone  169 #> 339   31.9      2 1763 1763-01-31 10:00:00  blood  170 #> 340   31.9      2 1763 1763-01-31 10:00:00   bone  170 #> 341   34.2      3 1763 1763-03-02 20:00:01  blood  171 #> 342   34.2      3 1763 1763-03-02 20:00:01   bone  171 #> 343   32.9      4 1763 1763-04-02 06:00:00  blood  172 #> 344   32.9      4 1763 1763-04-02 06:00:00   bone  172 #> 345   32.7      5 1763 1763-05-02 16:00:00  blood  173 #> 346   32.7      5 1763 1763-05-02 16:00:00   bone  173 #> 347   35.8      6 1763 1763-06-02 02:00:01  blood  174 #> 348   35.8      6 1763 1763-06-02 02:00:01   bone  174 #> 349   54.2      7 1763 1763-07-02 12:00:00  blood  175 #> 350   54.2      7 1763 1763-07-02 12:00:00   bone  175 #> 351   26.5      8 1763 1763-08-01 22:00:00  blood  176 #> 352   26.5      8 1763 1763-08-01 22:00:00   bone  176 #> 353   68.1      9 1763 1763-09-01 08:00:01  blood  177 #> 354   68.1      9 1763 1763-09-01 08:00:01   bone  177 #> 355   46.3     10 1763 1763-10-01 18:00:00  blood  178 #> 356   46.3     10 1763 1763-10-01 18:00:00   bone  178 #> 357   60.9     11 1763 1763-11-01 04:00:00  blood  179 #> 358   60.9     11 1763 1763-11-01 04:00:00   bone  179 #> 359   61.4     12 1763 1763-12-01 14:00:01  blood  180 #> 360   61.4     12 1763 1763-12-01 14:00:01   bone  180 #> 361   59.7      1 1764 1764-01-01 00:00:00  blood  181 #> 362   59.7      1 1764 1764-01-01 00:00:00   bone  181 #> 363   59.7      2 1764 1764-01-31 12:00:00  blood  182 #> 364   59.7      2 1764 1764-01-31 12:00:00   bone  182 #> 365   40.2      3 1764 1764-03-02 00:00:01  blood  183 #> 366   40.2      3 1764 1764-03-02 00:00:01   bone  183 #> 367   34.4      4 1764 1764-04-01 12:00:00  blood  184 #> 368   34.4      4 1764 1764-04-01 12:00:00   bone  184 #> 369   44.3      5 1764 1764-05-02 00:00:00  blood  185 #> 370   44.3      5 1764 1764-05-02 00:00:00   bone  185 #> 371   30.0      6 1764 1764-06-01 12:00:01  blood  186 #> 372   30.0      6 1764 1764-06-01 12:00:01   bone  186 #> 373   30.0      7 1764 1764-07-02 00:00:00  blood  187 #> 374   30.0      7 1764 1764-07-02 00:00:00   bone  187 #> 375   30.0      8 1764 1764-08-01 12:00:00  blood  188 #> 376   30.0      8 1764 1764-08-01 12:00:00   bone  188 #> 377   28.2      9 1764 1764-09-01 00:00:01  blood  189 #> 378   28.2      9 1764 1764-09-01 00:00:01   bone  189 #> 379   28.0     10 1764 1764-10-01 12:00:00  blood  190 #> 380   28.0     10 1764 1764-10-01 12:00:00   bone  190 #> 381   26.0     11 1764 1764-11-01 00:00:00  blood  191 #> 382   26.0     11 1764 1764-11-01 00:00:00   bone  191 #> 383   25.7     12 1764 1764-12-01 12:00:01  blood  192 #> 384   25.7     12 1764 1764-12-01 12:00:01   bone  192 #> 385   24.0      1 1765 1765-01-01 00:00:00  blood  193 #> 386   24.0      1 1765 1765-01-01 00:00:00   bone  193 #> 387   26.0      2 1765 1765-01-31 10:00:00  blood  194 #> 388   26.0      2 1765 1765-01-31 10:00:00   bone  194 #> 389   25.0      3 1765 1765-03-02 20:00:01  blood  195 #> 390   25.0      3 1765 1765-03-02 20:00:01   bone  195 #> 391   22.0      4 1765 1765-04-02 06:00:00  blood  196 #> 392   22.0      4 1765 1765-04-02 06:00:00   bone  196 #> 393   20.2      5 1765 1765-05-02 16:00:00  blood  197 #> 394   20.2      5 1765 1765-05-02 16:00:00   bone  197 #> 395   20.0      6 1765 1765-06-02 02:00:01  blood  198 #> 396   20.0      6 1765 1765-06-02 02:00:01   bone  198 #> 397   27.0      7 1765 1765-07-02 12:00:00  blood  199 #> 398   27.0      7 1765 1765-07-02 12:00:00   bone  199 #> 399   29.7      8 1765 1765-08-01 22:00:00  blood  200 #> 400   29.7      8 1765 1765-08-01 22:00:00   bone  200 #> 401   16.0      9 1765 1765-09-01 08:00:01  blood  201 #> 402   16.0      9 1765 1765-09-01 08:00:01   bone  201 #> 403   14.0     10 1765 1765-10-01 18:00:00  blood  202 #> 404   14.0     10 1765 1765-10-01 18:00:00   bone  202 #> 405   14.0     11 1765 1765-11-01 04:00:00  blood  203 #> 406   14.0     11 1765 1765-11-01 04:00:00   bone  203 #> 407   13.0     12 1765 1765-12-01 14:00:01  blood  204 #> 408   13.0     12 1765 1765-12-01 14:00:01   bone  204 #> 409   12.0      1 1766 1766-01-01 00:00:00  blood  205 #> 410   12.0      1 1766 1766-01-01 00:00:00   bone  205 #> 411   11.0      2 1766 1766-01-31 10:00:00  blood  206 #> 412   11.0      2 1766 1766-01-31 10:00:00   bone  206 #> 413   36.6      3 1766 1766-03-02 20:00:01  blood  207 #> 414   36.6      3 1766 1766-03-02 20:00:01   bone  207 #> 415    6.0      4 1766 1766-04-02 06:00:00  blood  208 #> 416    6.0      4 1766 1766-04-02 06:00:00   bone  208 #> 417   26.8      5 1766 1766-05-02 16:00:00  blood  209 #> 418   26.8      5 1766 1766-05-02 16:00:00   bone  209 #> 419    3.0      6 1766 1766-06-02 02:00:01  blood  210 #> 420    3.0      6 1766 1766-06-02 02:00:01   bone  210 #> 421    3.3      7 1766 1766-07-02 12:00:00  blood  211 #> 422    3.3      7 1766 1766-07-02 12:00:00   bone  211 #> 423    4.0      8 1766 1766-08-01 22:00:00  blood  212 #> 424    4.0      8 1766 1766-08-01 22:00:00   bone  212 #> 425    4.3      9 1766 1766-09-01 08:00:01  blood  213 #> 426    4.3      9 1766 1766-09-01 08:00:01   bone  213 #> 427    5.0     10 1766 1766-10-01 18:00:00  blood  214 #> 428    5.0     10 1766 1766-10-01 18:00:00   bone  214 #> 429    5.7     11 1766 1766-11-01 04:00:00  blood  215 #> 430    5.7     11 1766 1766-11-01 04:00:00   bone  215 #> 431   19.2     12 1766 1766-12-01 14:00:01  blood  216 #> 432   19.2     12 1766 1766-12-01 14:00:01   bone  216 #> 433   27.4      1 1767 1767-01-01 00:00:00  blood  217 #> 434   27.4      1 1767 1767-01-01 00:00:00   bone  217 #> 435   30.0      2 1767 1767-01-31 10:00:00  blood  218 #> 436   30.0      2 1767 1767-01-31 10:00:00   bone  218 #> 437   43.0      3 1767 1767-03-02 20:00:01  blood  219 #> 438   43.0      3 1767 1767-03-02 20:00:01   bone  219 #> 439   32.9      4 1767 1767-04-02 06:00:00  blood  220 #> 440   32.9      4 1767 1767-04-02 06:00:00   bone  220 #> 441   29.8      5 1767 1767-05-02 16:00:00  blood  221 #> 442   29.8      5 1767 1767-05-02 16:00:00   bone  221 #> 443   33.3      6 1767 1767-06-02 02:00:01  blood  222 #> 444   33.3      6 1767 1767-06-02 02:00:01   bone  222 #> 445   21.9      7 1767 1767-07-02 12:00:00  blood  223 #> 446   21.9      7 1767 1767-07-02 12:00:00   bone  223 #> 447   40.8      8 1767 1767-08-01 22:00:00  blood  224 #> 448   40.8      8 1767 1767-08-01 22:00:00   bone  224 #> 449   42.7      9 1767 1767-09-01 08:00:01  blood  225 #> 450   42.7      9 1767 1767-09-01 08:00:01   bone  225 #> 451   44.1     10 1767 1767-10-01 18:00:00  blood  226 #> 452   44.1     10 1767 1767-10-01 18:00:00   bone  226 #> 453   54.7     11 1767 1767-11-01 04:00:00  blood  227 #> 454   54.7     11 1767 1767-11-01 04:00:00   bone  227 #> 455   53.3     12 1767 1767-12-01 14:00:01  blood  228 #> 456   53.3     12 1767 1767-12-01 14:00:01   bone  228 #> 457   53.5      1 1768 1768-01-01 00:00:00  blood  229 #> 458   53.5      1 1768 1768-01-01 00:00:00   bone  229 #> 459   66.1      2 1768 1768-01-31 12:00:00  blood  230 #> 460   66.1      2 1768 1768-01-31 12:00:00   bone  230 #> 461   46.3      3 1768 1768-03-02 00:00:01  blood  231 #> 462   46.3      3 1768 1768-03-02 00:00:01   bone  231 #> 463   42.7      4 1768 1768-04-01 12:00:00  blood  232 #> 464   42.7      4 1768 1768-04-01 12:00:00   bone  232 #> 465   77.7      5 1768 1768-05-02 00:00:00  blood  233 #> 466   77.7      5 1768 1768-05-02 00:00:00   bone  233 #> 467   77.4      6 1768 1768-06-01 12:00:01  blood  234 #> 468   77.4      6 1768 1768-06-01 12:00:01   bone  234 #> 469   52.6      7 1768 1768-07-02 00:00:00  blood  235 #> 470   52.6      7 1768 1768-07-02 00:00:00   bone  235 #> 471   66.8      8 1768 1768-08-01 12:00:00  blood  236 #> 472   66.8      8 1768 1768-08-01 12:00:00   bone  236 #> 473   74.8      9 1768 1768-09-01 00:00:01  blood  237 #> 474   74.8      9 1768 1768-09-01 00:00:01   bone  237 #> 475   77.8     10 1768 1768-10-01 12:00:00  blood  238 #> 476   77.8     10 1768 1768-10-01 12:00:00   bone  238 #> 477   90.6     11 1768 1768-11-01 00:00:00  blood  239 #> 478   90.6     11 1768 1768-11-01 00:00:00   bone  239 #> 479  111.8     12 1768 1768-12-01 12:00:01  blood  240 #> 480  111.8     12 1768 1768-12-01 12:00:01   bone  240 #> 481   73.9      1 1769 1769-01-01 00:00:00  blood  241 #> 482   73.9      1 1769 1769-01-01 00:00:00   bone  241 #> 483   64.2      2 1769 1769-01-31 10:00:00  blood  242 #> 484   64.2      2 1769 1769-01-31 10:00:00   bone  242 #> 485   64.3      3 1769 1769-03-02 20:00:01  blood  243 #> 486   64.3      3 1769 1769-03-02 20:00:01   bone  243 #> 487   96.7      4 1769 1769-04-02 06:00:00  blood  244 #> 488   96.7      4 1769 1769-04-02 06:00:00   bone  244 #> 489   73.6      5 1769 1769-05-02 16:00:00  blood  245 #> 490   73.6      5 1769 1769-05-02 16:00:00   bone  245 #> 491   94.4      6 1769 1769-06-02 02:00:01  blood  246 #> 492   94.4      6 1769 1769-06-02 02:00:01   bone  246 #> 493  118.6      7 1769 1769-07-02 12:00:00  blood  247 #> 494  118.6      7 1769 1769-07-02 12:00:00   bone  247 #> 495  120.3      8 1769 1769-08-01 22:00:00  blood  248 #> 496  120.3      8 1769 1769-08-01 22:00:00   bone  248 #> 497  148.8      9 1769 1769-09-01 08:00:01  blood  249 #> 498  148.8      9 1769 1769-09-01 08:00:01   bone  249 #> 499  158.2     10 1769 1769-10-01 18:00:00  blood  250 #> 500  158.2     10 1769 1769-10-01 18:00:00   bone  250 #> 501  148.1     11 1769 1769-11-01 04:00:00  blood  251 #> 502  148.1     11 1769 1769-11-01 04:00:00   bone  251 #> 503  112.0     12 1769 1769-12-01 14:00:01  blood  252 #> 504  112.0     12 1769 1769-12-01 14:00:01   bone  252 #> 505  104.0      1 1770 1770-01-01 00:00:00  blood  253 #> 506  104.0      1 1770 1770-01-01 00:00:00   bone  253 #> 507  142.5      2 1770 1770-01-31 10:00:00  blood  254 #> 508  142.5      2 1770 1770-01-31 10:00:00   bone  254 #> 509   80.1      3 1770 1770-03-02 20:00:01  blood  255 #> 510   80.1      3 1770 1770-03-02 20:00:01   bone  255 #> 511   51.0      4 1770 1770-04-02 06:00:00  blood  256 #> 512   51.0      4 1770 1770-04-02 06:00:00   bone  256 #> 513   70.1      5 1770 1770-05-02 16:00:00  blood  257 #> 514   70.1      5 1770 1770-05-02 16:00:00   bone  257 #> 515   83.3      6 1770 1770-06-02 02:00:01  blood  258 #> 516   83.3      6 1770 1770-06-02 02:00:01   bone  258 #> 517  109.8      7 1770 1770-07-02 12:00:00  blood  259 #> 518  109.8      7 1770 1770-07-02 12:00:00   bone  259 #> 519  126.3      8 1770 1770-08-01 22:00:00  blood  260 #> 520  126.3      8 1770 1770-08-01 22:00:00   bone  260 #> 521  104.4      9 1770 1770-09-01 08:00:01  blood  261 #> 522  104.4      9 1770 1770-09-01 08:00:01   bone  261 #> 523  103.6     10 1770 1770-10-01 18:00:00  blood  262 #> 524  103.6     10 1770 1770-10-01 18:00:00   bone  262 #> 525  132.2     11 1770 1770-11-01 04:00:00  blood  263 #> 526  132.2     11 1770 1770-11-01 04:00:00   bone  263 #> 527  102.3     12 1770 1770-12-01 14:00:01  blood  264 #> 528  102.3     12 1770 1770-12-01 14:00:01   bone  264 #> 529   36.0      1 1771 1771-01-01 00:00:00  blood  265 #> 530   36.0      1 1771 1771-01-01 00:00:00   bone  265 #> 531   46.2      2 1771 1771-01-31 10:00:00  blood  266 #> 532   46.2      2 1771 1771-01-31 10:00:00   bone  266 #> 533   46.7      3 1771 1771-03-02 20:00:01  blood  267 #> 534   46.7      3 1771 1771-03-02 20:00:01   bone  267 #> 535   64.9      4 1771 1771-04-02 06:00:00  blood  268 #> 536   64.9      4 1771 1771-04-02 06:00:00   bone  268 #> 537  152.7      5 1771 1771-05-02 16:00:00  blood  269 #> 538  152.7      5 1771 1771-05-02 16:00:00   bone  269 #> 539  119.5      6 1771 1771-06-02 02:00:01  blood  270 #> 540  119.5      6 1771 1771-06-02 02:00:01   bone  270 #> 541   67.7      7 1771 1771-07-02 12:00:00  blood  271 #> 542   67.7      7 1771 1771-07-02 12:00:00   bone  271 #> 543   58.5      8 1771 1771-08-01 22:00:00  blood  272 #> 544   58.5      8 1771 1771-08-01 22:00:00   bone  272 #> 545  101.4      9 1771 1771-09-01 08:00:01  blood  273 #> 546  101.4      9 1771 1771-09-01 08:00:01   bone  273 #> 547   90.0     10 1771 1771-10-01 18:00:00  blood  274 #> 548   90.0     10 1771 1771-10-01 18:00:00   bone  274 #> 549   99.7     11 1771 1771-11-01 04:00:00  blood  275 #> 550   99.7     11 1771 1771-11-01 04:00:00   bone  275 #> 551   95.7     12 1771 1771-12-01 14:00:01  blood  276 #> 552   95.7     12 1771 1771-12-01 14:00:01   bone  276 #> 553  100.9      1 1772 1772-01-01 00:00:00  blood  277 #> 554  100.9      1 1772 1772-01-01 00:00:00   bone  277 #> 555   90.8      2 1772 1772-01-31 12:00:00  blood  278 #> 556   90.8      2 1772 1772-01-31 12:00:00   bone  278 #> 557   31.1      3 1772 1772-03-02 00:00:01  blood  279 #> 558   31.1      3 1772 1772-03-02 00:00:01   bone  279 #> 559   92.2      4 1772 1772-04-01 12:00:00  blood  280 #> 560   92.2      4 1772 1772-04-01 12:00:00   bone  280 #> 561   38.0      5 1772 1772-05-02 00:00:00  blood  281 #> 562   38.0      5 1772 1772-05-02 00:00:00   bone  281 #> 563   57.0      6 1772 1772-06-01 12:00:01  blood  282 #> 564   57.0      6 1772 1772-06-01 12:00:01   bone  282 #> 565   77.3      7 1772 1772-07-02 00:00:00  blood  283 #> 566   77.3      7 1772 1772-07-02 00:00:00   bone  283 #> 567   56.2      8 1772 1772-08-01 12:00:00  blood  284 #> 568   56.2      8 1772 1772-08-01 12:00:00   bone  284 #> 569   50.5      9 1772 1772-09-01 00:00:01  blood  285 #> 570   50.5      9 1772 1772-09-01 00:00:01   bone  285 #> 571   78.6     10 1772 1772-10-01 12:00:00  blood  286 #> 572   78.6     10 1772 1772-10-01 12:00:00   bone  286 #> 573   61.3     11 1772 1772-11-01 00:00:00  blood  287 #> 574   61.3     11 1772 1772-11-01 00:00:00   bone  287 #> 575   64.0     12 1772 1772-12-01 12:00:01  blood  288 #> 576   64.0     12 1772 1772-12-01 12:00:01   bone  288 #> 577   54.6      1 1773 1773-01-01 00:00:00  blood  289 #> 578   54.6      1 1773 1773-01-01 00:00:00   bone  289 #> 579   29.0      2 1773 1773-01-31 10:00:00  blood  290 #> 580   29.0      2 1773 1773-01-31 10:00:00   bone  290 #> 581   51.2      3 1773 1773-03-02 20:00:01  blood  291 #> 582   51.2      3 1773 1773-03-02 20:00:01   bone  291 #> 583   32.9      4 1773 1773-04-02 06:00:00  blood  292 #> 584   32.9      4 1773 1773-04-02 06:00:00   bone  292 #> 585   41.1      5 1773 1773-05-02 16:00:00  blood  293 #> 586   41.1      5 1773 1773-05-02 16:00:00   bone  293 #> 587   28.4      6 1773 1773-06-02 02:00:01  blood  294 #> 588   28.4      6 1773 1773-06-02 02:00:01   bone  294 #> 589   27.7      7 1773 1773-07-02 12:00:00  blood  295 #> 590   27.7      7 1773 1773-07-02 12:00:00   bone  295 #> 591   12.7      8 1773 1773-08-01 22:00:00  blood  296 #> 592   12.7      8 1773 1773-08-01 22:00:00   bone  296 #> 593   29.3      9 1773 1773-09-01 08:00:01  blood  297 #> 594   29.3      9 1773 1773-09-01 08:00:01   bone  297 #> 595   26.3     10 1773 1773-10-01 18:00:00  blood  298 #> 596   26.3     10 1773 1773-10-01 18:00:00   bone  298 #> 597   40.9     11 1773 1773-11-01 04:00:00  blood  299 #> 598   40.9     11 1773 1773-11-01 04:00:00   bone  299 #> 599   43.2     12 1773 1773-12-01 14:00:01  blood  300 #> 600   43.2     12 1773 1773-12-01 14:00:01   bone  300 #> 601   46.8      1 1774 1774-01-01 00:00:00  blood  301 #> 602   46.8      1 1774 1774-01-01 00:00:00   bone  301 #> 603   65.4      2 1774 1774-01-31 10:00:00  blood  302 #> 604   65.4      2 1774 1774-01-31 10:00:00   bone  302 #> 605   55.7      3 1774 1774-03-02 20:00:01  blood  303 #> 606   55.7      3 1774 1774-03-02 20:00:01   bone  303 #> 607   43.8      4 1774 1774-04-02 06:00:00  blood  304 #> 608   43.8      4 1774 1774-04-02 06:00:00   bone  304 #> 609   51.3      5 1774 1774-05-02 16:00:00  blood  305 #> 610   51.3      5 1774 1774-05-02 16:00:00   bone  305 #> 611   28.5      6 1774 1774-06-02 02:00:01  blood  306 #> 612   28.5      6 1774 1774-06-02 02:00:01   bone  306 #> 613   17.5      7 1774 1774-07-02 12:00:00  blood  307 #> 614   17.5      7 1774 1774-07-02 12:00:00   bone  307 #> 615    6.6      8 1774 1774-08-01 22:00:00  blood  308 #> 616    6.6      8 1774 1774-08-01 22:00:00   bone  308 #> 617    7.9      9 1774 1774-09-01 08:00:01  blood  309 #> 618    7.9      9 1774 1774-09-01 08:00:01   bone  309 #> 619   14.0     10 1774 1774-10-01 18:00:00  blood  310 #> 620   14.0     10 1774 1774-10-01 18:00:00   bone  310 #> 621   17.7     11 1774 1774-11-01 04:00:00  blood  311 #> 622   17.7     11 1774 1774-11-01 04:00:00   bone  311 #> 623   12.2     12 1774 1774-12-01 14:00:01  blood  312 #> 624   12.2     12 1774 1774-12-01 14:00:01   bone  312 #> 625    4.4      1 1775 1775-01-01 00:00:00  blood  313 #> 626    4.4      1 1775 1775-01-01 00:00:00   bone  313 #> 627    0.0      2 1775 1775-01-31 10:00:00  blood  314 #> 628    0.0      2 1775 1775-01-31 10:00:00   bone  314 #> 629   11.6      3 1775 1775-03-02 20:00:01  blood  315 #> 630   11.6      3 1775 1775-03-02 20:00:01   bone  315 #> 631   11.2      4 1775 1775-04-02 06:00:00  blood  316 #> 632   11.2      4 1775 1775-04-02 06:00:00   bone  316 #> 633    3.9      5 1775 1775-05-02 16:00:00  blood  317 #> 634    3.9      5 1775 1775-05-02 16:00:00   bone  317 #> 635   12.3      6 1775 1775-06-02 02:00:01  blood  318 #> 636   12.3      6 1775 1775-06-02 02:00:01   bone  318 #> 637    1.0      7 1775 1775-07-02 12:00:00  blood  319 #> 638    1.0      7 1775 1775-07-02 12:00:00   bone  319 #> 639    7.9      8 1775 1775-08-01 22:00:00  blood  320 #> 640    7.9      8 1775 1775-08-01 22:00:00   bone  320 #> 641    3.2      9 1775 1775-09-01 08:00:01  blood  321 #> 642    3.2      9 1775 1775-09-01 08:00:01   bone  321 #> 643    5.6     10 1775 1775-10-01 18:00:00  blood  322 #> 644    5.6     10 1775 1775-10-01 18:00:00   bone  322 #> 645   15.1     11 1775 1775-11-01 04:00:00  blood  323 #> 646   15.1     11 1775 1775-11-01 04:00:00   bone  323 #> 647    7.9     12 1775 1775-12-01 14:00:01  blood  324 #> 648    7.9     12 1775 1775-12-01 14:00:01   bone  324 #> 649   21.7      1 1776 1776-01-01 00:00:00  blood  325 #> 650   21.7      1 1776 1776-01-01 00:00:00   bone  325 #> 651   11.6      2 1776 1776-01-31 12:00:00  blood  326 #> 652   11.6      2 1776 1776-01-31 12:00:00   bone  326 #> 653    6.3      3 1776 1776-03-02 00:00:01  blood  327 #> 654    6.3      3 1776 1776-03-02 00:00:01   bone  327 #> 655   21.8      4 1776 1776-04-01 12:00:00  blood  328 #> 656   21.8      4 1776 1776-04-01 12:00:00   bone  328 #> 657   11.2      5 1776 1776-05-02 00:00:00  blood  329 #> 658   11.2      5 1776 1776-05-02 00:00:00   bone  329 #> 659   19.0      6 1776 1776-06-01 12:00:01  blood  330 #> 660   19.0      6 1776 1776-06-01 12:00:01   bone  330 #> 661    1.0      7 1776 1776-07-02 00:00:00  blood  331 #> 662    1.0      7 1776 1776-07-02 00:00:00   bone  331 #> 663   24.2      8 1776 1776-08-01 12:00:00  blood  332 #> 664   24.2      8 1776 1776-08-01 12:00:00   bone  332 #> 665   16.0      9 1776 1776-09-01 00:00:01  blood  333 #> 666   16.0      9 1776 1776-09-01 00:00:01   bone  333 #> 667   30.0     10 1776 1776-10-01 12:00:00  blood  334 #> 668   30.0     10 1776 1776-10-01 12:00:00   bone  334 #> 669   35.0     11 1776 1776-11-01 00:00:00  blood  335 #> 670   35.0     11 1776 1776-11-01 00:00:00   bone  335 #> 671   40.0     12 1776 1776-12-01 12:00:01  blood  336 #> 672   40.0     12 1776 1776-12-01 12:00:01   bone  336 #> 673   45.0      1 1777 1777-01-01 00:00:00  blood  337 #> 674   45.0      1 1777 1777-01-01 00:00:00   bone  337 #> 675   36.5      2 1777 1777-01-31 10:00:00  blood  338 #> 676   36.5      2 1777 1777-01-31 10:00:00   bone  338 #> 677   39.0      3 1777 1777-03-02 20:00:01  blood  339 #> 678   39.0      3 1777 1777-03-02 20:00:01   bone  339 #> 679   95.5      4 1777 1777-04-02 06:00:00  blood  340 #> 680   95.5      4 1777 1777-04-02 06:00:00   bone  340 #> 681   80.3      5 1777 1777-05-02 16:00:00  blood  341 #> 682   80.3      5 1777 1777-05-02 16:00:00   bone  341 #> 683   80.7      6 1777 1777-06-02 02:00:01  blood  342 #> 684   80.7      6 1777 1777-06-02 02:00:01   bone  342 #> 685   95.0      7 1777 1777-07-02 12:00:00  blood  343 #> 686   95.0      7 1777 1777-07-02 12:00:00   bone  343 #> 687  112.0      8 1777 1777-08-01 22:00:00  blood  344 #> 688  112.0      8 1777 1777-08-01 22:00:00   bone  344 #> 689  116.2      9 1777 1777-09-01 08:00:01  blood  345 #> 690  116.2      9 1777 1777-09-01 08:00:01   bone  345 #> 691  106.5     10 1777 1777-10-01 18:00:00  blood  346 #> 692  106.5     10 1777 1777-10-01 18:00:00   bone  346 #> 693  146.0     11 1777 1777-11-01 04:00:00  blood  347 #> 694  146.0     11 1777 1777-11-01 04:00:00   bone  347 #> 695  157.3     12 1777 1777-12-01 14:00:01  blood  348 #> 696  157.3     12 1777 1777-12-01 14:00:01   bone  348 #> 697  177.3      1 1778 1778-01-01 00:00:00  blood  349 #> 698  177.3      1 1778 1778-01-01 00:00:00   bone  349 #> 699  109.3      2 1778 1778-01-31 10:00:00  blood  350 #> 700  109.3      2 1778 1778-01-31 10:00:00   bone  350 #> 701  134.0      3 1778 1778-03-02 20:00:01  blood  351 #> 702  134.0      3 1778 1778-03-02 20:00:01   bone  351 #> 703  145.0      4 1778 1778-04-02 06:00:00  blood  352 #> 704  145.0      4 1778 1778-04-02 06:00:00   bone  352 #> 705  238.9      5 1778 1778-05-02 16:00:00  blood  353 #> 706  238.9      5 1778 1778-05-02 16:00:00   bone  353 #> 707  171.6      6 1778 1778-06-02 02:00:01  blood  354 #> 708  171.6      6 1778 1778-06-02 02:00:01   bone  354 #> 709  153.0      7 1778 1778-07-02 12:00:00  blood  355 #> 710  153.0      7 1778 1778-07-02 12:00:00   bone  355 #> 711  140.0      8 1778 1778-08-01 22:00:00  blood  356 #> 712  140.0      8 1778 1778-08-01 22:00:00   bone  356 #> 713  171.7      9 1778 1778-09-01 08:00:01  blood  357 #> 714  171.7      9 1778 1778-09-01 08:00:01   bone  357 #> 715  156.3     10 1778 1778-10-01 18:00:00  blood  358 #> 716  156.3     10 1778 1778-10-01 18:00:00   bone  358 #> 717  150.3     11 1778 1778-11-01 04:00:00  blood  359 #> 718  150.3     11 1778 1778-11-01 04:00:00   bone  359 #> 719  105.0     12 1778 1778-12-01 14:00:01  blood  360 #> 720  105.0     12 1778 1778-12-01 14:00:01   bone  360 #> 721  114.7      1 1779 1779-01-01 00:00:00  blood  361 #> 722  114.7      1 1779 1779-01-01 00:00:00   bone  361 #> 723  165.7      2 1779 1779-01-31 10:00:00  blood  362 #> 724  165.7      2 1779 1779-01-31 10:00:00   bone  362 #> 725  118.0      3 1779 1779-03-02 20:00:01  blood  363 #> 726  118.0      3 1779 1779-03-02 20:00:01   bone  363 #> 727  145.0      4 1779 1779-04-02 06:00:00  blood  364 #> 728  145.0      4 1779 1779-04-02 06:00:00   bone  364 #> 729  140.0      5 1779 1779-05-02 16:00:00  blood  365 #> 730  140.0      5 1779 1779-05-02 16:00:00   bone  365 #> 731  113.7      6 1779 1779-06-02 02:00:01  blood  366 #> 732  113.7      6 1779 1779-06-02 02:00:01   bone  366 #> 733  143.0      7 1779 1779-07-02 12:00:00  blood  367 #> 734  143.0      7 1779 1779-07-02 12:00:00   bone  367 #> 735  112.0      8 1779 1779-08-01 22:00:00  blood  368 #> 736  112.0      8 1779 1779-08-01 22:00:00   bone  368 #> 737  111.0      9 1779 1779-09-01 08:00:01  blood  369 #> 738  111.0      9 1779 1779-09-01 08:00:01   bone  369 #> 739  124.0     10 1779 1779-10-01 18:00:00  blood  370 #> 740  124.0     10 1779 1779-10-01 18:00:00   bone  370 #> 741  114.0     11 1779 1779-11-01 04:00:00  blood  371 #> 742  114.0     11 1779 1779-11-01 04:00:00   bone  371 #> 743  110.0     12 1779 1779-12-01 14:00:01  blood  372 #> 744  110.0     12 1779 1779-12-01 14:00:01   bone  372 #> 745   70.0      1 1780 1780-01-01 00:00:00  blood  373 #> 746   70.0      1 1780 1780-01-01 00:00:00   bone  373 #> 747   98.0      2 1780 1780-01-31 12:00:00  blood  374 #> 748   98.0      2 1780 1780-01-31 12:00:00   bone  374 #> 749   98.0      3 1780 1780-03-02 00:00:01  blood  375 #> 750   98.0      3 1780 1780-03-02 00:00:01   bone  375 #> 751   95.0      4 1780 1780-04-01 12:00:00  blood  376 #> 752   95.0      4 1780 1780-04-01 12:00:00   bone  376 #> 753  107.2      5 1780 1780-05-02 00:00:00  blood  377 #> 754  107.2      5 1780 1780-05-02 00:00:00   bone  377 #> 755   88.0      6 1780 1780-06-01 12:00:01  blood  378 #> 756   88.0      6 1780 1780-06-01 12:00:01   bone  378 #> 757   86.0      7 1780 1780-07-02 00:00:00  blood  379 #> 758   86.0      7 1780 1780-07-02 00:00:00   bone  379 #> 759   86.0      8 1780 1780-08-01 12:00:00  blood  380 #> 760   86.0      8 1780 1780-08-01 12:00:00   bone  380 #> 761   93.7      9 1780 1780-09-01 00:00:01  blood  381 #> 762   93.7      9 1780 1780-09-01 00:00:01   bone  381 #> 763   77.0     10 1780 1780-10-01 12:00:00  blood  382 #> 764   77.0     10 1780 1780-10-01 12:00:00   bone  382 #> 765   60.0     11 1780 1780-11-01 00:00:00  blood  383 #> 766   60.0     11 1780 1780-11-01 00:00:00   bone  383 #> 767   58.7     12 1780 1780-12-01 12:00:01  blood  384 #> 768   58.7     12 1780 1780-12-01 12:00:01   bone  384 #> 769   98.7      1 1781 1781-01-01 00:00:00  blood  385 #> 770   98.7      1 1781 1781-01-01 00:00:00   bone  385 #> 771   74.7      2 1781 1781-01-31 10:00:00  blood  386 #> 772   74.7      2 1781 1781-01-31 10:00:00   bone  386 #> 773   53.0      3 1781 1781-03-02 20:00:01  blood  387 #> 774   53.0      3 1781 1781-03-02 20:00:01   bone  387 #> 775   68.3      4 1781 1781-04-02 06:00:00  blood  388 #> 776   68.3      4 1781 1781-04-02 06:00:00   bone  388 #> 777  104.7      5 1781 1781-05-02 16:00:00  blood  389 #> 778  104.7      5 1781 1781-05-02 16:00:00   bone  389 #> 779   97.7      6 1781 1781-06-02 02:00:01  blood  390 #> 780   97.7      6 1781 1781-06-02 02:00:01   bone  390 #> 781   73.5      7 1781 1781-07-02 12:00:00  blood  391 #> 782   73.5      7 1781 1781-07-02 12:00:00   bone  391 #> 783   66.0      8 1781 1781-08-01 22:00:00  blood  392 #> 784   66.0      8 1781 1781-08-01 22:00:00   bone  392 #> 785   51.0      9 1781 1781-09-01 08:00:01  blood  393 #> 786   51.0      9 1781 1781-09-01 08:00:01   bone  393 #> 787   27.3     10 1781 1781-10-01 18:00:00  blood  394 #> 788   27.3     10 1781 1781-10-01 18:00:00   bone  394 #> 789   67.0     11 1781 1781-11-01 04:00:00  blood  395 #> 790   67.0     11 1781 1781-11-01 04:00:00   bone  395 #> 791   35.2     12 1781 1781-12-01 14:00:01  blood  396 #> 792   35.2     12 1781 1781-12-01 14:00:01   bone  396 #> 793   54.0      1 1782 1782-01-01 00:00:00  blood  397 #> 794   54.0      1 1782 1782-01-01 00:00:00   bone  397 #> 795   37.5      2 1782 1782-01-31 10:00:00  blood  398 #> 796   37.5      2 1782 1782-01-31 10:00:00   bone  398 #> 797   37.0      3 1782 1782-03-02 20:00:01  blood  399 #> 798   37.0      3 1782 1782-03-02 20:00:01   bone  399 #> 799   41.0      4 1782 1782-04-02 06:00:00  blood  400 #> 800   41.0      4 1782 1782-04-02 06:00:00   bone  400 #> 801   54.3      5 1782 1782-05-02 16:00:00  blood  401 #> 802   54.3      5 1782 1782-05-02 16:00:00   bone  401 #> 803   38.0      6 1782 1782-06-02 02:00:01  blood  402 #> 804   38.0      6 1782 1782-06-02 02:00:01   bone  402 #> 805   37.0      7 1782 1782-07-02 12:00:00  blood  403 #> 806   37.0      7 1782 1782-07-02 12:00:00   bone  403 #> 807   44.0      8 1782 1782-08-01 22:00:00  blood  404 #> 808   44.0      8 1782 1782-08-01 22:00:00   bone  404 #> 809   34.0      9 1782 1782-09-01 08:00:01  blood  405 #> 810   34.0      9 1782 1782-09-01 08:00:01   bone  405 #> 811   23.2     10 1782 1782-10-01 18:00:00  blood  406 #> 812   23.2     10 1782 1782-10-01 18:00:00   bone  406 #> 813   31.5     11 1782 1782-11-01 04:00:00  blood  407 #> 814   31.5     11 1782 1782-11-01 04:00:00   bone  407 #> 815   30.0     12 1782 1782-12-01 14:00:01  blood  408 #> 816   30.0     12 1782 1782-12-01 14:00:01   bone  408 #> 817   28.0      1 1783 1783-01-01 00:00:00  blood  409 #> 818   28.0      1 1783 1783-01-01 00:00:00   bone  409 #> 819   38.7      2 1783 1783-01-31 10:00:00  blood  410 #> 820   38.7      2 1783 1783-01-31 10:00:00   bone  410 #> 821   26.7      3 1783 1783-03-02 20:00:01  blood  411 #> 822   26.7      3 1783 1783-03-02 20:00:01   bone  411 #> 823   28.3      4 1783 1783-04-02 06:00:00  blood  412 #> 824   28.3      4 1783 1783-04-02 06:00:00   bone  412 #> 825   23.0      5 1783 1783-05-02 16:00:00  blood  413 #> 826   23.0      5 1783 1783-05-02 16:00:00   bone  413 #> 827   25.2      6 1783 1783-06-02 02:00:01  blood  414 #> 828   25.2      6 1783 1783-06-02 02:00:01   bone  414 #> 829   32.2      7 1783 1783-07-02 12:00:00  blood  415 #> 830   32.2      7 1783 1783-07-02 12:00:00   bone  415 #> 831   20.0      8 1783 1783-08-01 22:00:00  blood  416 #> 832   20.0      8 1783 1783-08-01 22:00:00   bone  416 #> 833   18.0      9 1783 1783-09-01 08:00:01  blood  417 #> 834   18.0      9 1783 1783-09-01 08:00:01   bone  417 #> 835    8.0     10 1783 1783-10-01 18:00:00  blood  418 #> 836    8.0     10 1783 1783-10-01 18:00:00   bone  418 #> 837   15.0     11 1783 1783-11-01 04:00:00  blood  419 #> 838   15.0     11 1783 1783-11-01 04:00:00   bone  419 #> 839   10.5     12 1783 1783-12-01 14:00:01  blood  420 #> 840   10.5     12 1783 1783-12-01 14:00:01   bone  420 #> 841   13.0      1 1784 1784-01-01 00:00:00  blood  421 #> 842   13.0      1 1784 1784-01-01 00:00:00   bone  421 #> 843    8.0      2 1784 1784-01-31 12:00:00  blood  422 #> 844    8.0      2 1784 1784-01-31 12:00:00   bone  422 #> 845   11.0      3 1784 1784-03-02 00:00:01  blood  423 #> 846   11.0      3 1784 1784-03-02 00:00:01   bone  423 #> 847   10.0      4 1784 1784-04-01 12:00:00  blood  424 #> 848   10.0      4 1784 1784-04-01 12:00:00   bone  424 #> 849    6.0      5 1784 1784-05-02 00:00:00  blood  425 #> 850    6.0      5 1784 1784-05-02 00:00:00   bone  425 #> 851    9.0      6 1784 1784-06-01 12:00:01  blood  426 #> 852    9.0      6 1784 1784-06-01 12:00:01   bone  426 #> 853    6.0      7 1784 1784-07-02 00:00:00  blood  427 #> 854    6.0      7 1784 1784-07-02 00:00:00   bone  427 #> 855   10.0      8 1784 1784-08-01 12:00:00  blood  428 #> 856   10.0      8 1784 1784-08-01 12:00:00   bone  428 #> 857   10.0      9 1784 1784-09-01 00:00:01  blood  429 #> 858   10.0      9 1784 1784-09-01 00:00:01   bone  429 #> 859    8.0     10 1784 1784-10-01 12:00:00  blood  430 #> 860    8.0     10 1784 1784-10-01 12:00:00   bone  430 #> 861   17.0     11 1784 1784-11-01 00:00:00  blood  431 #> 862   17.0     11 1784 1784-11-01 00:00:00   bone  431 #> 863   14.0     12 1784 1784-12-01 12:00:01  blood  432 #> 864   14.0     12 1784 1784-12-01 12:00:01   bone  432 #> 865    6.5      1 1785 1785-01-01 00:00:00  blood  433 #> 866    6.5      1 1785 1785-01-01 00:00:00   bone  433 #> 867    8.0      2 1785 1785-01-31 10:00:00  blood  434 #> 868    8.0      2 1785 1785-01-31 10:00:00   bone  434 #> 869    9.0      3 1785 1785-03-02 20:00:01  blood  435 #> 870    9.0      3 1785 1785-03-02 20:00:01   bone  435 #> 871   15.7      4 1785 1785-04-02 06:00:00  blood  436 #> 872   15.7      4 1785 1785-04-02 06:00:00   bone  436 #> 873   20.7      5 1785 1785-05-02 16:00:00  blood  437 #> 874   20.7      5 1785 1785-05-02 16:00:00   bone  437 #> 875   26.3      6 1785 1785-06-02 02:00:01  blood  438 #> 876   26.3      6 1785 1785-06-02 02:00:01   bone  438 #> 877   36.3      7 1785 1785-07-02 12:00:00  blood  439 #> 878   36.3      7 1785 1785-07-02 12:00:00   bone  439 #> 879   20.0      8 1785 1785-08-01 22:00:00  blood  440 #> 880   20.0      8 1785 1785-08-01 22:00:00   bone  440 #> 881   32.0      9 1785 1785-09-01 08:00:01  blood  441 #> 882   32.0      9 1785 1785-09-01 08:00:01   bone  441 #> 883   47.2     10 1785 1785-10-01 18:00:00  blood  442 #> 884   47.2     10 1785 1785-10-01 18:00:00   bone  442 #> 885   40.2     11 1785 1785-11-01 04:00:00  blood  443 #> 886   40.2     11 1785 1785-11-01 04:00:00   bone  443 #> 887   27.3     12 1785 1785-12-01 14:00:01  blood  444 #> 888   27.3     12 1785 1785-12-01 14:00:01   bone  444 #> 889   37.2      1 1786 1786-01-01 00:00:00  blood  445 #> 890   37.2      1 1786 1786-01-01 00:00:00   bone  445 #> 891   47.6      2 1786 1786-01-31 10:00:00  blood  446 #> 892   47.6      2 1786 1786-01-31 10:00:00   bone  446 #> 893   47.7      3 1786 1786-03-02 20:00:01  blood  447 #> 894   47.7      3 1786 1786-03-02 20:00:01   bone  447 #> 895   85.4      4 1786 1786-04-02 06:00:00  blood  448 #> 896   85.4      4 1786 1786-04-02 06:00:00   bone  448 #> 897   92.3      5 1786 1786-05-02 16:00:00  blood  449 #> 898   92.3      5 1786 1786-05-02 16:00:00   bone  449 #> 899   59.0      6 1786 1786-06-02 02:00:01  blood  450 #> 900   59.0      6 1786 1786-06-02 02:00:01   bone  450 #> 901   83.0      7 1786 1786-07-02 12:00:00  blood  451 #> 902   83.0      7 1786 1786-07-02 12:00:00   bone  451 #> 903   89.7      8 1786 1786-08-01 22:00:00  blood  452 #> 904   89.7      8 1786 1786-08-01 22:00:00   bone  452 #> 905  111.5      9 1786 1786-09-01 08:00:01  blood  453 #> 906  111.5      9 1786 1786-09-01 08:00:01   bone  453 #> 907  112.3     10 1786 1786-10-01 18:00:00  blood  454 #> 908  112.3     10 1786 1786-10-01 18:00:00   bone  454 #> 909  116.0     11 1786 1786-11-01 04:00:00  blood  455 #> 910  116.0     11 1786 1786-11-01 04:00:00   bone  455 #> 911  112.7     12 1786 1786-12-01 14:00:01  blood  456 #> 912  112.7     12 1786 1786-12-01 14:00:01   bone  456 #> 913  134.7      1 1787 1787-01-01 00:00:00  blood  457 #> 914  134.7      1 1787 1787-01-01 00:00:00   bone  457 #> 915  106.0      2 1787 1787-01-31 10:00:00  blood  458 #> 916  106.0      2 1787 1787-01-31 10:00:00   bone  458 #> 917   87.4      3 1787 1787-03-02 20:00:01  blood  459 #> 918   87.4      3 1787 1787-03-02 20:00:01   bone  459 #> 919  127.2      4 1787 1787-04-02 06:00:00  blood  460 #> 920  127.2      4 1787 1787-04-02 06:00:00   bone  460 #> 921  134.8      5 1787 1787-05-02 16:00:00  blood  461 #> 922  134.8      5 1787 1787-05-02 16:00:00   bone  461 #> 923   99.2      6 1787 1787-06-02 02:00:01  blood  462 #> 924   99.2      6 1787 1787-06-02 02:00:01   bone  462 #> 925  128.0      7 1787 1787-07-02 12:00:00  blood  463 #> 926  128.0      7 1787 1787-07-02 12:00:00   bone  463 #> 927  137.2      8 1787 1787-08-01 22:00:00  blood  464 #> 928  137.2      8 1787 1787-08-01 22:00:00   bone  464 #> 929  157.3      9 1787 1787-09-01 08:00:01  blood  465 #> 930  157.3      9 1787 1787-09-01 08:00:01   bone  465 #> 931  157.0     10 1787 1787-10-01 18:00:00  blood  466 #> 932  157.0     10 1787 1787-10-01 18:00:00   bone  466 #> 933  141.5     11 1787 1787-11-01 04:00:00  blood  467 #> 934  141.5     11 1787 1787-11-01 04:00:00   bone  467 #> 935  174.0     12 1787 1787-12-01 14:00:01  blood  468 #> 936  174.0     12 1787 1787-12-01 14:00:01   bone  468 #> 937  138.0      1 1788 1788-01-01 00:00:00  blood  469 #> 938  138.0      1 1788 1788-01-01 00:00:00   bone  469 #> 939  129.2      2 1788 1788-01-31 12:00:00  blood  470 #> 940  129.2      2 1788 1788-01-31 12:00:00   bone  470 #> 941  143.3      3 1788 1788-03-02 00:00:01  blood  471 #> 942  143.3      3 1788 1788-03-02 00:00:01   bone  471 #> 943  108.5      4 1788 1788-04-01 12:00:00  blood  472 #> 944  108.5      4 1788 1788-04-01 12:00:00   bone  472 #> 945  113.0      5 1788 1788-05-02 00:00:00  blood  473 #> 946  113.0      5 1788 1788-05-02 00:00:00   bone  473 #> 947  154.2      6 1788 1788-06-01 12:00:01  blood  474 #> 948  154.2      6 1788 1788-06-01 12:00:01   bone  474 #> 949  141.5      7 1788 1788-07-02 00:00:00  blood  475 #> 950  141.5      7 1788 1788-07-02 00:00:00   bone  475 #> 951  136.0      8 1788 1788-08-01 12:00:00  blood  476 #> 952  136.0      8 1788 1788-08-01 12:00:00   bone  476 #> 953  141.0      9 1788 1788-09-01 00:00:01  blood  477 #> 954  141.0      9 1788 1788-09-01 00:00:01   bone  477 #> 955  142.0     10 1788 1788-10-01 12:00:00  blood  478 #> 956  142.0     10 1788 1788-10-01 12:00:00   bone  478 #> 957   94.7     11 1788 1788-11-01 00:00:00  blood  479 #> 958   94.7     11 1788 1788-11-01 00:00:00   bone  479 #> 959  129.5     12 1788 1788-12-01 12:00:01  blood  480 #> 960  129.5     12 1788 1788-12-01 12:00:01   bone  480 #> 961  114.0      1 1789 1789-01-01 00:00:00  blood  481 #> 962  114.0      1 1789 1789-01-01 00:00:00   bone  481 #> 963  125.3      2 1789 1789-01-31 10:00:00  blood  482 #> 964  125.3      2 1789 1789-01-31 10:00:00   bone  482 #> 965  120.0      3 1789 1789-03-02 20:00:01  blood  483 #> 966  120.0      3 1789 1789-03-02 20:00:01   bone  483 #> 967  123.3      4 1789 1789-04-02 06:00:00  blood  484 #> 968  123.3      4 1789 1789-04-02 06:00:00   bone  484 #> 969  123.5      5 1789 1789-05-02 16:00:00  blood  485 #> 970  123.5      5 1789 1789-05-02 16:00:00   bone  485 #> 971  120.0      6 1789 1789-06-02 02:00:01  blood  486 #> 972  120.0      6 1789 1789-06-02 02:00:01   bone  486 #> 973  117.0      7 1789 1789-07-02 12:00:00  blood  487 #> 974  117.0      7 1789 1789-07-02 12:00:00   bone  487 #> 975  103.0      8 1789 1789-08-01 22:00:00  blood  488 #> 976  103.0      8 1789 1789-08-01 22:00:00   bone  488 #> 977  112.0      9 1789 1789-09-01 08:00:01  blood  489 #> 978  112.0      9 1789 1789-09-01 08:00:01   bone  489 #> 979   89.7     10 1789 1789-10-01 18:00:00  blood  490 #> 980   89.7     10 1789 1789-10-01 18:00:00   bone  490 #> 981  134.0     11 1789 1789-11-01 04:00:00  blood  491 #> 982  134.0     11 1789 1789-11-01 04:00:00   bone  491 #> 983  135.5     12 1789 1789-12-01 14:00:01  blood  492 #> 984  135.5     12 1789 1789-12-01 14:00:01   bone  492 #> 985  103.0      1 1790 1790-01-01 00:00:00  blood  493 #> 986  103.0      1 1790 1790-01-01 00:00:00   bone  493 #> 987  127.5      2 1790 1790-01-31 10:00:00  blood  494 #> 988  127.5      2 1790 1790-01-31 10:00:00   bone  494 #> 989   96.3      3 1790 1790-03-02 20:00:01  blood  495 #> 990   96.3      3 1790 1790-03-02 20:00:01   bone  495 #> 991   94.0      4 1790 1790-04-02 06:00:00  blood  496 #> 992   94.0      4 1790 1790-04-02 06:00:00   bone  496 #> 993   93.0      5 1790 1790-05-02 16:00:00  blood  497 #> 994   93.0      5 1790 1790-05-02 16:00:00   bone  497 #> 995   91.0      6 1790 1790-06-02 02:00:01  blood  498 #> 996   91.0      6 1790 1790-06-02 02:00:01   bone  498 #> 997   69.3      7 1790 1790-07-02 12:00:00  blood  499 #> 998   69.3      7 1790 1790-07-02 12:00:00   bone  499 #> 999   87.0      8 1790 1790-08-01 22:00:00  blood  500 #> 1000  87.0      8 1790 1790-08-01 22:00:00   bone  500 #> 1001  77.3      9 1790 1790-09-01 08:00:01  blood  501 #> 1002  77.3      9 1790 1790-09-01 08:00:01   bone  501 #> 1003  84.3     10 1790 1790-10-01 18:00:00  blood  502 #> 1004  84.3     10 1790 1790-10-01 18:00:00   bone  502 #> 1005  82.0     11 1790 1790-11-01 04:00:00  blood  503 #> 1006  82.0     11 1790 1790-11-01 04:00:00   bone  503 #> 1007  74.0     12 1790 1790-12-01 14:00:01  blood  504 #> 1008  74.0     12 1790 1790-12-01 14:00:01   bone  504 #> 1009  72.7      1 1791 1791-01-01 00:00:00  blood  505 #> 1010  72.7      1 1791 1791-01-01 00:00:00   bone  505 #> 1011  62.0      2 1791 1791-01-31 10:00:00  blood  506 #> 1012  62.0      2 1791 1791-01-31 10:00:00   bone  506 #> 1013  74.0      3 1791 1791-03-02 20:00:01  blood  507 #> 1014  74.0      3 1791 1791-03-02 20:00:01   bone  507 #> 1015  77.2      4 1791 1791-04-02 06:00:00  blood  508 #> 1016  77.2      4 1791 1791-04-02 06:00:00   bone  508 #> 1017  73.7      5 1791 1791-05-02 16:00:00  blood  509 #> 1018  73.7      5 1791 1791-05-02 16:00:00   bone  509 #> 1019  64.2      6 1791 1791-06-02 02:00:01  blood  510 #> 1020  64.2      6 1791 1791-06-02 02:00:01   bone  510 #> 1021  71.0      7 1791 1791-07-02 12:00:00  blood  511 #> 1022  71.0      7 1791 1791-07-02 12:00:00   bone  511 #> 1023  43.0      8 1791 1791-08-01 22:00:00  blood  512 #> 1024  43.0      8 1791 1791-08-01 22:00:00   bone  512 #> 1025  66.5      9 1791 1791-09-01 08:00:01  blood  513 #> 1026  66.5      9 1791 1791-09-01 08:00:01   bone  513 #> 1027  61.7     10 1791 1791-10-01 18:00:00  blood  514 #> 1028  61.7     10 1791 1791-10-01 18:00:00   bone  514 #> 1029  67.0     11 1791 1791-11-01 04:00:00  blood  515 #> 1030  67.0     11 1791 1791-11-01 04:00:00   bone  515 #> 1031  66.0     12 1791 1791-12-01 14:00:01  blood  516 #> 1032  66.0     12 1791 1791-12-01 14:00:01   bone  516 #> 1033  58.0      1 1792 1792-01-01 00:00:00  blood  517 #> 1034  58.0      1 1792 1792-01-01 00:00:00   bone  517 #> 1035  64.0      2 1792 1792-01-31 12:00:00  blood  518 #> 1036  64.0      2 1792 1792-01-31 12:00:00   bone  518 #> 1037  63.0      3 1792 1792-03-02 00:00:01  blood  519 #> 1038  63.0      3 1792 1792-03-02 00:00:01   bone  519 #> 1039  75.7      4 1792 1792-04-01 12:00:00  blood  520 #> 1040  75.7      4 1792 1792-04-01 12:00:00   bone  520 #> 1041  62.0      5 1792 1792-05-02 00:00:00  blood  521 #> 1042  62.0      5 1792 1792-05-02 00:00:00   bone  521 #> 1043  61.0      6 1792 1792-06-01 12:00:01  blood  522 #> 1044  61.0      6 1792 1792-06-01 12:00:01   bone  522 #> 1045  45.8      7 1792 1792-07-02 00:00:00  blood  523 #> 1046  45.8      7 1792 1792-07-02 00:00:00   bone  523 #> 1047  60.0      8 1792 1792-08-01 12:00:00  blood  524 #> 1048  60.0      8 1792 1792-08-01 12:00:00   bone  524 #> 1049  59.0      9 1792 1792-09-01 00:00:01  blood  525 #> 1050  59.0      9 1792 1792-09-01 00:00:01   bone  525 #> 1051  59.0     10 1792 1792-10-01 12:00:00  blood  526 #> 1052  59.0     10 1792 1792-10-01 12:00:00   bone  526 #> 1053  57.0     11 1792 1792-11-01 00:00:00  blood  527 #> 1054  57.0     11 1792 1792-11-01 00:00:00   bone  527 #> 1055  56.0     12 1792 1792-12-01 12:00:01  blood  528 #> 1056  56.0     12 1792 1792-12-01 12:00:01   bone  528 #> 1057  56.0      1 1793 1793-01-01 00:00:00  blood  529 #> 1058  56.0      1 1793 1793-01-01 00:00:00   bone  529 #> 1059  55.0      2 1793 1793-01-31 10:00:00  blood  530 #> 1060  55.0      2 1793 1793-01-31 10:00:00   bone  530 #> 1061  55.5      3 1793 1793-03-02 20:00:01  blood  531 #> 1062  55.5      3 1793 1793-03-02 20:00:01   bone  531 #> 1063  53.0      4 1793 1793-04-02 06:00:00  blood  532 #> 1064  53.0      4 1793 1793-04-02 06:00:00   bone  532 #> 1065  52.3      5 1793 1793-05-02 16:00:00  blood  533 #> 1066  52.3      5 1793 1793-05-02 16:00:00   bone  533 #> 1067  51.0      6 1793 1793-06-02 02:00:01  blood  534 #> 1068  51.0      6 1793 1793-06-02 02:00:01   bone  534 #> 1069  50.0      7 1793 1793-07-02 12:00:00  blood  535 #> 1070  50.0      7 1793 1793-07-02 12:00:00   bone  535 #> 1071  29.3      8 1793 1793-08-01 22:00:00  blood  536 #> 1072  29.3      8 1793 1793-08-01 22:00:00   bone  536 #> 1073  24.0      9 1793 1793-09-01 08:00:01  blood  537 #> 1074  24.0      9 1793 1793-09-01 08:00:01   bone  537 #> 1075  47.0     10 1793 1793-10-01 18:00:00  blood  538 #> 1076  47.0     10 1793 1793-10-01 18:00:00   bone  538 #> 1077  44.0     11 1793 1793-11-01 04:00:00  blood  539 #> 1078  44.0     11 1793 1793-11-01 04:00:00   bone  539 #> 1079  45.7     12 1793 1793-12-01 14:00:01  blood  540 #> 1080  45.7     12 1793 1793-12-01 14:00:01   bone  540 #> 1081  45.0      1 1794 1794-01-01 00:00:00  blood  541 #> 1082  45.0      1 1794 1794-01-01 00:00:00   bone  541 #> 1083  44.0      2 1794 1794-01-31 10:00:00  blood  542 #> 1084  44.0      2 1794 1794-01-31 10:00:00   bone  542 #> 1085  38.0      3 1794 1794-03-02 20:00:01  blood  543 #> 1086  38.0      3 1794 1794-03-02 20:00:01   bone  543 #> 1087  28.4      4 1794 1794-04-02 06:00:00  blood  544 #> 1088  28.4      4 1794 1794-04-02 06:00:00   bone  544 #> 1089  55.7      5 1794 1794-05-02 16:00:00  blood  545 #> 1090  55.7      5 1794 1794-05-02 16:00:00   bone  545 #> 1091  41.5      6 1794 1794-06-02 02:00:01  blood  546 #> 1092  41.5      6 1794 1794-06-02 02:00:01   bone  546 #> 1093  41.0      7 1794 1794-07-02 12:00:00  blood  547 #> 1094  41.0      7 1794 1794-07-02 12:00:00   bone  547 #> 1095  40.0      8 1794 1794-08-01 22:00:00  blood  548 #> 1096  40.0      8 1794 1794-08-01 22:00:00   bone  548 #> 1097  11.1      9 1794 1794-09-01 08:00:01  blood  549 #> 1098  11.1      9 1794 1794-09-01 08:00:01   bone  549 #> 1099  28.5     10 1794 1794-10-01 18:00:00  blood  550 #> 1100  28.5     10 1794 1794-10-01 18:00:00   bone  550 #> 1101  67.4     11 1794 1794-11-01 04:00:00  blood  551 #> 1102  67.4     11 1794 1794-11-01 04:00:00   bone  551 #> 1103  51.4     12 1794 1794-12-01 14:00:01  blood  552 #> 1104  51.4     12 1794 1794-12-01 14:00:01   bone  552 #> 1105  21.4      1 1795 1795-01-01 00:00:00  blood  553 #> 1106  21.4      1 1795 1795-01-01 00:00:00   bone  553 #> 1107  39.9      2 1795 1795-01-31 10:00:00  blood  554 #> 1108  39.9      2 1795 1795-01-31 10:00:00   bone  554 #> 1109  12.6      3 1795 1795-03-02 20:00:01  blood  555 #> 1110  12.6      3 1795 1795-03-02 20:00:01   bone  555 #> 1111  18.6      4 1795 1795-04-02 06:00:00  blood  556 #> 1112  18.6      4 1795 1795-04-02 06:00:00   bone  556 #> 1113  31.0      5 1795 1795-05-02 16:00:00  blood  557 #> 1114  31.0      5 1795 1795-05-02 16:00:00   bone  557 #> 1115  17.1      6 1795 1795-06-02 02:00:01  blood  558 #> 1116  17.1      6 1795 1795-06-02 02:00:01   bone  558 #> 1117  12.9      7 1795 1795-07-02 12:00:00  blood  559 #> 1118  12.9      7 1795 1795-07-02 12:00:00   bone  559 #> 1119  25.7      8 1795 1795-08-01 22:00:00  blood  560 #> 1120  25.7      8 1795 1795-08-01 22:00:00   bone  560 #> 1121  13.5      9 1795 1795-09-01 08:00:01  blood  561 #> 1122  13.5      9 1795 1795-09-01 08:00:01   bone  561 #> 1123  19.5     10 1795 1795-10-01 18:00:00  blood  562 #> 1124  19.5     10 1795 1795-10-01 18:00:00   bone  562 #> 1125  25.0     11 1795 1795-11-01 04:00:00  blood  563 #> 1126  25.0     11 1795 1795-11-01 04:00:00   bone  563 #> 1127  18.0     12 1795 1795-12-01 14:00:01  blood  564 #> 1128  18.0     12 1795 1795-12-01 14:00:01   bone  564 #> 1129  22.0      1 1796 1796-01-01 00:00:00  blood  565 #> 1130  22.0      1 1796 1796-01-01 00:00:00   bone  565 #> 1131  23.8      2 1796 1796-01-31 12:00:00  blood  566 #> 1132  23.8      2 1796 1796-01-31 12:00:00   bone  566 #> 1133  15.7      3 1796 1796-03-02 00:00:01  blood  567 #> 1134  15.7      3 1796 1796-03-02 00:00:01   bone  567 #> 1135  31.7      4 1796 1796-04-01 12:00:00  blood  568 #> 1136  31.7      4 1796 1796-04-01 12:00:00   bone  568 #> 1137  21.0      5 1796 1796-05-02 00:00:00  blood  569 #> 1138  21.0      5 1796 1796-05-02 00:00:00   bone  569 #> 1139   6.7      6 1796 1796-06-01 12:00:01  blood  570 #> 1140   6.7      6 1796 1796-06-01 12:00:01   bone  570 #> 1141  26.9      7 1796 1796-07-02 00:00:00  blood  571 #> 1142  26.9      7 1796 1796-07-02 00:00:00   bone  571 #> 1143   1.5      8 1796 1796-08-01 12:00:00  blood  572 #> 1144   1.5      8 1796 1796-08-01 12:00:00   bone  572 #> 1145  18.4      9 1796 1796-09-01 00:00:01  blood  573 #> 1146  18.4      9 1796 1796-09-01 00:00:01   bone  573 #> 1147  11.0     10 1796 1796-10-01 12:00:00  blood  574 #> 1148  11.0     10 1796 1796-10-01 12:00:00   bone  574 #> 1149   8.4     11 1796 1796-11-01 00:00:00  blood  575 #> 1150   8.4     11 1796 1796-11-01 00:00:00   bone  575 #> 1151   5.1     12 1796 1796-12-01 12:00:01  blood  576 #> 1152   5.1     12 1796 1796-12-01 12:00:01   bone  576 #> 1153  14.4      1 1797 1797-01-01 00:00:00  blood  577 #> 1154  14.4      1 1797 1797-01-01 00:00:00   bone  577 #> 1155   4.2      2 1797 1797-01-31 10:00:00  blood  578 #> 1156   4.2      2 1797 1797-01-31 10:00:00   bone  578 #> 1157   4.0      3 1797 1797-03-02 20:00:01  blood  579 #> 1158   4.0      3 1797 1797-03-02 20:00:01   bone  579 #> 1159   4.0      4 1797 1797-04-02 06:00:00  blood  580 #> 1160   4.0      4 1797 1797-04-02 06:00:00   bone  580 #> 1161   7.3      5 1797 1797-05-02 16:00:00  blood  581 #> 1162   7.3      5 1797 1797-05-02 16:00:00   bone  581 #> 1163  11.1      6 1797 1797-06-02 02:00:01  blood  582 #> 1164  11.1      6 1797 1797-06-02 02:00:01   bone  582 #> 1165   4.3      7 1797 1797-07-02 12:00:00  blood  583 #> 1166   4.3      7 1797 1797-07-02 12:00:00   bone  583 #> 1167   6.0      8 1797 1797-08-01 22:00:00  blood  584 #> 1168   6.0      8 1797 1797-08-01 22:00:00   bone  584 #> 1169   5.7      9 1797 1797-09-01 08:00:01  blood  585 #> 1170   5.7      9 1797 1797-09-01 08:00:01   bone  585 #> 1171   6.9     10 1797 1797-10-01 18:00:00  blood  586 #> 1172   6.9     10 1797 1797-10-01 18:00:00   bone  586 #> 1173   5.8     11 1797 1797-11-01 04:00:00  blood  587 #> 1174   5.8     11 1797 1797-11-01 04:00:00   bone  587 #> 1175   3.0     12 1797 1797-12-01 14:00:01  blood  588 #> 1176   3.0     12 1797 1797-12-01 14:00:01   bone  588 #> 1177   2.0      1 1798 1798-01-01 00:00:00  blood  589 #> 1178   2.0      1 1798 1798-01-01 00:00:00   bone  589 #> 1179   4.0      2 1798 1798-01-31 10:00:00  blood  590 #> 1180   4.0      2 1798 1798-01-31 10:00:00   bone  590 #> 1181  12.4      3 1798 1798-03-02 20:00:01  blood  591 #> 1182  12.4      3 1798 1798-03-02 20:00:01   bone  591 #> 1183   1.1      4 1798 1798-04-02 06:00:00  blood  592 #> 1184   1.1      4 1798 1798-04-02 06:00:00   bone  592 #> 1185   0.0      5 1798 1798-05-02 16:00:00  blood  593 #> 1186   0.0      5 1798 1798-05-02 16:00:00   bone  593 #> 1187   0.0      6 1798 1798-06-02 02:00:01  blood  594 #> 1188   0.0      6 1798 1798-06-02 02:00:01   bone  594 #> 1189   0.0      7 1798 1798-07-02 12:00:00  blood  595 #> 1190   0.0      7 1798 1798-07-02 12:00:00   bone  595 #> 1191   3.0      8 1798 1798-08-01 22:00:00  blood  596 #> 1192   3.0      8 1798 1798-08-01 22:00:00   bone  596 #> 1193   2.4      9 1798 1798-09-01 08:00:01  blood  597 #> 1194   2.4      9 1798 1798-09-01 08:00:01   bone  597 #> 1195   1.5     10 1798 1798-10-01 18:00:00  blood  598 #> 1196   1.5     10 1798 1798-10-01 18:00:00   bone  598 #> 1197  12.5     11 1798 1798-11-01 04:00:00  blood  599 #> 1198  12.5     11 1798 1798-11-01 04:00:00   bone  599 #> 1199   9.9     12 1798 1798-12-01 14:00:01  blood  600 #> 1200   9.9     12 1798 1798-12-01 14:00:01   bone  600 #> 1201   1.6      1 1799 1799-01-01 00:00:00  blood  601 #> 1202   1.6      1 1799 1799-01-01 00:00:00   bone  601 #> 1203  12.6      2 1799 1799-01-31 10:00:00  blood  602 #> 1204  12.6      2 1799 1799-01-31 10:00:00   bone  602 #> 1205  21.7      3 1799 1799-03-02 20:00:01  blood  603 #> 1206  21.7      3 1799 1799-03-02 20:00:01   bone  603 #> 1207   8.4      4 1799 1799-04-02 06:00:00  blood  604 #> 1208   8.4      4 1799 1799-04-02 06:00:00   bone  604 #> 1209   8.2      5 1799 1799-05-02 16:00:00  blood  605 #> 1210   8.2      5 1799 1799-05-02 16:00:00   bone  605 #> 1211  10.6      6 1799 1799-06-02 02:00:01  blood  606 #> 1212  10.6      6 1799 1799-06-02 02:00:01   bone  606 #> 1213   2.1      7 1799 1799-07-02 12:00:00  blood  607 #> 1214   2.1      7 1799 1799-07-02 12:00:00   bone  607 #> 1215   0.0      8 1799 1799-08-01 22:00:00  blood  608 #> 1216   0.0      8 1799 1799-08-01 22:00:00   bone  608 #> 1217   0.0      9 1799 1799-09-01 08:00:01  blood  609 #> 1218   0.0      9 1799 1799-09-01 08:00:01   bone  609 #> 1219   4.6     10 1799 1799-10-01 18:00:00  blood  610 #> 1220   4.6     10 1799 1799-10-01 18:00:00   bone  610 #> 1221   2.7     11 1799 1799-11-01 04:00:00  blood  611 #> 1222   2.7     11 1799 1799-11-01 04:00:00   bone  611 #> 1223   8.6     12 1799 1799-12-01 14:00:01  blood  612 #> 1224   8.6     12 1799 1799-12-01 14:00:01   bone  612 #> 1225   6.9      1 1800 1800-01-01 00:00:00  blood  613 #> 1226   6.9      1 1800 1800-01-01 00:00:00   bone  613 #> 1227   9.3      2 1800 1800-01-31 10:00:00  blood  614 #> 1228   9.3      2 1800 1800-01-31 10:00:00   bone  614 #> 1229  13.9      3 1800 1800-03-02 20:00:01  blood  615 #> 1230  13.9      3 1800 1800-03-02 20:00:01   bone  615 #> 1231   0.0      4 1800 1800-04-02 06:00:00  blood  616 #> 1232   0.0      4 1800 1800-04-02 06:00:00   bone  616 #> 1233   5.0      5 1800 1800-05-02 16:00:00  blood  617 #> 1234   5.0      5 1800 1800-05-02 16:00:00   bone  617 #> 1235  23.7      6 1800 1800-06-02 02:00:01  blood  618 #> 1236  23.7      6 1800 1800-06-02 02:00:01   bone  618 #> 1237  21.0      7 1800 1800-07-02 12:00:00  blood  619 #> 1238  21.0      7 1800 1800-07-02 12:00:00   bone  619 #> 1239  19.5      8 1800 1800-08-01 22:00:00  blood  620 #> 1240  19.5      8 1800 1800-08-01 22:00:00   bone  620 #> 1241  11.5      9 1800 1800-09-01 08:00:01  blood  621 #> 1242  11.5      9 1800 1800-09-01 08:00:01   bone  621 #> 1243  12.3     10 1800 1800-10-01 18:00:00  blood  622 #> 1244  12.3     10 1800 1800-10-01 18:00:00   bone  622 #> 1245  10.5     11 1800 1800-11-01 04:00:00  blood  623 #> 1246  10.5     11 1800 1800-11-01 04:00:00   bone  623 #> 1247  40.1     12 1800 1800-12-01 14:00:01  blood  624 #> 1248  40.1     12 1800 1800-12-01 14:00:01   bone  624 #> 1249  27.0      1 1801 1801-01-01 00:00:00  blood  625 #> 1250  27.0      1 1801 1801-01-01 00:00:00   bone  625 #> 1251  29.0      2 1801 1801-01-31 10:00:00  blood  626 #> 1252  29.0      2 1801 1801-01-31 10:00:00   bone  626 #> 1253  30.0      3 1801 1801-03-02 20:00:01  blood  627 #> 1254  30.0      3 1801 1801-03-02 20:00:01   bone  627 #> 1255  31.0      4 1801 1801-04-02 06:00:00  blood  628 #> 1256  31.0      4 1801 1801-04-02 06:00:00   bone  628 #> 1257  32.0      5 1801 1801-05-02 16:00:00  blood  629 #> 1258  32.0      5 1801 1801-05-02 16:00:00   bone  629 #> 1259  31.2      6 1801 1801-06-02 02:00:01  blood  630 #> 1260  31.2      6 1801 1801-06-02 02:00:01   bone  630 #> 1261  35.0      7 1801 1801-07-02 12:00:00  blood  631 #> 1262  35.0      7 1801 1801-07-02 12:00:00   bone  631 #> 1263  38.7      8 1801 1801-08-01 22:00:00  blood  632 #> 1264  38.7      8 1801 1801-08-01 22:00:00   bone  632 #> 1265  33.5      9 1801 1801-09-01 08:00:01  blood  633 #> 1266  33.5      9 1801 1801-09-01 08:00:01   bone  633 #> 1267  32.6     10 1801 1801-10-01 18:00:00  blood  634 #> 1268  32.6     10 1801 1801-10-01 18:00:00   bone  634 #> 1269  39.8     11 1801 1801-11-01 04:00:00  blood  635 #> 1270  39.8     11 1801 1801-11-01 04:00:00   bone  635 #> 1271  48.2     12 1801 1801-12-01 14:00:01  blood  636 #> 1272  48.2     12 1801 1801-12-01 14:00:01   bone  636 #> 1273  47.8      1 1802 1802-01-01 00:00:00  blood  637 #> 1274  47.8      1 1802 1802-01-01 00:00:00   bone  637 #> 1275  47.0      2 1802 1802-01-31 10:00:00  blood  638 #> 1276  47.0      2 1802 1802-01-31 10:00:00   bone  638 #> 1277  40.8      3 1802 1802-03-02 20:00:01  blood  639 #> 1278  40.8      3 1802 1802-03-02 20:00:01   bone  639 #> 1279  42.0      4 1802 1802-04-02 06:00:00  blood  640 #> 1280  42.0      4 1802 1802-04-02 06:00:00   bone  640 #> 1281  44.0      5 1802 1802-05-02 16:00:00  blood  641 #> 1282  44.0      5 1802 1802-05-02 16:00:00   bone  641 #> 1283  46.0      6 1802 1802-06-02 02:00:01  blood  642 #> 1284  46.0      6 1802 1802-06-02 02:00:01   bone  642 #> 1285  48.0      7 1802 1802-07-02 12:00:00  blood  643 #> 1286  48.0      7 1802 1802-07-02 12:00:00   bone  643 #> 1287  50.0      8 1802 1802-08-01 22:00:00  blood  644 #> 1288  50.0      8 1802 1802-08-01 22:00:00   bone  644 #> 1289  51.8      9 1802 1802-09-01 08:00:01  blood  645 #> 1290  51.8      9 1802 1802-09-01 08:00:01   bone  645 #> 1291  38.5     10 1802 1802-10-01 18:00:00  blood  646 #> 1292  38.5     10 1802 1802-10-01 18:00:00   bone  646 #> 1293  34.5     11 1802 1802-11-01 04:00:00  blood  647 #> 1294  34.5     11 1802 1802-11-01 04:00:00   bone  647 #> 1295  50.0     12 1802 1802-12-01 14:00:01  blood  648 #> 1296  50.0     12 1802 1802-12-01 14:00:01   bone  648 #> 1297  50.0      1 1803 1803-01-01 00:00:00  blood  649 #> 1298  50.0      1 1803 1803-01-01 00:00:00   bone  649 #> 1299  50.8      2 1803 1803-01-31 10:00:00  blood  650 #> 1300  50.8      2 1803 1803-01-31 10:00:00   bone  650 #> 1301  29.5      3 1803 1803-03-02 20:00:01  blood  651 #> 1302  29.5      3 1803 1803-03-02 20:00:01   bone  651 #> 1303  25.0      4 1803 1803-04-02 06:00:00  blood  652 #> 1304  25.0      4 1803 1803-04-02 06:00:00   bone  652 #> 1305  44.3      5 1803 1803-05-02 16:00:00  blood  653 #> 1306  44.3      5 1803 1803-05-02 16:00:00   bone  653 #> 1307  36.0      6 1803 1803-06-02 02:00:01  blood  654 #> 1308  36.0      6 1803 1803-06-02 02:00:01   bone  654 #> 1309  48.3      7 1803 1803-07-02 12:00:00  blood  655 #> 1310  48.3      7 1803 1803-07-02 12:00:00   bone  655 #> 1311  34.1      8 1803 1803-08-01 22:00:00  blood  656 #> 1312  34.1      8 1803 1803-08-01 22:00:00   bone  656 #> 1313  45.3      9 1803 1803-09-01 08:00:01  blood  657 #> 1314  45.3      9 1803 1803-09-01 08:00:01   bone  657 #> 1315  54.3     10 1803 1803-10-01 18:00:00  blood  658 #> 1316  54.3     10 1803 1803-10-01 18:00:00   bone  658 #> 1317  51.0     11 1803 1803-11-01 04:00:00  blood  659 #> 1318  51.0     11 1803 1803-11-01 04:00:00   bone  659 #> 1319  48.0     12 1803 1803-12-01 14:00:01  blood  660 #> 1320  48.0     12 1803 1803-12-01 14:00:01   bone  660 #> 1321  45.3      1 1804 1804-01-01 00:00:00  blood  661 #> 1322  45.3      1 1804 1804-01-01 00:00:00   bone  661 #> 1323  48.3      2 1804 1804-01-31 12:00:00  blood  662 #> 1324  48.3      2 1804 1804-01-31 12:00:00   bone  662 #> 1325  48.0      3 1804 1804-03-02 00:00:01  blood  663 #> 1326  48.0      3 1804 1804-03-02 00:00:01   bone  663 #> 1327  50.6      4 1804 1804-04-01 12:00:00  blood  664 #> 1328  50.6      4 1804 1804-04-01 12:00:00   bone  664 #> 1329  33.4      5 1804 1804-05-02 00:00:00  blood  665 #> 1330  33.4      5 1804 1804-05-02 00:00:00   bone  665 #> 1331  34.8      6 1804 1804-06-01 12:00:01  blood  666 #> 1332  34.8      6 1804 1804-06-01 12:00:01   bone  666 #> 1333  29.8      7 1804 1804-07-02 00:00:00  blood  667 #> 1334  29.8      7 1804 1804-07-02 00:00:00   bone  667 #> 1335  43.1      8 1804 1804-08-01 12:00:00  blood  668 #> 1336  43.1      8 1804 1804-08-01 12:00:00   bone  668 #> 1337  53.0      9 1804 1804-09-01 00:00:01  blood  669 #> 1338  53.0      9 1804 1804-09-01 00:00:01   bone  669 #> 1339  62.3     10 1804 1804-10-01 12:00:00  blood  670 #> 1340  62.3     10 1804 1804-10-01 12:00:00   bone  670 #> 1341  61.0     11 1804 1804-11-01 00:00:00  blood  671 #> 1342  61.0     11 1804 1804-11-01 00:00:00   bone  671 #> 1343  60.0     12 1804 1804-12-01 12:00:01  blood  672 #> 1344  60.0     12 1804 1804-12-01 12:00:01   bone  672 #> 1345  61.0      1 1805 1805-01-01 00:00:00  blood  673 #> 1346  61.0      1 1805 1805-01-01 00:00:00   bone  673 #> 1347  44.1      2 1805 1805-01-31 10:00:00  blood  674 #> 1348  44.1      2 1805 1805-01-31 10:00:00   bone  674 #> 1349  51.4      3 1805 1805-03-02 20:00:01  blood  675 #> 1350  51.4      3 1805 1805-03-02 20:00:01   bone  675 #> 1351  37.5      4 1805 1805-04-02 06:00:00  blood  676 #> 1352  37.5      4 1805 1805-04-02 06:00:00   bone  676 #> 1353  39.0      5 1805 1805-05-02 16:00:00  blood  677 #> 1354  39.0      5 1805 1805-05-02 16:00:00   bone  677 #> 1355  40.5      6 1805 1805-06-02 02:00:01  blood  678 #> 1356  40.5      6 1805 1805-06-02 02:00:01   bone  678 #> 1357  37.6      7 1805 1805-07-02 12:00:00  blood  679 #> 1358  37.6      7 1805 1805-07-02 12:00:00   bone  679 #> 1359  42.7      8 1805 1805-08-01 22:00:00  blood  680 #> 1360  42.7      8 1805 1805-08-01 22:00:00   bone  680 #> 1361  44.4      9 1805 1805-09-01 08:00:01  blood  681 #> 1362  44.4      9 1805 1805-09-01 08:00:01   bone  681 #> 1363  29.4     10 1805 1805-10-01 18:00:00  blood  682 #> 1364  29.4     10 1805 1805-10-01 18:00:00   bone  682 #> 1365  41.0     11 1805 1805-11-01 04:00:00  blood  683 #> 1366  41.0     11 1805 1805-11-01 04:00:00   bone  683 #> 1367  38.3     12 1805 1805-12-01 14:00:01  blood  684 #> 1368  38.3     12 1805 1805-12-01 14:00:01   bone  684 #> 1369  39.0      1 1806 1806-01-01 00:00:00  blood  685 #> 1370  39.0      1 1806 1806-01-01 00:00:00   bone  685 #> 1371  29.6      2 1806 1806-01-31 10:00:00  blood  686 #> 1372  29.6      2 1806 1806-01-31 10:00:00   bone  686 #> 1373  32.7      3 1806 1806-03-02 20:00:01  blood  687 #> 1374  32.7      3 1806 1806-03-02 20:00:01   bone  687 #> 1375  27.7      4 1806 1806-04-02 06:00:00  blood  688 #> 1376  27.7      4 1806 1806-04-02 06:00:00   bone  688 #> 1377  26.4      5 1806 1806-05-02 16:00:00  blood  689 #> 1378  26.4      5 1806 1806-05-02 16:00:00   bone  689 #> 1379  25.6      6 1806 1806-06-02 02:00:01  blood  690 #> 1380  25.6      6 1806 1806-06-02 02:00:01   bone  690 #> 1381  30.0      7 1806 1806-07-02 12:00:00  blood  691 #> 1382  30.0      7 1806 1806-07-02 12:00:00   bone  691 #> 1383  26.3      8 1806 1806-08-01 22:00:00  blood  692 #> 1384  26.3      8 1806 1806-08-01 22:00:00   bone  692 #> 1385  24.0      9 1806 1806-09-01 08:00:01  blood  693 #> 1386  24.0      9 1806 1806-09-01 08:00:01   bone  693 #> 1387  27.0     10 1806 1806-10-01 18:00:00  blood  694 #> 1388  27.0     10 1806 1806-10-01 18:00:00   bone  694 #> 1389  25.0     11 1806 1806-11-01 04:00:00  blood  695 #> 1390  25.0     11 1806 1806-11-01 04:00:00   bone  695 #> 1391  24.0     12 1806 1806-12-01 14:00:01  blood  696 #> 1392  24.0     12 1806 1806-12-01 14:00:01   bone  696 #> 1393  12.0      1 1807 1807-01-01 00:00:00  blood  697 #> 1394  12.0      1 1807 1807-01-01 00:00:00   bone  697 #> 1395  12.2      2 1807 1807-01-31 10:00:00  blood  698 #> 1396  12.2      2 1807 1807-01-31 10:00:00   bone  698 #> 1397   9.6      3 1807 1807-03-02 20:00:01  blood  699 #> 1398   9.6      3 1807 1807-03-02 20:00:01   bone  699 #> 1399  23.8      4 1807 1807-04-02 06:00:00  blood  700 #> 1400  23.8      4 1807 1807-04-02 06:00:00   bone  700 #> 1401  10.0      5 1807 1807-05-02 16:00:00  blood  701 #> 1402  10.0      5 1807 1807-05-02 16:00:00   bone  701 #> 1403  12.0      6 1807 1807-06-02 02:00:01  blood  702 #> 1404  12.0      6 1807 1807-06-02 02:00:01   bone  702 #> 1405  12.7      7 1807 1807-07-02 12:00:00  blood  703 #> 1406  12.7      7 1807 1807-07-02 12:00:00   bone  703 #> 1407  12.0      8 1807 1807-08-01 22:00:00  blood  704 #> 1408  12.0      8 1807 1807-08-01 22:00:00   bone  704 #> 1409   5.7      9 1807 1807-09-01 08:00:01  blood  705 #> 1410   5.7      9 1807 1807-09-01 08:00:01   bone  705 #> 1411   8.0     10 1807 1807-10-01 18:00:00  blood  706 #> 1412   8.0     10 1807 1807-10-01 18:00:00   bone  706 #> 1413   2.6     11 1807 1807-11-01 04:00:00  blood  707 #> 1414   2.6     11 1807 1807-11-01 04:00:00   bone  707 #> 1415   0.0     12 1807 1807-12-01 14:00:01  blood  708 #> 1416   0.0     12 1807 1807-12-01 14:00:01   bone  708 #> 1417   0.0      1 1808 1808-01-01 00:00:00  blood  709 #> 1418   0.0      1 1808 1808-01-01 00:00:00   bone  709 #> 1419   4.5      2 1808 1808-01-31 12:00:00  blood  710 #> 1420   4.5      2 1808 1808-01-31 12:00:00   bone  710 #> 1421   0.0      3 1808 1808-03-02 00:00:01  blood  711 #> 1422   0.0      3 1808 1808-03-02 00:00:01   bone  711 #> 1423  12.3      4 1808 1808-04-01 12:00:00  blood  712 #> 1424  12.3      4 1808 1808-04-01 12:00:00   bone  712 #> 1425  13.5      5 1808 1808-05-02 00:00:00  blood  713 #> 1426  13.5      5 1808 1808-05-02 00:00:00   bone  713 #> 1427  13.5      6 1808 1808-06-01 12:00:01  blood  714 #> 1428  13.5      6 1808 1808-06-01 12:00:01   bone  714 #> 1429   6.7      7 1808 1808-07-02 00:00:00  blood  715 #> 1430   6.7      7 1808 1808-07-02 00:00:00   bone  715 #> 1431   8.0      8 1808 1808-08-01 12:00:00  blood  716 #> 1432   8.0      8 1808 1808-08-01 12:00:00   bone  716 #> 1433  11.7      9 1808 1808-09-01 00:00:01  blood  717 #> 1434  11.7      9 1808 1808-09-01 00:00:01   bone  717 #> 1435   4.7     10 1808 1808-10-01 12:00:00  blood  718 #> 1436   4.7     10 1808 1808-10-01 12:00:00   bone  718 #> 1437  10.5     11 1808 1808-11-01 00:00:00  blood  719 #> 1438  10.5     11 1808 1808-11-01 00:00:00   bone  719 #> 1439  12.3     12 1808 1808-12-01 12:00:01  blood  720 #> 1440  12.3     12 1808 1808-12-01 12:00:01   bone  720 #> 1441   7.2      1 1809 1809-01-01 00:00:00  blood  721 #> 1442   7.2      1 1809 1809-01-01 00:00:00   bone  721 #> 1443   9.2      2 1809 1809-01-31 10:00:00  blood  722 #> 1444   9.2      2 1809 1809-01-31 10:00:00   bone  722 #> 1445   0.9      3 1809 1809-03-02 20:00:01  blood  723 #> 1446   0.9      3 1809 1809-03-02 20:00:01   bone  723 #> 1447   2.5      4 1809 1809-04-02 06:00:00  blood  724 #> 1448   2.5      4 1809 1809-04-02 06:00:00   bone  724 #> 1449   2.0      5 1809 1809-05-02 16:00:00  blood  725 #> 1450   2.0      5 1809 1809-05-02 16:00:00   bone  725 #> 1451   7.7      6 1809 1809-06-02 02:00:01  blood  726 #> 1452   7.7      6 1809 1809-06-02 02:00:01   bone  726 #> 1453   0.3      7 1809 1809-07-02 12:00:00  blood  727 #> 1454   0.3      7 1809 1809-07-02 12:00:00   bone  727 #> 1455   0.2      8 1809 1809-08-01 22:00:00  blood  728 #> 1456   0.2      8 1809 1809-08-01 22:00:00   bone  728 #> 1457   0.4      9 1809 1809-09-01 08:00:01  blood  729 #> 1458   0.4      9 1809 1809-09-01 08:00:01   bone  729 #> 1459   0.0     10 1809 1809-10-01 18:00:00  blood  730 #> 1460   0.0     10 1809 1809-10-01 18:00:00   bone  730 #> 1461   0.0     11 1809 1809-11-01 04:00:00  blood  731 #> 1462   0.0     11 1809 1809-11-01 04:00:00   bone  731 #> 1463   0.0     12 1809 1809-12-01 14:00:01  blood  732 #> 1464   0.0     12 1809 1809-12-01 14:00:01   bone  732 #> 1465   0.0      1 1810 1810-01-01 00:00:00  blood  733 #> 1466   0.0      1 1810 1810-01-01 00:00:00   bone  733 #> 1467   0.0      2 1810 1810-01-31 10:00:00  blood  734 #> 1468   0.0      2 1810 1810-01-31 10:00:00   bone  734 #> 1469   0.0      3 1810 1810-03-02 20:00:01  blood  735 #> 1470   0.0      3 1810 1810-03-02 20:00:01   bone  735 #> 1471   0.0      4 1810 1810-04-02 06:00:00  blood  736 #> 1472   0.0      4 1810 1810-04-02 06:00:00   bone  736 #> 1473   0.0      5 1810 1810-05-02 16:00:00  blood  737 #> 1474   0.0      5 1810 1810-05-02 16:00:00   bone  737 #> 1475   0.0      6 1810 1810-06-02 02:00:01  blood  738 #> 1476   0.0      6 1810 1810-06-02 02:00:01   bone  738 #> 1477   0.0      7 1810 1810-07-02 12:00:00  blood  739 #> 1478   0.0      7 1810 1810-07-02 12:00:00   bone  739 #> 1479   0.0      8 1810 1810-08-01 22:00:00  blood  740 #> 1480   0.0      8 1810 1810-08-01 22:00:00   bone  740 #> 1481   0.0      9 1810 1810-09-01 08:00:01  blood  741 #> 1482   0.0      9 1810 1810-09-01 08:00:01   bone  741 #> 1483   0.0     10 1810 1810-10-01 18:00:00  blood  742 #> 1484   0.0     10 1810 1810-10-01 18:00:00   bone  742 #> 1485   0.0     11 1810 1810-11-01 04:00:00  blood  743 #> 1486   0.0     11 1810 1810-11-01 04:00:00   bone  743 #> 1487   0.0     12 1810 1810-12-01 14:00:01  blood  744 #> 1488   0.0     12 1810 1810-12-01 14:00:01   bone  744 #> 1489   0.0      1 1811 1811-01-01 00:00:00  blood  745 #> 1490   0.0      1 1811 1811-01-01 00:00:00   bone  745 #> 1491   0.0      2 1811 1811-01-31 10:00:00  blood  746 #> 1492   0.0      2 1811 1811-01-31 10:00:00   bone  746 #> 1493   0.0      3 1811 1811-03-02 20:00:01  blood  747 #> 1494   0.0      3 1811 1811-03-02 20:00:01   bone  747 #> 1495   0.0      4 1811 1811-04-02 06:00:00  blood  748 #> 1496   0.0      4 1811 1811-04-02 06:00:00   bone  748 #> 1497   0.0      5 1811 1811-05-02 16:00:00  blood  749 #> 1498   0.0      5 1811 1811-05-02 16:00:00   bone  749 #> 1499   0.0      6 1811 1811-06-02 02:00:01  blood  750 #> 1500   0.0      6 1811 1811-06-02 02:00:01   bone  750 #> 1501   6.6      7 1811 1811-07-02 12:00:00  blood  751 #> 1502   6.6      7 1811 1811-07-02 12:00:00   bone  751 #> 1503   0.0      8 1811 1811-08-01 22:00:00  blood  752 #> 1504   0.0      8 1811 1811-08-01 22:00:00   bone  752 #> 1505   2.4      9 1811 1811-09-01 08:00:01  blood  753 #> 1506   2.4      9 1811 1811-09-01 08:00:01   bone  753 #> 1507   6.1     10 1811 1811-10-01 18:00:00  blood  754 #> 1508   6.1     10 1811 1811-10-01 18:00:00   bone  754 #> 1509   0.8     11 1811 1811-11-01 04:00:00  blood  755 #> 1510   0.8     11 1811 1811-11-01 04:00:00   bone  755 #> 1511   1.1     12 1811 1811-12-01 14:00:01  blood  756 #> 1512   1.1     12 1811 1811-12-01 14:00:01   bone  756 #> 1513  11.3      1 1812 1812-01-01 00:00:00  blood  757 #> 1514  11.3      1 1812 1812-01-01 00:00:00   bone  757 #> 1515   1.9      2 1812 1812-01-31 12:00:00  blood  758 #> 1516   1.9      2 1812 1812-01-31 12:00:00   bone  758 #> 1517   0.7      3 1812 1812-03-02 00:00:01  blood  759 #> 1518   0.7      3 1812 1812-03-02 00:00:01   bone  759 #> 1519   0.0      4 1812 1812-04-01 12:00:00  blood  760 #> 1520   0.0      4 1812 1812-04-01 12:00:00   bone  760 #> 1521   1.0      5 1812 1812-05-02 00:00:00  blood  761 #> 1522   1.0      5 1812 1812-05-02 00:00:00   bone  761 #> 1523   1.3      6 1812 1812-06-01 12:00:01  blood  762 #> 1524   1.3      6 1812 1812-06-01 12:00:01   bone  762 #> 1525   0.5      7 1812 1812-07-02 00:00:00  blood  763 #> 1526   0.5      7 1812 1812-07-02 00:00:00   bone  763 #> 1527  15.6      8 1812 1812-08-01 12:00:00  blood  764 #> 1528  15.6      8 1812 1812-08-01 12:00:00   bone  764 #> 1529   5.2      9 1812 1812-09-01 00:00:01  blood  765 #> 1530   5.2      9 1812 1812-09-01 00:00:01   bone  765 #> 1531   3.9     10 1812 1812-10-01 12:00:00  blood  766 #> 1532   3.9     10 1812 1812-10-01 12:00:00   bone  766 #> 1533   7.9     11 1812 1812-11-01 00:00:00  blood  767 #> 1534   7.9     11 1812 1812-11-01 00:00:00   bone  767 #> 1535  10.1     12 1812 1812-12-01 12:00:01  blood  768 #> 1536  10.1     12 1812 1812-12-01 12:00:01   bone  768 #> 1537   0.0      1 1813 1813-01-01 00:00:00  blood  769 #> 1538   0.0      1 1813 1813-01-01 00:00:00   bone  769 #> 1539  10.3      2 1813 1813-01-31 10:00:00  blood  770 #> 1540  10.3      2 1813 1813-01-31 10:00:00   bone  770 #> 1541   1.9      3 1813 1813-03-02 20:00:01  blood  771 #> 1542   1.9      3 1813 1813-03-02 20:00:01   bone  771 #> 1543  16.6      4 1813 1813-04-02 06:00:00  blood  772 #> 1544  16.6      4 1813 1813-04-02 06:00:00   bone  772 #> 1545   5.5      5 1813 1813-05-02 16:00:00  blood  773 #> 1546   5.5      5 1813 1813-05-02 16:00:00   bone  773 #> 1547  11.2      6 1813 1813-06-02 02:00:01  blood  774 #> 1548  11.2      6 1813 1813-06-02 02:00:01   bone  774 #> 1549  18.3      7 1813 1813-07-02 12:00:00  blood  775 #> 1550  18.3      7 1813 1813-07-02 12:00:00   bone  775 #> 1551   8.4      8 1813 1813-08-01 22:00:00  blood  776 #> 1552   8.4      8 1813 1813-08-01 22:00:00   bone  776 #> 1553  15.3      9 1813 1813-09-01 08:00:01  blood  777 #> 1554  15.3      9 1813 1813-09-01 08:00:01   bone  777 #> 1555  27.8     10 1813 1813-10-01 18:00:00  blood  778 #> 1556  27.8     10 1813 1813-10-01 18:00:00   bone  778 #> 1557  16.7     11 1813 1813-11-01 04:00:00  blood  779 #> 1558  16.7     11 1813 1813-11-01 04:00:00   bone  779 #> 1559  14.3     12 1813 1813-12-01 14:00:01  blood  780 #> 1560  14.3     12 1813 1813-12-01 14:00:01   bone  780 #> 1561  22.2      1 1814 1814-01-01 00:00:00  blood  781 #> 1562  22.2      1 1814 1814-01-01 00:00:00   bone  781 #> 1563  12.0      2 1814 1814-01-31 10:00:00  blood  782 #> 1564  12.0      2 1814 1814-01-31 10:00:00   bone  782 #> 1565   5.7      3 1814 1814-03-02 20:00:01  blood  783 #> 1566   5.7      3 1814 1814-03-02 20:00:01   bone  783 #> 1567  23.8      4 1814 1814-04-02 06:00:00  blood  784 #> 1568  23.8      4 1814 1814-04-02 06:00:00   bone  784 #> 1569   5.8      5 1814 1814-05-02 16:00:00  blood  785 #> 1570   5.8      5 1814 1814-05-02 16:00:00   bone  785 #> 1571  14.9      6 1814 1814-06-02 02:00:01  blood  786 #> 1572  14.9      6 1814 1814-06-02 02:00:01   bone  786 #> 1573  18.5      7 1814 1814-07-02 12:00:00  blood  787 #> 1574  18.5      7 1814 1814-07-02 12:00:00   bone  787 #> 1575   2.3      8 1814 1814-08-01 22:00:00  blood  788 #> 1576   2.3      8 1814 1814-08-01 22:00:00   bone  788 #> 1577   8.1      9 1814 1814-09-01 08:00:01  blood  789 #> 1578   8.1      9 1814 1814-09-01 08:00:01   bone  789 #> 1579  19.3     10 1814 1814-10-01 18:00:00  blood  790 #> 1580  19.3     10 1814 1814-10-01 18:00:00   bone  790 #> 1581  14.5     11 1814 1814-11-01 04:00:00  blood  791 #> 1582  14.5     11 1814 1814-11-01 04:00:00   bone  791 #> 1583  20.1     12 1814 1814-12-01 14:00:01  blood  792 #> 1584  20.1     12 1814 1814-12-01 14:00:01   bone  792 #> 1585  19.2      1 1815 1815-01-01 00:00:00  blood  793 #> 1586  19.2      1 1815 1815-01-01 00:00:00   bone  793 #> 1587  32.2      2 1815 1815-01-31 10:00:00  blood  794 #> 1588  32.2      2 1815 1815-01-31 10:00:00   bone  794 #> 1589  26.2      3 1815 1815-03-02 20:00:01  blood  795 #> 1590  26.2      3 1815 1815-03-02 20:00:01   bone  795 #> 1591  31.6      4 1815 1815-04-02 06:00:00  blood  796 #> 1592  31.6      4 1815 1815-04-02 06:00:00   bone  796 #> 1593   9.8      5 1815 1815-05-02 16:00:00  blood  797 #> 1594   9.8      5 1815 1815-05-02 16:00:00   bone  797 #> 1595  55.9      6 1815 1815-06-02 02:00:01  blood  798 #> 1596  55.9      6 1815 1815-06-02 02:00:01   bone  798 #> 1597  35.5      7 1815 1815-07-02 12:00:00  blood  799 #> 1598  35.5      7 1815 1815-07-02 12:00:00   bone  799 #> 1599  47.2      8 1815 1815-08-01 22:00:00  blood  800 #> 1600  47.2      8 1815 1815-08-01 22:00:00   bone  800 #> 1601  31.5      9 1815 1815-09-01 08:00:01  blood  801 #> 1602  31.5      9 1815 1815-09-01 08:00:01   bone  801 #> 1603  33.5     10 1815 1815-10-01 18:00:00  blood  802 #> 1604  33.5     10 1815 1815-10-01 18:00:00   bone  802 #> 1605  37.2     11 1815 1815-11-01 04:00:00  blood  803 #> 1606  37.2     11 1815 1815-11-01 04:00:00   bone  803 #> 1607  65.0     12 1815 1815-12-01 14:00:01  blood  804 #> 1608  65.0     12 1815 1815-12-01 14:00:01   bone  804 #> 1609  26.3      1 1816 1816-01-01 00:00:00  blood  805 #> 1610  26.3      1 1816 1816-01-01 00:00:00   bone  805 #> 1611  68.8      2 1816 1816-01-31 12:00:00  blood  806 #> 1612  68.8      2 1816 1816-01-31 12:00:00   bone  806 #> 1613  73.7      3 1816 1816-03-02 00:00:01  blood  807 #> 1614  73.7      3 1816 1816-03-02 00:00:01   bone  807 #> 1615  58.8      4 1816 1816-04-01 12:00:00  blood  808 #> 1616  58.8      4 1816 1816-04-01 12:00:00   bone  808 #> 1617  44.3      5 1816 1816-05-02 00:00:00  blood  809 #> 1618  44.3      5 1816 1816-05-02 00:00:00   bone  809 #> 1619  43.6      6 1816 1816-06-01 12:00:01  blood  810 #> 1620  43.6      6 1816 1816-06-01 12:00:01   bone  810 #> 1621  38.8      7 1816 1816-07-02 00:00:00  blood  811 #> 1622  38.8      7 1816 1816-07-02 00:00:00   bone  811 #> 1623  23.2      8 1816 1816-08-01 12:00:00  blood  812 #> 1624  23.2      8 1816 1816-08-01 12:00:00   bone  812 #> 1625  47.8      9 1816 1816-09-01 00:00:01  blood  813 #> 1626  47.8      9 1816 1816-09-01 00:00:01   bone  813 #> 1627  56.4     10 1816 1816-10-01 12:00:00  blood  814 #> 1628  56.4     10 1816 1816-10-01 12:00:00   bone  814 #> 1629  38.1     11 1816 1816-11-01 00:00:00  blood  815 #> 1630  38.1     11 1816 1816-11-01 00:00:00   bone  815 #> 1631  29.9     12 1816 1816-12-01 12:00:01  blood  816 #> 1632  29.9     12 1816 1816-12-01 12:00:01   bone  816 #> 1633  36.4      1 1817 1817-01-01 00:00:00  blood  817 #> 1634  36.4      1 1817 1817-01-01 00:00:00   bone  817 #> 1635  57.9      2 1817 1817-01-31 10:00:00  blood  818 #> 1636  57.9      2 1817 1817-01-31 10:00:00   bone  818 #> 1637  96.2      3 1817 1817-03-02 20:00:01  blood  819 #> 1638  96.2      3 1817 1817-03-02 20:00:01   bone  819 #> 1639  26.4      4 1817 1817-04-02 06:00:00  blood  820 #> 1640  26.4      4 1817 1817-04-02 06:00:00   bone  820 #> 1641  21.2      5 1817 1817-05-02 16:00:00  blood  821 #> 1642  21.2      5 1817 1817-05-02 16:00:00   bone  821 #> 1643  40.0      6 1817 1817-06-02 02:00:01  blood  822 #> 1644  40.0      6 1817 1817-06-02 02:00:01   bone  822 #> 1645  50.0      7 1817 1817-07-02 12:00:00  blood  823 #> 1646  50.0      7 1817 1817-07-02 12:00:00   bone  823 #> 1647  45.0      8 1817 1817-08-01 22:00:00  blood  824 #> 1648  45.0      8 1817 1817-08-01 22:00:00   bone  824 #> 1649  36.7      9 1817 1817-09-01 08:00:01  blood  825 #> 1650  36.7      9 1817 1817-09-01 08:00:01   bone  825 #> 1651  25.6     10 1817 1817-10-01 18:00:00  blood  826 #> 1652  25.6     10 1817 1817-10-01 18:00:00   bone  826 #> 1653  28.9     11 1817 1817-11-01 04:00:00  blood  827 #> 1654  28.9     11 1817 1817-11-01 04:00:00   bone  827 #> 1655  28.4     12 1817 1817-12-01 14:00:01  blood  828 #> 1656  28.4     12 1817 1817-12-01 14:00:01   bone  828 #> 1657  34.9      1 1818 1818-01-01 00:00:00  blood  829 #> 1658  34.9      1 1818 1818-01-01 00:00:00   bone  829 #> 1659  22.4      2 1818 1818-01-31 10:00:00  blood  830 #> 1660  22.4      2 1818 1818-01-31 10:00:00   bone  830 #> 1661  25.4      3 1818 1818-03-02 20:00:01  blood  831 #> 1662  25.4      3 1818 1818-03-02 20:00:01   bone  831 #> 1663  34.5      4 1818 1818-04-02 06:00:00  blood  832 #> 1664  34.5      4 1818 1818-04-02 06:00:00   bone  832 #> 1665  53.1      5 1818 1818-05-02 16:00:00  blood  833 #> 1666  53.1      5 1818 1818-05-02 16:00:00   bone  833 #> 1667  36.4      6 1818 1818-06-02 02:00:01  blood  834 #> 1668  36.4      6 1818 1818-06-02 02:00:01   bone  834 #> 1669  28.0      7 1818 1818-07-02 12:00:00  blood  835 #> 1670  28.0      7 1818 1818-07-02 12:00:00   bone  835 #> 1671  31.5      8 1818 1818-08-01 22:00:00  blood  836 #> 1672  31.5      8 1818 1818-08-01 22:00:00   bone  836 #> 1673  26.1      9 1818 1818-09-01 08:00:01  blood  837 #> 1674  26.1      9 1818 1818-09-01 08:00:01   bone  837 #> 1675  31.7     10 1818 1818-10-01 18:00:00  blood  838 #> 1676  31.7     10 1818 1818-10-01 18:00:00   bone  838 #> 1677  10.9     11 1818 1818-11-01 04:00:00  blood  839 #> 1678  10.9     11 1818 1818-11-01 04:00:00   bone  839 #> 1679  25.8     12 1818 1818-12-01 14:00:01  blood  840 #> 1680  25.8     12 1818 1818-12-01 14:00:01   bone  840 #> 1681  32.5      1 1819 1819-01-01 00:00:00  blood  841 #> 1682  32.5      1 1819 1819-01-01 00:00:00   bone  841 #> 1683  20.7      2 1819 1819-01-31 10:00:00  blood  842 #> 1684  20.7      2 1819 1819-01-31 10:00:00   bone  842 #> 1685   3.7      3 1819 1819-03-02 20:00:01  blood  843 #> 1686   3.7      3 1819 1819-03-02 20:00:01   bone  843 #> 1687  20.2      4 1819 1819-04-02 06:00:00  blood  844 #> 1688  20.2      4 1819 1819-04-02 06:00:00   bone  844 #> 1689  19.6      5 1819 1819-05-02 16:00:00  blood  845 #> 1690  19.6      5 1819 1819-05-02 16:00:00   bone  845 #> 1691  35.0      6 1819 1819-06-02 02:00:01  blood  846 #> 1692  35.0      6 1819 1819-06-02 02:00:01   bone  846 #> 1693  31.4      7 1819 1819-07-02 12:00:00  blood  847 #> 1694  31.4      7 1819 1819-07-02 12:00:00   bone  847 #> 1695  26.1      8 1819 1819-08-01 22:00:00  blood  848 #> 1696  26.1      8 1819 1819-08-01 22:00:00   bone  848 #> 1697  14.9      9 1819 1819-09-01 08:00:01  blood  849 #> 1698  14.9      9 1819 1819-09-01 08:00:01   bone  849 #> 1699  27.5     10 1819 1819-10-01 18:00:00  blood  850 #> 1700  27.5     10 1819 1819-10-01 18:00:00   bone  850 #> 1701  25.1     11 1819 1819-11-01 04:00:00  blood  851 #> 1702  25.1     11 1819 1819-11-01 04:00:00   bone  851 #> 1703  30.6     12 1819 1819-12-01 14:00:01  blood  852 #> 1704  30.6     12 1819 1819-12-01 14:00:01   bone  852 #> 1705  19.2      1 1820 1820-01-01 00:00:00  blood  853 #> 1706  19.2      1 1820 1820-01-01 00:00:00   bone  853 #> 1707  26.6      2 1820 1820-01-31 12:00:00  blood  854 #> 1708  26.6      2 1820 1820-01-31 12:00:00   bone  854 #> 1709   4.5      3 1820 1820-03-02 00:00:01  blood  855 #> 1710   4.5      3 1820 1820-03-02 00:00:01   bone  855 #> 1711  19.4      4 1820 1820-04-01 12:00:00  blood  856 #> 1712  19.4      4 1820 1820-04-01 12:00:00   bone  856 #> 1713  29.3      5 1820 1820-05-02 00:00:00  blood  857 #> 1714  29.3      5 1820 1820-05-02 00:00:00   bone  857 #> 1715  10.8      6 1820 1820-06-01 12:00:01  blood  858 #> 1716  10.8      6 1820 1820-06-01 12:00:01   bone  858 #> 1717  20.6      7 1820 1820-07-02 00:00:00  blood  859 #> 1718  20.6      7 1820 1820-07-02 00:00:00   bone  859 #> 1719  25.9      8 1820 1820-08-01 12:00:00  blood  860 #> 1720  25.9      8 1820 1820-08-01 12:00:00   bone  860 #> 1721   5.2      9 1820 1820-09-01 00:00:01  blood  861 #> 1722   5.2      9 1820 1820-09-01 00:00:01   bone  861 #> 1723   9.0     10 1820 1820-10-01 12:00:00  blood  862 #> 1724   9.0     10 1820 1820-10-01 12:00:00   bone  862 #> 1725   7.9     11 1820 1820-11-01 00:00:00  blood  863 #> 1726   7.9     11 1820 1820-11-01 00:00:00   bone  863 #> 1727   9.7     12 1820 1820-12-01 12:00:01  blood  864 #> 1728   9.7     12 1820 1820-12-01 12:00:01   bone  864 #> 1729  21.5      1 1821 1821-01-01 00:00:00  blood  865 #> 1730  21.5      1 1821 1821-01-01 00:00:00   bone  865 #> 1731   4.3      2 1821 1821-01-31 10:00:00  blood  866 #> 1732   4.3      2 1821 1821-01-31 10:00:00   bone  866 #> 1733   5.7      3 1821 1821-03-02 20:00:01  blood  867 #> 1734   5.7      3 1821 1821-03-02 20:00:01   bone  867 #> 1735   9.2      4 1821 1821-04-02 06:00:00  blood  868 #> 1736   9.2      4 1821 1821-04-02 06:00:00   bone  868 #> 1737   1.7      5 1821 1821-05-02 16:00:00  blood  869 #> 1738   1.7      5 1821 1821-05-02 16:00:00   bone  869 #> 1739   1.8      6 1821 1821-06-02 02:00:01  blood  870 #> 1740   1.8      6 1821 1821-06-02 02:00:01   bone  870 #> 1741   2.5      7 1821 1821-07-02 12:00:00  blood  871 #> 1742   2.5      7 1821 1821-07-02 12:00:00   bone  871 #> 1743   4.8      8 1821 1821-08-01 22:00:00  blood  872 #> 1744   4.8      8 1821 1821-08-01 22:00:00   bone  872 #> 1745   4.4      9 1821 1821-09-01 08:00:01  blood  873 #> 1746   4.4      9 1821 1821-09-01 08:00:01   bone  873 #> 1747  18.8     10 1821 1821-10-01 18:00:00  blood  874 #> 1748  18.8     10 1821 1821-10-01 18:00:00   bone  874 #> 1749   4.4     11 1821 1821-11-01 04:00:00  blood  875 #> 1750   4.4     11 1821 1821-11-01 04:00:00   bone  875 #> 1751   0.0     12 1821 1821-12-01 14:00:01  blood  876 #> 1752   0.0     12 1821 1821-12-01 14:00:01   bone  876 #> 1753   0.0      1 1822 1822-01-01 00:00:00  blood  877 #> 1754   0.0      1 1822 1822-01-01 00:00:00   bone  877 #> 1755   0.9      2 1822 1822-01-31 10:00:00  blood  878 #> 1756   0.9      2 1822 1822-01-31 10:00:00   bone  878 #> 1757  16.1      3 1822 1822-03-02 20:00:01  blood  879 #> 1758  16.1      3 1822 1822-03-02 20:00:01   bone  879 #> 1759  13.5      4 1822 1822-04-02 06:00:00  blood  880 #> 1760  13.5      4 1822 1822-04-02 06:00:00   bone  880 #> 1761   1.5      5 1822 1822-05-02 16:00:00  blood  881 #> 1762   1.5      5 1822 1822-05-02 16:00:00   bone  881 #> 1763   5.6      6 1822 1822-06-02 02:00:01  blood  882 #> 1764   5.6      6 1822 1822-06-02 02:00:01   bone  882 #> 1765   7.9      7 1822 1822-07-02 12:00:00  blood  883 #> 1766   7.9      7 1822 1822-07-02 12:00:00   bone  883 #> 1767   2.1      8 1822 1822-08-01 22:00:00  blood  884 #> 1768   2.1      8 1822 1822-08-01 22:00:00   bone  884 #> 1769   0.0      9 1822 1822-09-01 08:00:01  blood  885 #> 1770   0.0      9 1822 1822-09-01 08:00:01   bone  885 #> 1771   0.4     10 1822 1822-10-01 18:00:00  blood  886 #> 1772   0.4     10 1822 1822-10-01 18:00:00   bone  886 #> 1773   0.0     11 1822 1822-11-01 04:00:00  blood  887 #> 1774   0.0     11 1822 1822-11-01 04:00:00   bone  887 #> 1775   0.0     12 1822 1822-12-01 14:00:01  blood  888 #> 1776   0.0     12 1822 1822-12-01 14:00:01   bone  888 #> 1777   0.0      1 1823 1823-01-01 00:00:00  blood  889 #> 1778   0.0      1 1823 1823-01-01 00:00:00   bone  889 #> 1779   0.0      2 1823 1823-01-31 10:00:00  blood  890 #> 1780   0.0      2 1823 1823-01-31 10:00:00   bone  890 #> 1781   0.6      3 1823 1823-03-02 20:00:01  blood  891 #> 1782   0.6      3 1823 1823-03-02 20:00:01   bone  891 #> 1783   0.0      4 1823 1823-04-02 06:00:00  blood  892 #> 1784   0.0      4 1823 1823-04-02 06:00:00   bone  892 #> 1785   0.0      5 1823 1823-05-02 16:00:00  blood  893 #> 1786   0.0      5 1823 1823-05-02 16:00:00   bone  893 #> 1787   0.0      6 1823 1823-06-02 02:00:01  blood  894 #> 1788   0.0      6 1823 1823-06-02 02:00:01   bone  894 #> 1789   0.5      7 1823 1823-07-02 12:00:00  blood  895 #> 1790   0.5      7 1823 1823-07-02 12:00:00   bone  895 #> 1791   0.0      8 1823 1823-08-01 22:00:00  blood  896 #> 1792   0.0      8 1823 1823-08-01 22:00:00   bone  896 #> 1793   0.0      9 1823 1823-09-01 08:00:01  blood  897 #> 1794   0.0      9 1823 1823-09-01 08:00:01   bone  897 #> 1795   0.0     10 1823 1823-10-01 18:00:00  blood  898 #> 1796   0.0     10 1823 1823-10-01 18:00:00   bone  898 #> 1797   0.0     11 1823 1823-11-01 04:00:00  blood  899 #> 1798   0.0     11 1823 1823-11-01 04:00:00   bone  899 #> 1799  20.4     12 1823 1823-12-01 14:00:01  blood  900 #> 1800  20.4     12 1823 1823-12-01 14:00:01   bone  900 #> 1801  21.6      1 1824 1824-01-01 00:00:00  blood  901 #> 1802  21.6      1 1824 1824-01-01 00:00:00   bone  901 #> 1803  10.8      2 1824 1824-01-31 12:00:00  blood  902 #> 1804  10.8      2 1824 1824-01-31 12:00:00   bone  902 #> 1805   0.0      3 1824 1824-03-02 00:00:01  blood  903 #> 1806   0.0      3 1824 1824-03-02 00:00:01   bone  903 #> 1807  19.4      4 1824 1824-04-01 12:00:00  blood  904 #> 1808  19.4      4 1824 1824-04-01 12:00:00   bone  904 #> 1809   2.8      5 1824 1824-05-02 00:00:00  blood  905 #> 1810   2.8      5 1824 1824-05-02 00:00:00   bone  905 #> 1811   0.0      6 1824 1824-06-01 12:00:01  blood  906 #> 1812   0.0      6 1824 1824-06-01 12:00:01   bone  906 #> 1813   0.0      7 1824 1824-07-02 00:00:00  blood  907 #> 1814   0.0      7 1824 1824-07-02 00:00:00   bone  907 #> 1815   1.4      8 1824 1824-08-01 12:00:00  blood  908 #> 1816   1.4      8 1824 1824-08-01 12:00:00   bone  908 #> 1817  20.5      9 1824 1824-09-01 00:00:01  blood  909 #> 1818  20.5      9 1824 1824-09-01 00:00:01   bone  909 #> 1819  25.2     10 1824 1824-10-01 12:00:00  blood  910 #> 1820  25.2     10 1824 1824-10-01 12:00:00   bone  910 #> 1821   0.0     11 1824 1824-11-01 00:00:00  blood  911 #> 1822   0.0     11 1824 1824-11-01 00:00:00   bone  911 #> 1823   0.8     12 1824 1824-12-01 12:00:01  blood  912 #> 1824   0.8     12 1824 1824-12-01 12:00:01   bone  912 #> 1825   5.0      1 1825 1825-01-01 00:00:00  blood  913 #> 1826   5.0      1 1825 1825-01-01 00:00:00   bone  913 #> 1827  15.5      2 1825 1825-01-31 10:00:00  blood  914 #> 1828  15.5      2 1825 1825-01-31 10:00:00   bone  914 #> 1829  22.4      3 1825 1825-03-02 20:00:01  blood  915 #> 1830  22.4      3 1825 1825-03-02 20:00:01   bone  915 #> 1831   3.8      4 1825 1825-04-02 06:00:00  blood  916 #> 1832   3.8      4 1825 1825-04-02 06:00:00   bone  916 #> 1833  15.4      5 1825 1825-05-02 16:00:00  blood  917 #> 1834  15.4      5 1825 1825-05-02 16:00:00   bone  917 #> 1835  15.4      6 1825 1825-06-02 02:00:01  blood  918 #> 1836  15.4      6 1825 1825-06-02 02:00:01   bone  918 #> 1837  30.9      7 1825 1825-07-02 12:00:00  blood  919 #> 1838  30.9      7 1825 1825-07-02 12:00:00   bone  919 #> 1839  25.4      8 1825 1825-08-01 22:00:00  blood  920 #> 1840  25.4      8 1825 1825-08-01 22:00:00   bone  920 #> 1841  15.7      9 1825 1825-09-01 08:00:01  blood  921 #> 1842  15.7      9 1825 1825-09-01 08:00:01   bone  921 #> 1843  15.6     10 1825 1825-10-01 18:00:00  blood  922 #> 1844  15.6     10 1825 1825-10-01 18:00:00   bone  922 #> 1845  11.7     11 1825 1825-11-01 04:00:00  blood  923 #> 1846  11.7     11 1825 1825-11-01 04:00:00   bone  923 #> 1847  22.0     12 1825 1825-12-01 14:00:01  blood  924 #> 1848  22.0     12 1825 1825-12-01 14:00:01   bone  924 #> 1849  17.7      1 1826 1826-01-01 00:00:00  blood  925 #> 1850  17.7      1 1826 1826-01-01 00:00:00   bone  925 #> 1851  18.2      2 1826 1826-01-31 10:00:00  blood  926 #> 1852  18.2      2 1826 1826-01-31 10:00:00   bone  926 #> 1853  36.7      3 1826 1826-03-02 20:00:01  blood  927 #> 1854  36.7      3 1826 1826-03-02 20:00:01   bone  927 #> 1855  24.0      4 1826 1826-04-02 06:00:00  blood  928 #> 1856  24.0      4 1826 1826-04-02 06:00:00   bone  928 #> 1857  32.4      5 1826 1826-05-02 16:00:00  blood  929 #> 1858  32.4      5 1826 1826-05-02 16:00:00   bone  929 #> 1859  37.1      6 1826 1826-06-02 02:00:01  blood  930 #> 1860  37.1      6 1826 1826-06-02 02:00:01   bone  930 #> 1861  52.5      7 1826 1826-07-02 12:00:00  blood  931 #> 1862  52.5      7 1826 1826-07-02 12:00:00   bone  931 #> 1863  39.6      8 1826 1826-08-01 22:00:00  blood  932 #> 1864  39.6      8 1826 1826-08-01 22:00:00   bone  932 #> 1865  18.9      9 1826 1826-09-01 08:00:01  blood  933 #> 1866  18.9      9 1826 1826-09-01 08:00:01   bone  933 #> 1867  50.6     10 1826 1826-10-01 18:00:00  blood  934 #> 1868  50.6     10 1826 1826-10-01 18:00:00   bone  934 #> 1869  39.5     11 1826 1826-11-01 04:00:00  blood  935 #> 1870  39.5     11 1826 1826-11-01 04:00:00   bone  935 #> 1871  68.1     12 1826 1826-12-01 14:00:01  blood  936 #> 1872  68.1     12 1826 1826-12-01 14:00:01   bone  936 #> 1873  34.6      1 1827 1827-01-01 00:00:00  blood  937 #> 1874  34.6      1 1827 1827-01-01 00:00:00   bone  937 #> 1875  47.4      2 1827 1827-01-31 10:00:00  blood  938 #> 1876  47.4      2 1827 1827-01-31 10:00:00   bone  938 #> 1877  57.8      3 1827 1827-03-02 20:00:01  blood  939 #> 1878  57.8      3 1827 1827-03-02 20:00:01   bone  939 #> 1879  46.0      4 1827 1827-04-02 06:00:00  blood  940 #> 1880  46.0      4 1827 1827-04-02 06:00:00   bone  940 #> 1881  56.3      5 1827 1827-05-02 16:00:00  blood  941 #> 1882  56.3      5 1827 1827-05-02 16:00:00   bone  941 #> 1883  56.7      6 1827 1827-06-02 02:00:01  blood  942 #> 1884  56.7      6 1827 1827-06-02 02:00:01   bone  942 #> 1885  42.9      7 1827 1827-07-02 12:00:00  blood  943 #> 1886  42.9      7 1827 1827-07-02 12:00:00   bone  943 #> 1887  53.7      8 1827 1827-08-01 22:00:00  blood  944 #> 1888  53.7      8 1827 1827-08-01 22:00:00   bone  944 #> 1889  49.6      9 1827 1827-09-01 08:00:01  blood  945 #> 1890  49.6      9 1827 1827-09-01 08:00:01   bone  945 #> 1891  57.2     10 1827 1827-10-01 18:00:00  blood  946 #> 1892  57.2     10 1827 1827-10-01 18:00:00   bone  946 #> 1893  48.2     11 1827 1827-11-01 04:00:00  blood  947 #> 1894  48.2     11 1827 1827-11-01 04:00:00   bone  947 #> 1895  46.1     12 1827 1827-12-01 14:00:01  blood  948 #> 1896  46.1     12 1827 1827-12-01 14:00:01   bone  948 #> 1897  52.8      1 1828 1828-01-01 00:00:00  blood  949 #> 1898  52.8      1 1828 1828-01-01 00:00:00   bone  949 #> 1899  64.4      2 1828 1828-01-31 12:00:00  blood  950 #> 1900  64.4      2 1828 1828-01-31 12:00:00   bone  950 #> 1901  65.0      3 1828 1828-03-02 00:00:01  blood  951 #> 1902  65.0      3 1828 1828-03-02 00:00:01   bone  951 #> 1903  61.1      4 1828 1828-04-01 12:00:00  blood  952 #> 1904  61.1      4 1828 1828-04-01 12:00:00   bone  952 #> 1905  89.1      5 1828 1828-05-02 00:00:00  blood  953 #> 1906  89.1      5 1828 1828-05-02 00:00:00   bone  953 #> 1907  98.0      6 1828 1828-06-01 12:00:01  blood  954 #> 1908  98.0      6 1828 1828-06-01 12:00:01   bone  954 #> 1909  54.3      7 1828 1828-07-02 00:00:00  blood  955 #> 1910  54.3      7 1828 1828-07-02 00:00:00   bone  955 #> 1911  76.4      8 1828 1828-08-01 12:00:00  blood  956 #> 1912  76.4      8 1828 1828-08-01 12:00:00   bone  956 #> 1913  50.4      9 1828 1828-09-01 00:00:01  blood  957 #> 1914  50.4      9 1828 1828-09-01 00:00:01   bone  957 #> 1915  54.7     10 1828 1828-10-01 12:00:00  blood  958 #> 1916  54.7     10 1828 1828-10-01 12:00:00   bone  958 #> 1917  57.0     11 1828 1828-11-01 00:00:00  blood  959 #> 1918  57.0     11 1828 1828-11-01 00:00:00   bone  959 #> 1919  46.6     12 1828 1828-12-01 12:00:01  blood  960 #> 1920  46.6     12 1828 1828-12-01 12:00:01   bone  960 #> 1921  43.0      1 1829 1829-01-01 00:00:00  blood  961 #> 1922  43.0      1 1829 1829-01-01 00:00:00   bone  961 #> 1923  49.4      2 1829 1829-01-31 10:00:00  blood  962 #> 1924  49.4      2 1829 1829-01-31 10:00:00   bone  962 #> 1925  72.3      3 1829 1829-03-02 20:00:01  blood  963 #> 1926  72.3      3 1829 1829-03-02 20:00:01   bone  963 #> 1927  95.0      4 1829 1829-04-02 06:00:00  blood  964 #> 1928  95.0      4 1829 1829-04-02 06:00:00   bone  964 #> 1929  67.5      5 1829 1829-05-02 16:00:00  blood  965 #> 1930  67.5      5 1829 1829-05-02 16:00:00   bone  965 #> 1931  73.9      6 1829 1829-06-02 02:00:01  blood  966 #> 1932  73.9      6 1829 1829-06-02 02:00:01   bone  966 #> 1933  90.8      7 1829 1829-07-02 12:00:00  blood  967 #> 1934  90.8      7 1829 1829-07-02 12:00:00   bone  967 #> 1935  78.3      8 1829 1829-08-01 22:00:00  blood  968 #> 1936  78.3      8 1829 1829-08-01 22:00:00   bone  968 #> 1937  52.8      9 1829 1829-09-01 08:00:01  blood  969 #> 1938  52.8      9 1829 1829-09-01 08:00:01   bone  969 #> 1939  57.2     10 1829 1829-10-01 18:00:00  blood  970 #> 1940  57.2     10 1829 1829-10-01 18:00:00   bone  970 #> 1941  67.6     11 1829 1829-11-01 04:00:00  blood  971 #> 1942  67.6     11 1829 1829-11-01 04:00:00   bone  971 #> 1943  56.5     12 1829 1829-12-01 14:00:01  blood  972 #> 1944  56.5     12 1829 1829-12-01 14:00:01   bone  972 #> 1945  52.2      1 1830 1830-01-01 00:00:00  blood  973 #> 1946  52.2      1 1830 1830-01-01 00:00:00   bone  973 #> 1947  72.1      2 1830 1830-01-31 10:00:00  blood  974 #> 1948  72.1      2 1830 1830-01-31 10:00:00   bone  974 #> 1949  84.6      3 1830 1830-03-02 20:00:01  blood  975 #> 1950  84.6      3 1830 1830-03-02 20:00:01   bone  975 #> 1951 107.1      4 1830 1830-04-02 06:00:00  blood  976 #> 1952 107.1      4 1830 1830-04-02 06:00:00   bone  976 #> 1953  66.3      5 1830 1830-05-02 16:00:00  blood  977 #> 1954  66.3      5 1830 1830-05-02 16:00:00   bone  977 #> 1955  65.1      6 1830 1830-06-02 02:00:01  blood  978 #> 1956  65.1      6 1830 1830-06-02 02:00:01   bone  978 #> 1957  43.9      7 1830 1830-07-02 12:00:00  blood  979 #> 1958  43.9      7 1830 1830-07-02 12:00:00   bone  979 #> 1959  50.7      8 1830 1830-08-01 22:00:00  blood  980 #> 1960  50.7      8 1830 1830-08-01 22:00:00   bone  980 #> 1961  62.1      9 1830 1830-09-01 08:00:01  blood  981 #> 1962  62.1      9 1830 1830-09-01 08:00:01   bone  981 #> 1963  84.4     10 1830 1830-10-01 18:00:00  blood  982 #> 1964  84.4     10 1830 1830-10-01 18:00:00   bone  982 #> 1965  81.2     11 1830 1830-11-01 04:00:00  blood  983 #> 1966  81.2     11 1830 1830-11-01 04:00:00   bone  983 #> 1967  82.1     12 1830 1830-12-01 14:00:01  blood  984 #> 1968  82.1     12 1830 1830-12-01 14:00:01   bone  984 #> 1969  47.5      1 1831 1831-01-01 00:00:00  blood  985 #> 1970  47.5      1 1831 1831-01-01 00:00:00   bone  985 #> 1971  50.1      2 1831 1831-01-31 10:00:00  blood  986 #> 1972  50.1      2 1831 1831-01-31 10:00:00   bone  986 #> 1973  93.4      3 1831 1831-03-02 20:00:01  blood  987 #> 1974  93.4      3 1831 1831-03-02 20:00:01   bone  987 #> 1975  54.6      4 1831 1831-04-02 06:00:00  blood  988 #> 1976  54.6      4 1831 1831-04-02 06:00:00   bone  988 #> 1977  38.1      5 1831 1831-05-02 16:00:00  blood  989 #> 1978  38.1      5 1831 1831-05-02 16:00:00   bone  989 #> 1979  33.4      6 1831 1831-06-02 02:00:01  blood  990 #> 1980  33.4      6 1831 1831-06-02 02:00:01   bone  990 #> 1981  45.2      7 1831 1831-07-02 12:00:00  blood  991 #> 1982  45.2      7 1831 1831-07-02 12:00:00   bone  991 #> 1983  54.9      8 1831 1831-08-01 22:00:00  blood  992 #> 1984  54.9      8 1831 1831-08-01 22:00:00   bone  992 #> 1985  37.9      9 1831 1831-09-01 08:00:01  blood  993 #> 1986  37.9      9 1831 1831-09-01 08:00:01   bone  993 #> 1987  46.2     10 1831 1831-10-01 18:00:00  blood  994 #> 1988  46.2     10 1831 1831-10-01 18:00:00   bone  994 #> 1989  43.5     11 1831 1831-11-01 04:00:00  blood  995 #> 1990  43.5     11 1831 1831-11-01 04:00:00   bone  995 #> 1991  28.9     12 1831 1831-12-01 14:00:01  blood  996 #> 1992  28.9     12 1831 1831-12-01 14:00:01   bone  996 #> 1993  30.9      1 1832 1832-01-01 00:00:00  blood  997 #> 1994  30.9      1 1832 1832-01-01 00:00:00   bone  997 #> 1995  55.5      2 1832 1832-01-31 12:00:00  blood  998 #> 1996  55.5      2 1832 1832-01-31 12:00:00   bone  998 #> 1997  55.1      3 1832 1832-03-02 00:00:01  blood  999 #> 1998  55.1      3 1832 1832-03-02 00:00:01   bone  999 #> 1999  26.9      4 1832 1832-04-01 12:00:00  blood 1000 #> 2000  26.9      4 1832 1832-04-01 12:00:00   bone 1000 #> 2001  41.3      5 1832 1832-05-02 00:00:00  blood 1001 #> 2002  41.3      5 1832 1832-05-02 00:00:00   bone 1001 #> 2003  26.7      6 1832 1832-06-01 12:00:01  blood 1002 #> 2004  26.7      6 1832 1832-06-01 12:00:01   bone 1002 #> 2005  13.9      7 1832 1832-07-02 00:00:00  blood 1003 #> 2006  13.9      7 1832 1832-07-02 00:00:00   bone 1003 #> 2007   8.9      8 1832 1832-08-01 12:00:00  blood 1004 #> 2008   8.9      8 1832 1832-08-01 12:00:00   bone 1004 #> 2009   8.2      9 1832 1832-09-01 00:00:01  blood 1005 #> 2010   8.2      9 1832 1832-09-01 00:00:01   bone 1005 #> 2011  21.1     10 1832 1832-10-01 12:00:00  blood 1006 #> 2012  21.1     10 1832 1832-10-01 12:00:00   bone 1006 #> 2013  14.3     11 1832 1832-11-01 00:00:00  blood 1007 #> 2014  14.3     11 1832 1832-11-01 00:00:00   bone 1007 #> 2015  27.5     12 1832 1832-12-01 12:00:01  blood 1008 #> 2016  27.5     12 1832 1832-12-01 12:00:01   bone 1008 #> 2017  11.3      1 1833 1833-01-01 00:00:00  blood 1009 #> 2018  11.3      1 1833 1833-01-01 00:00:00   bone 1009 #> 2019  14.9      2 1833 1833-01-31 10:00:00  blood 1010 #> 2020  14.9      2 1833 1833-01-31 10:00:00   bone 1010 #> 2021  11.8      3 1833 1833-03-02 20:00:01  blood 1011 #> 2022  11.8      3 1833 1833-03-02 20:00:01   bone 1011 #> 2023   2.8      4 1833 1833-04-02 06:00:00  blood 1012 #> 2024   2.8      4 1833 1833-04-02 06:00:00   bone 1012 #> 2025  12.9      5 1833 1833-05-02 16:00:00  blood 1013 #> 2026  12.9      5 1833 1833-05-02 16:00:00   bone 1013 #> 2027   1.0      6 1833 1833-06-02 02:00:01  blood 1014 #> 2028   1.0      6 1833 1833-06-02 02:00:01   bone 1014 #> 2029   7.0      7 1833 1833-07-02 12:00:00  blood 1015 #> 2030   7.0      7 1833 1833-07-02 12:00:00   bone 1015 #> 2031   5.7      8 1833 1833-08-01 22:00:00  blood 1016 #> 2032   5.7      8 1833 1833-08-01 22:00:00   bone 1016 #> 2033  11.6      9 1833 1833-09-01 08:00:01  blood 1017 #> 2034  11.6      9 1833 1833-09-01 08:00:01   bone 1017 #> 2035   7.5     10 1833 1833-10-01 18:00:00  blood 1018 #> 2036   7.5     10 1833 1833-10-01 18:00:00   bone 1018 #> 2037   5.9     11 1833 1833-11-01 04:00:00  blood 1019 #> 2038   5.9     11 1833 1833-11-01 04:00:00   bone 1019 #> 2039   9.9     12 1833 1833-12-01 14:00:01  blood 1020 #> 2040   9.9     12 1833 1833-12-01 14:00:01   bone 1020 #> 2041   4.9      1 1834 1834-01-01 00:00:00  blood 1021 #> 2042   4.9      1 1834 1834-01-01 00:00:00   bone 1021 #> 2043  18.1      2 1834 1834-01-31 10:00:00  blood 1022 #> 2044  18.1      2 1834 1834-01-31 10:00:00   bone 1022 #> 2045   3.9      3 1834 1834-03-02 20:00:01  blood 1023 #> 2046   3.9      3 1834 1834-03-02 20:00:01   bone 1023 #> 2047   1.4      4 1834 1834-04-02 06:00:00  blood 1024 #> 2048   1.4      4 1834 1834-04-02 06:00:00   bone 1024 #> 2049   8.8      5 1834 1834-05-02 16:00:00  blood 1025 #> 2050   8.8      5 1834 1834-05-02 16:00:00   bone 1025 #> 2051   7.8      6 1834 1834-06-02 02:00:01  blood 1026 #> 2052   7.8      6 1834 1834-06-02 02:00:01   bone 1026 #> 2053   8.7      7 1834 1834-07-02 12:00:00  blood 1027 #> 2054   8.7      7 1834 1834-07-02 12:00:00   bone 1027 #> 2055   4.0      8 1834 1834-08-01 22:00:00  blood 1028 #> 2056   4.0      8 1834 1834-08-01 22:00:00   bone 1028 #> 2057  11.5      9 1834 1834-09-01 08:00:01  blood 1029 #> 2058  11.5      9 1834 1834-09-01 08:00:01   bone 1029 #> 2059  24.8     10 1834 1834-10-01 18:00:00  blood 1030 #> 2060  24.8     10 1834 1834-10-01 18:00:00   bone 1030 #> 2061  30.5     11 1834 1834-11-01 04:00:00  blood 1031 #> 2062  30.5     11 1834 1834-11-01 04:00:00   bone 1031 #> 2063  34.5     12 1834 1834-12-01 14:00:01  blood 1032 #> 2064  34.5     12 1834 1834-12-01 14:00:01   bone 1032 #> 2065   7.5      1 1835 1835-01-01 00:00:00  blood 1033 #> 2066   7.5      1 1835 1835-01-01 00:00:00   bone 1033 #> 2067  24.5      2 1835 1835-01-31 10:00:00  blood 1034 #> 2068  24.5      2 1835 1835-01-31 10:00:00   bone 1034 #> 2069  19.7      3 1835 1835-03-02 20:00:01  blood 1035 #> 2070  19.7      3 1835 1835-03-02 20:00:01   bone 1035 #> 2071  61.5      4 1835 1835-04-02 06:00:00  blood 1036 #> 2072  61.5      4 1835 1835-04-02 06:00:00   bone 1036 #> 2073  43.6      5 1835 1835-05-02 16:00:00  blood 1037 #> 2074  43.6      5 1835 1835-05-02 16:00:00   bone 1037 #> 2075  33.2      6 1835 1835-06-02 02:00:01  blood 1038 #> 2076  33.2      6 1835 1835-06-02 02:00:01   bone 1038 #> 2077  59.8      7 1835 1835-07-02 12:00:00  blood 1039 #> 2078  59.8      7 1835 1835-07-02 12:00:00   bone 1039 #> 2079  59.0      8 1835 1835-08-01 22:00:00  blood 1040 #> 2080  59.0      8 1835 1835-08-01 22:00:00   bone 1040 #> 2081 100.8      9 1835 1835-09-01 08:00:01  blood 1041 #> 2082 100.8      9 1835 1835-09-01 08:00:01   bone 1041 #> 2083  95.2     10 1835 1835-10-01 18:00:00  blood 1042 #> 2084  95.2     10 1835 1835-10-01 18:00:00   bone 1042 #> 2085 100.0     11 1835 1835-11-01 04:00:00  blood 1043 #> 2086 100.0     11 1835 1835-11-01 04:00:00   bone 1043 #> 2087  77.5     12 1835 1835-12-01 14:00:01  blood 1044 #> 2088  77.5     12 1835 1835-12-01 14:00:01   bone 1044 #> 2089  88.6      1 1836 1836-01-01 00:00:00  blood 1045 #> 2090  88.6      1 1836 1836-01-01 00:00:00   bone 1045 #> 2091 107.6      2 1836 1836-01-31 12:00:00  blood 1046 #> 2092 107.6      2 1836 1836-01-31 12:00:00   bone 1046 #> 2093  98.1      3 1836 1836-03-02 00:00:01  blood 1047 #> 2094  98.1      3 1836 1836-03-02 00:00:01   bone 1047 #> 2095 142.9      4 1836 1836-04-01 12:00:00  blood 1048 #> 2096 142.9      4 1836 1836-04-01 12:00:00   bone 1048 #> 2097 111.4      5 1836 1836-05-02 00:00:00  blood 1049 #> 2098 111.4      5 1836 1836-05-02 00:00:00   bone 1049 #> 2099 124.7      6 1836 1836-06-01 12:00:01  blood 1050 #> 2100 124.7      6 1836 1836-06-01 12:00:01   bone 1050 #> 2101 116.7      7 1836 1836-07-02 00:00:00  blood 1051 #> 2102 116.7      7 1836 1836-07-02 00:00:00   bone 1051 #> 2103 107.8      8 1836 1836-08-01 12:00:00  blood 1052 #> 2104 107.8      8 1836 1836-08-01 12:00:00   bone 1052 #> 2105  95.1      9 1836 1836-09-01 00:00:01  blood 1053 #> 2106  95.1      9 1836 1836-09-01 00:00:01   bone 1053 #> 2107 137.4     10 1836 1836-10-01 12:00:00  blood 1054 #> 2108 137.4     10 1836 1836-10-01 12:00:00   bone 1054 #> 2109 120.9     11 1836 1836-11-01 00:00:00  blood 1055 #> 2110 120.9     11 1836 1836-11-01 00:00:00   bone 1055 #> 2111 206.2     12 1836 1836-12-01 12:00:01  blood 1056 #> 2112 206.2     12 1836 1836-12-01 12:00:01   bone 1056 #> 2113 188.0      1 1837 1837-01-01 00:00:00  blood 1057 #> 2114 188.0      1 1837 1837-01-01 00:00:00   bone 1057 #> 2115 175.6      2 1837 1837-01-31 10:00:00  blood 1058 #> 2116 175.6      2 1837 1837-01-31 10:00:00   bone 1058 #> 2117 134.6      3 1837 1837-03-02 20:00:01  blood 1059 #> 2118 134.6      3 1837 1837-03-02 20:00:01   bone 1059 #> 2119 138.2      4 1837 1837-04-02 06:00:00  blood 1060 #> 2120 138.2      4 1837 1837-04-02 06:00:00   bone 1060 #> 2121 111.3      5 1837 1837-05-02 16:00:00  blood 1061 #> 2122 111.3      5 1837 1837-05-02 16:00:00   bone 1061 #> 2123 158.0      6 1837 1837-06-02 02:00:01  blood 1062 #> 2124 158.0      6 1837 1837-06-02 02:00:01   bone 1062 #> 2125 162.8      7 1837 1837-07-02 12:00:00  blood 1063 #> 2126 162.8      7 1837 1837-07-02 12:00:00   bone 1063 #> 2127 134.0      8 1837 1837-08-01 22:00:00  blood 1064 #> 2128 134.0      8 1837 1837-08-01 22:00:00   bone 1064 #> 2129  96.3      9 1837 1837-09-01 08:00:01  blood 1065 #> 2130  96.3      9 1837 1837-09-01 08:00:01   bone 1065 #> 2131 123.7     10 1837 1837-10-01 18:00:00  blood 1066 #> 2132 123.7     10 1837 1837-10-01 18:00:00   bone 1066 #> 2133 107.0     11 1837 1837-11-01 04:00:00  blood 1067 #> 2134 107.0     11 1837 1837-11-01 04:00:00   bone 1067 #> 2135 129.8     12 1837 1837-12-01 14:00:01  blood 1068 #> 2136 129.8     12 1837 1837-12-01 14:00:01   bone 1068 #> 2137 144.9      1 1838 1838-01-01 00:00:00  blood 1069 #> 2138 144.9      1 1838 1838-01-01 00:00:00   bone 1069 #> 2139  84.8      2 1838 1838-01-31 10:00:00  blood 1070 #> 2140  84.8      2 1838 1838-01-31 10:00:00   bone 1070 #> 2141 140.8      3 1838 1838-03-02 20:00:01  blood 1071 #> 2142 140.8      3 1838 1838-03-02 20:00:01   bone 1071 #> 2143 126.6      4 1838 1838-04-02 06:00:00  blood 1072 #> 2144 126.6      4 1838 1838-04-02 06:00:00   bone 1072 #> 2145 137.6      5 1838 1838-05-02 16:00:00  blood 1073 #> 2146 137.6      5 1838 1838-05-02 16:00:00   bone 1073 #> 2147  94.5      6 1838 1838-06-02 02:00:01  blood 1074 #> 2148  94.5      6 1838 1838-06-02 02:00:01   bone 1074 #> 2149 108.2      7 1838 1838-07-02 12:00:00  blood 1075 #> 2150 108.2      7 1838 1838-07-02 12:00:00   bone 1075 #> 2151  78.8      8 1838 1838-08-01 22:00:00  blood 1076 #> 2152  78.8      8 1838 1838-08-01 22:00:00   bone 1076 #> 2153  73.6      9 1838 1838-09-01 08:00:01  blood 1077 #> 2154  73.6      9 1838 1838-09-01 08:00:01   bone 1077 #> 2155  90.8     10 1838 1838-10-01 18:00:00  blood 1078 #> 2156  90.8     10 1838 1838-10-01 18:00:00   bone 1078 #> 2157  77.4     11 1838 1838-11-01 04:00:00  blood 1079 #> 2158  77.4     11 1838 1838-11-01 04:00:00   bone 1079 #> 2159  79.8     12 1838 1838-12-01 14:00:01  blood 1080 #> 2160  79.8     12 1838 1838-12-01 14:00:01   bone 1080 #> 2161 107.6      1 1839 1839-01-01 00:00:00  blood 1081 #> 2162 107.6      1 1839 1839-01-01 00:00:00   bone 1081 #> 2163 102.5      2 1839 1839-01-31 10:00:00  blood 1082 #> 2164 102.5      2 1839 1839-01-31 10:00:00   bone 1082 #> 2165  77.7      3 1839 1839-03-02 20:00:01  blood 1083 #> 2166  77.7      3 1839 1839-03-02 20:00:01   bone 1083 #> 2167  61.8      4 1839 1839-04-02 06:00:00  blood 1084 #> 2168  61.8      4 1839 1839-04-02 06:00:00   bone 1084 #> 2169  53.8      5 1839 1839-05-02 16:00:00  blood 1085 #> 2170  53.8      5 1839 1839-05-02 16:00:00   bone 1085 #> 2171  54.6      6 1839 1839-06-02 02:00:01  blood 1086 #> 2172  54.6      6 1839 1839-06-02 02:00:01   bone 1086 #> 2173  84.7      7 1839 1839-07-02 12:00:00  blood 1087 #> 2174  84.7      7 1839 1839-07-02 12:00:00   bone 1087 #> 2175 131.2      8 1839 1839-08-01 22:00:00  blood 1088 #> 2176 131.2      8 1839 1839-08-01 22:00:00   bone 1088 #> 2177 132.7      9 1839 1839-09-01 08:00:01  blood 1089 #> 2178 132.7      9 1839 1839-09-01 08:00:01   bone 1089 #> 2179  90.8     10 1839 1839-10-01 18:00:00  blood 1090 #> 2180  90.8     10 1839 1839-10-01 18:00:00   bone 1090 #> 2181  68.8     11 1839 1839-11-01 04:00:00  blood 1091 #> 2182  68.8     11 1839 1839-11-01 04:00:00   bone 1091 #> 2183  63.6     12 1839 1839-12-01 14:00:01  blood 1092 #> 2184  63.6     12 1839 1839-12-01 14:00:01   bone 1092 #> 2185  81.2      1 1840 1840-01-01 00:00:00  blood 1093 #> 2186  81.2      1 1840 1840-01-01 00:00:00   bone 1093 #> 2187  87.7      2 1840 1840-01-31 12:00:00  blood 1094 #> 2188  87.7      2 1840 1840-01-31 12:00:00   bone 1094 #> 2189  55.5      3 1840 1840-03-02 00:00:01  blood 1095 #> 2190  55.5      3 1840 1840-03-02 00:00:01   bone 1095 #> 2191  65.9      4 1840 1840-04-01 12:00:00  blood 1096 #> 2192  65.9      4 1840 1840-04-01 12:00:00   bone 1096 #> 2193  69.2      5 1840 1840-05-02 00:00:00  blood 1097 #> 2194  69.2      5 1840 1840-05-02 00:00:00   bone 1097 #> 2195  48.5      6 1840 1840-06-01 12:00:01  blood 1098 #> 2196  48.5      6 1840 1840-06-01 12:00:01   bone 1098 #> 2197  60.7      7 1840 1840-07-02 00:00:00  blood 1099 #> 2198  60.7      7 1840 1840-07-02 00:00:00   bone 1099 #> 2199  57.8      8 1840 1840-08-01 12:00:00  blood 1100 #> 2200  57.8      8 1840 1840-08-01 12:00:00   bone 1100 #> 2201  74.0      9 1840 1840-09-01 00:00:01  blood 1101 #> 2202  74.0      9 1840 1840-09-01 00:00:01   bone 1101 #> 2203  49.8     10 1840 1840-10-01 12:00:00  blood 1102 #> 2204  49.8     10 1840 1840-10-01 12:00:00   bone 1102 #> 2205  54.3     11 1840 1840-11-01 00:00:00  blood 1103 #> 2206  54.3     11 1840 1840-11-01 00:00:00   bone 1103 #> 2207  53.7     12 1840 1840-12-01 12:00:01  blood 1104 #> 2208  53.7     12 1840 1840-12-01 12:00:01   bone 1104 #> 2209  24.0      1 1841 1841-01-01 00:00:00  blood 1105 #> 2210  24.0      1 1841 1841-01-01 00:00:00   bone 1105 #> 2211  29.9      2 1841 1841-01-31 10:00:00  blood 1106 #> 2212  29.9      2 1841 1841-01-31 10:00:00   bone 1106 #> 2213  29.7      3 1841 1841-03-02 20:00:01  blood 1107 #> 2214  29.7      3 1841 1841-03-02 20:00:01   bone 1107 #> 2215  42.6      4 1841 1841-04-02 06:00:00  blood 1108 #> 2216  42.6      4 1841 1841-04-02 06:00:00   bone 1108 #> 2217  67.4      5 1841 1841-05-02 16:00:00  blood 1109 #> 2218  67.4      5 1841 1841-05-02 16:00:00   bone 1109 #> 2219  55.7      6 1841 1841-06-02 02:00:01  blood 1110 #> 2220  55.7      6 1841 1841-06-02 02:00:01   bone 1110 #> 2221  30.8      7 1841 1841-07-02 12:00:00  blood 1111 #> 2222  30.8      7 1841 1841-07-02 12:00:00   bone 1111 #> 2223  39.3      8 1841 1841-08-01 22:00:00  blood 1112 #> 2224  39.3      8 1841 1841-08-01 22:00:00   bone 1112 #> 2225  35.1      9 1841 1841-09-01 08:00:01  blood 1113 #> 2226  35.1      9 1841 1841-09-01 08:00:01   bone 1113 #> 2227  28.5     10 1841 1841-10-01 18:00:00  blood 1114 #> 2228  28.5     10 1841 1841-10-01 18:00:00   bone 1114 #> 2229  19.8     11 1841 1841-11-01 04:00:00  blood 1115 #> 2230  19.8     11 1841 1841-11-01 04:00:00   bone 1115 #> 2231  38.8     12 1841 1841-12-01 14:00:01  blood 1116 #> 2232  38.8     12 1841 1841-12-01 14:00:01   bone 1116 #> 2233  20.4      1 1842 1842-01-01 00:00:00  blood 1117 #> 2234  20.4      1 1842 1842-01-01 00:00:00   bone 1117 #> 2235  22.1      2 1842 1842-01-31 10:00:00  blood 1118 #> 2236  22.1      2 1842 1842-01-31 10:00:00   bone 1118 #> 2237  21.7      3 1842 1842-03-02 20:00:01  blood 1119 #> 2238  21.7      3 1842 1842-03-02 20:00:01   bone 1119 #> 2239  26.9      4 1842 1842-04-02 06:00:00  blood 1120 #> 2240  26.9      4 1842 1842-04-02 06:00:00   bone 1120 #> 2241  24.9      5 1842 1842-05-02 16:00:00  blood 1121 #> 2242  24.9      5 1842 1842-05-02 16:00:00   bone 1121 #> 2243  20.5      6 1842 1842-06-02 02:00:01  blood 1122 #> 2244  20.5      6 1842 1842-06-02 02:00:01   bone 1122 #> 2245  12.6      7 1842 1842-07-02 12:00:00  blood 1123 #> 2246  12.6      7 1842 1842-07-02 12:00:00   bone 1123 #> 2247  26.5      8 1842 1842-08-01 22:00:00  blood 1124 #> 2248  26.5      8 1842 1842-08-01 22:00:00   bone 1124 #> 2249  18.5      9 1842 1842-09-01 08:00:01  blood 1125 #> 2250  18.5      9 1842 1842-09-01 08:00:01   bone 1125 #> 2251  38.1     10 1842 1842-10-01 18:00:00  blood 1126 #> 2252  38.1     10 1842 1842-10-01 18:00:00   bone 1126 #> 2253  40.5     11 1842 1842-11-01 04:00:00  blood 1127 #> 2254  40.5     11 1842 1842-11-01 04:00:00   bone 1127 #> 2255  17.6     12 1842 1842-12-01 14:00:01  blood 1128 #> 2256  17.6     12 1842 1842-12-01 14:00:01   bone 1128 #> 2257  13.3      1 1843 1843-01-01 00:00:00  blood 1129 #> 2258  13.3      1 1843 1843-01-01 00:00:00   bone 1129 #> 2259   3.5      2 1843 1843-01-31 10:00:00  blood 1130 #> 2260   3.5      2 1843 1843-01-31 10:00:00   bone 1130 #> 2261   8.3      3 1843 1843-03-02 20:00:01  blood 1131 #> 2262   8.3      3 1843 1843-03-02 20:00:01   bone 1131 #> 2263   8.8      4 1843 1843-04-02 06:00:00  blood 1132 #> 2264   8.8      4 1843 1843-04-02 06:00:00   bone 1132 #> 2265  21.1      5 1843 1843-05-02 16:00:00  blood 1133 #> 2266  21.1      5 1843 1843-05-02 16:00:00   bone 1133 #> 2267  10.5      6 1843 1843-06-02 02:00:01  blood 1134 #> 2268  10.5      6 1843 1843-06-02 02:00:01   bone 1134 #> 2269   9.5      7 1843 1843-07-02 12:00:00  blood 1135 #> 2270   9.5      7 1843 1843-07-02 12:00:00   bone 1135 #> 2271  11.8      8 1843 1843-08-01 22:00:00  blood 1136 #> 2272  11.8      8 1843 1843-08-01 22:00:00   bone 1136 #> 2273   4.2      9 1843 1843-09-01 08:00:01  blood 1137 #> 2274   4.2      9 1843 1843-09-01 08:00:01   bone 1137 #> 2275   5.3     10 1843 1843-10-01 18:00:00  blood 1138 #> 2276   5.3     10 1843 1843-10-01 18:00:00   bone 1138 #> 2277  19.1     11 1843 1843-11-01 04:00:00  blood 1139 #> 2278  19.1     11 1843 1843-11-01 04:00:00   bone 1139 #> 2279  12.7     12 1843 1843-12-01 14:00:01  blood 1140 #> 2280  12.7     12 1843 1843-12-01 14:00:01   bone 1140 #> 2281   9.4      1 1844 1844-01-01 00:00:00  blood 1141 #> 2282   9.4      1 1844 1844-01-01 00:00:00   bone 1141 #> 2283  14.7      2 1844 1844-01-31 12:00:00  blood 1142 #> 2284  14.7      2 1844 1844-01-31 12:00:00   bone 1142 #> 2285  13.6      3 1844 1844-03-02 00:00:01  blood 1143 #> 2286  13.6      3 1844 1844-03-02 00:00:01   bone 1143 #> 2287  20.8      4 1844 1844-04-01 12:00:00  blood 1144 #> 2288  20.8      4 1844 1844-04-01 12:00:00   bone 1144 #> 2289  12.0      5 1844 1844-05-02 00:00:00  blood 1145 #> 2290  12.0      5 1844 1844-05-02 00:00:00   bone 1145 #> 2291   3.7      6 1844 1844-06-01 12:00:01  blood 1146 #> 2292   3.7      6 1844 1844-06-01 12:00:01   bone 1146 #> 2293  21.2      7 1844 1844-07-02 00:00:00  blood 1147 #> 2294  21.2      7 1844 1844-07-02 00:00:00   bone 1147 #> 2295  23.9      8 1844 1844-08-01 12:00:00  blood 1148 #> 2296  23.9      8 1844 1844-08-01 12:00:00   bone 1148 #> 2297   6.9      9 1844 1844-09-01 00:00:01  blood 1149 #> 2298   6.9      9 1844 1844-09-01 00:00:01   bone 1149 #> 2299  21.5     10 1844 1844-10-01 12:00:00  blood 1150 #> 2300  21.5     10 1844 1844-10-01 12:00:00   bone 1150 #> 2301  10.7     11 1844 1844-11-01 00:00:00  blood 1151 #> 2302  10.7     11 1844 1844-11-01 00:00:00   bone 1151 #> 2303  21.6     12 1844 1844-12-01 12:00:01  blood 1152 #> 2304  21.6     12 1844 1844-12-01 12:00:01   bone 1152 #> 2305  25.7      1 1845 1845-01-01 00:00:00  blood 1153 #> 2306  25.7      1 1845 1845-01-01 00:00:00   bone 1153 #> 2307  43.6      2 1845 1845-01-31 10:00:00  blood 1154 #> 2308  43.6      2 1845 1845-01-31 10:00:00   bone 1154 #> 2309  43.3      3 1845 1845-03-02 20:00:01  blood 1155 #> 2310  43.3      3 1845 1845-03-02 20:00:01   bone 1155 #> 2311  56.9      4 1845 1845-04-02 06:00:00  blood 1156 #> 2312  56.9      4 1845 1845-04-02 06:00:00   bone 1156 #> 2313  47.8      5 1845 1845-05-02 16:00:00  blood 1157 #> 2314  47.8      5 1845 1845-05-02 16:00:00   bone 1157 #> 2315  31.1      6 1845 1845-06-02 02:00:01  blood 1158 #> 2316  31.1      6 1845 1845-06-02 02:00:01   bone 1158 #> 2317  30.6      7 1845 1845-07-02 12:00:00  blood 1159 #> 2318  30.6      7 1845 1845-07-02 12:00:00   bone 1159 #> 2319  32.3      8 1845 1845-08-01 22:00:00  blood 1160 #> 2320  32.3      8 1845 1845-08-01 22:00:00   bone 1160 #> 2321  29.6      9 1845 1845-09-01 08:00:01  blood 1161 #> 2322  29.6      9 1845 1845-09-01 08:00:01   bone 1161 #> 2323  40.7     10 1845 1845-10-01 18:00:00  blood 1162 #> 2324  40.7     10 1845 1845-10-01 18:00:00   bone 1162 #> 2325  39.4     11 1845 1845-11-01 04:00:00  blood 1163 #> 2326  39.4     11 1845 1845-11-01 04:00:00   bone 1163 #> 2327  59.7     12 1845 1845-12-01 14:00:01  blood 1164 #> 2328  59.7     12 1845 1845-12-01 14:00:01   bone 1164 #> 2329  38.7      1 1846 1846-01-01 00:00:00  blood 1165 #> 2330  38.7      1 1846 1846-01-01 00:00:00   bone 1165 #> 2331  51.0      2 1846 1846-01-31 10:00:00  blood 1166 #> 2332  51.0      2 1846 1846-01-31 10:00:00   bone 1166 #> 2333  63.9      3 1846 1846-03-02 20:00:01  blood 1167 #> 2334  63.9      3 1846 1846-03-02 20:00:01   bone 1167 #> 2335  69.2      4 1846 1846-04-02 06:00:00  blood 1168 #> 2336  69.2      4 1846 1846-04-02 06:00:00   bone 1168 #> 2337  59.9      5 1846 1846-05-02 16:00:00  blood 1169 #> 2338  59.9      5 1846 1846-05-02 16:00:00   bone 1169 #> 2339  65.1      6 1846 1846-06-02 02:00:01  blood 1170 #> 2340  65.1      6 1846 1846-06-02 02:00:01   bone 1170 #> 2341  46.5      7 1846 1846-07-02 12:00:00  blood 1171 #> 2342  46.5      7 1846 1846-07-02 12:00:00   bone 1171 #> 2343  54.8      8 1846 1846-08-01 22:00:00  blood 1172 #> 2344  54.8      8 1846 1846-08-01 22:00:00   bone 1172 #> 2345 107.1      9 1846 1846-09-01 08:00:01  blood 1173 #> 2346 107.1      9 1846 1846-09-01 08:00:01   bone 1173 #> 2347  55.9     10 1846 1846-10-01 18:00:00  blood 1174 #> 2348  55.9     10 1846 1846-10-01 18:00:00   bone 1174 #> 2349  60.4     11 1846 1846-11-01 04:00:00  blood 1175 #> 2350  60.4     11 1846 1846-11-01 04:00:00   bone 1175 #> 2351  65.5     12 1846 1846-12-01 14:00:01  blood 1176 #> 2352  65.5     12 1846 1846-12-01 14:00:01   bone 1176 #> 2353  62.6      1 1847 1847-01-01 00:00:00  blood 1177 #> 2354  62.6      1 1847 1847-01-01 00:00:00   bone 1177 #> 2355  44.9      2 1847 1847-01-31 10:00:00  blood 1178 #> 2356  44.9      2 1847 1847-01-31 10:00:00   bone 1178 #> 2357  85.7      3 1847 1847-03-02 20:00:01  blood 1179 #> 2358  85.7      3 1847 1847-03-02 20:00:01   bone 1179 #> 2359  44.7      4 1847 1847-04-02 06:00:00  blood 1180 #> 2360  44.7      4 1847 1847-04-02 06:00:00   bone 1180 #> 2361  75.4      5 1847 1847-05-02 16:00:00  blood 1181 #> 2362  75.4      5 1847 1847-05-02 16:00:00   bone 1181 #> 2363  85.3      6 1847 1847-06-02 02:00:01  blood 1182 #> 2364  85.3      6 1847 1847-06-02 02:00:01   bone 1182 #> 2365  52.2      7 1847 1847-07-02 12:00:00  blood 1183 #> 2366  52.2      7 1847 1847-07-02 12:00:00   bone 1183 #> 2367 140.6      8 1847 1847-08-01 22:00:00  blood 1184 #> 2368 140.6      8 1847 1847-08-01 22:00:00   bone 1184 #> 2369 161.2      9 1847 1847-09-01 08:00:01  blood 1185 #> 2370 161.2      9 1847 1847-09-01 08:00:01   bone 1185 #> 2371 180.4     10 1847 1847-10-01 18:00:00  blood 1186 #> 2372 180.4     10 1847 1847-10-01 18:00:00   bone 1186 #> 2373 138.9     11 1847 1847-11-01 04:00:00  blood 1187 #> 2374 138.9     11 1847 1847-11-01 04:00:00   bone 1187 #> 2375 109.6     12 1847 1847-12-01 14:00:01  blood 1188 #> 2376 109.6     12 1847 1847-12-01 14:00:01   bone 1188 #> 2377 159.1      1 1848 1848-01-01 00:00:00  blood 1189 #> 2378 159.1      1 1848 1848-01-01 00:00:00   bone 1189 #> 2379 111.8      2 1848 1848-01-31 12:00:00  blood 1190 #> 2380 111.8      2 1848 1848-01-31 12:00:00   bone 1190 #> 2381 108.9      3 1848 1848-03-02 00:00:01  blood 1191 #> 2382 108.9      3 1848 1848-03-02 00:00:01   bone 1191 #> 2383 107.1      4 1848 1848-04-01 12:00:00  blood 1192 #> 2384 107.1      4 1848 1848-04-01 12:00:00   bone 1192 #> 2385 102.2      5 1848 1848-05-02 00:00:00  blood 1193 #> 2386 102.2      5 1848 1848-05-02 00:00:00   bone 1193 #> 2387 123.8      6 1848 1848-06-01 12:00:01  blood 1194 #> 2388 123.8      6 1848 1848-06-01 12:00:01   bone 1194 #> 2389 139.2      7 1848 1848-07-02 00:00:00  blood 1195 #> 2390 139.2      7 1848 1848-07-02 00:00:00   bone 1195 #> 2391 132.5      8 1848 1848-08-01 12:00:00  blood 1196 #> 2392 132.5      8 1848 1848-08-01 12:00:00   bone 1196 #> 2393 100.3      9 1848 1848-09-01 00:00:01  blood 1197 #> 2394 100.3      9 1848 1848-09-01 00:00:01   bone 1197 #> 2395 132.4     10 1848 1848-10-01 12:00:00  blood 1198 #> 2396 132.4     10 1848 1848-10-01 12:00:00   bone 1198 #> 2397 114.6     11 1848 1848-11-01 00:00:00  blood 1199 #> 2398 114.6     11 1848 1848-11-01 00:00:00   bone 1199 #> 2399 159.9     12 1848 1848-12-01 12:00:01  blood 1200 #> 2400 159.9     12 1848 1848-12-01 12:00:01   bone 1200 #> 2401 156.7      1 1849 1849-01-01 00:00:00  blood 1201 #> 2402 156.7      1 1849 1849-01-01 00:00:00   bone 1201 #> 2403 131.7      2 1849 1849-01-31 10:00:00  blood 1202 #> 2404 131.7      2 1849 1849-01-31 10:00:00   bone 1202 #> 2405  96.5      3 1849 1849-03-02 20:00:01  blood 1203 #> 2406  96.5      3 1849 1849-03-02 20:00:01   bone 1203 #> 2407 102.5      4 1849 1849-04-02 06:00:00  blood 1204 #> 2408 102.5      4 1849 1849-04-02 06:00:00   bone 1204 #> 2409  80.6      5 1849 1849-05-02 16:00:00  blood 1205 #> 2410  80.6      5 1849 1849-05-02 16:00:00   bone 1205 #> 2411  81.2      6 1849 1849-06-02 02:00:01  blood 1206 #> 2412  81.2      6 1849 1849-06-02 02:00:01   bone 1206 #> 2413  78.0      7 1849 1849-07-02 12:00:00  blood 1207 #> 2414  78.0      7 1849 1849-07-02 12:00:00   bone 1207 #> 2415  61.3      8 1849 1849-08-01 22:00:00  blood 1208 #> 2416  61.3      8 1849 1849-08-01 22:00:00   bone 1208 #> 2417  93.7      9 1849 1849-09-01 08:00:01  blood 1209 #> 2418  93.7      9 1849 1849-09-01 08:00:01   bone 1209 #> 2419  71.5     10 1849 1849-10-01 18:00:00  blood 1210 #> 2420  71.5     10 1849 1849-10-01 18:00:00   bone 1210 #> 2421  99.7     11 1849 1849-11-01 04:00:00  blood 1211 #> 2422  99.7     11 1849 1849-11-01 04:00:00   bone 1211 #> 2423  97.0     12 1849 1849-12-01 14:00:01  blood 1212 #> 2424  97.0     12 1849 1849-12-01 14:00:01   bone 1212 #> 2425  78.0      1 1850 1850-01-01 00:00:00  blood 1213 #> 2426  78.0      1 1850 1850-01-01 00:00:00   bone 1213 #> 2427  89.4      2 1850 1850-01-31 10:00:00  blood 1214 #> 2428  89.4      2 1850 1850-01-31 10:00:00   bone 1214 #> 2429  82.6      3 1850 1850-03-02 20:00:01  blood 1215 #> 2430  82.6      3 1850 1850-03-02 20:00:01   bone 1215 #> 2431  44.1      4 1850 1850-04-02 06:00:00  blood 1216 #> 2432  44.1      4 1850 1850-04-02 06:00:00   bone 1216 #> 2433  61.6      5 1850 1850-05-02 16:00:00  blood 1217 #> 2434  61.6      5 1850 1850-05-02 16:00:00   bone 1217 #> 2435  70.0      6 1850 1850-06-02 02:00:01  blood 1218 #> 2436  70.0      6 1850 1850-06-02 02:00:01   bone 1218 #> 2437  39.1      7 1850 1850-07-02 12:00:00  blood 1219 #> 2438  39.1      7 1850 1850-07-02 12:00:00   bone 1219 #> 2439  61.6      8 1850 1850-08-01 22:00:00  blood 1220 #> 2440  61.6      8 1850 1850-08-01 22:00:00   bone 1220 #> 2441  86.2      9 1850 1850-09-01 08:00:01  blood 1221 #> 2442  86.2      9 1850 1850-09-01 08:00:01   bone 1221 #> 2443  71.0     10 1850 1850-10-01 18:00:00  blood 1222 #> 2444  71.0     10 1850 1850-10-01 18:00:00   bone 1222 #> 2445  54.8     11 1850 1850-11-01 04:00:00  blood 1223 #> 2446  54.8     11 1850 1850-11-01 04:00:00   bone 1223 #> 2447  60.0     12 1850 1850-12-01 14:00:01  blood 1224 #> 2448  60.0     12 1850 1850-12-01 14:00:01   bone 1224 #> 2449  75.5      1 1851 1851-01-01 00:00:00  blood 1225 #> 2450  75.5      1 1851 1851-01-01 00:00:00   bone 1225 #> 2451 105.4      2 1851 1851-01-31 10:00:00  blood 1226 #> 2452 105.4      2 1851 1851-01-31 10:00:00   bone 1226 #> 2453  64.6      3 1851 1851-03-02 20:00:01  blood 1227 #> 2454  64.6      3 1851 1851-03-02 20:00:01   bone 1227 #> 2455  56.5      4 1851 1851-04-02 06:00:00  blood 1228 #> 2456  56.5      4 1851 1851-04-02 06:00:00   bone 1228 #> 2457  62.6      5 1851 1851-05-02 16:00:00  blood 1229 #> 2458  62.6      5 1851 1851-05-02 16:00:00   bone 1229 #> 2459  63.2      6 1851 1851-06-02 02:00:01  blood 1230 #> 2460  63.2      6 1851 1851-06-02 02:00:01   bone 1230 #> 2461  36.1      7 1851 1851-07-02 12:00:00  blood 1231 #> 2462  36.1      7 1851 1851-07-02 12:00:00   bone 1231 #> 2463  57.4      8 1851 1851-08-01 22:00:00  blood 1232 #> 2464  57.4      8 1851 1851-08-01 22:00:00   bone 1232 #> 2465  67.9      9 1851 1851-09-01 08:00:01  blood 1233 #> 2466  67.9      9 1851 1851-09-01 08:00:01   bone 1233 #> 2467  62.5     10 1851 1851-10-01 18:00:00  blood 1234 #> 2468  62.5     10 1851 1851-10-01 18:00:00   bone 1234 #> 2469  50.9     11 1851 1851-11-01 04:00:00  blood 1235 #> 2470  50.9     11 1851 1851-11-01 04:00:00   bone 1235 #> 2471  71.4     12 1851 1851-12-01 14:00:01  blood 1236 #> 2472  71.4     12 1851 1851-12-01 14:00:01   bone 1236 #> 2473  68.4      1 1852 1852-01-01 00:00:00  blood 1237 #> 2474  68.4      1 1852 1852-01-01 00:00:00   bone 1237 #> 2475  67.5      2 1852 1852-01-31 12:00:00  blood 1238 #> 2476  67.5      2 1852 1852-01-31 12:00:00   bone 1238 #> 2477  61.2      3 1852 1852-03-02 00:00:01  blood 1239 #> 2478  61.2      3 1852 1852-03-02 00:00:01   bone 1239 #> 2479  65.4      4 1852 1852-04-01 12:00:00  blood 1240 #> 2480  65.4      4 1852 1852-04-01 12:00:00   bone 1240 #> 2481  54.9      5 1852 1852-05-02 00:00:00  blood 1241 #> 2482  54.9      5 1852 1852-05-02 00:00:00   bone 1241 #> 2483  46.9      6 1852 1852-06-01 12:00:01  blood 1242 #> 2484  46.9      6 1852 1852-06-01 12:00:01   bone 1242 #> 2485  42.0      7 1852 1852-07-02 00:00:00  blood 1243 #> 2486  42.0      7 1852 1852-07-02 00:00:00   bone 1243 #> 2487  39.7      8 1852 1852-08-01 12:00:00  blood 1244 #> 2488  39.7      8 1852 1852-08-01 12:00:00   bone 1244 #> 2489  37.5      9 1852 1852-09-01 00:00:01  blood 1245 #> 2490  37.5      9 1852 1852-09-01 00:00:01   bone 1245 #> 2491  67.3     10 1852 1852-10-01 12:00:00  blood 1246 #> 2492  67.3     10 1852 1852-10-01 12:00:00   bone 1246 #> 2493  54.3     11 1852 1852-11-01 00:00:00  blood 1247 #> 2494  54.3     11 1852 1852-11-01 00:00:00   bone 1247 #> 2495  45.4     12 1852 1852-12-01 12:00:01  blood 1248 #> 2496  45.4     12 1852 1852-12-01 12:00:01   bone 1248 #> 2497  41.1      1 1853 1853-01-01 00:00:00  blood 1249 #> 2498  41.1      1 1853 1853-01-01 00:00:00   bone 1249 #> 2499  42.9      2 1853 1853-01-31 10:00:00  blood 1250 #> 2500  42.9      2 1853 1853-01-31 10:00:00   bone 1250 #> 2501  37.7      3 1853 1853-03-02 20:00:01  blood 1251 #> 2502  37.7      3 1853 1853-03-02 20:00:01   bone 1251 #> 2503  47.6      4 1853 1853-04-02 06:00:00  blood 1252 #> 2504  47.6      4 1853 1853-04-02 06:00:00   bone 1252 #> 2505  34.7      5 1853 1853-05-02 16:00:00  blood 1253 #> 2506  34.7      5 1853 1853-05-02 16:00:00   bone 1253 #> 2507  40.0      6 1853 1853-06-02 02:00:01  blood 1254 #> 2508  40.0      6 1853 1853-06-02 02:00:01   bone 1254 #> 2509  45.9      7 1853 1853-07-02 12:00:00  blood 1255 #> 2510  45.9      7 1853 1853-07-02 12:00:00   bone 1255 #> 2511  50.4      8 1853 1853-08-01 22:00:00  blood 1256 #> 2512  50.4      8 1853 1853-08-01 22:00:00   bone 1256 #> 2513  33.5      9 1853 1853-09-01 08:00:01  blood 1257 #> 2514  33.5      9 1853 1853-09-01 08:00:01   bone 1257 #> 2515  42.3     10 1853 1853-10-01 18:00:00  blood 1258 #> 2516  42.3     10 1853 1853-10-01 18:00:00   bone 1258 #> 2517  28.8     11 1853 1853-11-01 04:00:00  blood 1259 #> 2518  28.8     11 1853 1853-11-01 04:00:00   bone 1259 #> 2519  23.4     12 1853 1853-12-01 14:00:01  blood 1260 #> 2520  23.4     12 1853 1853-12-01 14:00:01   bone 1260 #> 2521  15.4      1 1854 1854-01-01 00:00:00  blood 1261 #> 2522  15.4      1 1854 1854-01-01 00:00:00   bone 1261 #> 2523  20.0      2 1854 1854-01-31 10:00:00  blood 1262 #> 2524  20.0      2 1854 1854-01-31 10:00:00   bone 1262 #> 2525  20.7      3 1854 1854-03-02 20:00:01  blood 1263 #> 2526  20.7      3 1854 1854-03-02 20:00:01   bone 1263 #> 2527  26.4      4 1854 1854-04-02 06:00:00  blood 1264 #> 2528  26.4      4 1854 1854-04-02 06:00:00   bone 1264 #> 2529  24.0      5 1854 1854-05-02 16:00:00  blood 1265 #> 2530  24.0      5 1854 1854-05-02 16:00:00   bone 1265 #> 2531  21.1      6 1854 1854-06-02 02:00:01  blood 1266 #> 2532  21.1      6 1854 1854-06-02 02:00:01   bone 1266 #> 2533  18.7      7 1854 1854-07-02 12:00:00  blood 1267 #> 2534  18.7      7 1854 1854-07-02 12:00:00   bone 1267 #> 2535  15.8      8 1854 1854-08-01 22:00:00  blood 1268 #> 2536  15.8      8 1854 1854-08-01 22:00:00   bone 1268 #> 2537  22.4      9 1854 1854-09-01 08:00:01  blood 1269 #> 2538  22.4      9 1854 1854-09-01 08:00:01   bone 1269 #> 2539  12.7     10 1854 1854-10-01 18:00:00  blood 1270 #> 2540  12.7     10 1854 1854-10-01 18:00:00   bone 1270 #> 2541  28.2     11 1854 1854-11-01 04:00:00  blood 1271 #> 2542  28.2     11 1854 1854-11-01 04:00:00   bone 1271 #> 2543  21.4     12 1854 1854-12-01 14:00:01  blood 1272 #> 2544  21.4     12 1854 1854-12-01 14:00:01   bone 1272 #> 2545  12.3      1 1855 1855-01-01 00:00:00  blood 1273 #> 2546  12.3      1 1855 1855-01-01 00:00:00   bone 1273 #> 2547  11.4      2 1855 1855-01-31 10:00:00  blood 1274 #> 2548  11.4      2 1855 1855-01-31 10:00:00   bone 1274 #> 2549  17.4      3 1855 1855-03-02 20:00:01  blood 1275 #> 2550  17.4      3 1855 1855-03-02 20:00:01   bone 1275 #> 2551   4.4      4 1855 1855-04-02 06:00:00  blood 1276 #> 2552   4.4      4 1855 1855-04-02 06:00:00   bone 1276 #> 2553   9.1      5 1855 1855-05-02 16:00:00  blood 1277 #> 2554   9.1      5 1855 1855-05-02 16:00:00   bone 1277 #> 2555   5.3      6 1855 1855-06-02 02:00:01  blood 1278 #> 2556   5.3      6 1855 1855-06-02 02:00:01   bone 1278 #> 2557   0.4      7 1855 1855-07-02 12:00:00  blood 1279 #> 2558   0.4      7 1855 1855-07-02 12:00:00   bone 1279 #> 2559   3.1      8 1855 1855-08-01 22:00:00  blood 1280 #> 2560   3.1      8 1855 1855-08-01 22:00:00   bone 1280 #> 2561   0.0      9 1855 1855-09-01 08:00:01  blood 1281 #> 2562   0.0      9 1855 1855-09-01 08:00:01   bone 1281 #> 2563   9.7     10 1855 1855-10-01 18:00:00  blood 1282 #> 2564   9.7     10 1855 1855-10-01 18:00:00   bone 1282 #> 2565   4.3     11 1855 1855-11-01 04:00:00  blood 1283 #> 2566   4.3     11 1855 1855-11-01 04:00:00   bone 1283 #> 2567   3.1     12 1855 1855-12-01 14:00:01  blood 1284 #> 2568   3.1     12 1855 1855-12-01 14:00:01   bone 1284 #> 2569   0.5      1 1856 1856-01-01 00:00:00  blood 1285 #> 2570   0.5      1 1856 1856-01-01 00:00:00   bone 1285 #> 2571   4.9      2 1856 1856-01-31 12:00:00  blood 1286 #> 2572   4.9      2 1856 1856-01-31 12:00:00   bone 1286 #> 2573   0.4      3 1856 1856-03-02 00:00:01  blood 1287 #> 2574   0.4      3 1856 1856-03-02 00:00:01   bone 1287 #> 2575   6.5      4 1856 1856-04-01 12:00:00  blood 1288 #> 2576   6.5      4 1856 1856-04-01 12:00:00   bone 1288 #> 2577   0.0      5 1856 1856-05-02 00:00:00  blood 1289 #> 2578   0.0      5 1856 1856-05-02 00:00:00   bone 1289 #> 2579   5.0      6 1856 1856-06-01 12:00:01  blood 1290 #> 2580   5.0      6 1856 1856-06-01 12:00:01   bone 1290 #> 2581   4.6      7 1856 1856-07-02 00:00:00  blood 1291 #> 2582   4.6      7 1856 1856-07-02 00:00:00   bone 1291 #> 2583   5.9      8 1856 1856-08-01 12:00:00  blood 1292 #> 2584   5.9      8 1856 1856-08-01 12:00:00   bone 1292 #> 2585   4.4      9 1856 1856-09-01 00:00:01  blood 1293 #> 2586   4.4      9 1856 1856-09-01 00:00:01   bone 1293 #> 2587   4.5     10 1856 1856-10-01 12:00:00  blood 1294 #> 2588   4.5     10 1856 1856-10-01 12:00:00   bone 1294 #> 2589   7.7     11 1856 1856-11-01 00:00:00  blood 1295 #> 2590   7.7     11 1856 1856-11-01 00:00:00   bone 1295 #> 2591   7.2     12 1856 1856-12-01 12:00:01  blood 1296 #> 2592   7.2     12 1856 1856-12-01 12:00:01   bone 1296 #> 2593  13.7      1 1857 1857-01-01 00:00:00  blood 1297 #> 2594  13.7      1 1857 1857-01-01 00:00:00   bone 1297 #> 2595   7.4      2 1857 1857-01-31 10:00:00  blood 1298 #> 2596   7.4      2 1857 1857-01-31 10:00:00   bone 1298 #> 2597   5.2      3 1857 1857-03-02 20:00:01  blood 1299 #> 2598   5.2      3 1857 1857-03-02 20:00:01   bone 1299 #> 2599  11.1      4 1857 1857-04-02 06:00:00  blood 1300 #> 2600  11.1      4 1857 1857-04-02 06:00:00   bone 1300 #> 2601  29.2      5 1857 1857-05-02 16:00:00  blood 1301 #> 2602  29.2      5 1857 1857-05-02 16:00:00   bone 1301 #> 2603  16.0      6 1857 1857-06-02 02:00:01  blood 1302 #> 2604  16.0      6 1857 1857-06-02 02:00:01   bone 1302 #> 2605  22.2      7 1857 1857-07-02 12:00:00  blood 1303 #> 2606  22.2      7 1857 1857-07-02 12:00:00   bone 1303 #> 2607  16.9      8 1857 1857-08-01 22:00:00  blood 1304 #> 2608  16.9      8 1857 1857-08-01 22:00:00   bone 1304 #> 2609  42.4      9 1857 1857-09-01 08:00:01  blood 1305 #> 2610  42.4      9 1857 1857-09-01 08:00:01   bone 1305 #> 2611  40.6     10 1857 1857-10-01 18:00:00  blood 1306 #> 2612  40.6     10 1857 1857-10-01 18:00:00   bone 1306 #> 2613  31.4     11 1857 1857-11-01 04:00:00  blood 1307 #> 2614  31.4     11 1857 1857-11-01 04:00:00   bone 1307 #> 2615  37.2     12 1857 1857-12-01 14:00:01  blood 1308 #> 2616  37.2     12 1857 1857-12-01 14:00:01   bone 1308 #> 2617  39.0      1 1858 1858-01-01 00:00:00  blood 1309 #> 2618  39.0      1 1858 1858-01-01 00:00:00   bone 1309 #> 2619  34.9      2 1858 1858-01-31 10:00:00  blood 1310 #> 2620  34.9      2 1858 1858-01-31 10:00:00   bone 1310 #> 2621  57.5      3 1858 1858-03-02 20:00:01  blood 1311 #> 2622  57.5      3 1858 1858-03-02 20:00:01   bone 1311 #> 2623  38.3      4 1858 1858-04-02 06:00:00  blood 1312 #> 2624  38.3      4 1858 1858-04-02 06:00:00   bone 1312 #> 2625  41.4      5 1858 1858-05-02 16:00:00  blood 1313 #> 2626  41.4      5 1858 1858-05-02 16:00:00   bone 1313 #> 2627  44.5      6 1858 1858-06-02 02:00:01  blood 1314 #> 2628  44.5      6 1858 1858-06-02 02:00:01   bone 1314 #> 2629  56.7      7 1858 1858-07-02 12:00:00  blood 1315 #> 2630  56.7      7 1858 1858-07-02 12:00:00   bone 1315 #> 2631  55.3      8 1858 1858-08-01 22:00:00  blood 1316 #> 2632  55.3      8 1858 1858-08-01 22:00:00   bone 1316 #> 2633  80.1      9 1858 1858-09-01 08:00:01  blood 1317 #> 2634  80.1      9 1858 1858-09-01 08:00:01   bone 1317 #> 2635  91.2     10 1858 1858-10-01 18:00:00  blood 1318 #> 2636  91.2     10 1858 1858-10-01 18:00:00   bone 1318 #> 2637  51.9     11 1858 1858-11-01 04:00:00  blood 1319 #> 2638  51.9     11 1858 1858-11-01 04:00:00   bone 1319 #> 2639  66.9     12 1858 1858-12-01 14:00:01  blood 1320 #> 2640  66.9     12 1858 1858-12-01 14:00:01   bone 1320 #> 2641  83.7      1 1859 1859-01-01 00:00:00  blood 1321 #> 2642  83.7      1 1859 1859-01-01 00:00:00   bone 1321 #> 2643  87.6      2 1859 1859-01-31 10:00:00  blood 1322 #> 2644  87.6      2 1859 1859-01-31 10:00:00   bone 1322 #> 2645  90.3      3 1859 1859-03-02 20:00:01  blood 1323 #> 2646  90.3      3 1859 1859-03-02 20:00:01   bone 1323 #> 2647  85.7      4 1859 1859-04-02 06:00:00  blood 1324 #> 2648  85.7      4 1859 1859-04-02 06:00:00   bone 1324 #> 2649  91.0      5 1859 1859-05-02 16:00:00  blood 1325 #> 2650  91.0      5 1859 1859-05-02 16:00:00   bone 1325 #> 2651  87.1      6 1859 1859-06-02 02:00:01  blood 1326 #> 2652  87.1      6 1859 1859-06-02 02:00:01   bone 1326 #> 2653  95.2      7 1859 1859-07-02 12:00:00  blood 1327 #> 2654  95.2      7 1859 1859-07-02 12:00:00   bone 1327 #> 2655 106.8      8 1859 1859-08-01 22:00:00  blood 1328 #> 2656 106.8      8 1859 1859-08-01 22:00:00   bone 1328 #> 2657 105.8      9 1859 1859-09-01 08:00:01  blood 1329 #> 2658 105.8      9 1859 1859-09-01 08:00:01   bone 1329 #> 2659 114.6     10 1859 1859-10-01 18:00:00  blood 1330 #> 2660 114.6     10 1859 1859-10-01 18:00:00   bone 1330 #> 2661  97.2     11 1859 1859-11-01 04:00:00  blood 1331 #> 2662  97.2     11 1859 1859-11-01 04:00:00   bone 1331 #> 2663  81.0     12 1859 1859-12-01 14:00:01  blood 1332 #> 2664  81.0     12 1859 1859-12-01 14:00:01   bone 1332 #> 2665  81.5      1 1860 1860-01-01 00:00:00  blood 1333 #> 2666  81.5      1 1860 1860-01-01 00:00:00   bone 1333 #> 2667  88.0      2 1860 1860-01-31 12:00:01  blood 1334 #> 2668  88.0      2 1860 1860-01-31 12:00:01   bone 1334 #> 2669  98.9      3 1860 1860-03-02 00:00:01  blood 1335 #> 2670  98.9      3 1860 1860-03-02 00:00:01   bone 1335 #> 2671  71.4      4 1860 1860-04-01 12:00:00  blood 1336 #> 2672  71.4      4 1860 1860-04-01 12:00:00   bone 1336 #> 2673 107.1      5 1860 1860-05-02 00:00:01  blood 1337 #> 2674 107.1      5 1860 1860-05-02 00:00:01   bone 1337 #> 2675 108.6      6 1860 1860-06-01 12:00:01  blood 1338 #> 2676 108.6      6 1860 1860-06-01 12:00:01   bone 1338 #> 2677 116.7      7 1860 1860-07-02 00:00:00  blood 1339 #> 2678 116.7      7 1860 1860-07-02 00:00:00   bone 1339 #> 2679 100.3      8 1860 1860-08-01 12:00:01  blood 1340 #> 2680 100.3      8 1860 1860-08-01 12:00:01   bone 1340 #> 2681  92.2      9 1860 1860-09-01 00:00:01  blood 1341 #> 2682  92.2      9 1860 1860-09-01 00:00:01   bone 1341 #> 2683  90.1     10 1860 1860-10-01 12:00:00  blood 1342 #> 2684  90.1     10 1860 1860-10-01 12:00:00   bone 1342 #> 2685  97.9     11 1860 1860-11-01 00:00:01  blood 1343 #> 2686  97.9     11 1860 1860-11-01 00:00:01   bone 1343 #> 2687  95.6     12 1860 1860-12-01 12:00:01  blood 1344 #> 2688  95.6     12 1860 1860-12-01 12:00:01   bone 1344 #> 2689  62.3      1 1861 1861-01-01 00:00:00  blood 1345 #> 2690  62.3      1 1861 1861-01-01 00:00:00   bone 1345 #> 2691  77.8      2 1861 1861-01-31 10:00:01  blood 1346 #> 2692  77.8      2 1861 1861-01-31 10:00:01   bone 1346 #> 2693 101.0      3 1861 1861-03-02 20:00:01  blood 1347 #> 2694 101.0      3 1861 1861-03-02 20:00:01   bone 1347 #> 2695  98.5      4 1861 1861-04-02 06:00:00  blood 1348 #> 2696  98.5      4 1861 1861-04-02 06:00:00   bone 1348 #> 2697  56.8      5 1861 1861-05-02 16:00:01  blood 1349 #> 2698  56.8      5 1861 1861-05-02 16:00:01   bone 1349 #> 2699  87.8      6 1861 1861-06-02 02:00:01  blood 1350 #> 2700  87.8      6 1861 1861-06-02 02:00:01   bone 1350 #> 2701  78.0      7 1861 1861-07-02 12:00:00  blood 1351 #> 2702  78.0      7 1861 1861-07-02 12:00:00   bone 1351 #> 2703  82.5      8 1861 1861-08-01 22:00:01  blood 1352 #> 2704  82.5      8 1861 1861-08-01 22:00:01   bone 1352 #> 2705  79.9      9 1861 1861-09-01 08:00:01  blood 1353 #> 2706  79.9      9 1861 1861-09-01 08:00:01   bone 1353 #> 2707  67.2     10 1861 1861-10-01 18:00:00  blood 1354 #> 2708  67.2     10 1861 1861-10-01 18:00:00   bone 1354 #> 2709  53.7     11 1861 1861-11-01 04:00:01  blood 1355 #> 2710  53.7     11 1861 1861-11-01 04:00:01   bone 1355 #> 2711  80.5     12 1861 1861-12-01 14:00:01  blood 1356 #> 2712  80.5     12 1861 1861-12-01 14:00:01   bone 1356 #> 2713  63.1      1 1862 1862-01-01 00:00:00  blood 1357 #> 2714  63.1      1 1862 1862-01-01 00:00:00   bone 1357 #> 2715  64.5      2 1862 1862-01-31 10:00:01  blood 1358 #> 2716  64.5      2 1862 1862-01-31 10:00:01   bone 1358 #> 2717  43.6      3 1862 1862-03-02 20:00:01  blood 1359 #> 2718  43.6      3 1862 1862-03-02 20:00:01   bone 1359 #> 2719  53.7      4 1862 1862-04-02 06:00:00  blood 1360 #> 2720  53.7      4 1862 1862-04-02 06:00:00   bone 1360 #> 2721  64.4      5 1862 1862-05-02 16:00:01  blood 1361 #> 2722  64.4      5 1862 1862-05-02 16:00:01   bone 1361 #> 2723  84.0      6 1862 1862-06-02 02:00:01  blood 1362 #> 2724  84.0      6 1862 1862-06-02 02:00:01   bone 1362 #> 2725  73.4      7 1862 1862-07-02 12:00:00  blood 1363 #> 2726  73.4      7 1862 1862-07-02 12:00:00   bone 1363 #> 2727  62.5      8 1862 1862-08-01 22:00:01  blood 1364 #> 2728  62.5      8 1862 1862-08-01 22:00:01   bone 1364 #> 2729  66.6      9 1862 1862-09-01 08:00:01  blood 1365 #> 2730  66.6      9 1862 1862-09-01 08:00:01   bone 1365 #> 2731  42.0     10 1862 1862-10-01 18:00:00  blood 1366 #> 2732  42.0     10 1862 1862-10-01 18:00:00   bone 1366 #> 2733  50.6     11 1862 1862-11-01 04:00:01  blood 1367 #> 2734  50.6     11 1862 1862-11-01 04:00:01   bone 1367 #> 2735  40.9     12 1862 1862-12-01 14:00:01  blood 1368 #> 2736  40.9     12 1862 1862-12-01 14:00:01   bone 1368 #> 2737  48.3      1 1863 1863-01-01 00:00:00  blood 1369 #> 2738  48.3      1 1863 1863-01-01 00:00:00   bone 1369 #> 2739  56.7      2 1863 1863-01-31 10:00:01  blood 1370 #> 2740  56.7      2 1863 1863-01-31 10:00:01   bone 1370 #> 2741  66.4      3 1863 1863-03-02 20:00:01  blood 1371 #> 2742  66.4      3 1863 1863-03-02 20:00:01   bone 1371 #> 2743  40.6      4 1863 1863-04-02 06:00:00  blood 1372 #> 2744  40.6      4 1863 1863-04-02 06:00:00   bone 1372 #> 2745  53.8      5 1863 1863-05-02 16:00:01  blood 1373 #> 2746  53.8      5 1863 1863-05-02 16:00:01   bone 1373 #> 2747  40.8      6 1863 1863-06-02 02:00:01  blood 1374 #> 2748  40.8      6 1863 1863-06-02 02:00:01   bone 1374 #> 2749  32.7      7 1863 1863-07-02 12:00:00  blood 1375 #> 2750  32.7      7 1863 1863-07-02 12:00:00   bone 1375 #> 2751  48.1      8 1863 1863-08-01 22:00:01  blood 1376 #> 2752  48.1      8 1863 1863-08-01 22:00:01   bone 1376 #> 2753  22.0      9 1863 1863-09-01 08:00:01  blood 1377 #> 2754  22.0      9 1863 1863-09-01 08:00:01   bone 1377 #> 2755  39.9     10 1863 1863-10-01 18:00:00  blood 1378 #> 2756  39.9     10 1863 1863-10-01 18:00:00   bone 1378 #> 2757  37.7     11 1863 1863-11-01 04:00:01  blood 1379 #> 2758  37.7     11 1863 1863-11-01 04:00:01   bone 1379 #> 2759  41.2     12 1863 1863-12-01 14:00:01  blood 1380 #> 2760  41.2     12 1863 1863-12-01 14:00:01   bone 1380 #> 2761  57.7      1 1864 1864-01-01 00:00:00  blood 1381 #> 2762  57.7      1 1864 1864-01-01 00:00:00   bone 1381 #> 2763  47.1      2 1864 1864-01-31 12:00:01  blood 1382 #> 2764  47.1      2 1864 1864-01-31 12:00:01   bone 1382 #> 2765  66.3      3 1864 1864-03-02 00:00:01  blood 1383 #> 2766  66.3      3 1864 1864-03-02 00:00:01   bone 1383 #> 2767  35.8      4 1864 1864-04-01 12:00:00  blood 1384 #> 2768  35.8      4 1864 1864-04-01 12:00:00   bone 1384 #> 2769  40.6      5 1864 1864-05-02 00:00:01  blood 1385 #> 2770  40.6      5 1864 1864-05-02 00:00:01   bone 1385 #> 2771  57.8      6 1864 1864-06-01 12:00:01  blood 1386 #> 2772  57.8      6 1864 1864-06-01 12:00:01   bone 1386 #> 2773  54.7      7 1864 1864-07-02 00:00:00  blood 1387 #> 2774  54.7      7 1864 1864-07-02 00:00:00   bone 1387 #> 2775  54.8      8 1864 1864-08-01 12:00:01  blood 1388 #> 2776  54.8      8 1864 1864-08-01 12:00:01   bone 1388 #> 2777  28.5      9 1864 1864-09-01 00:00:01  blood 1389 #> 2778  28.5      9 1864 1864-09-01 00:00:01   bone 1389 #> 2779  33.9     10 1864 1864-10-01 12:00:00  blood 1390 #> 2780  33.9     10 1864 1864-10-01 12:00:00   bone 1390 #> 2781  57.6     11 1864 1864-11-01 00:00:01  blood 1391 #> 2782  57.6     11 1864 1864-11-01 00:00:01   bone 1391 #> 2783  28.6     12 1864 1864-12-01 12:00:01  blood 1392 #> 2784  28.6     12 1864 1864-12-01 12:00:01   bone 1392 #> 2785  48.7      1 1865 1865-01-01 00:00:00  blood 1393 #> 2786  48.7      1 1865 1865-01-01 00:00:00   bone 1393 #> 2787  39.3      2 1865 1865-01-31 10:00:01  blood 1394 #> 2788  39.3      2 1865 1865-01-31 10:00:01   bone 1394 #> 2789  39.5      3 1865 1865-03-02 20:00:01  blood 1395 #> 2790  39.5      3 1865 1865-03-02 20:00:01   bone 1395 #> 2791  29.4      4 1865 1865-04-02 06:00:00  blood 1396 #> 2792  29.4      4 1865 1865-04-02 06:00:00   bone 1396 #> 2793  34.5      5 1865 1865-05-02 16:00:01  blood 1397 #> 2794  34.5      5 1865 1865-05-02 16:00:01   bone 1397 #> 2795  33.6      6 1865 1865-06-02 02:00:01  blood 1398 #> 2796  33.6      6 1865 1865-06-02 02:00:01   bone 1398 #> 2797  26.8      7 1865 1865-07-02 12:00:00  blood 1399 #> 2798  26.8      7 1865 1865-07-02 12:00:00   bone 1399 #> 2799  37.8      8 1865 1865-08-01 22:00:01  blood 1400 #> 2800  37.8      8 1865 1865-08-01 22:00:01   bone 1400 #> 2801  21.6      9 1865 1865-09-01 08:00:01  blood 1401 #> 2802  21.6      9 1865 1865-09-01 08:00:01   bone 1401 #> 2803  17.1     10 1865 1865-10-01 18:00:00  blood 1402 #> 2804  17.1     10 1865 1865-10-01 18:00:00   bone 1402 #> 2805  24.6     11 1865 1865-11-01 04:00:01  blood 1403 #> 2806  24.6     11 1865 1865-11-01 04:00:01   bone 1403 #> 2807  12.8     12 1865 1865-12-01 14:00:01  blood 1404 #> 2808  12.8     12 1865 1865-12-01 14:00:01   bone 1404 #> 2809  31.6      1 1866 1866-01-01 00:00:00  blood 1405 #> 2810  31.6      1 1866 1866-01-01 00:00:00   bone 1405 #> 2811  38.4      2 1866 1866-01-31 10:00:01  blood 1406 #> 2812  38.4      2 1866 1866-01-31 10:00:01   bone 1406 #> 2813  24.6      3 1866 1866-03-02 20:00:01  blood 1407 #> 2814  24.6      3 1866 1866-03-02 20:00:01   bone 1407 #> 2815  17.6      4 1866 1866-04-02 06:00:00  blood 1408 #> 2816  17.6      4 1866 1866-04-02 06:00:00   bone 1408 #> 2817  12.9      5 1866 1866-05-02 16:00:01  blood 1409 #> 2818  12.9      5 1866 1866-05-02 16:00:01   bone 1409 #> 2819  16.5      6 1866 1866-06-02 02:00:01  blood 1410 #> 2820  16.5      6 1866 1866-06-02 02:00:01   bone 1410 #> 2821   9.3      7 1866 1866-07-02 12:00:00  blood 1411 #> 2822   9.3      7 1866 1866-07-02 12:00:00   bone 1411 #> 2823  12.7      8 1866 1866-08-01 22:00:01  blood 1412 #> 2824  12.7      8 1866 1866-08-01 22:00:01   bone 1412 #> 2825   7.3      9 1866 1866-09-01 08:00:01  blood 1413 #> 2826   7.3      9 1866 1866-09-01 08:00:01   bone 1413 #> 2827  14.1     10 1866 1866-10-01 18:00:00  blood 1414 #> 2828  14.1     10 1866 1866-10-01 18:00:00   bone 1414 #> 2829   9.0     11 1866 1866-11-01 04:00:01  blood 1415 #> 2830   9.0     11 1866 1866-11-01 04:00:01   bone 1415 #> 2831   1.5     12 1866 1866-12-01 14:00:01  blood 1416 #> 2832   1.5     12 1866 1866-12-01 14:00:01   bone 1416 #> 2833   0.0      1 1867 1867-01-01 00:00:00  blood 1417 #> 2834   0.0      1 1867 1867-01-01 00:00:00   bone 1417 #> 2835   0.7      2 1867 1867-01-31 10:00:01  blood 1418 #> 2836   0.7      2 1867 1867-01-31 10:00:01   bone 1418 #> 2837   9.2      3 1867 1867-03-02 20:00:01  blood 1419 #> 2838   9.2      3 1867 1867-03-02 20:00:01   bone 1419 #> 2839   5.1      4 1867 1867-04-02 06:00:00  blood 1420 #> 2840   5.1      4 1867 1867-04-02 06:00:00   bone 1420 #> 2841   2.9      5 1867 1867-05-02 16:00:01  blood 1421 #> 2842   2.9      5 1867 1867-05-02 16:00:01   bone 1421 #> 2843   1.5      6 1867 1867-06-02 02:00:01  blood 1422 #> 2844   1.5      6 1867 1867-06-02 02:00:01   bone 1422 #> 2845   5.0      7 1867 1867-07-02 12:00:00  blood 1423 #> 2846   5.0      7 1867 1867-07-02 12:00:00   bone 1423 #> 2847   4.9      8 1867 1867-08-01 22:00:01  blood 1424 #> 2848   4.9      8 1867 1867-08-01 22:00:01   bone 1424 #> 2849   9.8      9 1867 1867-09-01 08:00:01  blood 1425 #> 2850   9.8      9 1867 1867-09-01 08:00:01   bone 1425 #> 2851  13.5     10 1867 1867-10-01 18:00:00  blood 1426 #> 2852  13.5     10 1867 1867-10-01 18:00:00   bone 1426 #> 2853   9.3     11 1867 1867-11-01 04:00:01  blood 1427 #> 2854   9.3     11 1867 1867-11-01 04:00:01   bone 1427 #> 2855  25.2     12 1867 1867-12-01 14:00:01  blood 1428 #> 2856  25.2     12 1867 1867-12-01 14:00:01   bone 1428 #> 2857  15.6      1 1868 1868-01-01 00:00:00  blood 1429 #> 2858  15.6      1 1868 1868-01-01 00:00:00   bone 1429 #> 2859  15.8      2 1868 1868-01-31 12:00:01  blood 1430 #> 2860  15.8      2 1868 1868-01-31 12:00:01   bone 1430 #> 2861  26.5      3 1868 1868-03-02 00:00:01  blood 1431 #> 2862  26.5      3 1868 1868-03-02 00:00:01   bone 1431 #> 2863  36.6      4 1868 1868-04-01 12:00:00  blood 1432 #> 2864  36.6      4 1868 1868-04-01 12:00:00   bone 1432 #> 2865  26.7      5 1868 1868-05-02 00:00:01  blood 1433 #> 2866  26.7      5 1868 1868-05-02 00:00:01   bone 1433 #> 2867  31.1      6 1868 1868-06-01 12:00:01  blood 1434 #> 2868  31.1      6 1868 1868-06-01 12:00:01   bone 1434 #> 2869  28.6      7 1868 1868-07-02 00:00:00  blood 1435 #> 2870  28.6      7 1868 1868-07-02 00:00:00   bone 1435 #> 2871  34.4      8 1868 1868-08-01 12:00:01  blood 1436 #> 2872  34.4      8 1868 1868-08-01 12:00:01   bone 1436 #> 2873  43.8      9 1868 1868-09-01 00:00:01  blood 1437 #> 2874  43.8      9 1868 1868-09-01 00:00:01   bone 1437 #> 2875  61.7     10 1868 1868-10-01 12:00:00  blood 1438 #> 2876  61.7     10 1868 1868-10-01 12:00:00   bone 1438 #> 2877  59.1     11 1868 1868-11-01 00:00:01  blood 1439 #> 2878  59.1     11 1868 1868-11-01 00:00:01   bone 1439 #> 2879  67.6     12 1868 1868-12-01 12:00:01  blood 1440 #> 2880  67.6     12 1868 1868-12-01 12:00:01   bone 1440 #> 2881  60.9      1 1869 1869-01-01 00:00:00  blood 1441 #> 2882  60.9      1 1869 1869-01-01 00:00:00   bone 1441 #> 2883  59.3      2 1869 1869-01-31 10:00:01  blood 1442 #> 2884  59.3      2 1869 1869-01-31 10:00:01   bone 1442 #> 2885  52.7      3 1869 1869-03-02 20:00:01  blood 1443 #> 2886  52.7      3 1869 1869-03-02 20:00:01   bone 1443 #> 2887  41.0      4 1869 1869-04-02 06:00:00  blood 1444 #> 2888  41.0      4 1869 1869-04-02 06:00:00   bone 1444 #> 2889 104.0      5 1869 1869-05-02 16:00:01  blood 1445 #> 2890 104.0      5 1869 1869-05-02 16:00:01   bone 1445 #> 2891 108.4      6 1869 1869-06-02 02:00:01  blood 1446 #> 2892 108.4      6 1869 1869-06-02 02:00:01   bone 1446 #> 2893  59.2      7 1869 1869-07-02 12:00:00  blood 1447 #> 2894  59.2      7 1869 1869-07-02 12:00:00   bone 1447 #> 2895  79.6      8 1869 1869-08-01 22:00:01  blood 1448 #> 2896  79.6      8 1869 1869-08-01 22:00:01   bone 1448 #> 2897  80.6      9 1869 1869-09-01 08:00:01  blood 1449 #> 2898  80.6      9 1869 1869-09-01 08:00:01   bone 1449 #> 2899  59.4     10 1869 1869-10-01 18:00:00  blood 1450 #> 2900  59.4     10 1869 1869-10-01 18:00:00   bone 1450 #> 2901  77.4     11 1869 1869-11-01 04:00:01  blood 1451 #> 2902  77.4     11 1869 1869-11-01 04:00:01   bone 1451 #> 2903 104.3     12 1869 1869-12-01 14:00:01  blood 1452 #> 2904 104.3     12 1869 1869-12-01 14:00:01   bone 1452 #> 2905  77.3      1 1870 1870-01-01 00:00:00  blood 1453 #> 2906  77.3      1 1870 1870-01-01 00:00:00   bone 1453 #> 2907 114.9      2 1870 1870-01-31 10:00:01  blood 1454 #> 2908 114.9      2 1870 1870-01-31 10:00:01   bone 1454 #> 2909 159.4      3 1870 1870-03-02 20:00:01  blood 1455 #> 2910 159.4      3 1870 1870-03-02 20:00:01   bone 1455 #> 2911 160.0      4 1870 1870-04-02 06:00:00  blood 1456 #> 2912 160.0      4 1870 1870-04-02 06:00:00   bone 1456 #> 2913 176.0      5 1870 1870-05-02 16:00:01  blood 1457 #> 2914 176.0      5 1870 1870-05-02 16:00:01   bone 1457 #> 2915 135.6      6 1870 1870-06-02 02:00:01  blood 1458 #> 2916 135.6      6 1870 1870-06-02 02:00:01   bone 1458 #> 2917 132.4      7 1870 1870-07-02 12:00:00  blood 1459 #> 2918 132.4      7 1870 1870-07-02 12:00:00   bone 1459 #> 2919 153.8      8 1870 1870-08-01 22:00:01  blood 1460 #> 2920 153.8      8 1870 1870-08-01 22:00:01   bone 1460 #> 2921 136.0      9 1870 1870-09-01 08:00:01  blood 1461 #> 2922 136.0      9 1870 1870-09-01 08:00:01   bone 1461 #> 2923 146.4     10 1870 1870-10-01 18:00:00  blood 1462 #> 2924 146.4     10 1870 1870-10-01 18:00:00   bone 1462 #> 2925 147.5     11 1870 1870-11-01 04:00:01  blood 1463 #> 2926 147.5     11 1870 1870-11-01 04:00:01   bone 1463 #> 2927 130.0     12 1870 1870-12-01 14:00:01  blood 1464 #> 2928 130.0     12 1870 1870-12-01 14:00:01   bone 1464 #> 2929  88.3      1 1871 1871-01-01 00:00:00  blood 1465 #> 2930  88.3      1 1871 1871-01-01 00:00:00   bone 1465 #> 2931 125.3      2 1871 1871-01-31 10:00:01  blood 1466 #> 2932 125.3      2 1871 1871-01-31 10:00:01   bone 1466 #> 2933 143.2      3 1871 1871-03-02 20:00:01  blood 1467 #> 2934 143.2      3 1871 1871-03-02 20:00:01   bone 1467 #> 2935 162.4      4 1871 1871-04-02 06:00:00  blood 1468 #> 2936 162.4      4 1871 1871-04-02 06:00:00   bone 1468 #> 2937 145.5      5 1871 1871-05-02 16:00:01  blood 1469 #> 2938 145.5      5 1871 1871-05-02 16:00:01   bone 1469 #> 2939  91.7      6 1871 1871-06-02 02:00:01  blood 1470 #> 2940  91.7      6 1871 1871-06-02 02:00:01   bone 1470 #> 2941 103.0      7 1871 1871-07-02 12:00:00  blood 1471 #> 2942 103.0      7 1871 1871-07-02 12:00:00   bone 1471 #> 2943 110.0      8 1871 1871-08-01 22:00:01  blood 1472 #> 2944 110.0      8 1871 1871-08-01 22:00:01   bone 1472 #> 2945  80.3      9 1871 1871-09-01 08:00:01  blood 1473 #> 2946  80.3      9 1871 1871-09-01 08:00:01   bone 1473 #> 2947  89.0     10 1871 1871-10-01 18:00:00  blood 1474 #> 2948  89.0     10 1871 1871-10-01 18:00:00   bone 1474 #> 2949 105.4     11 1871 1871-11-01 04:00:01  blood 1475 #> 2950 105.4     11 1871 1871-11-01 04:00:01   bone 1475 #> 2951  90.3     12 1871 1871-12-01 14:00:01  blood 1476 #> 2952  90.3     12 1871 1871-12-01 14:00:01   bone 1476 #> 2953  79.5      1 1872 1872-01-01 00:00:00  blood 1477 #> 2954  79.5      1 1872 1872-01-01 00:00:00   bone 1477 #> 2955 120.1      2 1872 1872-01-31 12:00:01  blood 1478 #> 2956 120.1      2 1872 1872-01-31 12:00:01   bone 1478 #> 2957  88.4      3 1872 1872-03-02 00:00:01  blood 1479 #> 2958  88.4      3 1872 1872-03-02 00:00:01   bone 1479 #> 2959 102.1      4 1872 1872-04-01 12:00:00  blood 1480 #> 2960 102.1      4 1872 1872-04-01 12:00:00   bone 1480 #> 2961 107.6      5 1872 1872-05-02 00:00:01  blood 1481 #> 2962 107.6      5 1872 1872-05-02 00:00:01   bone 1481 #> 2963 109.9      6 1872 1872-06-01 12:00:01  blood 1482 #> 2964 109.9      6 1872 1872-06-01 12:00:01   bone 1482 #> 2965 105.5      7 1872 1872-07-02 00:00:00  blood 1483 #> 2966 105.5      7 1872 1872-07-02 00:00:00   bone 1483 #> 2967  92.9      8 1872 1872-08-01 12:00:01  blood 1484 #> 2968  92.9      8 1872 1872-08-01 12:00:01   bone 1484 #> 2969 114.6      9 1872 1872-09-01 00:00:01  blood 1485 #> 2970 114.6      9 1872 1872-09-01 00:00:01   bone 1485 #> 2971 103.5     10 1872 1872-10-01 12:00:00  blood 1486 #> 2972 103.5     10 1872 1872-10-01 12:00:00   bone 1486 #> 2973 112.0     11 1872 1872-11-01 00:00:01  blood 1487 #> 2974 112.0     11 1872 1872-11-01 00:00:01   bone 1487 #> 2975  83.9     12 1872 1872-12-01 12:00:01  blood 1488 #> 2976  83.9     12 1872 1872-12-01 12:00:01   bone 1488 #> 2977  86.7      1 1873 1873-01-01 00:00:00  blood 1489 #> 2978  86.7      1 1873 1873-01-01 00:00:00   bone 1489 #> 2979 107.0      2 1873 1873-01-31 10:00:01  blood 1490 #> 2980 107.0      2 1873 1873-01-31 10:00:01   bone 1490 #> 2981  98.3      3 1873 1873-03-02 20:00:01  blood 1491 #> 2982  98.3      3 1873 1873-03-02 20:00:01   bone 1491 #> 2983  76.2      4 1873 1873-04-02 06:00:00  blood 1492 #> 2984  76.2      4 1873 1873-04-02 06:00:00   bone 1492 #> 2985  47.9      5 1873 1873-05-02 16:00:01  blood 1493 #> 2986  47.9      5 1873 1873-05-02 16:00:01   bone 1493 #> 2987  44.8      6 1873 1873-06-02 02:00:01  blood 1494 #> 2988  44.8      6 1873 1873-06-02 02:00:01   bone 1494 #> 2989  66.9      7 1873 1873-07-02 12:00:00  blood 1495 #> 2990  66.9      7 1873 1873-07-02 12:00:00   bone 1495 #> 2991  68.2      8 1873 1873-08-01 22:00:01  blood 1496 #> 2992  68.2      8 1873 1873-08-01 22:00:01   bone 1496 #> 2993  47.5      9 1873 1873-09-01 08:00:01  blood 1497 #> 2994  47.5      9 1873 1873-09-01 08:00:01   bone 1497 #> 2995  47.4     10 1873 1873-10-01 18:00:00  blood 1498 #> 2996  47.4     10 1873 1873-10-01 18:00:00   bone 1498 #> 2997  55.4     11 1873 1873-11-01 04:00:01  blood 1499 #> 2998  55.4     11 1873 1873-11-01 04:00:01   bone 1499 #> 2999  49.2     12 1873 1873-12-01 14:00:01  blood 1500 #> 3000  49.2     12 1873 1873-12-01 14:00:01   bone 1500 #> 3001  60.8      1 1874 1874-01-01 00:00:00  blood 1501 #> 3002  60.8      1 1874 1874-01-01 00:00:00   bone 1501 #> 3003  64.2      2 1874 1874-01-31 10:00:01  blood 1502 #> 3004  64.2      2 1874 1874-01-31 10:00:01   bone 1502 #> 3005  46.4      3 1874 1874-03-02 20:00:01  blood 1503 #> 3006  46.4      3 1874 1874-03-02 20:00:01   bone 1503 #> 3007  32.0      4 1874 1874-04-02 06:00:00  blood 1504 #> 3008  32.0      4 1874 1874-04-02 06:00:00   bone 1504 #> 3009  44.6      5 1874 1874-05-02 16:00:01  blood 1505 #> 3010  44.6      5 1874 1874-05-02 16:00:01   bone 1505 #> 3011  38.2      6 1874 1874-06-02 02:00:01  blood 1506 #> 3012  38.2      6 1874 1874-06-02 02:00:01   bone 1506 #> 3013  67.8      7 1874 1874-07-02 12:00:00  blood 1507 #> 3014  67.8      7 1874 1874-07-02 12:00:00   bone 1507 #> 3015  61.3      8 1874 1874-08-01 22:00:01  blood 1508 #> 3016  61.3      8 1874 1874-08-01 22:00:01   bone 1508 #> 3017  28.0      9 1874 1874-09-01 08:00:01  blood 1509 #> 3018  28.0      9 1874 1874-09-01 08:00:01   bone 1509 #> 3019  34.3     10 1874 1874-10-01 18:00:00  blood 1510 #> 3020  34.3     10 1874 1874-10-01 18:00:00   bone 1510 #> 3021  28.9     11 1874 1874-11-01 04:00:01  blood 1511 #> 3022  28.9     11 1874 1874-11-01 04:00:01   bone 1511 #> 3023  29.3     12 1874 1874-12-01 14:00:01  blood 1512 #> 3024  29.3     12 1874 1874-12-01 14:00:01   bone 1512 #> 3025  14.6      1 1875 1875-01-01 00:00:00  blood 1513 #> 3026  14.6      1 1875 1875-01-01 00:00:00   bone 1513 #> 3027  22.2      2 1875 1875-01-31 10:00:01  blood 1514 #> 3028  22.2      2 1875 1875-01-31 10:00:01   bone 1514 #> 3029  33.8      3 1875 1875-03-02 20:00:01  blood 1515 #> 3030  33.8      3 1875 1875-03-02 20:00:01   bone 1515 #> 3031  29.1      4 1875 1875-04-02 06:00:00  blood 1516 #> 3032  29.1      4 1875 1875-04-02 06:00:00   bone 1516 #> 3033  11.5      5 1875 1875-05-02 16:00:01  blood 1517 #> 3034  11.5      5 1875 1875-05-02 16:00:01   bone 1517 #> 3035  23.9      6 1875 1875-06-02 02:00:01  blood 1518 #> 3036  23.9      6 1875 1875-06-02 02:00:01   bone 1518 #> 3037  12.5      7 1875 1875-07-02 12:00:00  blood 1519 #> 3038  12.5      7 1875 1875-07-02 12:00:00   bone 1519 #> 3039  14.6      8 1875 1875-08-01 22:00:01  blood 1520 #> 3040  14.6      8 1875 1875-08-01 22:00:01   bone 1520 #> 3041   2.4      9 1875 1875-09-01 08:00:01  blood 1521 #> 3042   2.4      9 1875 1875-09-01 08:00:01   bone 1521 #> 3043  12.7     10 1875 1875-10-01 18:00:00  blood 1522 #> 3044  12.7     10 1875 1875-10-01 18:00:00   bone 1522 #> 3045  17.7     11 1875 1875-11-01 04:00:01  blood 1523 #> 3046  17.7     11 1875 1875-11-01 04:00:01   bone 1523 #> 3047   9.9     12 1875 1875-12-01 14:00:01  blood 1524 #> 3048   9.9     12 1875 1875-12-01 14:00:01   bone 1524 #> 3049  14.3      1 1876 1876-01-01 00:00:00  blood 1525 #> 3050  14.3      1 1876 1876-01-01 00:00:00   bone 1525 #> 3051  15.0      2 1876 1876-01-31 12:00:01  blood 1526 #> 3052  15.0      2 1876 1876-01-31 12:00:01   bone 1526 #> 3053  31.2      3 1876 1876-03-02 00:00:01  blood 1527 #> 3054  31.2      3 1876 1876-03-02 00:00:01   bone 1527 #> 3055   2.3      4 1876 1876-04-01 12:00:00  blood 1528 #> 3056   2.3      4 1876 1876-04-01 12:00:00   bone 1528 #> 3057   5.1      5 1876 1876-05-02 00:00:01  blood 1529 #> 3058   5.1      5 1876 1876-05-02 00:00:01   bone 1529 #> 3059   1.6      6 1876 1876-06-01 12:00:01  blood 1530 #> 3060   1.6      6 1876 1876-06-01 12:00:01   bone 1530 #> 3061  15.2      7 1876 1876-07-02 00:00:00  blood 1531 #> 3062  15.2      7 1876 1876-07-02 00:00:00   bone 1531 #> 3063   8.8      8 1876 1876-08-01 12:00:01  blood 1532 #> 3064   8.8      8 1876 1876-08-01 12:00:01   bone 1532 #> 3065   9.9      9 1876 1876-09-01 00:00:01  blood 1533 #> 3066   9.9      9 1876 1876-09-01 00:00:01   bone 1533 #> 3067  14.3     10 1876 1876-10-01 12:00:00  blood 1534 #> 3068  14.3     10 1876 1876-10-01 12:00:00   bone 1534 #> 3069   9.9     11 1876 1876-11-01 00:00:01  blood 1535 #> 3070   9.9     11 1876 1876-11-01 00:00:01   bone 1535 #> 3071   8.2     12 1876 1876-12-01 12:00:01  blood 1536 #> 3072   8.2     12 1876 1876-12-01 12:00:01   bone 1536 #> 3073  24.4      1 1877 1877-01-01 00:00:00  blood 1537 #> 3074  24.4      1 1877 1877-01-01 00:00:00   bone 1537 #> 3075   8.7      2 1877 1877-01-31 10:00:01  blood 1538 #> 3076   8.7      2 1877 1877-01-31 10:00:01   bone 1538 #> 3077  11.7      3 1877 1877-03-02 20:00:01  blood 1539 #> 3078  11.7      3 1877 1877-03-02 20:00:01   bone 1539 #> 3079  15.8      4 1877 1877-04-02 06:00:00  blood 1540 #> 3080  15.8      4 1877 1877-04-02 06:00:00   bone 1540 #> 3081  21.2      5 1877 1877-05-02 16:00:01  blood 1541 #> 3082  21.2      5 1877 1877-05-02 16:00:01   bone 1541 #> 3083  13.4      6 1877 1877-06-02 02:00:01  blood 1542 #> 3084  13.4      6 1877 1877-06-02 02:00:01   bone 1542 #> 3085   5.9      7 1877 1877-07-02 12:00:00  blood 1543 #> 3086   5.9      7 1877 1877-07-02 12:00:00   bone 1543 #> 3087   6.3      8 1877 1877-08-01 22:00:01  blood 1544 #> 3088   6.3      8 1877 1877-08-01 22:00:01   bone 1544 #> 3089  16.4      9 1877 1877-09-01 08:00:01  blood 1545 #> 3090  16.4      9 1877 1877-09-01 08:00:01   bone 1545 #> 3091   6.7     10 1877 1877-10-01 18:00:00  blood 1546 #> 3092   6.7     10 1877 1877-10-01 18:00:00   bone 1546 #> 3093  14.5     11 1877 1877-11-01 04:00:01  blood 1547 #> 3094  14.5     11 1877 1877-11-01 04:00:01   bone 1547 #> 3095   2.3     12 1877 1877-12-01 14:00:01  blood 1548 #> 3096   2.3     12 1877 1877-12-01 14:00:01   bone 1548 #> 3097   3.3      1 1878 1878-01-01 00:00:00  blood 1549 #> 3098   3.3      1 1878 1878-01-01 00:00:00   bone 1549 #> 3099   6.0      2 1878 1878-01-31 10:00:01  blood 1550 #> 3100   6.0      2 1878 1878-01-31 10:00:01   bone 1550 #> 3101   7.8      3 1878 1878-03-02 20:00:01  blood 1551 #> 3102   7.8      3 1878 1878-03-02 20:00:01   bone 1551 #> 3103   0.1      4 1878 1878-04-02 06:00:00  blood 1552 #> 3104   0.1      4 1878 1878-04-02 06:00:00   bone 1552 #> 3105   5.8      5 1878 1878-05-02 16:00:01  blood 1553 #> 3106   5.8      5 1878 1878-05-02 16:00:01   bone 1553 #> 3107   6.4      6 1878 1878-06-02 02:00:01  blood 1554 #> 3108   6.4      6 1878 1878-06-02 02:00:01   bone 1554 #> 3109   0.1      7 1878 1878-07-02 12:00:00  blood 1555 #> 3110   0.1      7 1878 1878-07-02 12:00:00   bone 1555 #> 3111   0.0      8 1878 1878-08-01 22:00:01  blood 1556 #> 3112   0.0      8 1878 1878-08-01 22:00:01   bone 1556 #> 3113   5.3      9 1878 1878-09-01 08:00:01  blood 1557 #> 3114   5.3      9 1878 1878-09-01 08:00:01   bone 1557 #> 3115   1.1     10 1878 1878-10-01 18:00:00  blood 1558 #> 3116   1.1     10 1878 1878-10-01 18:00:00   bone 1558 #> 3117   4.1     11 1878 1878-11-01 04:00:01  blood 1559 #> 3118   4.1     11 1878 1878-11-01 04:00:01   bone 1559 #> 3119   0.5     12 1878 1878-12-01 14:00:01  blood 1560 #> 3120   0.5     12 1878 1878-12-01 14:00:01   bone 1560 #> 3121   0.8      1 1879 1879-01-01 00:00:00  blood 1561 #> 3122   0.8      1 1879 1879-01-01 00:00:00   bone 1561 #> 3123   0.6      2 1879 1879-01-31 10:00:01  blood 1562 #> 3124   0.6      2 1879 1879-01-31 10:00:01   bone 1562 #> 3125   0.0      3 1879 1879-03-02 20:00:01  blood 1563 #> 3126   0.0      3 1879 1879-03-02 20:00:01   bone 1563 #> 3127   6.2      4 1879 1879-04-02 06:00:00  blood 1564 #> 3128   6.2      4 1879 1879-04-02 06:00:00   bone 1564 #> 3129   2.4      5 1879 1879-05-02 16:00:01  blood 1565 #> 3130   2.4      5 1879 1879-05-02 16:00:01   bone 1565 #> 3131   4.8      6 1879 1879-06-02 02:00:01  blood 1566 #> 3132   4.8      6 1879 1879-06-02 02:00:01   bone 1566 #> 3133   7.5      7 1879 1879-07-02 12:00:00  blood 1567 #> 3134   7.5      7 1879 1879-07-02 12:00:00   bone 1567 #> 3135  10.7      8 1879 1879-08-01 22:00:01  blood 1568 #> 3136  10.7      8 1879 1879-08-01 22:00:01   bone 1568 #> 3137   6.1      9 1879 1879-09-01 08:00:01  blood 1569 #> 3138   6.1      9 1879 1879-09-01 08:00:01   bone 1569 #> 3139  12.3     10 1879 1879-10-01 18:00:00  blood 1570 #> 3140  12.3     10 1879 1879-10-01 18:00:00   bone 1570 #> 3141  12.9     11 1879 1879-11-01 04:00:01  blood 1571 #> 3142  12.9     11 1879 1879-11-01 04:00:01   bone 1571 #> 3143   7.2     12 1879 1879-12-01 14:00:01  blood 1572 #> 3144   7.2     12 1879 1879-12-01 14:00:01   bone 1572 #> 3145  24.0      1 1880 1880-01-01 00:00:00  blood 1573 #> 3146  24.0      1 1880 1880-01-01 00:00:00   bone 1573 #> 3147  27.5      2 1880 1880-01-31 12:00:01  blood 1574 #> 3148  27.5      2 1880 1880-01-31 12:00:01   bone 1574 #> 3149  19.5      3 1880 1880-03-02 00:00:01  blood 1575 #> 3150  19.5      3 1880 1880-03-02 00:00:01   bone 1575 #> 3151  19.3      4 1880 1880-04-01 12:00:00  blood 1576 #> 3152  19.3      4 1880 1880-04-01 12:00:00   bone 1576 #> 3153  23.5      5 1880 1880-05-02 00:00:01  blood 1577 #> 3154  23.5      5 1880 1880-05-02 00:00:01   bone 1577 #> 3155  34.1      6 1880 1880-06-01 12:00:01  blood 1578 #> 3156  34.1      6 1880 1880-06-01 12:00:01   bone 1578 #> 3157  21.9      7 1880 1880-07-02 00:00:00  blood 1579 #> 3158  21.9      7 1880 1880-07-02 00:00:00   bone 1579 #> 3159  48.1      8 1880 1880-08-01 12:00:01  blood 1580 #> 3160  48.1      8 1880 1880-08-01 12:00:01   bone 1580 #> 3161  66.0      9 1880 1880-09-01 00:00:01  blood 1581 #> 3162  66.0      9 1880 1880-09-01 00:00:01   bone 1581 #> 3163  43.0     10 1880 1880-10-01 12:00:00  blood 1582 #> 3164  43.0     10 1880 1880-10-01 12:00:00   bone 1582 #> 3165  30.7     11 1880 1880-11-01 00:00:01  blood 1583 #> 3166  30.7     11 1880 1880-11-01 00:00:01   bone 1583 #> 3167  29.6     12 1880 1880-12-01 12:00:01  blood 1584 #> 3168  29.6     12 1880 1880-12-01 12:00:01   bone 1584 #> 3169  36.4      1 1881 1881-01-01 00:00:00  blood 1585 #> 3170  36.4      1 1881 1881-01-01 00:00:00   bone 1585 #> 3171  53.2      2 1881 1881-01-31 10:00:01  blood 1586 #> 3172  53.2      2 1881 1881-01-31 10:00:01   bone 1586 #> 3173  51.5      3 1881 1881-03-02 20:00:01  blood 1587 #> 3174  51.5      3 1881 1881-03-02 20:00:01   bone 1587 #> 3175  51.7      4 1881 1881-04-02 06:00:00  blood 1588 #> 3176  51.7      4 1881 1881-04-02 06:00:00   bone 1588 #> 3177  43.5      5 1881 1881-05-02 16:00:01  blood 1589 #> 3178  43.5      5 1881 1881-05-02 16:00:01   bone 1589 #> 3179  60.5      6 1881 1881-06-02 02:00:01  blood 1590 #> 3180  60.5      6 1881 1881-06-02 02:00:01   bone 1590 #> 3181  76.9      7 1881 1881-07-02 12:00:00  blood 1591 #> 3182  76.9      7 1881 1881-07-02 12:00:00   bone 1591 #> 3183  58.0      8 1881 1881-08-01 22:00:01  blood 1592 #> 3184  58.0      8 1881 1881-08-01 22:00:01   bone 1592 #> 3185  53.2      9 1881 1881-09-01 08:00:01  blood 1593 #> 3186  53.2      9 1881 1881-09-01 08:00:01   bone 1593 #> 3187  64.0     10 1881 1881-10-01 18:00:00  blood 1594 #> 3188  64.0     10 1881 1881-10-01 18:00:00   bone 1594 #> 3189  54.8     11 1881 1881-11-01 04:00:01  blood 1595 #> 3190  54.8     11 1881 1881-11-01 04:00:01   bone 1595 #> 3191  47.3     12 1881 1881-12-01 14:00:01  blood 1596 #> 3192  47.3     12 1881 1881-12-01 14:00:01   bone 1596 #> 3193  45.0      1 1882 1882-01-01 00:00:00  blood 1597 #> 3194  45.0      1 1882 1882-01-01 00:00:00   bone 1597 #> 3195  69.3      2 1882 1882-01-31 10:00:01  blood 1598 #> 3196  69.3      2 1882 1882-01-31 10:00:01   bone 1598 #> 3197  67.5      3 1882 1882-03-02 20:00:01  blood 1599 #> 3198  67.5      3 1882 1882-03-02 20:00:01   bone 1599 #> 3199  95.8      4 1882 1882-04-02 06:00:00  blood 1600 #> 3200  95.8      4 1882 1882-04-02 06:00:00   bone 1600 #> 3201  64.1      5 1882 1882-05-02 16:00:01  blood 1601 #> 3202  64.1      5 1882 1882-05-02 16:00:01   bone 1601 #> 3203  45.2      6 1882 1882-06-02 02:00:01  blood 1602 #> 3204  45.2      6 1882 1882-06-02 02:00:01   bone 1602 #> 3205  45.4      7 1882 1882-07-02 12:00:00  blood 1603 #> 3206  45.4      7 1882 1882-07-02 12:00:00   bone 1603 #> 3207  40.4      8 1882 1882-08-01 22:00:01  blood 1604 #> 3208  40.4      8 1882 1882-08-01 22:00:01   bone 1604 #> 3209  57.7      9 1882 1882-09-01 08:00:01  blood 1605 #> 3210  57.7      9 1882 1882-09-01 08:00:01   bone 1605 #> 3211  59.2     10 1882 1882-10-01 18:00:00  blood 1606 #> 3212  59.2     10 1882 1882-10-01 18:00:00   bone 1606 #> 3213  84.4     11 1882 1882-11-01 04:00:01  blood 1607 #> 3214  84.4     11 1882 1882-11-01 04:00:01   bone 1607 #> 3215  41.8     12 1882 1882-12-01 14:00:01  blood 1608 #> 3216  41.8     12 1882 1882-12-01 14:00:01   bone 1608 #> 3217  60.6      1 1883 1883-01-01 00:00:00  blood 1609 #> 3218  60.6      1 1883 1883-01-01 00:00:00   bone 1609 #> 3219  46.9      2 1883 1883-01-31 10:00:01  blood 1610 #> 3220  46.9      2 1883 1883-01-31 10:00:01   bone 1610 #> 3221  42.8      3 1883 1883-03-02 20:00:01  blood 1611 #> 3222  42.8      3 1883 1883-03-02 20:00:01   bone 1611 #> 3223  82.1      4 1883 1883-04-02 06:00:00  blood 1612 #> 3224  82.1      4 1883 1883-04-02 06:00:00   bone 1612 #> 3225  32.1      5 1883 1883-05-02 16:00:01  blood 1613 #> 3226  32.1      5 1883 1883-05-02 16:00:01   bone 1613 #> 3227  76.5      6 1883 1883-06-02 02:00:01  blood 1614 #> 3228  76.5      6 1883 1883-06-02 02:00:01   bone 1614 #> 3229  80.6      7 1883 1883-07-02 12:00:00  blood 1615 #> 3230  80.6      7 1883 1883-07-02 12:00:00   bone 1615 #> 3231  46.0      8 1883 1883-08-01 22:00:01  blood 1616 #> 3232  46.0      8 1883 1883-08-01 22:00:01   bone 1616 #> 3233  52.6      9 1883 1883-09-01 08:00:01  blood 1617 #> 3234  52.6      9 1883 1883-09-01 08:00:01   bone 1617 #> 3235  83.8     10 1883 1883-10-01 18:00:00  blood 1618 #> 3236  83.8     10 1883 1883-10-01 18:00:00   bone 1618 #> 3237  84.5     11 1883 1883-11-01 04:00:01  blood 1619 #> 3238  84.5     11 1883 1883-11-01 04:00:01   bone 1619 #> 3239  75.9     12 1883 1883-12-01 14:00:01  blood 1620 #> 3240  75.9     12 1883 1883-12-01 14:00:01   bone 1620 #> 3241  91.5      1 1884 1884-01-01 00:00:00  blood 1621 #> 3242  91.5      1 1884 1884-01-01 00:00:00   bone 1621 #> 3243  86.9      2 1884 1884-01-31 12:00:01  blood 1622 #> 3244  86.9      2 1884 1884-01-31 12:00:01   bone 1622 #> 3245  86.8      3 1884 1884-03-02 00:00:01  blood 1623 #> 3246  86.8      3 1884 1884-03-02 00:00:01   bone 1623 #> 3247  76.1      4 1884 1884-04-01 12:00:00  blood 1624 #> 3248  76.1      4 1884 1884-04-01 12:00:00   bone 1624 #> 3249  66.5      5 1884 1884-05-02 00:00:01  blood 1625 #> 3250  66.5      5 1884 1884-05-02 00:00:01   bone 1625 #> 3251  51.2      6 1884 1884-06-01 12:00:01  blood 1626 #> 3252  51.2      6 1884 1884-06-01 12:00:01   bone 1626 #> 3253  53.1      7 1884 1884-07-02 00:00:00  blood 1627 #> 3254  53.1      7 1884 1884-07-02 00:00:00   bone 1627 #> 3255  55.8      8 1884 1884-08-01 12:00:01  blood 1628 #> 3256  55.8      8 1884 1884-08-01 12:00:01   bone 1628 #> 3257  61.9      9 1884 1884-09-01 00:00:01  blood 1629 #> 3258  61.9      9 1884 1884-09-01 00:00:01   bone 1629 #> 3259  47.8     10 1884 1884-10-01 12:00:00  blood 1630 #> 3260  47.8     10 1884 1884-10-01 12:00:00   bone 1630 #> 3261  36.6     11 1884 1884-11-01 00:00:01  blood 1631 #> 3262  36.6     11 1884 1884-11-01 00:00:01   bone 1631 #> 3263  47.2     12 1884 1884-12-01 12:00:01  blood 1632 #> 3264  47.2     12 1884 1884-12-01 12:00:01   bone 1632 #> 3265  42.8      1 1885 1885-01-01 00:00:00  blood 1633 #> 3266  42.8      1 1885 1885-01-01 00:00:00   bone 1633 #> 3267  71.8      2 1885 1885-01-31 10:00:01  blood 1634 #> 3268  71.8      2 1885 1885-01-31 10:00:01   bone 1634 #> 3269  49.8      3 1885 1885-03-02 20:00:01  blood 1635 #> 3270  49.8      3 1885 1885-03-02 20:00:01   bone 1635 #> 3271  55.0      4 1885 1885-04-02 06:00:00  blood 1636 #> 3272  55.0      4 1885 1885-04-02 06:00:00   bone 1636 #> 3273  73.0      5 1885 1885-05-02 16:00:01  blood 1637 #> 3274  73.0      5 1885 1885-05-02 16:00:01   bone 1637 #> 3275  83.7      6 1885 1885-06-02 02:00:01  blood 1638 #> 3276  83.7      6 1885 1885-06-02 02:00:01   bone 1638 #> 3277  66.5      7 1885 1885-07-02 12:00:00  blood 1639 #> 3278  66.5      7 1885 1885-07-02 12:00:00   bone 1639 #> 3279  50.0      8 1885 1885-08-01 22:00:01  blood 1640 #> 3280  50.0      8 1885 1885-08-01 22:00:01   bone 1640 #> 3281  39.6      9 1885 1885-09-01 08:00:01  blood 1641 #> 3282  39.6      9 1885 1885-09-01 08:00:01   bone 1641 #> 3283  38.7     10 1885 1885-10-01 18:00:00  blood 1642 #> 3284  38.7     10 1885 1885-10-01 18:00:00   bone 1642 #> 3285  33.3     11 1885 1885-11-01 04:00:01  blood 1643 #> 3286  33.3     11 1885 1885-11-01 04:00:01   bone 1643 #> 3287  21.7     12 1885 1885-12-01 14:00:01  blood 1644 #> 3288  21.7     12 1885 1885-12-01 14:00:01   bone 1644 #> 3289  29.9      1 1886 1886-01-01 00:00:00  blood 1645 #> 3290  29.9      1 1886 1886-01-01 00:00:00   bone 1645 #> 3291  25.9      2 1886 1886-01-31 10:00:01  blood 1646 #> 3292  25.9      2 1886 1886-01-31 10:00:01   bone 1646 #> 3293  57.3      3 1886 1886-03-02 20:00:01  blood 1647 #> 3294  57.3      3 1886 1886-03-02 20:00:01   bone 1647 #> 3295  43.7      4 1886 1886-04-02 06:00:00  blood 1648 #> 3296  43.7      4 1886 1886-04-02 06:00:00   bone 1648 #> 3297  30.7      5 1886 1886-05-02 16:00:01  blood 1649 #> 3298  30.7      5 1886 1886-05-02 16:00:01   bone 1649 #> 3299  27.1      6 1886 1886-06-02 02:00:01  blood 1650 #> 3300  27.1      6 1886 1886-06-02 02:00:01   bone 1650 #> 3301  30.3      7 1886 1886-07-02 12:00:00  blood 1651 #> 3302  30.3      7 1886 1886-07-02 12:00:00   bone 1651 #> 3303  16.9      8 1886 1886-08-01 22:00:01  blood 1652 #> 3304  16.9      8 1886 1886-08-01 22:00:01   bone 1652 #> 3305  21.4      9 1886 1886-09-01 08:00:01  blood 1653 #> 3306  21.4      9 1886 1886-09-01 08:00:01   bone 1653 #> 3307   8.6     10 1886 1886-10-01 18:00:00  blood 1654 #> 3308   8.6     10 1886 1886-10-01 18:00:00   bone 1654 #> 3309   0.3     11 1886 1886-11-01 04:00:01  blood 1655 #> 3310   0.3     11 1886 1886-11-01 04:00:01   bone 1655 #> 3311  12.4     12 1886 1886-12-01 14:00:01  blood 1656 #> 3312  12.4     12 1886 1886-12-01 14:00:01   bone 1656 #> 3313  10.3      1 1887 1887-01-01 00:00:00  blood 1657 #> 3314  10.3      1 1887 1887-01-01 00:00:00   bone 1657 #> 3315  13.2      2 1887 1887-01-31 10:00:01  blood 1658 #> 3316  13.2      2 1887 1887-01-31 10:00:01   bone 1658 #> 3317   4.2      3 1887 1887-03-02 20:00:01  blood 1659 #> 3318   4.2      3 1887 1887-03-02 20:00:01   bone 1659 #> 3319   6.9      4 1887 1887-04-02 06:00:00  blood 1660 #> 3320   6.9      4 1887 1887-04-02 06:00:00   bone 1660 #> 3321  20.0      5 1887 1887-05-02 16:00:01  blood 1661 #> 3322  20.0      5 1887 1887-05-02 16:00:01   bone 1661 #> 3323  15.7      6 1887 1887-06-02 02:00:01  blood 1662 #> 3324  15.7      6 1887 1887-06-02 02:00:01   bone 1662 #> 3325  23.3      7 1887 1887-07-02 12:00:00  blood 1663 #> 3326  23.3      7 1887 1887-07-02 12:00:00   bone 1663 #> 3327  21.4      8 1887 1887-08-01 22:00:01  blood 1664 #> 3328  21.4      8 1887 1887-08-01 22:00:01   bone 1664 #> 3329   7.4      9 1887 1887-09-01 08:00:01  blood 1665 #> 3330   7.4      9 1887 1887-09-01 08:00:01   bone 1665 #> 3331   6.6     10 1887 1887-10-01 18:00:00  blood 1666 #> 3332   6.6     10 1887 1887-10-01 18:00:00   bone 1666 #> 3333   6.9     11 1887 1887-11-01 04:00:01  blood 1667 #> 3334   6.9     11 1887 1887-11-01 04:00:01   bone 1667 #> 3335  20.7     12 1887 1887-12-01 14:00:01  blood 1668 #> 3336  20.7     12 1887 1887-12-01 14:00:01   bone 1668 #> 3337  12.7      1 1888 1888-01-01 00:00:00  blood 1669 #> 3338  12.7      1 1888 1888-01-01 00:00:00   bone 1669 #> 3339   7.1      2 1888 1888-01-31 12:00:01  blood 1670 #> 3340   7.1      2 1888 1888-01-31 12:00:01   bone 1670 #> 3341   7.8      3 1888 1888-03-02 00:00:01  blood 1671 #> 3342   7.8      3 1888 1888-03-02 00:00:01   bone 1671 #> 3343   5.1      4 1888 1888-04-01 12:00:00  blood 1672 #> 3344   5.1      4 1888 1888-04-01 12:00:00   bone 1672 #> 3345   7.0      5 1888 1888-05-02 00:00:01  blood 1673 #> 3346   7.0      5 1888 1888-05-02 00:00:01   bone 1673 #> 3347   7.1      6 1888 1888-06-01 12:00:01  blood 1674 #> 3348   7.1      6 1888 1888-06-01 12:00:01   bone 1674 #> 3349   3.1      7 1888 1888-07-02 00:00:00  blood 1675 #> 3350   3.1      7 1888 1888-07-02 00:00:00   bone 1675 #> 3351   2.8      8 1888 1888-08-01 12:00:01  blood 1676 #> 3352   2.8      8 1888 1888-08-01 12:00:01   bone 1676 #> 3353   8.8      9 1888 1888-09-01 00:00:01  blood 1677 #> 3354   8.8      9 1888 1888-09-01 00:00:01   bone 1677 #> 3355   2.1     10 1888 1888-10-01 12:00:00  blood 1678 #> 3356   2.1     10 1888 1888-10-01 12:00:00   bone 1678 #> 3357  10.7     11 1888 1888-11-01 00:00:01  blood 1679 #> 3358  10.7     11 1888 1888-11-01 00:00:01   bone 1679 #> 3359   6.7     12 1888 1888-12-01 12:00:01  blood 1680 #> 3360   6.7     12 1888 1888-12-01 12:00:01   bone 1680 #> 3361   0.8      1 1889 1889-01-01 00:00:00  blood 1681 #> 3362   0.8      1 1889 1889-01-01 00:00:00   bone 1681 #> 3363   8.5      2 1889 1889-01-31 10:00:01  blood 1682 #> 3364   8.5      2 1889 1889-01-31 10:00:01   bone 1682 #> 3365   7.0      3 1889 1889-03-02 20:00:01  blood 1683 #> 3366   7.0      3 1889 1889-03-02 20:00:01   bone 1683 #> 3367   4.3      4 1889 1889-04-02 06:00:00  blood 1684 #> 3368   4.3      4 1889 1889-04-02 06:00:00   bone 1684 #> 3369   2.4      5 1889 1889-05-02 16:00:01  blood 1685 #> 3370   2.4      5 1889 1889-05-02 16:00:01   bone 1685 #> 3371   6.4      6 1889 1889-06-02 02:00:01  blood 1686 #> 3372   6.4      6 1889 1889-06-02 02:00:01   bone 1686 #> 3373   9.7      7 1889 1889-07-02 12:00:00  blood 1687 #> 3374   9.7      7 1889 1889-07-02 12:00:00   bone 1687 #> 3375  20.6      8 1889 1889-08-01 22:00:01  blood 1688 #> 3376  20.6      8 1889 1889-08-01 22:00:01   bone 1688 #> 3377   6.5      9 1889 1889-09-01 08:00:01  blood 1689 #> 3378   6.5      9 1889 1889-09-01 08:00:01   bone 1689 #> 3379   2.1     10 1889 1889-10-01 18:00:00  blood 1690 #> 3380   2.1     10 1889 1889-10-01 18:00:00   bone 1690 #> 3381   0.2     11 1889 1889-11-01 04:00:01  blood 1691 #> 3382   0.2     11 1889 1889-11-01 04:00:01   bone 1691 #> 3383   6.7     12 1889 1889-12-01 14:00:01  blood 1692 #> 3384   6.7     12 1889 1889-12-01 14:00:01   bone 1692 #> 3385   5.3      1 1890 1890-01-01 00:00:00  blood 1693 #> 3386   5.3      1 1890 1890-01-01 00:00:00   bone 1693 #> 3387   0.6      2 1890 1890-01-31 10:00:01  blood 1694 #> 3388   0.6      2 1890 1890-01-31 10:00:01   bone 1694 #> 3389   5.1      3 1890 1890-03-02 20:00:01  blood 1695 #> 3390   5.1      3 1890 1890-03-02 20:00:01   bone 1695 #> 3391   1.6      4 1890 1890-04-02 06:00:00  blood 1696 #> 3392   1.6      4 1890 1890-04-02 06:00:00   bone 1696 #> 3393   4.8      5 1890 1890-05-02 16:00:01  blood 1697 #> 3394   4.8      5 1890 1890-05-02 16:00:01   bone 1697 #> 3395   1.3      6 1890 1890-06-02 02:00:01  blood 1698 #> 3396   1.3      6 1890 1890-06-02 02:00:01   bone 1698 #> 3397  11.6      7 1890 1890-07-02 12:00:00  blood 1699 #> 3398  11.6      7 1890 1890-07-02 12:00:00   bone 1699 #> 3399   8.5      8 1890 1890-08-01 22:00:01  blood 1700 #> 3400   8.5      8 1890 1890-08-01 22:00:01   bone 1700 #> 3401  17.2      9 1890 1890-09-01 08:00:01  blood 1701 #> 3402  17.2      9 1890 1890-09-01 08:00:01   bone 1701 #> 3403  11.2     10 1890 1890-10-01 18:00:00  blood 1702 #> 3404  11.2     10 1890 1890-10-01 18:00:00   bone 1702 #> 3405   9.6     11 1890 1890-11-01 04:00:01  blood 1703 #> 3406   9.6     11 1890 1890-11-01 04:00:01   bone 1703 #> 3407   7.8     12 1890 1890-12-01 14:00:01  blood 1704 #> 3408   7.8     12 1890 1890-12-01 14:00:01   bone 1704 #> 3409  13.5      1 1891 1891-01-01 00:00:00  blood 1705 #> 3410  13.5      1 1891 1891-01-01 00:00:00   bone 1705 #> 3411  22.2      2 1891 1891-01-31 10:00:01  blood 1706 #> 3412  22.2      2 1891 1891-01-31 10:00:01   bone 1706 #> 3413  10.4      3 1891 1891-03-02 20:00:01  blood 1707 #> 3414  10.4      3 1891 1891-03-02 20:00:01   bone 1707 #> 3415  20.5      4 1891 1891-04-02 06:00:00  blood 1708 #> 3416  20.5      4 1891 1891-04-02 06:00:00   bone 1708 #> 3417  41.1      5 1891 1891-05-02 16:00:01  blood 1709 #> 3418  41.1      5 1891 1891-05-02 16:00:01   bone 1709 #> 3419  48.3      6 1891 1891-06-02 02:00:01  blood 1710 #> 3420  48.3      6 1891 1891-06-02 02:00:01   bone 1710 #> 3421  58.8      7 1891 1891-07-02 12:00:00  blood 1711 #> 3422  58.8      7 1891 1891-07-02 12:00:00   bone 1711 #> 3423  33.2      8 1891 1891-08-01 22:00:01  blood 1712 #> 3424  33.2      8 1891 1891-08-01 22:00:01   bone 1712 #> 3425  53.8      9 1891 1891-09-01 08:00:01  blood 1713 #> 3426  53.8      9 1891 1891-09-01 08:00:01   bone 1713 #> 3427  51.5     10 1891 1891-10-01 18:00:00  blood 1714 #> 3428  51.5     10 1891 1891-10-01 18:00:00   bone 1714 #> 3429  41.9     11 1891 1891-11-01 04:00:01  blood 1715 #> 3430  41.9     11 1891 1891-11-01 04:00:01   bone 1715 #> 3431  32.3     12 1891 1891-12-01 14:00:01  blood 1716 #> 3432  32.3     12 1891 1891-12-01 14:00:01   bone 1716 #> 3433  69.1      1 1892 1892-01-01 00:00:00  blood 1717 #> 3434  69.1      1 1892 1892-01-01 00:00:00   bone 1717 #> 3435  75.6      2 1892 1892-01-31 12:00:01  blood 1718 #> 3436  75.6      2 1892 1892-01-31 12:00:01   bone 1718 #> 3437  49.9      3 1892 1892-03-02 00:00:01  blood 1719 #> 3438  49.9      3 1892 1892-03-02 00:00:01   bone 1719 #> 3439  69.6      4 1892 1892-04-01 12:00:00  blood 1720 #> 3440  69.6      4 1892 1892-04-01 12:00:00   bone 1720 #> 3441  79.6      5 1892 1892-05-02 00:00:01  blood 1721 #> 3442  79.6      5 1892 1892-05-02 00:00:01   bone 1721 #> 3443  76.3      6 1892 1892-06-01 12:00:01  blood 1722 #> 3444  76.3      6 1892 1892-06-01 12:00:01   bone 1722 #> 3445  76.8      7 1892 1892-07-02 00:00:00  blood 1723 #> 3446  76.8      7 1892 1892-07-02 00:00:00   bone 1723 #> 3447 101.4      8 1892 1892-08-01 12:00:01  blood 1724 #> 3448 101.4      8 1892 1892-08-01 12:00:01   bone 1724 #> 3449  62.8      9 1892 1892-09-01 00:00:01  blood 1725 #> 3450  62.8      9 1892 1892-09-01 00:00:01   bone 1725 #> 3451  70.5     10 1892 1892-10-01 12:00:00  blood 1726 #> 3452  70.5     10 1892 1892-10-01 12:00:00   bone 1726 #> 3453  65.4     11 1892 1892-11-01 00:00:01  blood 1727 #> 3454  65.4     11 1892 1892-11-01 00:00:01   bone 1727 #> 3455  78.6     12 1892 1892-12-01 12:00:01  blood 1728 #> 3456  78.6     12 1892 1892-12-01 12:00:01   bone 1728 #> 3457  75.0      1 1893 1893-01-01 00:00:00  blood 1729 #> 3458  75.0      1 1893 1893-01-01 00:00:00   bone 1729 #> 3459  73.0      2 1893 1893-01-31 10:00:01  blood 1730 #> 3460  73.0      2 1893 1893-01-31 10:00:01   bone 1730 #> 3461  65.7      3 1893 1893-03-02 20:00:01  blood 1731 #> 3462  65.7      3 1893 1893-03-02 20:00:01   bone 1731 #> 3463  88.1      4 1893 1893-04-02 06:00:00  blood 1732 #> 3464  88.1      4 1893 1893-04-02 06:00:00   bone 1732 #> 3465  84.7      5 1893 1893-05-02 16:00:01  blood 1733 #> 3466  84.7      5 1893 1893-05-02 16:00:01   bone 1733 #> 3467  88.2      6 1893 1893-06-02 02:00:01  blood 1734 #> 3468  88.2      6 1893 1893-06-02 02:00:01   bone 1734 #> 3469  88.8      7 1893 1893-07-02 12:00:00  blood 1735 #> 3470  88.8      7 1893 1893-07-02 12:00:00   bone 1735 #> 3471 129.2      8 1893 1893-08-01 22:00:01  blood 1736 #> 3472 129.2      8 1893 1893-08-01 22:00:01   bone 1736 #> 3473  77.9      9 1893 1893-09-01 08:00:01  blood 1737 #> 3474  77.9      9 1893 1893-09-01 08:00:01   bone 1737 #> 3475  79.7     10 1893 1893-10-01 18:00:00  blood 1738 #> 3476  79.7     10 1893 1893-10-01 18:00:00   bone 1738 #> 3477  75.1     11 1893 1893-11-01 04:00:01  blood 1739 #> 3478  75.1     11 1893 1893-11-01 04:00:01   bone 1739 #> 3479  93.8     12 1893 1893-12-01 14:00:01  blood 1740 #> 3480  93.8     12 1893 1893-12-01 14:00:01   bone 1740 #> 3481  83.2      1 1894 1894-01-01 00:00:00  blood 1741 #> 3482  83.2      1 1894 1894-01-01 00:00:00   bone 1741 #> 3483  84.6      2 1894 1894-01-31 10:00:01  blood 1742 #> 3484  84.6      2 1894 1894-01-31 10:00:01   bone 1742 #> 3485  52.3      3 1894 1894-03-02 20:00:01  blood 1743 #> 3486  52.3      3 1894 1894-03-02 20:00:01   bone 1743 #> 3487  81.6      4 1894 1894-04-02 06:00:00  blood 1744 #> 3488  81.6      4 1894 1894-04-02 06:00:00   bone 1744 #> 3489 101.2      5 1894 1894-05-02 16:00:01  blood 1745 #> 3490 101.2      5 1894 1894-05-02 16:00:01   bone 1745 #> 3491  98.9      6 1894 1894-06-02 02:00:01  blood 1746 #> 3492  98.9      6 1894 1894-06-02 02:00:01   bone 1746 #> 3493 106.0      7 1894 1894-07-02 12:00:00  blood 1747 #> 3494 106.0      7 1894 1894-07-02 12:00:00   bone 1747 #> 3495  70.3      8 1894 1894-08-01 22:00:01  blood 1748 #> 3496  70.3      8 1894 1894-08-01 22:00:01   bone 1748 #> 3497  65.9      9 1894 1894-09-01 08:00:01  blood 1749 #> 3498  65.9      9 1894 1894-09-01 08:00:01   bone 1749 #> 3499  75.5     10 1894 1894-10-01 18:00:00  blood 1750 #> 3500  75.5     10 1894 1894-10-01 18:00:00   bone 1750 #> 3501  56.6     11 1894 1894-11-01 04:00:01  blood 1751 #> 3502  56.6     11 1894 1894-11-01 04:00:01   bone 1751 #> 3503  60.0     12 1894 1894-12-01 14:00:01  blood 1752 #> 3504  60.0     12 1894 1894-12-01 14:00:01   bone 1752 #> 3505  63.3      1 1895 1895-01-01 00:00:00  blood 1753 #> 3506  63.3      1 1895 1895-01-01 00:00:00   bone 1753 #> 3507  67.2      2 1895 1895-01-31 10:00:01  blood 1754 #> 3508  67.2      2 1895 1895-01-31 10:00:01   bone 1754 #> 3509  61.0      3 1895 1895-03-02 20:00:01  blood 1755 #> 3510  61.0      3 1895 1895-03-02 20:00:01   bone 1755 #> 3511  76.9      4 1895 1895-04-02 06:00:00  blood 1756 #> 3512  76.9      4 1895 1895-04-02 06:00:00   bone 1756 #> 3513  67.5      5 1895 1895-05-02 16:00:01  blood 1757 #> 3514  67.5      5 1895 1895-05-02 16:00:01   bone 1757 #> 3515  71.5      6 1895 1895-06-02 02:00:01  blood 1758 #> 3516  71.5      6 1895 1895-06-02 02:00:01   bone 1758 #> 3517  47.8      7 1895 1895-07-02 12:00:00  blood 1759 #> 3518  47.8      7 1895 1895-07-02 12:00:00   bone 1759 #> 3519  68.9      8 1895 1895-08-01 22:00:01  blood 1760 #> 3520  68.9      8 1895 1895-08-01 22:00:01   bone 1760 #> 3521  57.7      9 1895 1895-09-01 08:00:01  blood 1761 #> 3522  57.7      9 1895 1895-09-01 08:00:01   bone 1761 #> 3523  67.9     10 1895 1895-10-01 18:00:00  blood 1762 #> 3524  67.9     10 1895 1895-10-01 18:00:00   bone 1762 #> 3525  47.2     11 1895 1895-11-01 04:00:01  blood 1763 #> 3526  47.2     11 1895 1895-11-01 04:00:01   bone 1763 #> 3527  70.7     12 1895 1895-12-01 14:00:01  blood 1764 #> 3528  70.7     12 1895 1895-12-01 14:00:01   bone 1764 #> 3529  29.0      1 1896 1896-01-01 00:00:00  blood 1765 #> 3530  29.0      1 1896 1896-01-01 00:00:00   bone 1765 #> 3531  57.4      2 1896 1896-01-31 12:00:01  blood 1766 #> 3532  57.4      2 1896 1896-01-31 12:00:01   bone 1766 #> 3533  52.0      3 1896 1896-03-02 00:00:01  blood 1767 #> 3534  52.0      3 1896 1896-03-02 00:00:01   bone 1767 #> 3535  43.8      4 1896 1896-04-01 12:00:00  blood 1768 #> 3536  43.8      4 1896 1896-04-01 12:00:00   bone 1768 #> 3537  27.7      5 1896 1896-05-02 00:00:01  blood 1769 #> 3538  27.7      5 1896 1896-05-02 00:00:01   bone 1769 #> 3539  49.0      6 1896 1896-06-01 12:00:01  blood 1770 #> 3540  49.0      6 1896 1896-06-01 12:00:01   bone 1770 #> 3541  45.0      7 1896 1896-07-02 00:00:00  blood 1771 #> 3542  45.0      7 1896 1896-07-02 00:00:00   bone 1771 #> 3543  27.2      8 1896 1896-08-01 12:00:01  blood 1772 #> 3544  27.2      8 1896 1896-08-01 12:00:01   bone 1772 #> 3545  61.3      9 1896 1896-09-01 00:00:01  blood 1773 #> 3546  61.3      9 1896 1896-09-01 00:00:01   bone 1773 #> 3547  28.4     10 1896 1896-10-01 12:00:00  blood 1774 #> 3548  28.4     10 1896 1896-10-01 12:00:00   bone 1774 #> 3549  38.0     11 1896 1896-11-01 00:00:01  blood 1775 #> 3550  38.0     11 1896 1896-11-01 00:00:01   bone 1775 #> 3551  42.6     12 1896 1896-12-01 12:00:01  blood 1776 #> 3552  42.6     12 1896 1896-12-01 12:00:01   bone 1776 #> 3553  40.6      1 1897 1897-01-01 00:00:00  blood 1777 #> 3554  40.6      1 1897 1897-01-01 00:00:00   bone 1777 #> 3555  29.4      2 1897 1897-01-31 10:00:01  blood 1778 #> 3556  29.4      2 1897 1897-01-31 10:00:01   bone 1778 #> 3557  29.1      3 1897 1897-03-02 20:00:01  blood 1779 #> 3558  29.1      3 1897 1897-03-02 20:00:01   bone 1779 #> 3559  31.0      4 1897 1897-04-02 06:00:00  blood 1780 #> 3560  31.0      4 1897 1897-04-02 06:00:00   bone 1780 #> 3561  20.0      5 1897 1897-05-02 16:00:01  blood 1781 #> 3562  20.0      5 1897 1897-05-02 16:00:01   bone 1781 #> 3563  11.3      6 1897 1897-06-02 02:00:01  blood 1782 #> 3564  11.3      6 1897 1897-06-02 02:00:01   bone 1782 #> 3565  27.6      7 1897 1897-07-02 12:00:00  blood 1783 #> 3566  27.6      7 1897 1897-07-02 12:00:00   bone 1783 #> 3567  21.8      8 1897 1897-08-01 22:00:01  blood 1784 #> 3568  21.8      8 1897 1897-08-01 22:00:01   bone 1784 #> 3569  48.1      9 1897 1897-09-01 08:00:01  blood 1785 #> 3570  48.1      9 1897 1897-09-01 08:00:01   bone 1785 #> 3571  14.3     10 1897 1897-10-01 18:00:00  blood 1786 #> 3572  14.3     10 1897 1897-10-01 18:00:00   bone 1786 #> 3573   8.4     11 1897 1897-11-01 04:00:01  blood 1787 #> 3574   8.4     11 1897 1897-11-01 04:00:01   bone 1787 #> 3575  33.3     12 1897 1897-12-01 14:00:01  blood 1788 #> 3576  33.3     12 1897 1897-12-01 14:00:01   bone 1788 #> 3577  30.2      1 1898 1898-01-01 00:00:00  blood 1789 #> 3578  30.2      1 1898 1898-01-01 00:00:00   bone 1789 #> 3579  36.4      2 1898 1898-01-31 10:00:01  blood 1790 #> 3580  36.4      2 1898 1898-01-31 10:00:01   bone 1790 #> 3581  38.3      3 1898 1898-03-02 20:00:01  blood 1791 #> 3582  38.3      3 1898 1898-03-02 20:00:01   bone 1791 #> 3583  14.5      4 1898 1898-04-02 06:00:00  blood 1792 #> 3584  14.5      4 1898 1898-04-02 06:00:00   bone 1792 #> 3585  25.8      5 1898 1898-05-02 16:00:01  blood 1793 #> 3586  25.8      5 1898 1898-05-02 16:00:01   bone 1793 #> 3587  22.3      6 1898 1898-06-02 02:00:01  blood 1794 #> 3588  22.3      6 1898 1898-06-02 02:00:01   bone 1794 #> 3589   9.0      7 1898 1898-07-02 12:00:00  blood 1795 #> 3590   9.0      7 1898 1898-07-02 12:00:00   bone 1795 #> 3591  31.4      8 1898 1898-08-01 22:00:01  blood 1796 #> 3592  31.4      8 1898 1898-08-01 22:00:01   bone 1796 #> 3593  34.8      9 1898 1898-09-01 08:00:01  blood 1797 #> 3594  34.8      9 1898 1898-09-01 08:00:01   bone 1797 #> 3595  34.4     10 1898 1898-10-01 18:00:00  blood 1798 #> 3596  34.4     10 1898 1898-10-01 18:00:00   bone 1798 #> 3597  30.9     11 1898 1898-11-01 04:00:01  blood 1799 #> 3598  30.9     11 1898 1898-11-01 04:00:01   bone 1799 #> 3599  12.6     12 1898 1898-12-01 14:00:01  blood 1800 #> 3600  12.6     12 1898 1898-12-01 14:00:01   bone 1800 #> 3601  19.5      1 1899 1899-01-01 00:00:00  blood 1801 #> 3602  19.5      1 1899 1899-01-01 00:00:00   bone 1801 #> 3603   9.2      2 1899 1899-01-31 10:00:01  blood 1802 #> 3604   9.2      2 1899 1899-01-31 10:00:01   bone 1802 #> 3605  18.1      3 1899 1899-03-02 20:00:01  blood 1803 #> 3606  18.1      3 1899 1899-03-02 20:00:01   bone 1803 #> 3607  14.2      4 1899 1899-04-02 06:00:00  blood 1804 #> 3608  14.2      4 1899 1899-04-02 06:00:00   bone 1804 #> 3609   7.7      5 1899 1899-05-02 16:00:01  blood 1805 #> 3610   7.7      5 1899 1899-05-02 16:00:01   bone 1805 #> 3611  20.5      6 1899 1899-06-02 02:00:01  blood 1806 #> 3612  20.5      6 1899 1899-06-02 02:00:01   bone 1806 #> 3613  13.5      7 1899 1899-07-02 12:00:00  blood 1807 #> 3614  13.5      7 1899 1899-07-02 12:00:00   bone 1807 #> 3615   2.9      8 1899 1899-08-01 22:00:01  blood 1808 #> 3616   2.9      8 1899 1899-08-01 22:00:01   bone 1808 #> 3617   8.4      9 1899 1899-09-01 08:00:01  blood 1809 #> 3618   8.4      9 1899 1899-09-01 08:00:01   bone 1809 #> 3619  13.0     10 1899 1899-10-01 18:00:00  blood 1810 #> 3620  13.0     10 1899 1899-10-01 18:00:00   bone 1810 #> 3621   7.8     11 1899 1899-11-01 04:00:01  blood 1811 #> 3622   7.8     11 1899 1899-11-01 04:00:01   bone 1811 #> 3623  10.5     12 1899 1899-12-01 14:00:01  blood 1812 #> 3624  10.5     12 1899 1899-12-01 14:00:01   bone 1812 #> 3625   9.4      1 1900 1900-01-01 00:00:00  blood 1813 #> 3626   9.4      1 1900 1900-01-01 00:00:00   bone 1813 #> 3627  13.6      2 1900 1900-01-31 10:00:01  blood 1814 #> 3628  13.6      2 1900 1900-01-31 10:00:01   bone 1814 #> 3629   8.6      3 1900 1900-03-02 20:00:01  blood 1815 #> 3630   8.6      3 1900 1900-03-02 20:00:01   bone 1815 #> 3631  16.0      4 1900 1900-04-02 06:00:00  blood 1816 #> 3632  16.0      4 1900 1900-04-02 06:00:00   bone 1816 #> 3633  15.2      5 1900 1900-05-02 16:00:01  blood 1817 #> 3634  15.2      5 1900 1900-05-02 16:00:01   bone 1817 #> 3635  12.1      6 1900 1900-06-02 02:00:01  blood 1818 #> 3636  12.1      6 1900 1900-06-02 02:00:01   bone 1818 #> 3637   8.3      7 1900 1900-07-02 12:00:00  blood 1819 #> 3638   8.3      7 1900 1900-07-02 12:00:00   bone 1819 #> 3639   4.3      8 1900 1900-08-01 22:00:01  blood 1820 #> 3640   4.3      8 1900 1900-08-01 22:00:01   bone 1820 #> 3641   8.3      9 1900 1900-09-01 08:00:01  blood 1821 #> 3642   8.3      9 1900 1900-09-01 08:00:01   bone 1821 #> 3643  12.9     10 1900 1900-10-01 18:00:00  blood 1822 #> 3644  12.9     10 1900 1900-10-01 18:00:00   bone 1822 #> 3645   4.5     11 1900 1900-11-01 04:00:01  blood 1823 #> 3646   4.5     11 1900 1900-11-01 04:00:01   bone 1823 #> 3647   0.3     12 1900 1900-12-01 14:00:01  blood 1824 #> 3648   0.3     12 1900 1900-12-01 14:00:01   bone 1824 #> 3649   0.2      1 1901 1901-01-01 00:00:00  blood 1825 #> 3650   0.2      1 1901 1901-01-01 00:00:00   bone 1825 #> 3651   2.4      2 1901 1901-01-31 10:00:01  blood 1826 #> 3652   2.4      2 1901 1901-01-31 10:00:01   bone 1826 #> 3653   4.5      3 1901 1901-03-02 20:00:01  blood 1827 #> 3654   4.5      3 1901 1901-03-02 20:00:01   bone 1827 #> 3655   0.0      4 1901 1901-04-02 06:00:00  blood 1828 #> 3656   0.0      4 1901 1901-04-02 06:00:00   bone 1828 #> 3657  10.2      5 1901 1901-05-02 16:00:01  blood 1829 #> 3658  10.2      5 1901 1901-05-02 16:00:01   bone 1829 #> 3659   5.8      6 1901 1901-06-02 02:00:01  blood 1830 #> 3660   5.8      6 1901 1901-06-02 02:00:01   bone 1830 #> 3661   0.7      7 1901 1901-07-02 12:00:00  blood 1831 #> 3662   0.7      7 1901 1901-07-02 12:00:00   bone 1831 #> 3663   1.0      8 1901 1901-08-01 22:00:01  blood 1832 #> 3664   1.0      8 1901 1901-08-01 22:00:01   bone 1832 #> 3665   0.6      9 1901 1901-09-01 08:00:01  blood 1833 #> 3666   0.6      9 1901 1901-09-01 08:00:01   bone 1833 #> 3667   3.7     10 1901 1901-10-01 18:00:00  blood 1834 #> 3668   3.7     10 1901 1901-10-01 18:00:00   bone 1834 #> 3669   3.8     11 1901 1901-11-01 04:00:01  blood 1835 #> 3670   3.8     11 1901 1901-11-01 04:00:01   bone 1835 #> 3671   0.0     12 1901 1901-12-01 14:00:01  blood 1836 #> 3672   0.0     12 1901 1901-12-01 14:00:01   bone 1836 #> 3673   5.2      1 1902 1902-01-01 00:00:00  blood 1837 #> 3674   5.2      1 1902 1902-01-01 00:00:00   bone 1837 #> 3675   0.0      2 1902 1902-01-31 10:00:01  blood 1838 #> 3676   0.0      2 1902 1902-01-31 10:00:01   bone 1838 #> 3677  12.4      3 1902 1902-03-02 20:00:01  blood 1839 #> 3678  12.4      3 1902 1902-03-02 20:00:01   bone 1839 #> 3679   0.0      4 1902 1902-04-02 06:00:00  blood 1840 #> 3680   0.0      4 1902 1902-04-02 06:00:00   bone 1840 #> 3681   2.8      5 1902 1902-05-02 16:00:01  blood 1841 #> 3682   2.8      5 1902 1902-05-02 16:00:01   bone 1841 #> 3683   1.4      6 1902 1902-06-02 02:00:01  blood 1842 #> 3684   1.4      6 1902 1902-06-02 02:00:01   bone 1842 #> 3685   0.9      7 1902 1902-07-02 12:00:00  blood 1843 #> 3686   0.9      7 1902 1902-07-02 12:00:00   bone 1843 #> 3687   2.3      8 1902 1902-08-01 22:00:01  blood 1844 #> 3688   2.3      8 1902 1902-08-01 22:00:01   bone 1844 #> 3689   7.6      9 1902 1902-09-01 08:00:01  blood 1845 #> 3690   7.6      9 1902 1902-09-01 08:00:01   bone 1845 #> 3691  16.3     10 1902 1902-10-01 18:00:00  blood 1846 #> 3692  16.3     10 1902 1902-10-01 18:00:00   bone 1846 #> 3693  10.3     11 1902 1902-11-01 04:00:01  blood 1847 #> 3694  10.3     11 1902 1902-11-01 04:00:01   bone 1847 #> 3695   1.1     12 1902 1902-12-01 14:00:01  blood 1848 #> 3696   1.1     12 1902 1902-12-01 14:00:01   bone 1848 #> 3697   8.3      1 1903 1903-01-01 00:00:00  blood 1849 #> 3698   8.3      1 1903 1903-01-01 00:00:00   bone 1849 #> 3699  17.0      2 1903 1903-01-31 10:00:01  blood 1850 #> 3700  17.0      2 1903 1903-01-31 10:00:01   bone 1850 #> 3701  13.5      3 1903 1903-03-02 20:00:01  blood 1851 #> 3702  13.5      3 1903 1903-03-02 20:00:01   bone 1851 #> 3703  26.1      4 1903 1903-04-02 06:00:00  blood 1852 #> 3704  26.1      4 1903 1903-04-02 06:00:00   bone 1852 #> 3705  14.6      5 1903 1903-05-02 16:00:01  blood 1853 #> 3706  14.6      5 1903 1903-05-02 16:00:01   bone 1853 #> 3707  16.3      6 1903 1903-06-02 02:00:01  blood 1854 #> 3708  16.3      6 1903 1903-06-02 02:00:01   bone 1854 #> 3709  27.9      7 1903 1903-07-02 12:00:00  blood 1855 #> 3710  27.9      7 1903 1903-07-02 12:00:00   bone 1855 #> 3711  28.8      8 1903 1903-08-01 22:00:01  blood 1856 #> 3712  28.8      8 1903 1903-08-01 22:00:01   bone 1856 #> 3713  11.1      9 1903 1903-09-01 08:00:01  blood 1857 #> 3714  11.1      9 1903 1903-09-01 08:00:01   bone 1857 #> 3715  38.9     10 1903 1903-10-01 18:00:00  blood 1858 #> 3716  38.9     10 1903 1903-10-01 18:00:00   bone 1858 #> 3717  44.5     11 1903 1903-11-01 04:00:01  blood 1859 #> 3718  44.5     11 1903 1903-11-01 04:00:01   bone 1859 #> 3719  45.6     12 1903 1903-12-01 14:00:01  blood 1860 #> 3720  45.6     12 1903 1903-12-01 14:00:01   bone 1860 #> 3721  31.6      1 1904 1904-01-01 00:00:00  blood 1861 #> 3722  31.6      1 1904 1904-01-01 00:00:00   bone 1861 #> 3723  24.5      2 1904 1904-01-31 12:00:01  blood 1862 #> 3724  24.5      2 1904 1904-01-31 12:00:01   bone 1862 #> 3725  37.2      3 1904 1904-03-02 00:00:01  blood 1863 #> 3726  37.2      3 1904 1904-03-02 00:00:01   bone 1863 #> 3727  43.0      4 1904 1904-04-01 12:00:00  blood 1864 #> 3728  43.0      4 1904 1904-04-01 12:00:00   bone 1864 #> 3729  39.5      5 1904 1904-05-02 00:00:01  blood 1865 #> 3730  39.5      5 1904 1904-05-02 00:00:01   bone 1865 #> 3731  41.9      6 1904 1904-06-01 12:00:01  blood 1866 #> 3732  41.9      6 1904 1904-06-01 12:00:01   bone 1866 #> 3733  50.6      7 1904 1904-07-02 00:00:00  blood 1867 #> 3734  50.6      7 1904 1904-07-02 00:00:00   bone 1867 #> 3735  58.2      8 1904 1904-08-01 12:00:01  blood 1868 #> 3736  58.2      8 1904 1904-08-01 12:00:01   bone 1868 #> 3737  30.1      9 1904 1904-09-01 00:00:01  blood 1869 #> 3738  30.1      9 1904 1904-09-01 00:00:01   bone 1869 #> 3739  54.2     10 1904 1904-10-01 12:00:00  blood 1870 #> 3740  54.2     10 1904 1904-10-01 12:00:00   bone 1870 #> 3741  38.0     11 1904 1904-11-01 00:00:01  blood 1871 #> 3742  38.0     11 1904 1904-11-01 00:00:01   bone 1871 #> 3743  54.6     12 1904 1904-12-01 12:00:01  blood 1872 #> 3744  54.6     12 1904 1904-12-01 12:00:01   bone 1872 #> 3745  54.8      1 1905 1905-01-01 00:00:00  blood 1873 #> 3746  54.8      1 1905 1905-01-01 00:00:00   bone 1873 #> 3747  85.8      2 1905 1905-01-31 10:00:01  blood 1874 #> 3748  85.8      2 1905 1905-01-31 10:00:01   bone 1874 #> 3749  56.5      3 1905 1905-03-02 20:00:01  blood 1875 #> 3750  56.5      3 1905 1905-03-02 20:00:01   bone 1875 #> 3751  39.3      4 1905 1905-04-02 06:00:00  blood 1876 #> 3752  39.3      4 1905 1905-04-02 06:00:00   bone 1876 #> 3753  48.0      5 1905 1905-05-02 16:00:01  blood 1877 #> 3754  48.0      5 1905 1905-05-02 16:00:01   bone 1877 #> 3755  49.0      6 1905 1905-06-02 02:00:01  blood 1878 #> 3756  49.0      6 1905 1905-06-02 02:00:01   bone 1878 #> 3757  73.0      7 1905 1905-07-02 12:00:00  blood 1879 #> 3758  73.0      7 1905 1905-07-02 12:00:00   bone 1879 #> 3759  58.8      8 1905 1905-08-01 22:00:01  blood 1880 #> 3760  58.8      8 1905 1905-08-01 22:00:01   bone 1880 #> 3761  55.0      9 1905 1905-09-01 08:00:01  blood 1881 #> 3762  55.0      9 1905 1905-09-01 08:00:01   bone 1881 #> 3763  78.7     10 1905 1905-10-01 18:00:00  blood 1882 #> 3764  78.7     10 1905 1905-10-01 18:00:00   bone 1882 #> 3765 107.2     11 1905 1905-11-01 04:00:01  blood 1883 #> 3766 107.2     11 1905 1905-11-01 04:00:01   bone 1883 #> 3767  55.5     12 1905 1905-12-01 14:00:01  blood 1884 #> 3768  55.5     12 1905 1905-12-01 14:00:01   bone 1884 #> 3769  45.5      1 1906 1906-01-01 00:00:00  blood 1885 #> 3770  45.5      1 1906 1906-01-01 00:00:00   bone 1885 #> 3771  31.3      2 1906 1906-01-31 10:00:01  blood 1886 #> 3772  31.3      2 1906 1906-01-31 10:00:01   bone 1886 #> 3773  64.5      3 1906 1906-03-02 20:00:01  blood 1887 #> 3774  64.5      3 1906 1906-03-02 20:00:01   bone 1887 #> 3775  55.3      4 1906 1906-04-02 06:00:00  blood 1888 #> 3776  55.3      4 1906 1906-04-02 06:00:00   bone 1888 #> 3777  57.7      5 1906 1906-05-02 16:00:01  blood 1889 #> 3778  57.7      5 1906 1906-05-02 16:00:01   bone 1889 #> 3779  63.2      6 1906 1906-06-02 02:00:01  blood 1890 #> 3780  63.2      6 1906 1906-06-02 02:00:01   bone 1890 #> 3781 103.6      7 1906 1906-07-02 12:00:00  blood 1891 #> 3782 103.6      7 1906 1906-07-02 12:00:00   bone 1891 #> 3783  47.7      8 1906 1906-08-01 22:00:01  blood 1892 #> 3784  47.7      8 1906 1906-08-01 22:00:01   bone 1892 #> 3785  56.1      9 1906 1906-09-01 08:00:01  blood 1893 #> 3786  56.1      9 1906 1906-09-01 08:00:01   bone 1893 #> 3787  17.8     10 1906 1906-10-01 18:00:00  blood 1894 #> 3788  17.8     10 1906 1906-10-01 18:00:00   bone 1894 #> 3789  38.9     11 1906 1906-11-01 04:00:01  blood 1895 #> 3790  38.9     11 1906 1906-11-01 04:00:01   bone 1895 #> 3791  64.7     12 1906 1906-12-01 14:00:01  blood 1896 #> 3792  64.7     12 1906 1906-12-01 14:00:01   bone 1896 #> 3793  76.4      1 1907 1907-01-01 00:00:00  blood 1897 #> 3794  76.4      1 1907 1907-01-01 00:00:00   bone 1897 #> 3795 108.2      2 1907 1907-01-31 10:00:01  blood 1898 #> 3796 108.2      2 1907 1907-01-31 10:00:01   bone 1898 #> 3797  60.7      3 1907 1907-03-02 20:00:01  blood 1899 #> 3798  60.7      3 1907 1907-03-02 20:00:01   bone 1899 #> 3799  52.6      4 1907 1907-04-02 06:00:00  blood 1900 #> 3800  52.6      4 1907 1907-04-02 06:00:00   bone 1900 #> 3801  42.9      5 1907 1907-05-02 16:00:01  blood 1901 #> 3802  42.9      5 1907 1907-05-02 16:00:01   bone 1901 #> 3803  40.4      6 1907 1907-06-02 02:00:01  blood 1902 #> 3804  40.4      6 1907 1907-06-02 02:00:01   bone 1902 #> 3805  49.7      7 1907 1907-07-02 12:00:00  blood 1903 #> 3806  49.7      7 1907 1907-07-02 12:00:00   bone 1903 #> 3807  54.3      8 1907 1907-08-01 22:00:01  blood 1904 #> 3808  54.3      8 1907 1907-08-01 22:00:01   bone 1904 #> 3809  85.0      9 1907 1907-09-01 08:00:01  blood 1905 #> 3810  85.0      9 1907 1907-09-01 08:00:01   bone 1905 #> 3811  65.4     10 1907 1907-10-01 18:00:00  blood 1906 #> 3812  65.4     10 1907 1907-10-01 18:00:00   bone 1906 #> 3813  61.5     11 1907 1907-11-01 04:00:01  blood 1907 #> 3814  61.5     11 1907 1907-11-01 04:00:01   bone 1907 #> 3815  47.3     12 1907 1907-12-01 14:00:01  blood 1908 #> 3816  47.3     12 1907 1907-12-01 14:00:01   bone 1908 #> 3817  39.2      1 1908 1908-01-01 00:00:00  blood 1909 #> 3818  39.2      1 1908 1908-01-01 00:00:00   bone 1909 #> 3819  33.9      2 1908 1908-01-31 12:00:01  blood 1910 #> 3820  33.9      2 1908 1908-01-31 12:00:01   bone 1910 #> 3821  28.7      3 1908 1908-03-02 00:00:01  blood 1911 #> 3822  28.7      3 1908 1908-03-02 00:00:01   bone 1911 #> 3823  57.6      4 1908 1908-04-01 12:00:00  blood 1912 #> 3824  57.6      4 1908 1908-04-01 12:00:00   bone 1912 #> 3825  40.8      5 1908 1908-05-02 00:00:01  blood 1913 #> 3826  40.8      5 1908 1908-05-02 00:00:01   bone 1913 #> 3827  48.1      6 1908 1908-06-01 12:00:01  blood 1914 #> 3828  48.1      6 1908 1908-06-01 12:00:01   bone 1914 #> 3829  39.5      7 1908 1908-07-02 00:00:00  blood 1915 #> 3830  39.5      7 1908 1908-07-02 00:00:00   bone 1915 #> 3831  90.5      8 1908 1908-08-01 12:00:01  blood 1916 #> 3832  90.5      8 1908 1908-08-01 12:00:01   bone 1916 #> 3833  86.9      9 1908 1908-09-01 00:00:01  blood 1917 #> 3834  86.9      9 1908 1908-09-01 00:00:01   bone 1917 #> 3835  32.3     10 1908 1908-10-01 12:00:00  blood 1918 #> 3836  32.3     10 1908 1908-10-01 12:00:00   bone 1918 #> 3837  45.5     11 1908 1908-11-01 00:00:01  blood 1919 #> 3838  45.5     11 1908 1908-11-01 00:00:01   bone 1919 #> 3839  39.5     12 1908 1908-12-01 12:00:01  blood 1920 #> 3840  39.5     12 1908 1908-12-01 12:00:01   bone 1920 #> 3841  56.7      1 1909 1909-01-01 00:00:00  blood 1921 #> 3842  56.7      1 1909 1909-01-01 00:00:00   bone 1921 #> 3843  46.6      2 1909 1909-01-31 10:00:01  blood 1922 #> 3844  46.6      2 1909 1909-01-31 10:00:01   bone 1922 #> 3845  66.3      3 1909 1909-03-02 20:00:01  blood 1923 #> 3846  66.3      3 1909 1909-03-02 20:00:01   bone 1923 #> 3847  32.3      4 1909 1909-04-02 06:00:00  blood 1924 #> 3848  32.3      4 1909 1909-04-02 06:00:00   bone 1924 #> 3849  36.0      5 1909 1909-05-02 16:00:01  blood 1925 #> 3850  36.0      5 1909 1909-05-02 16:00:01   bone 1925 #> 3851  22.6      6 1909 1909-06-02 02:00:01  blood 1926 #> 3852  22.6      6 1909 1909-06-02 02:00:01   bone 1926 #> 3853  35.8      7 1909 1909-07-02 12:00:00  blood 1927 #> 3854  35.8      7 1909 1909-07-02 12:00:00   bone 1927 #> 3855  23.1      8 1909 1909-08-01 22:00:01  blood 1928 #> 3856  23.1      8 1909 1909-08-01 22:00:01   bone 1928 #> 3857  38.8      9 1909 1909-09-01 08:00:01  blood 1929 #> 3858  38.8      9 1909 1909-09-01 08:00:01   bone 1929 #> 3859  58.4     10 1909 1909-10-01 18:00:00  blood 1930 #> 3860  58.4     10 1909 1909-10-01 18:00:00   bone 1930 #> 3861  55.8     11 1909 1909-11-01 04:00:01  blood 1931 #> 3862  55.8     11 1909 1909-11-01 04:00:01   bone 1931 #> 3863  54.2     12 1909 1909-12-01 14:00:01  blood 1932 #> 3864  54.2     12 1909 1909-12-01 14:00:01   bone 1932 #> 3865  26.4      1 1910 1910-01-01 00:00:00  blood 1933 #> 3866  26.4      1 1910 1910-01-01 00:00:00   bone 1933 #> 3867  31.5      2 1910 1910-01-31 10:00:01  blood 1934 #> 3868  31.5      2 1910 1910-01-31 10:00:01   bone 1934 #> 3869  21.4      3 1910 1910-03-02 20:00:01  blood 1935 #> 3870  21.4      3 1910 1910-03-02 20:00:01   bone 1935 #> 3871   8.4      4 1910 1910-04-02 06:00:00  blood 1936 #> 3872   8.4      4 1910 1910-04-02 06:00:00   bone 1936 #> 3873  22.2      5 1910 1910-05-02 16:00:01  blood 1937 #> 3874  22.2      5 1910 1910-05-02 16:00:01   bone 1937 #> 3875  12.3      6 1910 1910-06-02 02:00:01  blood 1938 #> 3876  12.3      6 1910 1910-06-02 02:00:01   bone 1938 #> 3877  14.1      7 1910 1910-07-02 12:00:00  blood 1939 #> 3878  14.1      7 1910 1910-07-02 12:00:00   bone 1939 #> 3879  11.5      8 1910 1910-08-01 22:00:01  blood 1940 #> 3880  11.5      8 1910 1910-08-01 22:00:01   bone 1940 #> 3881  26.2      9 1910 1910-09-01 08:00:01  blood 1941 #> 3882  26.2      9 1910 1910-09-01 08:00:01   bone 1941 #> 3883  38.3     10 1910 1910-10-01 18:00:00  blood 1942 #> 3884  38.3     10 1910 1910-10-01 18:00:00   bone 1942 #> 3885   4.9     11 1910 1910-11-01 04:00:01  blood 1943 #> 3886   4.9     11 1910 1910-11-01 04:00:01   bone 1943 #> 3887   5.8     12 1910 1910-12-01 14:00:01  blood 1944 #> 3888   5.8     12 1910 1910-12-01 14:00:01   bone 1944 #> 3889   3.4      1 1911 1911-01-01 00:00:00  blood 1945 #> 3890   3.4      1 1911 1911-01-01 00:00:00   bone 1945 #> 3891   9.0      2 1911 1911-01-31 10:00:01  blood 1946 #> 3892   9.0      2 1911 1911-01-31 10:00:01   bone 1946 #> 3893   7.8      3 1911 1911-03-02 20:00:01  blood 1947 #> 3894   7.8      3 1911 1911-03-02 20:00:01   bone 1947 #> 3895  16.5      4 1911 1911-04-02 06:00:00  blood 1948 #> 3896  16.5      4 1911 1911-04-02 06:00:00   bone 1948 #> 3897   9.0      5 1911 1911-05-02 16:00:01  blood 1949 #> 3898   9.0      5 1911 1911-05-02 16:00:01   bone 1949 #> 3899   2.2      6 1911 1911-06-02 02:00:01  blood 1950 #> 3900   2.2      6 1911 1911-06-02 02:00:01   bone 1950 #> 3901   3.5      7 1911 1911-07-02 12:00:00  blood 1951 #> 3902   3.5      7 1911 1911-07-02 12:00:00   bone 1951 #> 3903   4.0      8 1911 1911-08-01 22:00:01  blood 1952 #> 3904   4.0      8 1911 1911-08-01 22:00:01   bone 1952 #> 3905   4.0      9 1911 1911-09-01 08:00:01  blood 1953 #> 3906   4.0      9 1911 1911-09-01 08:00:01   bone 1953 #> 3907   2.6     10 1911 1911-10-01 18:00:00  blood 1954 #> 3908   2.6     10 1911 1911-10-01 18:00:00   bone 1954 #> 3909   4.2     11 1911 1911-11-01 04:00:01  blood 1955 #> 3910   4.2     11 1911 1911-11-01 04:00:01   bone 1955 #> 3911   2.2     12 1911 1911-12-01 14:00:01  blood 1956 #> 3912   2.2     12 1911 1911-12-01 14:00:01   bone 1956 #> 3913   0.3      1 1912 1912-01-01 00:00:00  blood 1957 #> 3914   0.3      1 1912 1912-01-01 00:00:00   bone 1957 #> 3915   0.0      2 1912 1912-01-31 12:00:01  blood 1958 #> 3916   0.0      2 1912 1912-01-31 12:00:01   bone 1958 #> 3917   4.9      3 1912 1912-03-02 00:00:01  blood 1959 #> 3918   4.9      3 1912 1912-03-02 00:00:01   bone 1959 #> 3919   4.5      4 1912 1912-04-01 12:00:00  blood 1960 #> 3920   4.5      4 1912 1912-04-01 12:00:00   bone 1960 #> 3921   4.4      5 1912 1912-05-02 00:00:01  blood 1961 #> 3922   4.4      5 1912 1912-05-02 00:00:01   bone 1961 #> 3923   4.1      6 1912 1912-06-01 12:00:01  blood 1962 #> 3924   4.1      6 1912 1912-06-01 12:00:01   bone 1962 #> 3925   3.0      7 1912 1912-07-02 00:00:00  blood 1963 #> 3926   3.0      7 1912 1912-07-02 00:00:00   bone 1963 #> 3927   0.3      8 1912 1912-08-01 12:00:01  blood 1964 #> 3928   0.3      8 1912 1912-08-01 12:00:01   bone 1964 #> 3929   9.5      9 1912 1912-09-01 00:00:01  blood 1965 #> 3930   9.5      9 1912 1912-09-01 00:00:01   bone 1965 #> 3931   4.6     10 1912 1912-10-01 12:00:00  blood 1966 #> 3932   4.6     10 1912 1912-10-01 12:00:00   bone 1966 #> 3933   1.1     11 1912 1912-11-01 00:00:01  blood 1967 #> 3934   1.1     11 1912 1912-11-01 00:00:01   bone 1967 #> 3935   6.4     12 1912 1912-12-01 12:00:01  blood 1968 #> 3936   6.4     12 1912 1912-12-01 12:00:01   bone 1968 #> 3937   2.3      1 1913 1913-01-01 00:00:00  blood 1969 #> 3938   2.3      1 1913 1913-01-01 00:00:00   bone 1969 #> 3939   2.9      2 1913 1913-01-31 10:00:01  blood 1970 #> 3940   2.9      2 1913 1913-01-31 10:00:01   bone 1970 #> 3941   0.5      3 1913 1913-03-02 20:00:01  blood 1971 #> 3942   0.5      3 1913 1913-03-02 20:00:01   bone 1971 #> 3943   0.9      4 1913 1913-04-02 06:00:00  blood 1972 #> 3944   0.9      4 1913 1913-04-02 06:00:00   bone 1972 #> 3945   0.0      5 1913 1913-05-02 16:00:01  blood 1973 #> 3946   0.0      5 1913 1913-05-02 16:00:01   bone 1973 #> 3947   0.0      6 1913 1913-06-02 02:00:01  blood 1974 #> 3948   0.0      6 1913 1913-06-02 02:00:01   bone 1974 #> 3949   1.7      7 1913 1913-07-02 12:00:00  blood 1975 #> 3950   1.7      7 1913 1913-07-02 12:00:00   bone 1975 #> 3951   0.2      8 1913 1913-08-01 22:00:01  blood 1976 #> 3952   0.2      8 1913 1913-08-01 22:00:01   bone 1976 #> 3953   1.2      9 1913 1913-09-01 08:00:01  blood 1977 #> 3954   1.2      9 1913 1913-09-01 08:00:01   bone 1977 #> 3955   3.1     10 1913 1913-10-01 18:00:00  blood 1978 #> 3956   3.1     10 1913 1913-10-01 18:00:00   bone 1978 #> 3957   0.7     11 1913 1913-11-01 04:00:01  blood 1979 #> 3958   0.7     11 1913 1913-11-01 04:00:01   bone 1979 #> 3959   3.8     12 1913 1913-12-01 14:00:01  blood 1980 #> 3960   3.8     12 1913 1913-12-01 14:00:01   bone 1980 #> 3961   2.8      1 1914 1914-01-01 00:00:00  blood 1981 #> 3962   2.8      1 1914 1914-01-01 00:00:00   bone 1981 #> 3963   2.6      2 1914 1914-01-31 10:00:01  blood 1982 #> 3964   2.6      2 1914 1914-01-31 10:00:01   bone 1982 #> 3965   3.1      3 1914 1914-03-02 20:00:01  blood 1983 #> 3966   3.1      3 1914 1914-03-02 20:00:01   bone 1983 #> 3967  17.3      4 1914 1914-04-02 06:00:00  blood 1984 #> 3968  17.3      4 1914 1914-04-02 06:00:00   bone 1984 #> 3969   5.2      5 1914 1914-05-02 16:00:01  blood 1985 #> 3970   5.2      5 1914 1914-05-02 16:00:01   bone 1985 #> 3971  11.4      6 1914 1914-06-02 02:00:01  blood 1986 #> 3972  11.4      6 1914 1914-06-02 02:00:01   bone 1986 #> 3973   5.4      7 1914 1914-07-02 12:00:00  blood 1987 #> 3974   5.4      7 1914 1914-07-02 12:00:00   bone 1987 #> 3975   7.7      8 1914 1914-08-01 22:00:01  blood 1988 #> 3976   7.7      8 1914 1914-08-01 22:00:01   bone 1988 #> 3977  12.7      9 1914 1914-09-01 08:00:01  blood 1989 #> 3978  12.7      9 1914 1914-09-01 08:00:01   bone 1989 #> 3979   8.2     10 1914 1914-10-01 18:00:00  blood 1990 #> 3980   8.2     10 1914 1914-10-01 18:00:00   bone 1990 #> 3981  16.4     11 1914 1914-11-01 04:00:01  blood 1991 #> 3982  16.4     11 1914 1914-11-01 04:00:01   bone 1991 #> 3983  22.3     12 1914 1914-12-01 14:00:01  blood 1992 #> 3984  22.3     12 1914 1914-12-01 14:00:01   bone 1992 #> 3985  23.0      1 1915 1915-01-01 00:00:00  blood 1993 #> 3986  23.0      1 1915 1915-01-01 00:00:00   bone 1993 #> 3987  42.3      2 1915 1915-01-31 10:00:01  blood 1994 #> 3988  42.3      2 1915 1915-01-31 10:00:01   bone 1994 #> 3989  38.8      3 1915 1915-03-02 20:00:01  blood 1995 #> 3990  38.8      3 1915 1915-03-02 20:00:01   bone 1995 #> 3991  41.3      4 1915 1915-04-02 06:00:00  blood 1996 #> 3992  41.3      4 1915 1915-04-02 06:00:00   bone 1996 #> 3993  33.0      5 1915 1915-05-02 16:00:01  blood 1997 #> 3994  33.0      5 1915 1915-05-02 16:00:01   bone 1997 #> 3995  68.8      6 1915 1915-06-02 02:00:01  blood 1998 #> 3996  68.8      6 1915 1915-06-02 02:00:01   bone 1998 #> 3997  71.6      7 1915 1915-07-02 12:00:00  blood 1999 #> 3998  71.6      7 1915 1915-07-02 12:00:00   bone 1999 #> 3999  69.6      8 1915 1915-08-01 22:00:01  blood 2000 #> 4000  69.6      8 1915 1915-08-01 22:00:01   bone 2000 #> 4001  49.5      9 1915 1915-09-01 08:00:01  blood 2001 #> 4002  49.5      9 1915 1915-09-01 08:00:01   bone 2001 #> 4003  53.5     10 1915 1915-10-01 18:00:00  blood 2002 #> 4004  53.5     10 1915 1915-10-01 18:00:00   bone 2002 #> 4005  42.5     11 1915 1915-11-01 04:00:01  blood 2003 #> 4006  42.5     11 1915 1915-11-01 04:00:01   bone 2003 #> 4007  34.5     12 1915 1915-12-01 14:00:01  blood 2004 #> 4008  34.5     12 1915 1915-12-01 14:00:01   bone 2004 #> 4009  45.3      1 1916 1916-01-01 00:00:00  blood 2005 #> 4010  45.3      1 1916 1916-01-01 00:00:00   bone 2005 #> 4011  55.4      2 1916 1916-01-31 12:00:01  blood 2006 #> 4012  55.4      2 1916 1916-01-31 12:00:01   bone 2006 #> 4013  67.0      3 1916 1916-03-02 00:00:01  blood 2007 #> 4014  67.0      3 1916 1916-03-02 00:00:01   bone 2007 #> 4015  71.8      4 1916 1916-04-01 12:00:00  blood 2008 #> 4016  71.8      4 1916 1916-04-01 12:00:00   bone 2008 #> 4017  74.5      5 1916 1916-05-02 00:00:01  blood 2009 #> 4018  74.5      5 1916 1916-05-02 00:00:01   bone 2009 #> 4019  67.7      6 1916 1916-06-01 12:00:01  blood 2010 #> 4020  67.7      6 1916 1916-06-01 12:00:01   bone 2010 #> 4021  53.5      7 1916 1916-07-02 00:00:00  blood 2011 #> 4022  53.5      7 1916 1916-07-02 00:00:00   bone 2011 #> 4023  35.2      8 1916 1916-08-01 12:00:01  blood 2012 #> 4024  35.2      8 1916 1916-08-01 12:00:01   bone 2012 #> 4025  45.1      9 1916 1916-09-01 00:00:01  blood 2013 #> 4026  45.1      9 1916 1916-09-01 00:00:01   bone 2013 #> 4027  50.7     10 1916 1916-10-01 12:00:00  blood 2014 #> 4028  50.7     10 1916 1916-10-01 12:00:00   bone 2014 #> 4029  65.6     11 1916 1916-11-01 00:00:01  blood 2015 #> 4030  65.6     11 1916 1916-11-01 00:00:01   bone 2015 #> 4031  53.0     12 1916 1916-12-01 12:00:01  blood 2016 #> 4032  53.0     12 1916 1916-12-01 12:00:01   bone 2016 #> 4033  74.7      1 1917 1917-01-01 00:00:00  blood 2017 #> 4034  74.7      1 1917 1917-01-01 00:00:00   bone 2017 #> 4035  71.9      2 1917 1917-01-31 10:00:01  blood 2018 #> 4036  71.9      2 1917 1917-01-31 10:00:01   bone 2018 #> 4037  94.8      3 1917 1917-03-02 20:00:01  blood 2019 #> 4038  94.8      3 1917 1917-03-02 20:00:01   bone 2019 #> 4039  74.7      4 1917 1917-04-02 06:00:00  blood 2020 #> 4040  74.7      4 1917 1917-04-02 06:00:00   bone 2020 #> 4041 114.1      5 1917 1917-05-02 16:00:01  blood 2021 #> 4042 114.1      5 1917 1917-05-02 16:00:01   bone 2021 #> 4043 114.9      6 1917 1917-06-02 02:00:01  blood 2022 #> 4044 114.9      6 1917 1917-06-02 02:00:01   bone 2022 #> 4045 119.8      7 1917 1917-07-02 12:00:00  blood 2023 #> 4046 119.8      7 1917 1917-07-02 12:00:00   bone 2023 #> 4047 154.5      8 1917 1917-08-01 22:00:01  blood 2024 #> 4048 154.5      8 1917 1917-08-01 22:00:01   bone 2024 #> 4049 129.4      9 1917 1917-09-01 08:00:01  blood 2025 #> 4050 129.4      9 1917 1917-09-01 08:00:01   bone 2025 #> 4051  72.2     10 1917 1917-10-01 18:00:00  blood 2026 #> 4052  72.2     10 1917 1917-10-01 18:00:00   bone 2026 #> 4053  96.4     11 1917 1917-11-01 04:00:01  blood 2027 #> 4054  96.4     11 1917 1917-11-01 04:00:01   bone 2027 #> 4055 129.3     12 1917 1917-12-01 14:00:01  blood 2028 #> 4056 129.3     12 1917 1917-12-01 14:00:01   bone 2028 #> 4057  96.0      1 1918 1918-01-01 00:00:00  blood 2029 #> 4058  96.0      1 1918 1918-01-01 00:00:00   bone 2029 #> 4059  65.3      2 1918 1918-01-31 10:00:01  blood 2030 #> 4060  65.3      2 1918 1918-01-31 10:00:01   bone 2030 #> 4061  72.2      3 1918 1918-03-02 20:00:01  blood 2031 #> 4062  72.2      3 1918 1918-03-02 20:00:01   bone 2031 #> 4063  80.5      4 1918 1918-04-02 06:00:00  blood 2032 #> 4064  80.5      4 1918 1918-04-02 06:00:00   bone 2032 #> 4065  76.7      5 1918 1918-05-02 16:00:01  blood 2033 #> 4066  76.7      5 1918 1918-05-02 16:00:01   bone 2033 #> 4067  59.4      6 1918 1918-06-02 02:00:01  blood 2034 #> 4068  59.4      6 1918 1918-06-02 02:00:01   bone 2034 #> 4069 107.6      7 1918 1918-07-02 12:00:00  blood 2035 #> 4070 107.6      7 1918 1918-07-02 12:00:00   bone 2035 #> 4071 101.7      8 1918 1918-08-01 22:00:01  blood 2036 #> 4072 101.7      8 1918 1918-08-01 22:00:01   bone 2036 #> 4073  79.9      9 1918 1918-09-01 08:00:01  blood 2037 #> 4074  79.9      9 1918 1918-09-01 08:00:01   bone 2037 #> 4075  85.0     10 1918 1918-10-01 18:00:00  blood 2038 #> 4076  85.0     10 1918 1918-10-01 18:00:00   bone 2038 #> 4077  83.4     11 1918 1918-11-01 04:00:01  blood 2039 #> 4078  83.4     11 1918 1918-11-01 04:00:01   bone 2039 #> 4079  59.2     12 1918 1918-12-01 14:00:01  blood 2040 #> 4080  59.2     12 1918 1918-12-01 14:00:01   bone 2040 #> 4081  48.1      1 1919 1919-01-01 00:00:00  blood 2041 #> 4082  48.1      1 1919 1919-01-01 00:00:00   bone 2041 #> 4083  79.5      2 1919 1919-01-31 10:00:01  blood 2042 #> 4084  79.5      2 1919 1919-01-31 10:00:01   bone 2042 #> 4085  66.5      3 1919 1919-03-02 20:00:01  blood 2043 #> 4086  66.5      3 1919 1919-03-02 20:00:01   bone 2043 #> 4087  51.8      4 1919 1919-04-02 06:00:00  blood 2044 #> 4088  51.8      4 1919 1919-04-02 06:00:00   bone 2044 #> 4089  88.1      5 1919 1919-05-02 16:00:01  blood 2045 #> 4090  88.1      5 1919 1919-05-02 16:00:01   bone 2045 #> 4091 111.2      6 1919 1919-06-02 02:00:01  blood 2046 #> 4092 111.2      6 1919 1919-06-02 02:00:01   bone 2046 #> 4093  64.7      7 1919 1919-07-02 12:00:00  blood 2047 #> 4094  64.7      7 1919 1919-07-02 12:00:00   bone 2047 #> 4095  69.0      8 1919 1919-08-01 22:00:01  blood 2048 #> 4096  69.0      8 1919 1919-08-01 22:00:01   bone 2048 #> 4097  54.7      9 1919 1919-09-01 08:00:01  blood 2049 #> 4098  54.7      9 1919 1919-09-01 08:00:01   bone 2049 #> 4099  52.8     10 1919 1919-10-01 18:00:00  blood 2050 #> 4100  52.8     10 1919 1919-10-01 18:00:00   bone 2050 #> 4101  42.0     11 1919 1919-11-01 04:00:01  blood 2051 #> 4102  42.0     11 1919 1919-11-01 04:00:01   bone 2051 #> 4103  34.9     12 1919 1919-12-01 14:00:01  blood 2052 #> 4104  34.9     12 1919 1919-12-01 14:00:01   bone 2052 #> 4105  51.1      1 1920 1920-01-01 00:00:00  blood 2053 #> 4106  51.1      1 1920 1920-01-01 00:00:00   bone 2053 #> 4107  53.9      2 1920 1920-01-31 12:00:01  blood 2054 #> 4108  53.9      2 1920 1920-01-31 12:00:01   bone 2054 #> 4109  70.2      3 1920 1920-03-02 00:00:01  blood 2055 #> 4110  70.2      3 1920 1920-03-02 00:00:01   bone 2055 #> 4111  14.8      4 1920 1920-04-01 12:00:00  blood 2056 #> 4112  14.8      4 1920 1920-04-01 12:00:00   bone 2056 #> 4113  33.3      5 1920 1920-05-02 00:00:01  blood 2057 #> 4114  33.3      5 1920 1920-05-02 00:00:01   bone 2057 #> 4115  38.7      6 1920 1920-06-01 12:00:01  blood 2058 #> 4116  38.7      6 1920 1920-06-01 12:00:01   bone 2058 #> 4117  27.5      7 1920 1920-07-02 00:00:00  blood 2059 #> 4118  27.5      7 1920 1920-07-02 00:00:00   bone 2059 #> 4119  19.2      8 1920 1920-08-01 12:00:01  blood 2060 #> 4120  19.2      8 1920 1920-08-01 12:00:01   bone 2060 #> 4121  36.3      9 1920 1920-09-01 00:00:01  blood 2061 #> 4122  36.3      9 1920 1920-09-01 00:00:01   bone 2061 #> 4123  49.6     10 1920 1920-10-01 12:00:00  blood 2062 #> 4124  49.6     10 1920 1920-10-01 12:00:00   bone 2062 #> 4125  27.2     11 1920 1920-11-01 00:00:01  blood 2063 #> 4126  27.2     11 1920 1920-11-01 00:00:01   bone 2063 #> 4127  29.9     12 1920 1920-12-01 12:00:01  blood 2064 #> 4128  29.9     12 1920 1920-12-01 12:00:01   bone 2064 #> 4129  31.5      1 1921 1921-01-01 00:00:00  blood 2065 #> 4130  31.5      1 1921 1921-01-01 00:00:00   bone 2065 #> 4131  28.3      2 1921 1921-01-31 10:00:01  blood 2066 #> 4132  28.3      2 1921 1921-01-31 10:00:01   bone 2066 #> 4133  26.7      3 1921 1921-03-02 20:00:01  blood 2067 #> 4134  26.7      3 1921 1921-03-02 20:00:01   bone 2067 #> 4135  32.4      4 1921 1921-04-02 06:00:00  blood 2068 #> 4136  32.4      4 1921 1921-04-02 06:00:00   bone 2068 #> 4137  22.2      5 1921 1921-05-02 16:00:01  blood 2069 #> 4138  22.2      5 1921 1921-05-02 16:00:01   bone 2069 #> 4139  33.7      6 1921 1921-06-02 02:00:01  blood 2070 #> 4140  33.7      6 1921 1921-06-02 02:00:01   bone 2070 #> 4141  41.9      7 1921 1921-07-02 12:00:00  blood 2071 #> 4142  41.9      7 1921 1921-07-02 12:00:00   bone 2071 #> 4143  22.8      8 1921 1921-08-01 22:00:01  blood 2072 #> 4144  22.8      8 1921 1921-08-01 22:00:01   bone 2072 #> 4145  17.8      9 1921 1921-09-01 08:00:01  blood 2073 #> 4146  17.8      9 1921 1921-09-01 08:00:01   bone 2073 #> 4147  18.2     10 1921 1921-10-01 18:00:00  blood 2074 #> 4148  18.2     10 1921 1921-10-01 18:00:00   bone 2074 #> 4149  17.8     11 1921 1921-11-01 04:00:01  blood 2075 #> 4150  17.8     11 1921 1921-11-01 04:00:01   bone 2075 #> 4151  20.3     12 1921 1921-12-01 14:00:01  blood 2076 #> 4152  20.3     12 1921 1921-12-01 14:00:01   bone 2076 #> 4153  11.8      1 1922 1922-01-01 00:00:00  blood 2077 #> 4154  11.8      1 1922 1922-01-01 00:00:00   bone 2077 #> 4155  26.4      2 1922 1922-01-31 10:00:01  blood 2078 #> 4156  26.4      2 1922 1922-01-31 10:00:01   bone 2078 #> 4157  54.7      3 1922 1922-03-02 20:00:01  blood 2079 #> 4158  54.7      3 1922 1922-03-02 20:00:01   bone 2079 #> 4159  11.0      4 1922 1922-04-02 06:00:00  blood 2080 #> 4160  11.0      4 1922 1922-04-02 06:00:00   bone 2080 #> 4161   8.0      5 1922 1922-05-02 16:00:01  blood 2081 #> 4162   8.0      5 1922 1922-05-02 16:00:01   bone 2081 #> 4163   5.8      6 1922 1922-06-02 02:00:01  blood 2082 #> 4164   5.8      6 1922 1922-06-02 02:00:01   bone 2082 #> 4165  10.9      7 1922 1922-07-02 12:00:00  blood 2083 #> 4166  10.9      7 1922 1922-07-02 12:00:00   bone 2083 #> 4167   6.5      8 1922 1922-08-01 22:00:01  blood 2084 #> 4168   6.5      8 1922 1922-08-01 22:00:01   bone 2084 #> 4169   4.7      9 1922 1922-09-01 08:00:01  blood 2085 #> 4170   4.7      9 1922 1922-09-01 08:00:01   bone 2085 #> 4171   6.2     10 1922 1922-10-01 18:00:00  blood 2086 #> 4172   6.2     10 1922 1922-10-01 18:00:00   bone 2086 #> 4173   7.4     11 1922 1922-11-01 04:00:01  blood 2087 #> 4174   7.4     11 1922 1922-11-01 04:00:01   bone 2087 #> 4175  17.5     12 1922 1922-12-01 14:00:01  blood 2088 #> 4176  17.5     12 1922 1922-12-01 14:00:01   bone 2088 #> 4177   4.5      1 1923 1923-01-01 00:00:00  blood 2089 #> 4178   4.5      1 1923 1923-01-01 00:00:00   bone 2089 #> 4179   1.5      2 1923 1923-01-31 10:00:01  blood 2090 #> 4180   1.5      2 1923 1923-01-31 10:00:01   bone 2090 #> 4181   3.3      3 1923 1923-03-02 20:00:01  blood 2091 #> 4182   3.3      3 1923 1923-03-02 20:00:01   bone 2091 #> 4183   6.1      4 1923 1923-04-02 06:00:00  blood 2092 #> 4184   6.1      4 1923 1923-04-02 06:00:00   bone 2092 #> 4185   3.2      5 1923 1923-05-02 16:00:01  blood 2093 #> 4186   3.2      5 1923 1923-05-02 16:00:01   bone 2093 #> 4187   9.1      6 1923 1923-06-02 02:00:01  blood 2094 #> 4188   9.1      6 1923 1923-06-02 02:00:01   bone 2094 #> 4189   3.5      7 1923 1923-07-02 12:00:00  blood 2095 #> 4190   3.5      7 1923 1923-07-02 12:00:00   bone 2095 #> 4191   0.5      8 1923 1923-08-01 22:00:01  blood 2096 #> 4192   0.5      8 1923 1923-08-01 22:00:01   bone 2096 #> 4193  13.2      9 1923 1923-09-01 08:00:01  blood 2097 #> 4194  13.2      9 1923 1923-09-01 08:00:01   bone 2097 #> 4195  11.6     10 1923 1923-10-01 18:00:00  blood 2098 #> 4196  11.6     10 1923 1923-10-01 18:00:00   bone 2098 #> 4197  10.0     11 1923 1923-11-01 04:00:01  blood 2099 #> 4198  10.0     11 1923 1923-11-01 04:00:01   bone 2099 #> 4199   2.8     12 1923 1923-12-01 14:00:01  blood 2100 #> 4200   2.8     12 1923 1923-12-01 14:00:01   bone 2100 #> 4201   0.5      1 1924 1924-01-01 00:00:00  blood 2101 #> 4202   0.5      1 1924 1924-01-01 00:00:00   bone 2101 #> 4203   5.1      2 1924 1924-01-31 12:00:01  blood 2102 #> 4204   5.1      2 1924 1924-01-31 12:00:01   bone 2102 #> 4205   1.8      3 1924 1924-03-02 00:00:01  blood 2103 #> 4206   1.8      3 1924 1924-03-02 00:00:01   bone 2103 #> 4207  11.3      4 1924 1924-04-01 12:00:00  blood 2104 #> 4208  11.3      4 1924 1924-04-01 12:00:00   bone 2104 #> 4209  20.8      5 1924 1924-05-02 00:00:01  blood 2105 #> 4210  20.8      5 1924 1924-05-02 00:00:01   bone 2105 #> 4211  24.0      6 1924 1924-06-01 12:00:01  blood 2106 #> 4212  24.0      6 1924 1924-06-01 12:00:01   bone 2106 #> 4213  28.1      7 1924 1924-07-02 00:00:00  blood 2107 #> 4214  28.1      7 1924 1924-07-02 00:00:00   bone 2107 #> 4215  19.3      8 1924 1924-08-01 12:00:01  blood 2108 #> 4216  19.3      8 1924 1924-08-01 12:00:01   bone 2108 #> 4217  25.1      9 1924 1924-09-01 00:00:01  blood 2109 #> 4218  25.1      9 1924 1924-09-01 00:00:01   bone 2109 #> 4219  25.6     10 1924 1924-10-01 12:00:00  blood 2110 #> 4220  25.6     10 1924 1924-10-01 12:00:00   bone 2110 #> 4221  22.5     11 1924 1924-11-01 00:00:01  blood 2111 #> 4222  22.5     11 1924 1924-11-01 00:00:01   bone 2111 #> 4223  16.5     12 1924 1924-12-01 12:00:01  blood 2112 #> 4224  16.5     12 1924 1924-12-01 12:00:01   bone 2112 #> 4225   5.5      1 1925 1925-01-01 00:00:00  blood 2113 #> 4226   5.5      1 1925 1925-01-01 00:00:00   bone 2113 #> 4227  23.2      2 1925 1925-01-31 10:00:01  blood 2114 #> 4228  23.2      2 1925 1925-01-31 10:00:01   bone 2114 #> 4229  18.0      3 1925 1925-03-02 20:00:01  blood 2115 #> 4230  18.0      3 1925 1925-03-02 20:00:01   bone 2115 #> 4231  31.7      4 1925 1925-04-02 06:00:00  blood 2116 #> 4232  31.7      4 1925 1925-04-02 06:00:00   bone 2116 #> 4233  42.8      5 1925 1925-05-02 16:00:01  blood 2117 #> 4234  42.8      5 1925 1925-05-02 16:00:01   bone 2117 #> 4235  47.5      6 1925 1925-06-02 02:00:01  blood 2118 #> 4236  47.5      6 1925 1925-06-02 02:00:01   bone 2118 #> 4237  38.5      7 1925 1925-07-02 12:00:00  blood 2119 #> 4238  38.5      7 1925 1925-07-02 12:00:00   bone 2119 #> 4239  37.9      8 1925 1925-08-01 22:00:01  blood 2120 #> 4240  37.9      8 1925 1925-08-01 22:00:01   bone 2120 #> 4241  60.2      9 1925 1925-09-01 08:00:01  blood 2121 #> 4242  60.2      9 1925 1925-09-01 08:00:01   bone 2121 #> 4243  69.2     10 1925 1925-10-01 18:00:00  blood 2122 #> 4244  69.2     10 1925 1925-10-01 18:00:00   bone 2122 #> 4245  58.6     11 1925 1925-11-01 04:00:01  blood 2123 #> 4246  58.6     11 1925 1925-11-01 04:00:01   bone 2123 #> 4247  98.6     12 1925 1925-12-01 14:00:01  blood 2124 #> 4248  98.6     12 1925 1925-12-01 14:00:01   bone 2124 #> 4249  71.8      1 1926 1926-01-01 00:00:00  blood 2125 #> 4250  71.8      1 1926 1926-01-01 00:00:00   bone 2125 #> 4251  70.0      2 1926 1926-01-31 10:00:01  blood 2126 #> 4252  70.0      2 1926 1926-01-31 10:00:01   bone 2126 #> 4253  62.5      3 1926 1926-03-02 20:00:01  blood 2127 #> 4254  62.5      3 1926 1926-03-02 20:00:01   bone 2127 #> 4255  38.5      4 1926 1926-04-02 06:00:00  blood 2128 #> 4256  38.5      4 1926 1926-04-02 06:00:00   bone 2128 #> 4257  64.3      5 1926 1926-05-02 16:00:01  blood 2129 #> 4258  64.3      5 1926 1926-05-02 16:00:01   bone 2129 #> 4259  73.5      6 1926 1926-06-02 02:00:01  blood 2130 #> 4260  73.5      6 1926 1926-06-02 02:00:01   bone 2130 #> 4261  52.3      7 1926 1926-07-02 12:00:00  blood 2131 #> 4262  52.3      7 1926 1926-07-02 12:00:00   bone 2131 #> 4263  61.6      8 1926 1926-08-01 22:00:01  blood 2132 #> 4264  61.6      8 1926 1926-08-01 22:00:01   bone 2132 #> 4265  60.8      9 1926 1926-09-01 08:00:01  blood 2133 #> 4266  60.8      9 1926 1926-09-01 08:00:01   bone 2133 #> 4267  71.5     10 1926 1926-10-01 18:00:00  blood 2134 #> 4268  71.5     10 1926 1926-10-01 18:00:00   bone 2134 #> 4269  60.5     11 1926 1926-11-01 04:00:01  blood 2135 #> 4270  60.5     11 1926 1926-11-01 04:00:01   bone 2135 #> 4271  79.4     12 1926 1926-12-01 14:00:01  blood 2136 #> 4272  79.4     12 1926 1926-12-01 14:00:01   bone 2136 #> 4273  81.6      1 1927 1927-01-01 00:00:00  blood 2137 #> 4274  81.6      1 1927 1927-01-01 00:00:00   bone 2137 #> 4275  93.0      2 1927 1927-01-31 10:00:01  blood 2138 #> 4276  93.0      2 1927 1927-01-31 10:00:01   bone 2138 #> 4277  69.6      3 1927 1927-03-02 20:00:01  blood 2139 #> 4278  69.6      3 1927 1927-03-02 20:00:01   bone 2139 #> 4279  93.5      4 1927 1927-04-02 06:00:00  blood 2140 #> 4280  93.5      4 1927 1927-04-02 06:00:00   bone 2140 #> 4281  79.1      5 1927 1927-05-02 16:00:01  blood 2141 #> 4282  79.1      5 1927 1927-05-02 16:00:01   bone 2141 #> 4283  59.1      6 1927 1927-06-02 02:00:01  blood 2142 #> 4284  59.1      6 1927 1927-06-02 02:00:01   bone 2142 #> 4285  54.9      7 1927 1927-07-02 12:00:00  blood 2143 #> 4286  54.9      7 1927 1927-07-02 12:00:00   bone 2143 #> 4287  53.8      8 1927 1927-08-01 22:00:01  blood 2144 #> 4288  53.8      8 1927 1927-08-01 22:00:01   bone 2144 #> 4289  68.4      9 1927 1927-09-01 08:00:01  blood 2145 #> 4290  68.4      9 1927 1927-09-01 08:00:01   bone 2145 #> 4291  63.1     10 1927 1927-10-01 18:00:00  blood 2146 #> 4292  63.1     10 1927 1927-10-01 18:00:00   bone 2146 #> 4293  67.2     11 1927 1927-11-01 04:00:01  blood 2147 #> 4294  67.2     11 1927 1927-11-01 04:00:01   bone 2147 #> 4295  45.2     12 1927 1927-12-01 14:00:01  blood 2148 #> 4296  45.2     12 1927 1927-12-01 14:00:01   bone 2148 #> 4297  83.5      1 1928 1928-01-01 00:00:00  blood 2149 #> 4298  83.5      1 1928 1928-01-01 00:00:00   bone 2149 #> 4299  73.5      2 1928 1928-01-31 12:00:01  blood 2150 #> 4300  73.5      2 1928 1928-01-31 12:00:01   bone 2150 #> 4301  85.4      3 1928 1928-03-02 00:00:01  blood 2151 #> 4302  85.4      3 1928 1928-03-02 00:00:01   bone 2151 #> 4303  80.6      4 1928 1928-04-01 12:00:00  blood 2152 #> 4304  80.6      4 1928 1928-04-01 12:00:00   bone 2152 #> 4305  76.9      5 1928 1928-05-02 00:00:01  blood 2153 #> 4306  76.9      5 1928 1928-05-02 00:00:01   bone 2153 #> 4307  91.4      6 1928 1928-06-01 12:00:01  blood 2154 #> 4308  91.4      6 1928 1928-06-01 12:00:01   bone 2154 #> 4309  98.0      7 1928 1928-07-02 00:00:00  blood 2155 #> 4310  98.0      7 1928 1928-07-02 00:00:00   bone 2155 #> 4311  83.8      8 1928 1928-08-01 12:00:01  blood 2156 #> 4312  83.8      8 1928 1928-08-01 12:00:01   bone 2156 #> 4313  89.7      9 1928 1928-09-01 00:00:01  blood 2157 #> 4314  89.7      9 1928 1928-09-01 00:00:01   bone 2157 #> 4315  61.4     10 1928 1928-10-01 12:00:00  blood 2158 #> 4316  61.4     10 1928 1928-10-01 12:00:00   bone 2158 #> 4317  50.3     11 1928 1928-11-01 00:00:01  blood 2159 #> 4318  50.3     11 1928 1928-11-01 00:00:01   bone 2159 #> 4319  59.0     12 1928 1928-12-01 12:00:01  blood 2160 #> 4320  59.0     12 1928 1928-12-01 12:00:01   bone 2160 #> 4321  68.9      1 1929 1929-01-01 00:00:00  blood 2161 #> 4322  68.9      1 1929 1929-01-01 00:00:00   bone 2161 #> 4323  64.1      2 1929 1929-01-31 10:00:01  blood 2162 #> 4324  64.1      2 1929 1929-01-31 10:00:01   bone 2162 #> 4325  50.2      3 1929 1929-03-02 20:00:01  blood 2163 #> 4326  50.2      3 1929 1929-03-02 20:00:01   bone 2163 #> 4327  52.8      4 1929 1929-04-02 06:00:00  blood 2164 #> 4328  52.8      4 1929 1929-04-02 06:00:00   bone 2164 #> 4329  58.2      5 1929 1929-05-02 16:00:01  blood 2165 #> 4330  58.2      5 1929 1929-05-02 16:00:01   bone 2165 #> 4331  71.9      6 1929 1929-06-02 02:00:01  blood 2166 #> 4332  71.9      6 1929 1929-06-02 02:00:01   bone 2166 #> 4333  70.2      7 1929 1929-07-02 12:00:00  blood 2167 #> 4334  70.2      7 1929 1929-07-02 12:00:00   bone 2167 #> 4335  65.8      8 1929 1929-08-01 22:00:01  blood 2168 #> 4336  65.8      8 1929 1929-08-01 22:00:01   bone 2168 #> 4337  34.4      9 1929 1929-09-01 08:00:01  blood 2169 #> 4338  34.4      9 1929 1929-09-01 08:00:01   bone 2169 #> 4339  54.0     10 1929 1929-10-01 18:00:00  blood 2170 #> 4340  54.0     10 1929 1929-10-01 18:00:00   bone 2170 #> 4341  81.1     11 1929 1929-11-01 04:00:01  blood 2171 #> 4342  81.1     11 1929 1929-11-01 04:00:01   bone 2171 #> 4343 108.0     12 1929 1929-12-01 14:00:01  blood 2172 #> 4344 108.0     12 1929 1929-12-01 14:00:01   bone 2172 #> 4345  65.3      1 1930 1930-01-01 00:00:00  blood 2173 #> 4346  65.3      1 1930 1930-01-01 00:00:00   bone 2173 #> 4347  49.2      2 1930 1930-01-31 10:00:01  blood 2174 #> 4348  49.2      2 1930 1930-01-31 10:00:01   bone 2174 #> 4349  35.0      3 1930 1930-03-02 20:00:01  blood 2175 #> 4350  35.0      3 1930 1930-03-02 20:00:01   bone 2175 #> 4351  38.2      4 1930 1930-04-02 06:00:00  blood 2176 #> 4352  38.2      4 1930 1930-04-02 06:00:00   bone 2176 #> 4353  36.8      5 1930 1930-05-02 16:00:01  blood 2177 #> 4354  36.8      5 1930 1930-05-02 16:00:01   bone 2177 #> 4355  28.8      6 1930 1930-06-02 02:00:01  blood 2178 #> 4356  28.8      6 1930 1930-06-02 02:00:01   bone 2178 #> 4357  21.9      7 1930 1930-07-02 12:00:00  blood 2179 #> 4358  21.9      7 1930 1930-07-02 12:00:00   bone 2179 #> 4359  24.9      8 1930 1930-08-01 22:00:01  blood 2180 #> 4360  24.9      8 1930 1930-08-01 22:00:01   bone 2180 #> 4361  32.1      9 1930 1930-09-01 08:00:01  blood 2181 #> 4362  32.1      9 1930 1930-09-01 08:00:01   bone 2181 #> 4363  34.4     10 1930 1930-10-01 18:00:00  blood 2182 #> 4364  34.4     10 1930 1930-10-01 18:00:00   bone 2182 #> 4365  35.6     11 1930 1930-11-01 04:00:01  blood 2183 #> 4366  35.6     11 1930 1930-11-01 04:00:01   bone 2183 #> 4367  25.8     12 1930 1930-12-01 14:00:01  blood 2184 #> 4368  25.8     12 1930 1930-12-01 14:00:01   bone 2184 #> 4369  14.6      1 1931 1931-01-01 00:00:00  blood 2185 #> 4370  14.6      1 1931 1931-01-01 00:00:00   bone 2185 #> 4371  43.1      2 1931 1931-01-31 10:00:01  blood 2186 #> 4372  43.1      2 1931 1931-01-31 10:00:01   bone 2186 #> 4373  30.0      3 1931 1931-03-02 20:00:01  blood 2187 #> 4374  30.0      3 1931 1931-03-02 20:00:01   bone 2187 #> 4375  31.2      4 1931 1931-04-02 06:00:00  blood 2188 #> 4376  31.2      4 1931 1931-04-02 06:00:00   bone 2188 #> 4377  24.6      5 1931 1931-05-02 16:00:01  blood 2189 #> 4378  24.6      5 1931 1931-05-02 16:00:01   bone 2189 #> 4379  15.3      6 1931 1931-06-02 02:00:01  blood 2190 #> 4380  15.3      6 1931 1931-06-02 02:00:01   bone 2190 #> 4381  17.4      7 1931 1931-07-02 12:00:00  blood 2191 #> 4382  17.4      7 1931 1931-07-02 12:00:00   bone 2191 #> 4383  13.0      8 1931 1931-08-01 22:00:01  blood 2192 #> 4384  13.0      8 1931 1931-08-01 22:00:01   bone 2192 #> 4385  19.0      9 1931 1931-09-01 08:00:01  blood 2193 #> 4386  19.0      9 1931 1931-09-01 08:00:01   bone 2193 #> 4387  10.0     10 1931 1931-10-01 18:00:00  blood 2194 #> 4388  10.0     10 1931 1931-10-01 18:00:00   bone 2194 #> 4389  18.7     11 1931 1931-11-01 04:00:01  blood 2195 #> 4390  18.7     11 1931 1931-11-01 04:00:01   bone 2195 #> 4391  17.8     12 1931 1931-12-01 14:00:01  blood 2196 #> 4392  17.8     12 1931 1931-12-01 14:00:01   bone 2196 #> 4393  12.1      1 1932 1932-01-01 00:00:00  blood 2197 #> 4394  12.1      1 1932 1932-01-01 00:00:00   bone 2197 #> 4395  10.6      2 1932 1932-01-31 12:00:01  blood 2198 #> 4396  10.6      2 1932 1932-01-31 12:00:01   bone 2198 #> 4397  11.2      3 1932 1932-03-02 00:00:01  blood 2199 #> 4398  11.2      3 1932 1932-03-02 00:00:01   bone 2199 #> 4399  11.2      4 1932 1932-04-01 12:00:00  blood 2200 #> 4400  11.2      4 1932 1932-04-01 12:00:00   bone 2200 #> 4401  17.9      5 1932 1932-05-02 00:00:01  blood 2201 #> 4402  17.9      5 1932 1932-05-02 00:00:01   bone 2201 #> 4403  22.2      6 1932 1932-06-01 12:00:01  blood 2202 #> 4404  22.2      6 1932 1932-06-01 12:00:01   bone 2202 #> 4405   9.6      7 1932 1932-07-02 00:00:00  blood 2203 #> 4406   9.6      7 1932 1932-07-02 00:00:00   bone 2203 #> 4407   6.8      8 1932 1932-08-01 12:00:01  blood 2204 #> 4408   6.8      8 1932 1932-08-01 12:00:01   bone 2204 #> 4409   4.0      9 1932 1932-09-01 00:00:01  blood 2205 #> 4410   4.0      9 1932 1932-09-01 00:00:01   bone 2205 #> 4411   8.9     10 1932 1932-10-01 12:00:00  blood 2206 #> 4412   8.9     10 1932 1932-10-01 12:00:00   bone 2206 #> 4413   8.2     11 1932 1932-11-01 00:00:01  blood 2207 #> 4414   8.2     11 1932 1932-11-01 00:00:01   bone 2207 #> 4415  11.0     12 1932 1932-12-01 12:00:01  blood 2208 #> 4416  11.0     12 1932 1932-12-01 12:00:01   bone 2208 #> 4417  12.3      1 1933 1933-01-01 00:00:00  blood 2209 #> 4418  12.3      1 1933 1933-01-01 00:00:00   bone 2209 #> 4419  22.2      2 1933 1933-01-31 10:00:01  blood 2210 #> 4420  22.2      2 1933 1933-01-31 10:00:01   bone 2210 #> 4421  10.1      3 1933 1933-03-02 20:00:01  blood 2211 #> 4422  10.1      3 1933 1933-03-02 20:00:01   bone 2211 #> 4423   2.9      4 1933 1933-04-02 06:00:00  blood 2212 #> 4424   2.9      4 1933 1933-04-02 06:00:00   bone 2212 #> 4425   3.2      5 1933 1933-05-02 16:00:01  blood 2213 #> 4426   3.2      5 1933 1933-05-02 16:00:01   bone 2213 #> 4427   5.2      6 1933 1933-06-02 02:00:01  blood 2214 #> 4428   5.2      6 1933 1933-06-02 02:00:01   bone 2214 #> 4429   2.8      7 1933 1933-07-02 12:00:00  blood 2215 #> 4430   2.8      7 1933 1933-07-02 12:00:00   bone 2215 #> 4431   0.2      8 1933 1933-08-01 22:00:01  blood 2216 #> 4432   0.2      8 1933 1933-08-01 22:00:01   bone 2216 #> 4433   5.1      9 1933 1933-09-01 08:00:01  blood 2217 #> 4434   5.1      9 1933 1933-09-01 08:00:01   bone 2217 #> 4435   3.0     10 1933 1933-10-01 18:00:00  blood 2218 #> 4436   3.0     10 1933 1933-10-01 18:00:00   bone 2218 #> 4437   0.6     11 1933 1933-11-01 04:00:01  blood 2219 #> 4438   0.6     11 1933 1933-11-01 04:00:01   bone 2219 #> 4439   0.3     12 1933 1933-12-01 14:00:01  blood 2220 #> 4440   0.3     12 1933 1933-12-01 14:00:01   bone 2220 #> 4441   3.4      1 1934 1934-01-01 00:00:00  blood 2221 #> 4442   3.4      1 1934 1934-01-01 00:00:00   bone 2221 #> 4443   7.8      2 1934 1934-01-31 10:00:01  blood 2222 #> 4444   7.8      2 1934 1934-01-31 10:00:01   bone 2222 #> 4445   4.3      3 1934 1934-03-02 20:00:01  blood 2223 #> 4446   4.3      3 1934 1934-03-02 20:00:01   bone 2223 #> 4447  11.3      4 1934 1934-04-02 06:00:00  blood 2224 #> 4448  11.3      4 1934 1934-04-02 06:00:00   bone 2224 #> 4449  19.7      5 1934 1934-05-02 16:00:01  blood 2225 #> 4450  19.7      5 1934 1934-05-02 16:00:01   bone 2225 #> 4451   6.7      6 1934 1934-06-02 02:00:01  blood 2226 #> 4452   6.7      6 1934 1934-06-02 02:00:01   bone 2226 #> 4453   9.3      7 1934 1934-07-02 12:00:00  blood 2227 #> 4454   9.3      7 1934 1934-07-02 12:00:00   bone 2227 #> 4455   8.3      8 1934 1934-08-01 22:00:01  blood 2228 #> 4456   8.3      8 1934 1934-08-01 22:00:01   bone 2228 #> 4457   4.0      9 1934 1934-09-01 08:00:01  blood 2229 #> 4458   4.0      9 1934 1934-09-01 08:00:01   bone 2229 #> 4459   5.7     10 1934 1934-10-01 18:00:00  blood 2230 #> 4460   5.7     10 1934 1934-10-01 18:00:00   bone 2230 #> 4461   8.7     11 1934 1934-11-01 04:00:01  blood 2231 #> 4462   8.7     11 1934 1934-11-01 04:00:01   bone 2231 #> 4463  15.4     12 1934 1934-12-01 14:00:01  blood 2232 #> 4464  15.4     12 1934 1934-12-01 14:00:01   bone 2232 #> 4465  18.9      1 1935 1935-01-01 00:00:00  blood 2233 #> 4466  18.9      1 1935 1935-01-01 00:00:00   bone 2233 #> 4467  20.5      2 1935 1935-01-31 10:00:01  blood 2234 #> 4468  20.5      2 1935 1935-01-31 10:00:01   bone 2234 #> 4469  23.1      3 1935 1935-03-02 20:00:01  blood 2235 #> 4470  23.1      3 1935 1935-03-02 20:00:01   bone 2235 #> 4471  12.2      4 1935 1935-04-02 06:00:00  blood 2236 #> 4472  12.2      4 1935 1935-04-02 06:00:00   bone 2236 #> 4473  27.3      5 1935 1935-05-02 16:00:01  blood 2237 #> 4474  27.3      5 1935 1935-05-02 16:00:01   bone 2237 #> 4475  45.7      6 1935 1935-06-02 02:00:01  blood 2238 #> 4476  45.7      6 1935 1935-06-02 02:00:01   bone 2238 #> 4477  33.9      7 1935 1935-07-02 12:00:00  blood 2239 #> 4478  33.9      7 1935 1935-07-02 12:00:00   bone 2239 #> 4479  30.1      8 1935 1935-08-01 22:00:01  blood 2240 #> 4480  30.1      8 1935 1935-08-01 22:00:01   bone 2240 #> 4481  42.1      9 1935 1935-09-01 08:00:01  blood 2241 #> 4482  42.1      9 1935 1935-09-01 08:00:01   bone 2241 #> 4483  53.2     10 1935 1935-10-01 18:00:00  blood 2242 #> 4484  53.2     10 1935 1935-10-01 18:00:00   bone 2242 #> 4485  64.2     11 1935 1935-11-01 04:00:01  blood 2243 #> 4486  64.2     11 1935 1935-11-01 04:00:01   bone 2243 #> 4487  61.5     12 1935 1935-12-01 14:00:01  blood 2244 #> 4488  61.5     12 1935 1935-12-01 14:00:01   bone 2244 #> 4489  62.8      1 1936 1936-01-01 00:00:00  blood 2245 #> 4490  62.8      1 1936 1936-01-01 00:00:00   bone 2245 #> 4491  74.3      2 1936 1936-01-31 12:00:01  blood 2246 #> 4492  74.3      2 1936 1936-01-31 12:00:01   bone 2246 #> 4493  77.1      3 1936 1936-03-02 00:00:01  blood 2247 #> 4494  77.1      3 1936 1936-03-02 00:00:01   bone 2247 #> 4495  74.9      4 1936 1936-04-01 12:00:00  blood 2248 #> 4496  74.9      4 1936 1936-04-01 12:00:00   bone 2248 #> 4497  54.6      5 1936 1936-05-02 00:00:01  blood 2249 #> 4498  54.6      5 1936 1936-05-02 00:00:01   bone 2249 #> 4499  70.0      6 1936 1936-06-01 12:00:01  blood 2250 #> 4500  70.0      6 1936 1936-06-01 12:00:01   bone 2250 #> 4501  52.3      7 1936 1936-07-02 00:00:00  blood 2251 #> 4502  52.3      7 1936 1936-07-02 00:00:00   bone 2251 #> 4503  87.0      8 1936 1936-08-01 12:00:01  blood 2252 #> 4504  87.0      8 1936 1936-08-01 12:00:01   bone 2252 #> 4505  76.0      9 1936 1936-09-01 00:00:01  blood 2253 #> 4506  76.0      9 1936 1936-09-01 00:00:01   bone 2253 #> 4507  89.0     10 1936 1936-10-01 12:00:00  blood 2254 #> 4508  89.0     10 1936 1936-10-01 12:00:00   bone 2254 #> 4509 115.4     11 1936 1936-11-01 00:00:01  blood 2255 #> 4510 115.4     11 1936 1936-11-01 00:00:01   bone 2255 #> 4511 123.4     12 1936 1936-12-01 12:00:01  blood 2256 #> 4512 123.4     12 1936 1936-12-01 12:00:01   bone 2256 #> 4513 132.5      1 1937 1937-01-01 00:00:00  blood 2257 #> 4514 132.5      1 1937 1937-01-01 00:00:00   bone 2257 #> 4515 128.5      2 1937 1937-01-31 10:00:01  blood 2258 #> 4516 128.5      2 1937 1937-01-31 10:00:01   bone 2258 #> 4517  83.9      3 1937 1937-03-02 20:00:01  blood 2259 #> 4518  83.9      3 1937 1937-03-02 20:00:01   bone 2259 #> 4519 109.3      4 1937 1937-04-02 06:00:00  blood 2260 #> 4520 109.3      4 1937 1937-04-02 06:00:00   bone 2260 #> 4521 116.7      5 1937 1937-05-02 16:00:01  blood 2261 #> 4522 116.7      5 1937 1937-05-02 16:00:01   bone 2261 #> 4523 130.3      6 1937 1937-06-02 02:00:01  blood 2262 #> 4524 130.3      6 1937 1937-06-02 02:00:01   bone 2262 #> 4525 145.1      7 1937 1937-07-02 12:00:00  blood 2263 #> 4526 145.1      7 1937 1937-07-02 12:00:00   bone 2263 #> 4527 137.7      8 1937 1937-08-01 22:00:01  blood 2264 #> 4528 137.7      8 1937 1937-08-01 22:00:01   bone 2264 #> 4529 100.7      9 1937 1937-09-01 08:00:01  blood 2265 #> 4530 100.7      9 1937 1937-09-01 08:00:01   bone 2265 #> 4531 124.9     10 1937 1937-10-01 18:00:00  blood 2266 #> 4532 124.9     10 1937 1937-10-01 18:00:00   bone 2266 #> 4533  74.4     11 1937 1937-11-01 04:00:01  blood 2267 #> 4534  74.4     11 1937 1937-11-01 04:00:01   bone 2267 #> 4535  88.8     12 1937 1937-12-01 14:00:01  blood 2268 #> 4536  88.8     12 1937 1937-12-01 14:00:01   bone 2268 #> 4537  98.4      1 1938 1938-01-01 00:00:00  blood 2269 #> 4538  98.4      1 1938 1938-01-01 00:00:00   bone 2269 #> 4539 119.2      2 1938 1938-01-31 10:00:01  blood 2270 #> 4540 119.2      2 1938 1938-01-31 10:00:01   bone 2270 #> 4541  86.5      3 1938 1938-03-02 20:00:01  blood 2271 #> 4542  86.5      3 1938 1938-03-02 20:00:01   bone 2271 #> 4543 101.0      4 1938 1938-04-02 06:00:00  blood 2272 #> 4544 101.0      4 1938 1938-04-02 06:00:00   bone 2272 #> 4545 127.4      5 1938 1938-05-02 16:00:01  blood 2273 #> 4546 127.4      5 1938 1938-05-02 16:00:01   bone 2273 #> 4547  97.5      6 1938 1938-06-02 02:00:01  blood 2274 #> 4548  97.5      6 1938 1938-06-02 02:00:01   bone 2274 #> 4549 165.3      7 1938 1938-07-02 12:00:00  blood 2275 #> 4550 165.3      7 1938 1938-07-02 12:00:00   bone 2275 #> 4551 115.7      8 1938 1938-08-01 22:00:01  blood 2276 #> 4552 115.7      8 1938 1938-08-01 22:00:01   bone 2276 #> 4553  89.6      9 1938 1938-09-01 08:00:01  blood 2277 #> 4554  89.6      9 1938 1938-09-01 08:00:01   bone 2277 #> 4555  99.1     10 1938 1938-10-01 18:00:00  blood 2278 #> 4556  99.1     10 1938 1938-10-01 18:00:00   bone 2278 #> 4557 122.2     11 1938 1938-11-01 04:00:01  blood 2279 #> 4558 122.2     11 1938 1938-11-01 04:00:01   bone 2279 #> 4559  92.7     12 1938 1938-12-01 14:00:01  blood 2280 #> 4560  92.7     12 1938 1938-12-01 14:00:01   bone 2280 #> 4561  80.3      1 1939 1939-01-01 00:00:00  blood 2281 #> 4562  80.3      1 1939 1939-01-01 00:00:00   bone 2281 #> 4563  77.4      2 1939 1939-01-31 10:00:01  blood 2282 #> 4564  77.4      2 1939 1939-01-31 10:00:01   bone 2282 #> 4565  64.6      3 1939 1939-03-02 20:00:01  blood 2283 #> 4566  64.6      3 1939 1939-03-02 20:00:01   bone 2283 #> 4567 109.1      4 1939 1939-04-02 06:00:00  blood 2284 #> 4568 109.1      4 1939 1939-04-02 06:00:00   bone 2284 #> 4569 118.3      5 1939 1939-05-02 16:00:01  blood 2285 #> 4570 118.3      5 1939 1939-05-02 16:00:01   bone 2285 #> 4571 101.0      6 1939 1939-06-02 02:00:01  blood 2286 #> 4572 101.0      6 1939 1939-06-02 02:00:01   bone 2286 #> 4573  97.6      7 1939 1939-07-02 12:00:00  blood 2287 #> 4574  97.6      7 1939 1939-07-02 12:00:00   bone 2287 #> 4575 105.8      8 1939 1939-08-01 22:00:01  blood 2288 #> 4576 105.8      8 1939 1939-08-01 22:00:01   bone 2288 #> 4577 112.6      9 1939 1939-09-01 08:00:01  blood 2289 #> 4578 112.6      9 1939 1939-09-01 08:00:01   bone 2289 #> 4579  88.1     10 1939 1939-10-01 18:00:00  blood 2290 #> 4580  88.1     10 1939 1939-10-01 18:00:00   bone 2290 #> 4581  68.1     11 1939 1939-11-01 04:00:01  blood 2291 #> 4582  68.1     11 1939 1939-11-01 04:00:01   bone 2291 #> 4583  42.1     12 1939 1939-12-01 14:00:01  blood 2292 #> 4584  42.1     12 1939 1939-12-01 14:00:01   bone 2292 #> 4585  50.5      1 1940 1940-01-01 00:00:00  blood 2293 #> 4586  50.5      1 1940 1940-01-01 00:00:00   bone 2293 #> 4587  59.4      2 1940 1940-01-31 12:00:01  blood 2294 #> 4588  59.4      2 1940 1940-01-31 12:00:01   bone 2294 #> 4589  83.3      3 1940 1940-03-02 00:00:01  blood 2295 #> 4590  83.3      3 1940 1940-03-02 00:00:01   bone 2295 #> 4591  60.7      4 1940 1940-04-01 12:00:00  blood 2296 #> 4592  60.7      4 1940 1940-04-01 12:00:00   bone 2296 #> 4593  54.4      5 1940 1940-05-02 00:00:01  blood 2297 #> 4594  54.4      5 1940 1940-05-02 00:00:01   bone 2297 #> 4595  83.9      6 1940 1940-06-01 12:00:01  blood 2298 #> 4596  83.9      6 1940 1940-06-01 12:00:01   bone 2298 #> 4597  67.5      7 1940 1940-07-02 00:00:00  blood 2299 #> 4598  67.5      7 1940 1940-07-02 00:00:00   bone 2299 #> 4599 105.5      8 1940 1940-08-01 12:00:01  blood 2300 #> 4600 105.5      8 1940 1940-08-01 12:00:01   bone 2300 #> 4601  66.5      9 1940 1940-09-01 00:00:01  blood 2301 #> 4602  66.5      9 1940 1940-09-01 00:00:01   bone 2301 #> 4603  55.0     10 1940 1940-10-01 12:00:00  blood 2302 #> 4604  55.0     10 1940 1940-10-01 12:00:00   bone 2302 #> 4605  58.4     11 1940 1940-11-01 00:00:01  blood 2303 #> 4606  58.4     11 1940 1940-11-01 00:00:01   bone 2303 #> 4607  68.3     12 1940 1940-12-01 12:00:01  blood 2304 #> 4608  68.3     12 1940 1940-12-01 12:00:01   bone 2304 #> 4609  45.6      1 1941 1941-01-01 00:00:00  blood 2305 #> 4610  45.6      1 1941 1941-01-01 00:00:00   bone 2305 #> 4611  44.5      2 1941 1941-01-31 10:00:01  blood 2306 #> 4612  44.5      2 1941 1941-01-31 10:00:01   bone 2306 #> 4613  46.4      3 1941 1941-03-02 20:00:01  blood 2307 #> 4614  46.4      3 1941 1941-03-02 20:00:01   bone 2307 #> 4615  32.8      4 1941 1941-04-02 06:00:00  blood 2308 #> 4616  32.8      4 1941 1941-04-02 06:00:00   bone 2308 #> 4617  29.5      5 1941 1941-05-02 16:00:01  blood 2309 #> 4618  29.5      5 1941 1941-05-02 16:00:01   bone 2309 #> 4619  59.8      6 1941 1941-06-02 02:00:01  blood 2310 #> 4620  59.8      6 1941 1941-06-02 02:00:01   bone 2310 #> 4621  66.9      7 1941 1941-07-02 12:00:00  blood 2311 #> 4622  66.9      7 1941 1941-07-02 12:00:00   bone 2311 #> 4623  60.0      8 1941 1941-08-01 22:00:01  blood 2312 #> 4624  60.0      8 1941 1941-08-01 22:00:01   bone 2312 #> 4625  65.9      9 1941 1941-09-01 08:00:01  blood 2313 #> 4626  65.9      9 1941 1941-09-01 08:00:01   bone 2313 #> 4627  46.3     10 1941 1941-10-01 18:00:00  blood 2314 #> 4628  46.3     10 1941 1941-10-01 18:00:00   bone 2314 #> 4629  38.3     11 1941 1941-11-01 04:00:01  blood 2315 #> 4630  38.3     11 1941 1941-11-01 04:00:01   bone 2315 #> 4631  33.7     12 1941 1941-12-01 14:00:01  blood 2316 #> 4632  33.7     12 1941 1941-12-01 14:00:01   bone 2316 #> 4633  35.6      1 1942 1942-01-01 00:00:00  blood 2317 #> 4634  35.6      1 1942 1942-01-01 00:00:00   bone 2317 #> 4635  52.8      2 1942 1942-01-31 10:00:01  blood 2318 #> 4636  52.8      2 1942 1942-01-31 10:00:01   bone 2318 #> 4637  54.2      3 1942 1942-03-02 20:00:01  blood 2319 #> 4638  54.2      3 1942 1942-03-02 20:00:01   bone 2319 #> 4639  60.7      4 1942 1942-04-02 06:00:00  blood 2320 #> 4640  60.7      4 1942 1942-04-02 06:00:00   bone 2320 #> 4641  25.0      5 1942 1942-05-02 16:00:01  blood 2321 #> 4642  25.0      5 1942 1942-05-02 16:00:01   bone 2321 #> 4643  11.4      6 1942 1942-06-02 02:00:01  blood 2322 #> 4644  11.4      6 1942 1942-06-02 02:00:01   bone 2322 #> 4645  17.7      7 1942 1942-07-02 12:00:00  blood 2323 #> 4646  17.7      7 1942 1942-07-02 12:00:00   bone 2323 #> 4647  20.2      8 1942 1942-08-01 22:00:01  blood 2324 #> 4648  20.2      8 1942 1942-08-01 22:00:01   bone 2324 #> 4649  17.2      9 1942 1942-09-01 08:00:01  blood 2325 #> 4650  17.2      9 1942 1942-09-01 08:00:01   bone 2325 #> 4651  19.2     10 1942 1942-10-01 18:00:00  blood 2326 #> 4652  19.2     10 1942 1942-10-01 18:00:00   bone 2326 #> 4653  30.7     11 1942 1942-11-01 04:00:01  blood 2327 #> 4654  30.7     11 1942 1942-11-01 04:00:01   bone 2327 #> 4655  22.5     12 1942 1942-12-01 14:00:01  blood 2328 #> 4656  22.5     12 1942 1942-12-01 14:00:01   bone 2328 #> 4657  12.4      1 1943 1943-01-01 00:00:00  blood 2329 #> 4658  12.4      1 1943 1943-01-01 00:00:00   bone 2329 #> 4659  28.9      2 1943 1943-01-31 10:00:01  blood 2330 #> 4660  28.9      2 1943 1943-01-31 10:00:01   bone 2330 #> 4661  27.4      3 1943 1943-03-02 20:00:01  blood 2331 #> 4662  27.4      3 1943 1943-03-02 20:00:01   bone 2331 #> 4663  26.1      4 1943 1943-04-02 06:00:00  blood 2332 #> 4664  26.1      4 1943 1943-04-02 06:00:00   bone 2332 #> 4665  14.1      5 1943 1943-05-02 16:00:01  blood 2333 #> 4666  14.1      5 1943 1943-05-02 16:00:01   bone 2333 #> 4667   7.6      6 1943 1943-06-02 02:00:01  blood 2334 #> 4668   7.6      6 1943 1943-06-02 02:00:01   bone 2334 #> 4669  13.2      7 1943 1943-07-02 12:00:00  blood 2335 #> 4670  13.2      7 1943 1943-07-02 12:00:00   bone 2335 #> 4671  19.4      8 1943 1943-08-01 22:00:01  blood 2336 #> 4672  19.4      8 1943 1943-08-01 22:00:01   bone 2336 #> 4673  10.0      9 1943 1943-09-01 08:00:01  blood 2337 #> 4674  10.0      9 1943 1943-09-01 08:00:01   bone 2337 #> 4675   7.8     10 1943 1943-10-01 18:00:00  blood 2338 #> 4676   7.8     10 1943 1943-10-01 18:00:00   bone 2338 #> 4677  10.2     11 1943 1943-11-01 04:00:01  blood 2339 #> 4678  10.2     11 1943 1943-11-01 04:00:01   bone 2339 #> 4679  18.8     12 1943 1943-12-01 14:00:01  blood 2340 #> 4680  18.8     12 1943 1943-12-01 14:00:01   bone 2340 #> 4681   3.7      1 1944 1944-01-01 00:00:00  blood 2341 #> 4682   3.7      1 1944 1944-01-01 00:00:00   bone 2341 #> 4683   0.5      2 1944 1944-01-31 12:00:01  blood 2342 #> 4684   0.5      2 1944 1944-01-31 12:00:01   bone 2342 #> 4685  11.0      3 1944 1944-03-02 00:00:01  blood 2343 #> 4686  11.0      3 1944 1944-03-02 00:00:01   bone 2343 #> 4687   0.3      4 1944 1944-04-01 12:00:00  blood 2344 #> 4688   0.3      4 1944 1944-04-01 12:00:00   bone 2344 #> 4689   2.5      5 1944 1944-05-02 00:00:01  blood 2345 #> 4690   2.5      5 1944 1944-05-02 00:00:01   bone 2345 #> 4691   5.0      6 1944 1944-06-01 12:00:01  blood 2346 #> 4692   5.0      6 1944 1944-06-01 12:00:01   bone 2346 #> 4693   5.0      7 1944 1944-07-02 00:00:00  blood 2347 #> 4694   5.0      7 1944 1944-07-02 00:00:00   bone 2347 #> 4695  16.7      8 1944 1944-08-01 12:00:01  blood 2348 #> 4696  16.7      8 1944 1944-08-01 12:00:01   bone 2348 #> 4697  14.3      9 1944 1944-09-01 00:00:01  blood 2349 #> 4698  14.3      9 1944 1944-09-01 00:00:01   bone 2349 #> 4699  16.9     10 1944 1944-10-01 12:00:00  blood 2350 #> 4700  16.9     10 1944 1944-10-01 12:00:00   bone 2350 #> 4701  10.8     11 1944 1944-11-01 00:00:01  blood 2351 #> 4702  10.8     11 1944 1944-11-01 00:00:01   bone 2351 #> 4703  28.4     12 1944 1944-12-01 12:00:01  blood 2352 #> 4704  28.4     12 1944 1944-12-01 12:00:01   bone 2352 #> 4705  18.5      1 1945 1945-01-01 00:00:00  blood 2353 #> 4706  18.5      1 1945 1945-01-01 00:00:00   bone 2353 #> 4707  12.7      2 1945 1945-01-31 10:00:01  blood 2354 #> 4708  12.7      2 1945 1945-01-31 10:00:01   bone 2354 #> 4709  21.5      3 1945 1945-03-02 20:00:01  blood 2355 #> 4710  21.5      3 1945 1945-03-02 20:00:01   bone 2355 #> 4711  32.0      4 1945 1945-04-02 06:00:00  blood 2356 #> 4712  32.0      4 1945 1945-04-02 06:00:00   bone 2356 #> 4713  30.6      5 1945 1945-05-02 16:00:01  blood 2357 #> 4714  30.6      5 1945 1945-05-02 16:00:01   bone 2357 #> 4715  36.2      6 1945 1945-06-02 02:00:01  blood 2358 #> 4716  36.2      6 1945 1945-06-02 02:00:01   bone 2358 #> 4717  42.6      7 1945 1945-07-02 12:00:00  blood 2359 #> 4718  42.6      7 1945 1945-07-02 12:00:00   bone 2359 #> 4719  25.9      8 1945 1945-08-01 22:00:01  blood 2360 #> 4720  25.9      8 1945 1945-08-01 22:00:01   bone 2360 #> 4721  34.9      9 1945 1945-09-01 08:00:01  blood 2361 #> 4722  34.9      9 1945 1945-09-01 08:00:01   bone 2361 #> 4723  68.8     10 1945 1945-10-01 18:00:00  blood 2362 #> 4724  68.8     10 1945 1945-10-01 18:00:00   bone 2362 #> 4725  46.0     11 1945 1945-11-01 04:00:01  blood 2363 #> 4726  46.0     11 1945 1945-11-01 04:00:01   bone 2363 #> 4727  27.4     12 1945 1945-12-01 14:00:01  blood 2364 #> 4728  27.4     12 1945 1945-12-01 14:00:01   bone 2364 #> 4729  47.6      1 1946 1946-01-01 00:00:00  blood 2365 #> 4730  47.6      1 1946 1946-01-01 00:00:00   bone 2365 #> 4731  86.2      2 1946 1946-01-31 10:00:01  blood 2366 #> 4732  86.2      2 1946 1946-01-31 10:00:01   bone 2366 #> 4733  76.6      3 1946 1946-03-02 20:00:01  blood 2367 #> 4734  76.6      3 1946 1946-03-02 20:00:01   bone 2367 #> 4735  75.7      4 1946 1946-04-02 06:00:00  blood 2368 #> 4736  75.7      4 1946 1946-04-02 06:00:00   bone 2368 #> 4737  84.9      5 1946 1946-05-02 16:00:01  blood 2369 #> 4738  84.9      5 1946 1946-05-02 16:00:01   bone 2369 #> 4739  73.5      6 1946 1946-06-02 02:00:01  blood 2370 #> 4740  73.5      6 1946 1946-06-02 02:00:01   bone 2370 #> 4741 116.2      7 1946 1946-07-02 12:00:00  blood 2371 #> 4742 116.2      7 1946 1946-07-02 12:00:00   bone 2371 #> 4743 107.2      8 1946 1946-08-01 22:00:01  blood 2372 #> 4744 107.2      8 1946 1946-08-01 22:00:01   bone 2372 #> 4745  94.4      9 1946 1946-09-01 08:00:01  blood 2373 #> 4746  94.4      9 1946 1946-09-01 08:00:01   bone 2373 #> 4747 102.3     10 1946 1946-10-01 18:00:00  blood 2374 #> 4748 102.3     10 1946 1946-10-01 18:00:00   bone 2374 #> 4749 123.8     11 1946 1946-11-01 04:00:01  blood 2375 #> 4750 123.8     11 1946 1946-11-01 04:00:01   bone 2375 #> 4751 121.7     12 1946 1946-12-01 14:00:01  blood 2376 #> 4752 121.7     12 1946 1946-12-01 14:00:01   bone 2376 #> 4753 115.7      1 1947 1947-01-01 00:00:00  blood 2377 #> 4754 115.7      1 1947 1947-01-01 00:00:00   bone 2377 #> 4755 113.4      2 1947 1947-01-31 10:00:01  blood 2378 #> 4756 113.4      2 1947 1947-01-31 10:00:01   bone 2378 #> 4757 129.8      3 1947 1947-03-02 20:00:01  blood 2379 #> 4758 129.8      3 1947 1947-03-02 20:00:01   bone 2379 #> 4759 149.8      4 1947 1947-04-02 06:00:00  blood 2380 #> 4760 149.8      4 1947 1947-04-02 06:00:00   bone 2380 #> 4761 201.3      5 1947 1947-05-02 16:00:01  blood 2381 #> 4762 201.3      5 1947 1947-05-02 16:00:01   bone 2381 #> 4763 163.9      6 1947 1947-06-02 02:00:01  blood 2382 #> 4764 163.9      6 1947 1947-06-02 02:00:01   bone 2382 #> 4765 157.9      7 1947 1947-07-02 12:00:00  blood 2383 #> 4766 157.9      7 1947 1947-07-02 12:00:00   bone 2383 #> 4767 188.8      8 1947 1947-08-01 22:00:01  blood 2384 #> 4768 188.8      8 1947 1947-08-01 22:00:01   bone 2384 #> 4769 169.4      9 1947 1947-09-01 08:00:01  blood 2385 #> 4770 169.4      9 1947 1947-09-01 08:00:01   bone 2385 #> 4771 163.6     10 1947 1947-10-01 18:00:00  blood 2386 #> 4772 163.6     10 1947 1947-10-01 18:00:00   bone 2386 #> 4773 128.0     11 1947 1947-11-01 04:00:01  blood 2387 #> 4774 128.0     11 1947 1947-11-01 04:00:01   bone 2387 #> 4775 116.5     12 1947 1947-12-01 14:00:01  blood 2388 #> 4776 116.5     12 1947 1947-12-01 14:00:01   bone 2388 #> 4777 108.5      1 1948 1948-01-01 00:00:00  blood 2389 #> 4778 108.5      1 1948 1948-01-01 00:00:00   bone 2389 #> 4779  86.1      2 1948 1948-01-31 12:00:01  blood 2390 #> 4780  86.1      2 1948 1948-01-31 12:00:01   bone 2390 #> 4781  94.8      3 1948 1948-03-02 00:00:01  blood 2391 #> 4782  94.8      3 1948 1948-03-02 00:00:01   bone 2391 #> 4783 189.7      4 1948 1948-04-01 12:00:00  blood 2392 #> 4784 189.7      4 1948 1948-04-01 12:00:00   bone 2392 #> 4785 174.0      5 1948 1948-05-02 00:00:01  blood 2393 #> 4786 174.0      5 1948 1948-05-02 00:00:01   bone 2393 #> 4787 167.8      6 1948 1948-06-01 12:00:01  blood 2394 #> 4788 167.8      6 1948 1948-06-01 12:00:01   bone 2394 #> 4789 142.2      7 1948 1948-07-02 00:00:00  blood 2395 #> 4790 142.2      7 1948 1948-07-02 00:00:00   bone 2395 #> 4791 157.9      8 1948 1948-08-01 12:00:01  blood 2396 #> 4792 157.9      8 1948 1948-08-01 12:00:01   bone 2396 #> 4793 143.3      9 1948 1948-09-01 00:00:01  blood 2397 #> 4794 143.3      9 1948 1948-09-01 00:00:01   bone 2397 #>  #> $data_test #>         y season year                date series time #> 1   136.3     10 1948 1948-10-01 12:00:00  blood 2398 #> 2   136.3     10 1948 1948-10-01 12:00:00   bone 2398 #> 3    95.8     11 1948 1948-11-01 00:00:01  blood 2399 #> 4    95.8     11 1948 1948-11-01 00:00:01   bone 2399 #> 5   138.0     12 1948 1948-12-01 12:00:01  blood 2400 #> 6   138.0     12 1948 1948-12-01 12:00:01   bone 2400 #> 7   119.1      1 1949 1949-01-01 00:00:00  blood 2401 #> 8   119.1      1 1949 1949-01-01 00:00:00   bone 2401 #> 9   182.3      2 1949 1949-01-31 10:00:01  blood 2402 #> 10  182.3      2 1949 1949-01-31 10:00:01   bone 2402 #> 11  157.5      3 1949 1949-03-02 20:00:01  blood 2403 #> 12  157.5      3 1949 1949-03-02 20:00:01   bone 2403 #> 13  147.0      4 1949 1949-04-02 06:00:00  blood 2404 #> 14  147.0      4 1949 1949-04-02 06:00:00   bone 2404 #> 15  106.2      5 1949 1949-05-02 16:00:01  blood 2405 #> 16  106.2      5 1949 1949-05-02 16:00:01   bone 2405 #> 17  121.7      6 1949 1949-06-02 02:00:01  blood 2406 #> 18  121.7      6 1949 1949-06-02 02:00:01   bone 2406 #> 19  125.8      7 1949 1949-07-02 12:00:00  blood 2407 #> 20  125.8      7 1949 1949-07-02 12:00:00   bone 2407 #> 21  123.8      8 1949 1949-08-01 22:00:01  blood 2408 #> 22  123.8      8 1949 1949-08-01 22:00:01   bone 2408 #> 23  145.3      9 1949 1949-09-01 08:00:01  blood 2409 #> 24  145.3      9 1949 1949-09-01 08:00:01   bone 2409 #> 25  131.6     10 1949 1949-10-01 18:00:00  blood 2410 #> 26  131.6     10 1949 1949-10-01 18:00:00   bone 2410 #> 27  143.5     11 1949 1949-11-01 04:00:01  blood 2411 #> 28  143.5     11 1949 1949-11-01 04:00:01   bone 2411 #> 29  117.6     12 1949 1949-12-01 14:00:01  blood 2412 #> 30  117.6     12 1949 1949-12-01 14:00:01   bone 2412 #> 31  101.6      1 1950 1950-01-01 00:00:00  blood 2413 #> 32  101.6      1 1950 1950-01-01 00:00:00   bone 2413 #> 33   94.8      2 1950 1950-01-31 10:00:01  blood 2414 #> 34   94.8      2 1950 1950-01-31 10:00:01   bone 2414 #> 35  109.7      3 1950 1950-03-02 20:00:01  blood 2415 #> 36  109.7      3 1950 1950-03-02 20:00:01   bone 2415 #> 37  113.4      4 1950 1950-04-02 06:00:00  blood 2416 #> 38  113.4      4 1950 1950-04-02 06:00:00   bone 2416 #> 39  106.2      5 1950 1950-05-02 16:00:01  blood 2417 #> 40  106.2      5 1950 1950-05-02 16:00:01   bone 2417 #> 41   83.6      6 1950 1950-06-02 02:00:01  blood 2418 #> 42   83.6      6 1950 1950-06-02 02:00:01   bone 2418 #> 43   91.0      7 1950 1950-07-02 12:00:00  blood 2419 #> 44   91.0      7 1950 1950-07-02 12:00:00   bone 2419 #> 45   85.2      8 1950 1950-08-01 22:00:01  blood 2420 #> 46   85.2      8 1950 1950-08-01 22:00:01   bone 2420 #> 47   51.3      9 1950 1950-09-01 08:00:01  blood 2421 #> 48   51.3      9 1950 1950-09-01 08:00:01   bone 2421 #> 49   61.4     10 1950 1950-10-01 18:00:00  blood 2422 #> 50   61.4     10 1950 1950-10-01 18:00:00   bone 2422 #> 51   54.8     11 1950 1950-11-01 04:00:01  blood 2423 #> 52   54.8     11 1950 1950-11-01 04:00:01   bone 2423 #> 53   54.1     12 1950 1950-12-01 14:00:01  blood 2424 #> 54   54.1     12 1950 1950-12-01 14:00:01   bone 2424 #> 55   59.9      1 1951 1951-01-01 00:00:00  blood 2425 #> 56   59.9      1 1951 1951-01-01 00:00:00   bone 2425 #> 57   59.9      2 1951 1951-01-31 10:00:01  blood 2426 #> 58   59.9      2 1951 1951-01-31 10:00:01   bone 2426 #> 59   59.9      3 1951 1951-03-02 20:00:01  blood 2427 #> 60   59.9      3 1951 1951-03-02 20:00:01   bone 2427 #> 61   92.9      4 1951 1951-04-02 06:00:00  blood 2428 #> 62   92.9      4 1951 1951-04-02 06:00:00   bone 2428 #> 63  108.5      5 1951 1951-05-02 16:00:01  blood 2429 #> 64  108.5      5 1951 1951-05-02 16:00:01   bone 2429 #> 65  100.6      6 1951 1951-06-02 02:00:01  blood 2430 #> 66  100.6      6 1951 1951-06-02 02:00:01   bone 2430 #> 67   61.5      7 1951 1951-07-02 12:00:00  blood 2431 #> 68   61.5      7 1951 1951-07-02 12:00:00   bone 2431 #> 69   61.0      8 1951 1951-08-01 22:00:01  blood 2432 #> 70   61.0      8 1951 1951-08-01 22:00:01   bone 2432 #> 71   83.1      9 1951 1951-09-01 08:00:01  blood 2433 #> 72   83.1      9 1951 1951-09-01 08:00:01   bone 2433 #> 73   51.6     10 1951 1951-10-01 18:00:00  blood 2434 #> 74   51.6     10 1951 1951-10-01 18:00:00   bone 2434 #> 75   52.4     11 1951 1951-11-01 04:00:01  blood 2435 #> 76   52.4     11 1951 1951-11-01 04:00:01   bone 2435 #> 77   45.8     12 1951 1951-12-01 14:00:01  blood 2436 #> 78   45.8     12 1951 1951-12-01 14:00:01   bone 2436 #> 79   40.7      1 1952 1952-01-01 00:00:00  blood 2437 #> 80   40.7      1 1952 1952-01-01 00:00:00   bone 2437 #> 81   22.7      2 1952 1952-01-31 12:00:01  blood 2438 #> 82   22.7      2 1952 1952-01-31 12:00:01   bone 2438 #> 83   22.0      3 1952 1952-03-02 00:00:01  blood 2439 #> 84   22.0      3 1952 1952-03-02 00:00:01   bone 2439 #> 85   29.1      4 1952 1952-04-01 12:00:00  blood 2440 #> 86   29.1      4 1952 1952-04-01 12:00:00   bone 2440 #> 87   23.4      5 1952 1952-05-02 00:00:01  blood 2441 #> 88   23.4      5 1952 1952-05-02 00:00:01   bone 2441 #> 89   36.4      6 1952 1952-06-01 12:00:01  blood 2442 #> 90   36.4      6 1952 1952-06-01 12:00:01   bone 2442 #> 91   39.3      7 1952 1952-07-02 00:00:00  blood 2443 #> 92   39.3      7 1952 1952-07-02 00:00:00   bone 2443 #> 93   54.9      8 1952 1952-08-01 12:00:01  blood 2444 #> 94   54.9      8 1952 1952-08-01 12:00:01   bone 2444 #> 95   28.2      9 1952 1952-09-01 00:00:01  blood 2445 #> 96   28.2      9 1952 1952-09-01 00:00:01   bone 2445 #> 97   23.8     10 1952 1952-10-01 12:00:00  blood 2446 #> 98   23.8     10 1952 1952-10-01 12:00:00   bone 2446 #> 99   22.1     11 1952 1952-11-01 00:00:01  blood 2447 #> 100  22.1     11 1952 1952-11-01 00:00:01   bone 2447 #> 101  34.3     12 1952 1952-12-01 12:00:01  blood 2448 #> 102  34.3     12 1952 1952-12-01 12:00:01   bone 2448 #> 103  26.5      1 1953 1953-01-01 00:00:00  blood 2449 #> 104  26.5      1 1953 1953-01-01 00:00:00   bone 2449 #> 105   3.9      2 1953 1953-01-31 10:00:01  blood 2450 #> 106   3.9      2 1953 1953-01-31 10:00:01   bone 2450 #> 107  10.0      3 1953 1953-03-02 20:00:01  blood 2451 #> 108  10.0      3 1953 1953-03-02 20:00:01   bone 2451 #> 109  27.8      4 1953 1953-04-02 06:00:00  blood 2452 #> 110  27.8      4 1953 1953-04-02 06:00:00   bone 2452 #> 111  12.5      5 1953 1953-05-02 16:00:01  blood 2453 #> 112  12.5      5 1953 1953-05-02 16:00:01   bone 2453 #> 113  21.8      6 1953 1953-06-02 02:00:01  blood 2454 #> 114  21.8      6 1953 1953-06-02 02:00:01   bone 2454 #> 115   8.6      7 1953 1953-07-02 12:00:00  blood 2455 #> 116   8.6      7 1953 1953-07-02 12:00:00   bone 2455 #> 117  23.5      8 1953 1953-08-01 22:00:01  blood 2456 #> 118  23.5      8 1953 1953-08-01 22:00:01   bone 2456 #> 119  19.3      9 1953 1953-09-01 08:00:01  blood 2457 #> 120  19.3      9 1953 1953-09-01 08:00:01   bone 2457 #> 121   8.2     10 1953 1953-10-01 18:00:00  blood 2458 #> 122   8.2     10 1953 1953-10-01 18:00:00   bone 2458 #> 123   1.6     11 1953 1953-11-01 04:00:01  blood 2459 #> 124   1.6     11 1953 1953-11-01 04:00:01   bone 2459 #> 125   2.5     12 1953 1953-12-01 14:00:01  blood 2460 #> 126   2.5     12 1953 1953-12-01 14:00:01   bone 2460 #> 127   0.2      1 1954 1954-01-01 00:00:00  blood 2461 #> 128   0.2      1 1954 1954-01-01 00:00:00   bone 2461 #> 129   0.5      2 1954 1954-01-31 10:00:01  blood 2462 #> 130   0.5      2 1954 1954-01-31 10:00:01   bone 2462 #> 131  10.9      3 1954 1954-03-02 20:00:01  blood 2463 #> 132  10.9      3 1954 1954-03-02 20:00:01   bone 2463 #> 133   1.8      4 1954 1954-04-02 06:00:00  blood 2464 #> 134   1.8      4 1954 1954-04-02 06:00:00   bone 2464 #> 135   0.8      5 1954 1954-05-02 16:00:01  blood 2465 #> 136   0.8      5 1954 1954-05-02 16:00:01   bone 2465 #> 137   0.2      6 1954 1954-06-02 02:00:01  blood 2466 #> 138   0.2      6 1954 1954-06-02 02:00:01   bone 2466 #> 139   4.8      7 1954 1954-07-02 12:00:00  blood 2467 #> 140   4.8      7 1954 1954-07-02 12:00:00   bone 2467 #> 141   8.4      8 1954 1954-08-01 22:00:01  blood 2468 #> 142   8.4      8 1954 1954-08-01 22:00:01   bone 2468 #> 143   1.5      9 1954 1954-09-01 08:00:01  blood 2469 #> 144   1.5      9 1954 1954-09-01 08:00:01   bone 2469 #> 145   7.0     10 1954 1954-10-01 18:00:00  blood 2470 #> 146   7.0     10 1954 1954-10-01 18:00:00   bone 2470 #> 147   9.2     11 1954 1954-11-01 04:00:01  blood 2471 #> 148   9.2     11 1954 1954-11-01 04:00:01   bone 2471 #> 149   7.6     12 1954 1954-12-01 14:00:01  blood 2472 #> 150   7.6     12 1954 1954-12-01 14:00:01   bone 2472 #> 151  23.1      1 1955 1955-01-01 00:00:00  blood 2473 #> 152  23.1      1 1955 1955-01-01 00:00:00   bone 2473 #> 153  20.8      2 1955 1955-01-31 10:00:01  blood 2474 #> 154  20.8      2 1955 1955-01-31 10:00:01   bone 2474 #> 155   4.9      3 1955 1955-03-02 20:00:01  blood 2475 #> 156   4.9      3 1955 1955-03-02 20:00:01   bone 2475 #> 157  11.3      4 1955 1955-04-02 06:00:00  blood 2476 #> 158  11.3      4 1955 1955-04-02 06:00:00   bone 2476 #> 159  28.9      5 1955 1955-05-02 16:00:01  blood 2477 #> 160  28.9      5 1955 1955-05-02 16:00:01   bone 2477 #> 161  31.7      6 1955 1955-06-02 02:00:01  blood 2478 #> 162  31.7      6 1955 1955-06-02 02:00:01   bone 2478 #> 163  26.7      7 1955 1955-07-02 12:00:00  blood 2479 #> 164  26.7      7 1955 1955-07-02 12:00:00   bone 2479 #> 165  40.7      8 1955 1955-08-01 22:00:01  blood 2480 #> 166  40.7      8 1955 1955-08-01 22:00:01   bone 2480 #> 167  42.7      9 1955 1955-09-01 08:00:01  blood 2481 #> 168  42.7      9 1955 1955-09-01 08:00:01   bone 2481 #> 169  58.5     10 1955 1955-10-01 18:00:00  blood 2482 #> 170  58.5     10 1955 1955-10-01 18:00:00   bone 2482 #> 171  89.2     11 1955 1955-11-01 04:00:01  blood 2483 #> 172  89.2     11 1955 1955-11-01 04:00:01   bone 2483 #> 173  76.9     12 1955 1955-12-01 14:00:01  blood 2484 #> 174  76.9     12 1955 1955-12-01 14:00:01   bone 2484 #> 175  73.6      1 1956 1956-01-01 00:00:00  blood 2485 #> 176  73.6      1 1956 1956-01-01 00:00:00   bone 2485 #> 177 124.0      2 1956 1956-01-31 12:00:01  blood 2486 #> 178 124.0      2 1956 1956-01-31 12:00:01   bone 2486 #> 179 118.4      3 1956 1956-03-02 00:00:01  blood 2487 #> 180 118.4      3 1956 1956-03-02 00:00:01   bone 2487 #> 181 110.7      4 1956 1956-04-01 12:00:00  blood 2488 #> 182 110.7      4 1956 1956-04-01 12:00:00   bone 2488 #> 183 136.6      5 1956 1956-05-02 00:00:01  blood 2489 #> 184 136.6      5 1956 1956-05-02 00:00:01   bone 2489 #> 185 116.6      6 1956 1956-06-01 12:00:01  blood 2490 #> 186 116.6      6 1956 1956-06-01 12:00:01   bone 2490 #> 187 129.1      7 1956 1956-07-02 00:00:00  blood 2491 #> 188 129.1      7 1956 1956-07-02 00:00:00   bone 2491 #> 189 169.6      8 1956 1956-08-01 12:00:01  blood 2492 #> 190 169.6      8 1956 1956-08-01 12:00:01   bone 2492 #> 191 173.2      9 1956 1956-09-01 00:00:01  blood 2493 #> 192 173.2      9 1956 1956-09-01 00:00:01   bone 2493 #> 193 155.3     10 1956 1956-10-01 12:00:00  blood 2494 #> 194 155.3     10 1956 1956-10-01 12:00:00   bone 2494 #> 195 201.3     11 1956 1956-11-01 00:00:01  blood 2495 #> 196 201.3     11 1956 1956-11-01 00:00:01   bone 2495 #> 197 192.1     12 1956 1956-12-01 12:00:01  blood 2496 #> 198 192.1     12 1956 1956-12-01 12:00:01   bone 2496 #> 199 165.0      1 1957 1957-01-01 00:00:00  blood 2497 #> 200 165.0      1 1957 1957-01-01 00:00:00   bone 2497 #> 201 130.2      2 1957 1957-01-31 10:00:01  blood 2498 #> 202 130.2      2 1957 1957-01-31 10:00:01   bone 2498 #> 203 157.4      3 1957 1957-03-02 20:00:01  blood 2499 #> 204 157.4      3 1957 1957-03-02 20:00:01   bone 2499 #> 205 175.2      4 1957 1957-04-02 06:00:00  blood 2500 #> 206 175.2      4 1957 1957-04-02 06:00:00   bone 2500 #> 207 164.6      5 1957 1957-05-02 16:00:01  blood 2501 #> 208 164.6      5 1957 1957-05-02 16:00:01   bone 2501 #> 209 200.7      6 1957 1957-06-02 02:00:01  blood 2502 #> 210 200.7      6 1957 1957-06-02 02:00:01   bone 2502 #> 211 187.2      7 1957 1957-07-02 12:00:00  blood 2503 #> 212 187.2      7 1957 1957-07-02 12:00:00   bone 2503 #> 213 158.0      8 1957 1957-08-01 22:00:01  blood 2504 #> 214 158.0      8 1957 1957-08-01 22:00:01   bone 2504 #> 215 235.8      9 1957 1957-09-01 08:00:01  blood 2505 #> 216 235.8      9 1957 1957-09-01 08:00:01   bone 2505 #> 217 253.8     10 1957 1957-10-01 18:00:00  blood 2506 #> 218 253.8     10 1957 1957-10-01 18:00:00   bone 2506 #> 219 210.9     11 1957 1957-11-01 04:00:01  blood 2507 #> 220 210.9     11 1957 1957-11-01 04:00:01   bone 2507 #> 221 239.4     12 1957 1957-12-01 14:00:01  blood 2508 #> 222 239.4     12 1957 1957-12-01 14:00:01   bone 2508 #> 223 202.5      1 1958 1958-01-01 00:00:00  blood 2509 #> 224 202.5      1 1958 1958-01-01 00:00:00   bone 2509 #> 225 164.9      2 1958 1958-01-31 10:00:01  blood 2510 #> 226 164.9      2 1958 1958-01-31 10:00:01   bone 2510 #> 227 190.7      3 1958 1958-03-02 20:00:01  blood 2511 #> 228 190.7      3 1958 1958-03-02 20:00:01   bone 2511 #> 229 196.0      4 1958 1958-04-02 06:00:00  blood 2512 #> 230 196.0      4 1958 1958-04-02 06:00:00   bone 2512 #> 231 175.3      5 1958 1958-05-02 16:00:01  blood 2513 #> 232 175.3      5 1958 1958-05-02 16:00:01   bone 2513 #> 233 171.5      6 1958 1958-06-02 02:00:01  blood 2514 #> 234 171.5      6 1958 1958-06-02 02:00:01   bone 2514 #> 235 191.4      7 1958 1958-07-02 12:00:00  blood 2515 #> 236 191.4      7 1958 1958-07-02 12:00:00   bone 2515 #> 237 200.2      8 1958 1958-08-01 22:00:01  blood 2516 #> 238 200.2      8 1958 1958-08-01 22:00:01   bone 2516 #> 239 201.2      9 1958 1958-09-01 08:00:01  blood 2517 #> 240 201.2      9 1958 1958-09-01 08:00:01   bone 2517 #> 241 181.5     10 1958 1958-10-01 18:00:00  blood 2518 #> 242 181.5     10 1958 1958-10-01 18:00:00   bone 2518 #> 243 152.3     11 1958 1958-11-01 04:00:01  blood 2519 #> 244 152.3     11 1958 1958-11-01 04:00:01   bone 2519 #> 245 187.6     12 1958 1958-12-01 14:00:01  blood 2520 #> 246 187.6     12 1958 1958-12-01 14:00:01   bone 2520 #> 247 217.4      1 1959 1959-01-01 00:00:00  blood 2521 #> 248 217.4      1 1959 1959-01-01 00:00:00   bone 2521 #> 249 143.1      2 1959 1959-01-31 10:00:01  blood 2522 #> 250 143.1      2 1959 1959-01-31 10:00:01   bone 2522 #> 251 185.7      3 1959 1959-03-02 20:00:01  blood 2523 #> 252 185.7      3 1959 1959-03-02 20:00:01   bone 2523 #> 253 163.3      4 1959 1959-04-02 06:00:00  blood 2524 #> 254 163.3      4 1959 1959-04-02 06:00:00   bone 2524 #> 255 172.0      5 1959 1959-05-02 16:00:01  blood 2525 #> 256 172.0      5 1959 1959-05-02 16:00:01   bone 2525 #> 257 168.7      6 1959 1959-06-02 02:00:01  blood 2526 #> 258 168.7      6 1959 1959-06-02 02:00:01   bone 2526 #> 259 149.6      7 1959 1959-07-02 12:00:00  blood 2527 #> 260 149.6      7 1959 1959-07-02 12:00:00   bone 2527 #> 261 199.6      8 1959 1959-08-01 22:00:01  blood 2528 #> 262 199.6      8 1959 1959-08-01 22:00:01   bone 2528 #> 263 145.2      9 1959 1959-09-01 08:00:01  blood 2529 #> 264 145.2      9 1959 1959-09-01 08:00:01   bone 2529 #> 265 111.4     10 1959 1959-10-01 18:00:00  blood 2530 #> 266 111.4     10 1959 1959-10-01 18:00:00   bone 2530 #> 267 124.0     11 1959 1959-11-01 04:00:01  blood 2531 #> 268 124.0     11 1959 1959-11-01 04:00:01   bone 2531 #> 269 125.0     12 1959 1959-12-01 14:00:01  blood 2532 #> 270 125.0     12 1959 1959-12-01 14:00:01   bone 2532 #> 271 146.3      1 1960 1960-01-01 00:00:00  blood 2533 #> 272 146.3      1 1960 1960-01-01 00:00:00   bone 2533 #> 273 106.0      2 1960 1960-01-31 12:00:01  blood 2534 #> 274 106.0      2 1960 1960-01-31 12:00:01   bone 2534 #> 275 102.2      3 1960 1960-03-02 00:00:01  blood 2535 #> 276 102.2      3 1960 1960-03-02 00:00:01   bone 2535 #> 277 122.0      4 1960 1960-04-01 12:00:00  blood 2536 #> 278 122.0      4 1960 1960-04-01 12:00:00   bone 2536 #> 279 119.6      5 1960 1960-05-02 00:00:01  blood 2537 #> 280 119.6      5 1960 1960-05-02 00:00:01   bone 2537 #> 281 110.2      6 1960 1960-06-01 12:00:01  blood 2538 #> 282 110.2      6 1960 1960-06-01 12:00:01   bone 2538 #> 283 121.7      7 1960 1960-07-02 00:00:00  blood 2539 #> 284 121.7      7 1960 1960-07-02 00:00:00   bone 2539 #> 285 134.1      8 1960 1960-08-01 12:00:01  blood 2540 #> 286 134.1      8 1960 1960-08-01 12:00:01   bone 2540 #> 287 127.2      9 1960 1960-09-01 00:00:01  blood 2541 #> 288 127.2      9 1960 1960-09-01 00:00:01   bone 2541 #> 289  82.8     10 1960 1960-10-01 12:00:00  blood 2542 #> 290  82.8     10 1960 1960-10-01 12:00:00   bone 2542 #> 291  89.6     11 1960 1960-11-01 00:00:01  blood 2543 #> 292  89.6     11 1960 1960-11-01 00:00:01   bone 2543 #> 293  85.6     12 1960 1960-12-01 12:00:01  blood 2544 #> 294  85.6     12 1960 1960-12-01 12:00:01   bone 2544 #> 295  57.9      1 1961 1961-01-01 00:00:00  blood 2545 #> 296  57.9      1 1961 1961-01-01 00:00:00   bone 2545 #> 297  46.1      2 1961 1961-01-31 10:00:01  blood 2546 #> 298  46.1      2 1961 1961-01-31 10:00:01   bone 2546 #> 299  53.0      3 1961 1961-03-02 20:00:01  blood 2547 #> 300  53.0      3 1961 1961-03-02 20:00:01   bone 2547 #> 301  61.4      4 1961 1961-04-02 06:00:00  blood 2548 #> 302  61.4      4 1961 1961-04-02 06:00:00   bone 2548 #> 303  51.0      5 1961 1961-05-02 16:00:01  blood 2549 #> 304  51.0      5 1961 1961-05-02 16:00:01   bone 2549 #> 305  77.4      6 1961 1961-06-02 02:00:01  blood 2550 #> 306  77.4      6 1961 1961-06-02 02:00:01   bone 2550 #> 307  70.2      7 1961 1961-07-02 12:00:00  blood 2551 #> 308  70.2      7 1961 1961-07-02 12:00:00   bone 2551 #> 309  55.9      8 1961 1961-08-01 22:00:01  blood 2552 #> 310  55.9      8 1961 1961-08-01 22:00:01   bone 2552 #> 311  63.6      9 1961 1961-09-01 08:00:01  blood 2553 #> 312  63.6      9 1961 1961-09-01 08:00:01   bone 2553 #> 313  37.7     10 1961 1961-10-01 18:00:00  blood 2554 #> 314  37.7     10 1961 1961-10-01 18:00:00   bone 2554 #> 315  32.6     11 1961 1961-11-01 04:00:01  blood 2555 #> 316  32.6     11 1961 1961-11-01 04:00:01   bone 2555 #> 317  40.0     12 1961 1961-12-01 14:00:01  blood 2556 #> 318  40.0     12 1961 1961-12-01 14:00:01   bone 2556 #> 319  38.7      1 1962 1962-01-01 00:00:00  blood 2557 #> 320  38.7      1 1962 1962-01-01 00:00:00   bone 2557 #> 321  50.3      2 1962 1962-01-31 10:00:01  blood 2558 #> 322  50.3      2 1962 1962-01-31 10:00:01   bone 2558 #> 323  45.6      3 1962 1962-03-02 20:00:01  blood 2559 #> 324  45.6      3 1962 1962-03-02 20:00:01   bone 2559 #> 325  46.4      4 1962 1962-04-02 06:00:00  blood 2560 #> 326  46.4      4 1962 1962-04-02 06:00:00   bone 2560 #> 327  43.7      5 1962 1962-05-02 16:00:01  blood 2561 #> 328  43.7      5 1962 1962-05-02 16:00:01   bone 2561 #> 329  42.0      6 1962 1962-06-02 02:00:01  blood 2562 #> 330  42.0      6 1962 1962-06-02 02:00:01   bone 2562 #> 331  21.8      7 1962 1962-07-02 12:00:00  blood 2563 #> 332  21.8      7 1962 1962-07-02 12:00:00   bone 2563 #> 333  21.8      8 1962 1962-08-01 22:00:01  blood 2564 #> 334  21.8      8 1962 1962-08-01 22:00:01   bone 2564 #> 335  51.3      9 1962 1962-09-01 08:00:01  blood 2565 #> 336  51.3      9 1962 1962-09-01 08:00:01   bone 2565 #> 337  39.5     10 1962 1962-10-01 18:00:00  blood 2566 #> 338  39.5     10 1962 1962-10-01 18:00:00   bone 2566 #> 339  26.9     11 1962 1962-11-01 04:00:01  blood 2567 #> 340  26.9     11 1962 1962-11-01 04:00:01   bone 2567 #> 341  23.2     12 1962 1962-12-01 14:00:01  blood 2568 #> 342  23.2     12 1962 1962-12-01 14:00:01   bone 2568 #> 343  19.8      1 1963 1963-01-01 00:00:00  blood 2569 #> 344  19.8      1 1963 1963-01-01 00:00:00   bone 2569 #> 345  24.4      2 1963 1963-01-31 10:00:01  blood 2570 #> 346  24.4      2 1963 1963-01-31 10:00:01   bone 2570 #> 347  17.1      3 1963 1963-03-02 20:00:01  blood 2571 #> 348  17.1      3 1963 1963-03-02 20:00:01   bone 2571 #> 349  29.3      4 1963 1963-04-02 06:00:00  blood 2572 #> 350  29.3      4 1963 1963-04-02 06:00:00   bone 2572 #> 351  43.0      5 1963 1963-05-02 16:00:01  blood 2573 #> 352  43.0      5 1963 1963-05-02 16:00:01   bone 2573 #> 353  35.9      6 1963 1963-06-02 02:00:01  blood 2574 #> 354  35.9      6 1963 1963-06-02 02:00:01   bone 2574 #> 355  19.6      7 1963 1963-07-02 12:00:00  blood 2575 #> 356  19.6      7 1963 1963-07-02 12:00:00   bone 2575 #> 357  33.2      8 1963 1963-08-01 22:00:01  blood 2576 #> 358  33.2      8 1963 1963-08-01 22:00:01   bone 2576 #> 359  38.8      9 1963 1963-09-01 08:00:01  blood 2577 #> 360  38.8      9 1963 1963-09-01 08:00:01   bone 2577 #> 361  35.3     10 1963 1963-10-01 18:00:00  blood 2578 #> 362  35.3     10 1963 1963-10-01 18:00:00   bone 2578 #> 363  23.4     11 1963 1963-11-01 04:00:01  blood 2579 #> 364  23.4     11 1963 1963-11-01 04:00:01   bone 2579 #> 365  14.9     12 1963 1963-12-01 14:00:01  blood 2580 #> 366  14.9     12 1963 1963-12-01 14:00:01   bone 2580 #> 367  15.3      1 1964 1964-01-01 00:00:00  blood 2581 #> 368  15.3      1 1964 1964-01-01 00:00:00   bone 2581 #> 369  17.7      2 1964 1964-01-31 12:00:01  blood 2582 #> 370  17.7      2 1964 1964-01-31 12:00:01   bone 2582 #> 371  16.5      3 1964 1964-03-02 00:00:01  blood 2583 #> 372  16.5      3 1964 1964-03-02 00:00:01   bone 2583 #> 373   8.6      4 1964 1964-04-01 12:00:00  blood 2584 #> 374   8.6      4 1964 1964-04-01 12:00:00   bone 2584 #> 375   9.5      5 1964 1964-05-02 00:00:01  blood 2585 #> 376   9.5      5 1964 1964-05-02 00:00:01   bone 2585 #> 377   9.1      6 1964 1964-06-01 12:00:01  blood 2586 #> 378   9.1      6 1964 1964-06-01 12:00:01   bone 2586 #> 379   3.1      7 1964 1964-07-02 00:00:00  blood 2587 #> 380   3.1      7 1964 1964-07-02 00:00:00   bone 2587 #> 381   9.3      8 1964 1964-08-01 12:00:01  blood 2588 #> 382   9.3      8 1964 1964-08-01 12:00:01   bone 2588 #> 383   4.7      9 1964 1964-09-01 00:00:01  blood 2589 #> 384   4.7      9 1964 1964-09-01 00:00:01   bone 2589 #> 385   6.1     10 1964 1964-10-01 12:00:00  blood 2590 #> 386   6.1     10 1964 1964-10-01 12:00:00   bone 2590 #> 387   7.4     11 1964 1964-11-01 00:00:01  blood 2591 #> 388   7.4     11 1964 1964-11-01 00:00:01   bone 2591 #> 389  15.1     12 1964 1964-12-01 12:00:01  blood 2592 #> 390  15.1     12 1964 1964-12-01 12:00:01   bone 2592 #> 391  17.5      1 1965 1965-01-01 00:00:00  blood 2593 #> 392  17.5      1 1965 1965-01-01 00:00:00   bone 2593 #> 393  14.2      2 1965 1965-01-31 10:00:01  blood 2594 #> 394  14.2      2 1965 1965-01-31 10:00:01   bone 2594 #> 395  11.7      3 1965 1965-03-02 20:00:01  blood 2595 #> 396  11.7      3 1965 1965-03-02 20:00:01   bone 2595 #> 397   6.8      4 1965 1965-04-02 06:00:00  blood 2596 #> 398   6.8      4 1965 1965-04-02 06:00:00   bone 2596 #> 399  24.1      5 1965 1965-05-02 16:00:01  blood 2597 #> 400  24.1      5 1965 1965-05-02 16:00:01   bone 2597 #> 401  15.9      6 1965 1965-06-02 02:00:01  blood 2598 #> 402  15.9      6 1965 1965-06-02 02:00:01   bone 2598 #> 403  11.9      7 1965 1965-07-02 12:00:00  blood 2599 #> 404  11.9      7 1965 1965-07-02 12:00:00   bone 2599 #> 405   8.9      8 1965 1965-08-01 22:00:01  blood 2600 #> 406   8.9      8 1965 1965-08-01 22:00:01   bone 2600 #> 407  16.8      9 1965 1965-09-01 08:00:01  blood 2601 #> 408  16.8      9 1965 1965-09-01 08:00:01   bone 2601 #> 409  20.1     10 1965 1965-10-01 18:00:00  blood 2602 #> 410  20.1     10 1965 1965-10-01 18:00:00   bone 2602 #> 411  15.8     11 1965 1965-11-01 04:00:01  blood 2603 #> 412  15.8     11 1965 1965-11-01 04:00:01   bone 2603 #> 413  17.0     12 1965 1965-12-01 14:00:01  blood 2604 #> 414  17.0     12 1965 1965-12-01 14:00:01   bone 2604 #> 415  28.2      1 1966 1966-01-01 00:00:00  blood 2605 #> 416  28.2      1 1966 1966-01-01 00:00:00   bone 2605 #> 417  24.4      2 1966 1966-01-31 10:00:01  blood 2606 #> 418  24.4      2 1966 1966-01-31 10:00:01   bone 2606 #> 419  25.3      3 1966 1966-03-02 20:00:01  blood 2607 #> 420  25.3      3 1966 1966-03-02 20:00:01   bone 2607 #> 421  48.7      4 1966 1966-04-02 06:00:00  blood 2608 #> 422  48.7      4 1966 1966-04-02 06:00:00   bone 2608 #> 423  45.3      5 1966 1966-05-02 16:00:01  blood 2609 #> 424  45.3      5 1966 1966-05-02 16:00:01   bone 2609 #> 425  47.7      6 1966 1966-06-02 02:00:01  blood 2610 #> 426  47.7      6 1966 1966-06-02 02:00:01   bone 2610 #> 427  56.7      7 1966 1966-07-02 12:00:00  blood 2611 #> 428  56.7      7 1966 1966-07-02 12:00:00   bone 2611 #> 429  51.2      8 1966 1966-08-01 22:00:01  blood 2612 #> 430  51.2      8 1966 1966-08-01 22:00:01   bone 2612 #> 431  50.2      9 1966 1966-09-01 08:00:01  blood 2613 #> 432  50.2      9 1966 1966-09-01 08:00:01   bone 2613 #> 433  57.2     10 1966 1966-10-01 18:00:00  blood 2614 #> 434  57.2     10 1966 1966-10-01 18:00:00   bone 2614 #> 435  57.2     11 1966 1966-11-01 04:00:01  blood 2615 #> 436  57.2     11 1966 1966-11-01 04:00:01   bone 2615 #> 437  70.4     12 1966 1966-12-01 14:00:01  blood 2616 #> 438  70.4     12 1966 1966-12-01 14:00:01   bone 2616 #> 439 110.9      1 1967 1967-01-01 00:00:00  blood 2617 #> 440 110.9      1 1967 1967-01-01 00:00:00   bone 2617 #> 441  93.6      2 1967 1967-01-31 10:00:01  blood 2618 #> 442  93.6      2 1967 1967-01-31 10:00:01   bone 2618 #> 443 111.8      3 1967 1967-03-02 20:00:01  blood 2619 #> 444 111.8      3 1967 1967-03-02 20:00:01   bone 2619 #> 445  69.5      4 1967 1967-04-02 06:00:00  blood 2620 #> 446  69.5      4 1967 1967-04-02 06:00:00   bone 2620 #> 447  86.5      5 1967 1967-05-02 16:00:01  blood 2621 #> 448  86.5      5 1967 1967-05-02 16:00:01   bone 2621 #> 449  67.3      6 1967 1967-06-02 02:00:01  blood 2622 #> 450  67.3      6 1967 1967-06-02 02:00:01   bone 2622 #> 451  91.5      7 1967 1967-07-02 12:00:00  blood 2623 #> 452  91.5      7 1967 1967-07-02 12:00:00   bone 2623 #> 453 107.2      8 1967 1967-08-01 22:00:01  blood 2624 #> 454 107.2      8 1967 1967-08-01 22:00:01   bone 2624 #> 455  76.8      9 1967 1967-09-01 08:00:01  blood 2625 #> 456  76.8      9 1967 1967-09-01 08:00:01   bone 2625 #> 457  88.2     10 1967 1967-10-01 18:00:00  blood 2626 #> 458  88.2     10 1967 1967-10-01 18:00:00   bone 2626 #> 459  94.3     11 1967 1967-11-01 04:00:01  blood 2627 #> 460  94.3     11 1967 1967-11-01 04:00:01   bone 2627 #> 461 126.4     12 1967 1967-12-01 14:00:01  blood 2628 #> 462 126.4     12 1967 1967-12-01 14:00:01   bone 2628 #> 463 121.8      1 1968 1968-01-01 00:00:00  blood 2629 #> 464 121.8      1 1968 1968-01-01 00:00:00   bone 2629 #> 465 111.9      2 1968 1968-01-31 12:00:01  blood 2630 #> 466 111.9      2 1968 1968-01-31 12:00:01   bone 2630 #> 467  92.2      3 1968 1968-03-02 00:00:01  blood 2631 #> 468  92.2      3 1968 1968-03-02 00:00:01   bone 2631 #> 469  81.2      4 1968 1968-04-01 12:00:00  blood 2632 #> 470  81.2      4 1968 1968-04-01 12:00:00   bone 2632 #> 471 127.2      5 1968 1968-05-02 00:00:01  blood 2633 #> 472 127.2      5 1968 1968-05-02 00:00:01   bone 2633 #> 473 110.3      6 1968 1968-06-01 12:00:01  blood 2634 #> 474 110.3      6 1968 1968-06-01 12:00:01   bone 2634 #> 475  96.1      7 1968 1968-07-02 00:00:00  blood 2635 #> 476  96.1      7 1968 1968-07-02 00:00:00   bone 2635 #> 477 109.3      8 1968 1968-08-01 12:00:01  blood 2636 #> 478 109.3      8 1968 1968-08-01 12:00:01   bone 2636 #> 479 117.2      9 1968 1968-09-01 00:00:01  blood 2637 #> 480 117.2      9 1968 1968-09-01 00:00:01   bone 2637 #> 481 107.7     10 1968 1968-10-01 12:00:00  blood 2638 #> 482 107.7     10 1968 1968-10-01 12:00:00   bone 2638 #> 483  86.0     11 1968 1968-11-01 00:00:01  blood 2639 #> 484  86.0     11 1968 1968-11-01 00:00:01   bone 2639 #> 485 109.8     12 1968 1968-12-01 12:00:01  blood 2640 #> 486 109.8     12 1968 1968-12-01 12:00:01   bone 2640 #> 487 104.4      1 1969 1969-01-01 00:00:00  blood 2641 #> 488 104.4      1 1969 1969-01-01 00:00:00   bone 2641 #> 489 120.5      2 1969 1969-01-31 10:00:01  blood 2642 #> 490 120.5      2 1969 1969-01-31 10:00:01   bone 2642 #> 491 135.8      3 1969 1969-03-02 20:00:01  blood 2643 #> 492 135.8      3 1969 1969-03-02 20:00:01   bone 2643 #> 493 106.8      4 1969 1969-04-02 06:00:00  blood 2644 #> 494 106.8      4 1969 1969-04-02 06:00:00   bone 2644 #> 495 120.0      5 1969 1969-05-02 16:00:01  blood 2645 #> 496 120.0      5 1969 1969-05-02 16:00:01   bone 2645 #> 497 106.0      6 1969 1969-06-02 02:00:01  blood 2646 #> 498 106.0      6 1969 1969-06-02 02:00:01   bone 2646 #> 499  96.8      7 1969 1969-07-02 12:00:00  blood 2647 #> 500  96.8      7 1969 1969-07-02 12:00:00   bone 2647 #> 501  98.0      8 1969 1969-08-01 22:00:01  blood 2648 #> 502  98.0      8 1969 1969-08-01 22:00:01   bone 2648 #> 503  91.3      9 1969 1969-09-01 08:00:01  blood 2649 #> 504  91.3      9 1969 1969-09-01 08:00:01   bone 2649 #> 505  95.7     10 1969 1969-10-01 18:00:00  blood 2650 #> 506  95.7     10 1969 1969-10-01 18:00:00   bone 2650 #> 507  93.5     11 1969 1969-11-01 04:00:01  blood 2651 #> 508  93.5     11 1969 1969-11-01 04:00:01   bone 2651 #> 509  97.9     12 1969 1969-12-01 14:00:01  blood 2652 #> 510  97.9     12 1969 1969-12-01 14:00:01   bone 2652 #> 511 111.5      1 1970 1970-01-01 00:00:00  blood 2653 #> 512 111.5      1 1970 1970-01-01 00:00:00   bone 2653 #> 513 127.8      2 1970 1970-01-31 10:00:00  blood 2654 #> 514 127.8      2 1970 1970-01-31 10:00:00   bone 2654 #> 515 102.9      3 1970 1970-03-02 20:00:00  blood 2655 #> 516 102.9      3 1970 1970-03-02 20:00:00   bone 2655 #> 517 109.5      4 1970 1970-04-02 06:00:00  blood 2656 #> 518 109.5      4 1970 1970-04-02 06:00:00   bone 2656 #> 519 127.5      5 1970 1970-05-02 16:00:00  blood 2657 #> 520 127.5      5 1970 1970-05-02 16:00:00   bone 2657 #> 521 106.8      6 1970 1970-06-02 02:00:00  blood 2658 #> 522 106.8      6 1970 1970-06-02 02:00:00   bone 2658 #> 523 112.5      7 1970 1970-07-02 12:00:00  blood 2659 #> 524 112.5      7 1970 1970-07-02 12:00:00   bone 2659 #> 525  93.0      8 1970 1970-08-01 22:00:00  blood 2660 #> 526  93.0      8 1970 1970-08-01 22:00:00   bone 2660 #> 527  99.5      9 1970 1970-09-01 08:00:00  blood 2661 #> 528  99.5      9 1970 1970-09-01 08:00:00   bone 2661 #> 529  86.6     10 1970 1970-10-01 18:00:00  blood 2662 #> 530  86.6     10 1970 1970-10-01 18:00:00   bone 2662 #> 531  95.2     11 1970 1970-11-01 04:00:00  blood 2663 #> 532  95.2     11 1970 1970-11-01 04:00:00   bone 2663 #> 533  83.5     12 1970 1970-12-01 14:00:00  blood 2664 #> 534  83.5     12 1970 1970-12-01 14:00:00   bone 2664 #> 535  91.3      1 1971 1971-01-01 00:00:00  blood 2665 #> 536  91.3      1 1971 1971-01-01 00:00:00   bone 2665 #> 537  79.0      2 1971 1971-01-31 10:00:00  blood 2666 #> 538  79.0      2 1971 1971-01-31 10:00:00   bone 2666 #> 539  60.7      3 1971 1971-03-02 20:00:00  blood 2667 #> 540  60.7      3 1971 1971-03-02 20:00:00   bone 2667 #> 541  71.8      4 1971 1971-04-02 06:00:00  blood 2668 #> 542  71.8      4 1971 1971-04-02 06:00:00   bone 2668 #> 543  57.5      5 1971 1971-05-02 16:00:00  blood 2669 #> 544  57.5      5 1971 1971-05-02 16:00:00   bone 2669 #> 545  49.8      6 1971 1971-06-02 02:00:00  blood 2670 #> 546  49.8      6 1971 1971-06-02 02:00:00   bone 2670 #> 547  81.0      7 1971 1971-07-02 12:00:00  blood 2671 #> 548  81.0      7 1971 1971-07-02 12:00:00   bone 2671 #> 549  61.4      8 1971 1971-08-01 22:00:00  blood 2672 #> 550  61.4      8 1971 1971-08-01 22:00:00   bone 2672 #> 551  50.2      9 1971 1971-09-01 08:00:00  blood 2673 #> 552  50.2      9 1971 1971-09-01 08:00:00   bone 2673 #> 553  51.7     10 1971 1971-10-01 18:00:00  blood 2674 #> 554  51.7     10 1971 1971-10-01 18:00:00   bone 2674 #> 555  63.2     11 1971 1971-11-01 04:00:00  blood 2675 #> 556  63.2     11 1971 1971-11-01 04:00:00   bone 2675 #> 557  82.2     12 1971 1971-12-01 14:00:00  blood 2676 #> 558  82.2     12 1971 1971-12-01 14:00:00   bone 2676 #> 559  61.5      1 1972 1972-01-01 00:00:00  blood 2677 #> 560  61.5      1 1972 1972-01-01 00:00:00   bone 2677 #> 561  88.4      2 1972 1972-01-31 12:00:00  blood 2678 #> 562  88.4      2 1972 1972-01-31 12:00:00   bone 2678 #> 563  80.1      3 1972 1972-03-02 00:00:00  blood 2679 #> 564  80.1      3 1972 1972-03-02 00:00:00   bone 2679 #> 565  63.2      4 1972 1972-04-01 12:00:00  blood 2680 #> 566  63.2      4 1972 1972-04-01 12:00:00   bone 2680 #> 567  80.5      5 1972 1972-05-02 00:00:00  blood 2681 #> 568  80.5      5 1972 1972-05-02 00:00:00   bone 2681 #> 569  88.0      6 1972 1972-06-01 12:00:00  blood 2682 #> 570  88.0      6 1972 1972-06-01 12:00:00   bone 2682 #> 571  76.5      7 1972 1972-07-02 00:00:00  blood 2683 #> 572  76.5      7 1972 1972-07-02 00:00:00   bone 2683 #> 573  76.8      8 1972 1972-08-01 12:00:00  blood 2684 #> 574  76.8      8 1972 1972-08-01 12:00:00   bone 2684 #> 575  64.0      9 1972 1972-09-01 00:00:00  blood 2685 #> 576  64.0      9 1972 1972-09-01 00:00:00   bone 2685 #> 577  61.3     10 1972 1972-10-01 12:00:00  blood 2686 #> 578  61.3     10 1972 1972-10-01 12:00:00   bone 2686 #> 579  41.6     11 1972 1972-11-01 00:00:00  blood 2687 #> 580  41.6     11 1972 1972-11-01 00:00:00   bone 2687 #> 581  45.3     12 1972 1972-12-01 12:00:00  blood 2688 #> 582  45.3     12 1972 1972-12-01 12:00:00   bone 2688 #> 583  43.4      1 1973 1973-01-01 00:00:00  blood 2689 #> 584  43.4      1 1973 1973-01-01 00:00:00   bone 2689 #> 585  42.9      2 1973 1973-01-31 10:00:00  blood 2690 #> 586  42.9      2 1973 1973-01-31 10:00:00   bone 2690 #> 587  46.0      3 1973 1973-03-02 20:00:00  blood 2691 #> 588  46.0      3 1973 1973-03-02 20:00:00   bone 2691 #> 589  57.7      4 1973 1973-04-02 06:00:00  blood 2692 #> 590  57.7      4 1973 1973-04-02 06:00:00   bone 2692 #> 591  42.4      5 1973 1973-05-02 16:00:00  blood 2693 #> 592  42.4      5 1973 1973-05-02 16:00:00   bone 2693 #> 593  39.5      6 1973 1973-06-02 02:00:00  blood 2694 #> 594  39.5      6 1973 1973-06-02 02:00:00   bone 2694 #> 595  23.1      7 1973 1973-07-02 12:00:00  blood 2695 #> 596  23.1      7 1973 1973-07-02 12:00:00   bone 2695 #> 597  25.6      8 1973 1973-08-01 22:00:00  blood 2696 #> 598  25.6      8 1973 1973-08-01 22:00:00   bone 2696 #> 599  59.3      9 1973 1973-09-01 08:00:00  blood 2697 #> 600  59.3      9 1973 1973-09-01 08:00:00   bone 2697 #> 601  30.7     10 1973 1973-10-01 18:00:00  blood 2698 #> 602  30.7     10 1973 1973-10-01 18:00:00   bone 2698 #> 603  23.9     11 1973 1973-11-01 04:00:00  blood 2699 #> 604  23.9     11 1973 1973-11-01 04:00:00   bone 2699 #> 605  23.3     12 1973 1973-12-01 14:00:00  blood 2700 #> 606  23.3     12 1973 1973-12-01 14:00:00   bone 2700 #> 607  27.6      1 1974 1974-01-01 00:00:00  blood 2701 #> 608  27.6      1 1974 1974-01-01 00:00:00   bone 2701 #> 609  26.0      2 1974 1974-01-31 10:00:00  blood 2702 #> 610  26.0      2 1974 1974-01-31 10:00:00   bone 2702 #> 611  21.3      3 1974 1974-03-02 20:00:00  blood 2703 #> 612  21.3      3 1974 1974-03-02 20:00:00   bone 2703 #> 613  40.3      4 1974 1974-04-02 06:00:00  blood 2704 #> 614  40.3      4 1974 1974-04-02 06:00:00   bone 2704 #> 615  39.5      5 1974 1974-05-02 16:00:00  blood 2705 #> 616  39.5      5 1974 1974-05-02 16:00:00   bone 2705 #> 617  36.0      6 1974 1974-06-02 02:00:00  blood 2706 #> 618  36.0      6 1974 1974-06-02 02:00:00   bone 2706 #> 619  55.8      7 1974 1974-07-02 12:00:00  blood 2707 #> 620  55.8      7 1974 1974-07-02 12:00:00   bone 2707 #> 621  33.6      8 1974 1974-08-01 22:00:00  blood 2708 #> 622  33.6      8 1974 1974-08-01 22:00:00   bone 2708 #> 623  40.2      9 1974 1974-09-01 08:00:00  blood 2709 #> 624  40.2      9 1974 1974-09-01 08:00:00   bone 2709 #> 625  47.1     10 1974 1974-10-01 18:00:00  blood 2710 #> 626  47.1     10 1974 1974-10-01 18:00:00   bone 2710 #> 627  25.0     11 1974 1974-11-01 04:00:00  blood 2711 #> 628  25.0     11 1974 1974-11-01 04:00:00   bone 2711 #> 629  20.5     12 1974 1974-12-01 14:00:00  blood 2712 #> 630  20.5     12 1974 1974-12-01 14:00:00   bone 2712 #> 631  18.9      1 1975 1975-01-01 00:00:00  blood 2713 #> 632  18.9      1 1975 1975-01-01 00:00:00   bone 2713 #> 633  11.5      2 1975 1975-01-31 10:00:00  blood 2714 #> 634  11.5      2 1975 1975-01-31 10:00:00   bone 2714 #> 635  11.5      3 1975 1975-03-02 20:00:00  blood 2715 #> 636  11.5      3 1975 1975-03-02 20:00:00   bone 2715 #> 637   5.1      4 1975 1975-04-02 06:00:00  blood 2716 #> 638   5.1      4 1975 1975-04-02 06:00:00   bone 2716 #> 639   9.0      5 1975 1975-05-02 16:00:00  blood 2717 #> 640   9.0      5 1975 1975-05-02 16:00:00   bone 2717 #> 641  11.4      6 1975 1975-06-02 02:00:00  blood 2718 #> 642  11.4      6 1975 1975-06-02 02:00:00   bone 2718 #> 643  28.2      7 1975 1975-07-02 12:00:00  blood 2719 #> 644  28.2      7 1975 1975-07-02 12:00:00   bone 2719 #> 645  39.7      8 1975 1975-08-01 22:00:00  blood 2720 #> 646  39.7      8 1975 1975-08-01 22:00:00   bone 2720 #> 647  13.9      9 1975 1975-09-01 08:00:00  blood 2721 #> 648  13.9      9 1975 1975-09-01 08:00:00   bone 2721 #> 649   9.1     10 1975 1975-10-01 18:00:00  blood 2722 #> 650   9.1     10 1975 1975-10-01 18:00:00   bone 2722 #> 651  19.4     11 1975 1975-11-01 04:00:00  blood 2723 #> 652  19.4     11 1975 1975-11-01 04:00:00   bone 2723 #> 653   7.8     12 1975 1975-12-01 14:00:00  blood 2724 #> 654   7.8     12 1975 1975-12-01 14:00:00   bone 2724 #> 655   8.1      1 1976 1976-01-01 00:00:00  blood 2725 #> 656   8.1      1 1976 1976-01-01 00:00:00   bone 2725 #> 657   4.3      2 1976 1976-01-31 12:00:00  blood 2726 #> 658   4.3      2 1976 1976-01-31 12:00:00   bone 2726 #> 659  21.9      3 1976 1976-03-02 00:00:00  blood 2727 #> 660  21.9      3 1976 1976-03-02 00:00:00   bone 2727 #> 661  18.8      4 1976 1976-04-01 12:00:00  blood 2728 #> 662  18.8      4 1976 1976-04-01 12:00:00   bone 2728 #> 663  12.4      5 1976 1976-05-02 00:00:00  blood 2729 #> 664  12.4      5 1976 1976-05-02 00:00:00   bone 2729 #> 665  12.2      6 1976 1976-06-01 12:00:00  blood 2730 #> 666  12.2      6 1976 1976-06-01 12:00:00   bone 2730 #> 667   1.9      7 1976 1976-07-02 00:00:00  blood 2731 #> 668   1.9      7 1976 1976-07-02 00:00:00   bone 2731 #> 669  16.4      8 1976 1976-08-01 12:00:00  blood 2732 #> 670  16.4      8 1976 1976-08-01 12:00:00   bone 2732 #> 671  13.5      9 1976 1976-09-01 00:00:00  blood 2733 #> 672  13.5      9 1976 1976-09-01 00:00:00   bone 2733 #> 673  20.6     10 1976 1976-10-01 12:00:00  blood 2734 #> 674  20.6     10 1976 1976-10-01 12:00:00   bone 2734 #> 675   5.2     11 1976 1976-11-01 00:00:00  blood 2735 #> 676   5.2     11 1976 1976-11-01 00:00:00   bone 2735 #> 677  15.3     12 1976 1976-12-01 12:00:00  blood 2736 #> 678  15.3     12 1976 1976-12-01 12:00:00   bone 2736 #> 679  16.4      1 1977 1977-01-01 00:00:00  blood 2737 #> 680  16.4      1 1977 1977-01-01 00:00:00   bone 2737 #> 681  23.1      2 1977 1977-01-31 10:00:00  blood 2738 #> 682  23.1      2 1977 1977-01-31 10:00:00   bone 2738 #> 683   8.7      3 1977 1977-03-02 20:00:00  blood 2739 #> 684   8.7      3 1977 1977-03-02 20:00:00   bone 2739 #> 685  12.9      4 1977 1977-04-02 06:00:00  blood 2740 #> 686  12.9      4 1977 1977-04-02 06:00:00   bone 2740 #> 687  18.6      5 1977 1977-05-02 16:00:00  blood 2741 #> 688  18.6      5 1977 1977-05-02 16:00:00   bone 2741 #> 689  38.5      6 1977 1977-06-02 02:00:00  blood 2742 #> 690  38.5      6 1977 1977-06-02 02:00:00   bone 2742 #> 691  21.4      7 1977 1977-07-02 12:00:00  blood 2743 #> 692  21.4      7 1977 1977-07-02 12:00:00   bone 2743 #> 693  30.1      8 1977 1977-08-01 22:00:00  blood 2744 #> 694  30.1      8 1977 1977-08-01 22:00:00   bone 2744 #> 695  44.0      9 1977 1977-09-01 08:00:00  blood 2745 #> 696  44.0      9 1977 1977-09-01 08:00:00   bone 2745 #> 697  43.8     10 1977 1977-10-01 18:00:00  blood 2746 #> 698  43.8     10 1977 1977-10-01 18:00:00   bone 2746 #> 699  29.1     11 1977 1977-11-01 04:00:00  blood 2747 #> 700  29.1     11 1977 1977-11-01 04:00:00   bone 2747 #> 701  43.2     12 1977 1977-12-01 14:00:00  blood 2748 #> 702  43.2     12 1977 1977-12-01 14:00:00   bone 2748 #> 703  51.9      1 1978 1978-01-01 00:00:00  blood 2749 #> 704  51.9      1 1978 1978-01-01 00:00:00   bone 2749 #> 705  93.6      2 1978 1978-01-31 10:00:00  blood 2750 #> 706  93.6      2 1978 1978-01-31 10:00:00   bone 2750 #> 707  76.5      3 1978 1978-03-02 20:00:00  blood 2751 #> 708  76.5      3 1978 1978-03-02 20:00:00   bone 2751 #> 709  99.7      4 1978 1978-04-02 06:00:00  blood 2752 #> 710  99.7      4 1978 1978-04-02 06:00:00   bone 2752 #> 711  82.7      5 1978 1978-05-02 16:00:00  blood 2753 #> 712  82.7      5 1978 1978-05-02 16:00:00   bone 2753 #> 713  95.1      6 1978 1978-06-02 02:00:00  blood 2754 #> 714  95.1      6 1978 1978-06-02 02:00:00   bone 2754 #> 715  70.4      7 1978 1978-07-02 12:00:00  blood 2755 #> 716  70.4      7 1978 1978-07-02 12:00:00   bone 2755 #> 717  58.1      8 1978 1978-08-01 22:00:00  blood 2756 #> 718  58.1      8 1978 1978-08-01 22:00:00   bone 2756 #> 719 138.2      9 1978 1978-09-01 08:00:00  blood 2757 #> 720 138.2      9 1978 1978-09-01 08:00:00   bone 2757 #> 721 125.1     10 1978 1978-10-01 18:00:00  blood 2758 #> 722 125.1     10 1978 1978-10-01 18:00:00   bone 2758 #> 723  97.9     11 1978 1978-11-01 04:00:00  blood 2759 #> 724  97.9     11 1978 1978-11-01 04:00:00   bone 2759 #> 725 122.7     12 1978 1978-12-01 14:00:00  blood 2760 #> 726 122.7     12 1978 1978-12-01 14:00:00   bone 2760 #> 727 166.6      1 1979 1979-01-01 00:00:00  blood 2761 #> 728 166.6      1 1979 1979-01-01 00:00:00   bone 2761 #> 729 137.5      2 1979 1979-01-31 10:00:00  blood 2762 #> 730 137.5      2 1979 1979-01-31 10:00:00   bone 2762 #> 731 138.0      3 1979 1979-03-02 20:00:00  blood 2763 #> 732 138.0      3 1979 1979-03-02 20:00:00   bone 2763 #> 733 101.5      4 1979 1979-04-02 06:00:00  blood 2764 #> 734 101.5      4 1979 1979-04-02 06:00:00   bone 2764 #> 735 134.4      5 1979 1979-05-02 16:00:00  blood 2765 #> 736 134.4      5 1979 1979-05-02 16:00:00   bone 2765 #> 737 149.5      6 1979 1979-06-02 02:00:00  blood 2766 #> 738 149.5      6 1979 1979-06-02 02:00:00   bone 2766 #> 739 159.4      7 1979 1979-07-02 12:00:00  blood 2767 #> 740 159.4      7 1979 1979-07-02 12:00:00   bone 2767 #> 741 142.2      8 1979 1979-08-01 22:00:00  blood 2768 #> 742 142.2      8 1979 1979-08-01 22:00:00   bone 2768 #> 743 188.4      9 1979 1979-09-01 08:00:00  blood 2769 #> 744 188.4      9 1979 1979-09-01 08:00:00   bone 2769 #> 745 186.2     10 1979 1979-10-01 18:00:00  blood 2770 #> 746 186.2     10 1979 1979-10-01 18:00:00   bone 2770 #> 747 183.3     11 1979 1979-11-01 04:00:00  blood 2771 #> 748 183.3     11 1979 1979-11-01 04:00:00   bone 2771 #> 749 176.3     12 1979 1979-12-01 14:00:00  blood 2772 #> 750 176.3     12 1979 1979-12-01 14:00:00   bone 2772 #> 751 159.6      1 1980 1980-01-01 00:00:00  blood 2773 #> 752 159.6      1 1980 1980-01-01 00:00:00   bone 2773 #> 753 155.0      2 1980 1980-01-31 12:00:00  blood 2774 #> 754 155.0      2 1980 1980-01-31 12:00:00   bone 2774 #> 755 126.2      3 1980 1980-03-02 00:00:00  blood 2775 #> 756 126.2      3 1980 1980-03-02 00:00:00   bone 2775 #> 757 164.1      4 1980 1980-04-01 12:00:00  blood 2776 #> 758 164.1      4 1980 1980-04-01 12:00:00   bone 2776 #> 759 179.9      5 1980 1980-05-02 00:00:00  blood 2777 #> 760 179.9      5 1980 1980-05-02 00:00:00   bone 2777 #> 761 157.3      6 1980 1980-06-01 12:00:00  blood 2778 #> 762 157.3      6 1980 1980-06-01 12:00:00   bone 2778 #> 763 136.3      7 1980 1980-07-02 00:00:00  blood 2779 #> 764 136.3      7 1980 1980-07-02 00:00:00   bone 2779 #> 765 135.4      8 1980 1980-08-01 12:00:00  blood 2780 #> 766 135.4      8 1980 1980-08-01 12:00:00   bone 2780 #> 767 155.0      9 1980 1980-09-01 00:00:00  blood 2781 #> 768 155.0      9 1980 1980-09-01 00:00:00   bone 2781 #> 769 164.7     10 1980 1980-10-01 12:00:00  blood 2782 #> 770 164.7     10 1980 1980-10-01 12:00:00   bone 2782 #> 771 147.9     11 1980 1980-11-01 00:00:00  blood 2783 #> 772 147.9     11 1980 1980-11-01 00:00:00   bone 2783 #> 773 174.4     12 1980 1980-12-01 12:00:00  blood 2784 #> 774 174.4     12 1980 1980-12-01 12:00:00   bone 2784 #> 775 114.0      1 1981 1981-01-01 00:00:00  blood 2785 #> 776 114.0      1 1981 1981-01-01 00:00:00   bone 2785 #> 777 141.3      2 1981 1981-01-31 10:00:00  blood 2786 #> 778 141.3      2 1981 1981-01-31 10:00:00   bone 2786 #> 779 135.5      3 1981 1981-03-02 20:00:00  blood 2787 #> 780 135.5      3 1981 1981-03-02 20:00:00   bone 2787 #> 781 156.4      4 1981 1981-04-02 06:00:00  blood 2788 #> 782 156.4      4 1981 1981-04-02 06:00:00   bone 2788 #> 783 127.5      5 1981 1981-05-02 16:00:00  blood 2789 #> 784 127.5      5 1981 1981-05-02 16:00:00   bone 2789 #> 785  90.0      6 1981 1981-06-02 02:00:00  blood 2790 #> 786  90.0      6 1981 1981-06-02 02:00:00   bone 2790 #> 787 143.8      7 1981 1981-07-02 12:00:00  blood 2791 #> 788 143.8      7 1981 1981-07-02 12:00:00   bone 2791 #> 789 158.7      8 1981 1981-08-01 22:00:00  blood 2792 #> 790 158.7      8 1981 1981-08-01 22:00:00   bone 2792 #> 791 167.3      9 1981 1981-09-01 08:00:00  blood 2793 #> 792 167.3      9 1981 1981-09-01 08:00:00   bone 2793 #> 793 162.4     10 1981 1981-10-01 18:00:00  blood 2794 #> 794 162.4     10 1981 1981-10-01 18:00:00   bone 2794 #> 795 137.5     11 1981 1981-11-01 04:00:00  blood 2795 #> 796 137.5     11 1981 1981-11-01 04:00:00   bone 2795 #> 797 150.1     12 1981 1981-12-01 14:00:00  blood 2796 #> 798 150.1     12 1981 1981-12-01 14:00:00   bone 2796 #> 799 111.2      1 1982 1982-01-01 00:00:00  blood 2797 #> 800 111.2      1 1982 1982-01-01 00:00:00   bone 2797 #> 801 163.6      2 1982 1982-01-31 10:00:00  blood 2798 #> 802 163.6      2 1982 1982-01-31 10:00:00   bone 2798 #> 803 153.8      3 1982 1982-03-02 20:00:00  blood 2799 #> 804 153.8      3 1982 1982-03-02 20:00:00   bone 2799 #> 805 122.0      4 1982 1982-04-02 06:00:00  blood 2800 #> 806 122.0      4 1982 1982-04-02 06:00:00   bone 2800 #> 807  82.2      5 1982 1982-05-02 16:00:00  blood 2801 #> 808  82.2      5 1982 1982-05-02 16:00:00   bone 2801 #> 809 110.4      6 1982 1982-06-02 02:00:00  blood 2802 #> 810 110.4      6 1982 1982-06-02 02:00:00   bone 2802 #> 811 106.1      7 1982 1982-07-02 12:00:00  blood 2803 #> 812 106.1      7 1982 1982-07-02 12:00:00   bone 2803 #> 813 107.6      8 1982 1982-08-01 22:00:00  blood 2804 #> 814 107.6      8 1982 1982-08-01 22:00:00   bone 2804 #> 815 118.8      9 1982 1982-09-01 08:00:00  blood 2805 #> 816 118.8      9 1982 1982-09-01 08:00:00   bone 2805 #> 817  94.7     10 1982 1982-10-01 18:00:00  blood 2806 #> 818  94.7     10 1982 1982-10-01 18:00:00   bone 2806 #> 819  98.1     11 1982 1982-11-01 04:00:00  blood 2807 #> 820  98.1     11 1982 1982-11-01 04:00:00   bone 2807 #> 821 127.0     12 1982 1982-12-01 14:00:00  blood 2808 #> 822 127.0     12 1982 1982-12-01 14:00:00   bone 2808 #> 823  84.3      1 1983 1983-01-01 00:00:00  blood 2809 #> 824  84.3      1 1983 1983-01-01 00:00:00   bone 2809 #> 825  51.0      2 1983 1983-01-31 10:00:00  blood 2810 #> 826  51.0      2 1983 1983-01-31 10:00:00   bone 2810 #> 827  66.5      3 1983 1983-03-02 20:00:00  blood 2811 #> 828  66.5      3 1983 1983-03-02 20:00:00   bone 2811 #> 829  80.7      4 1983 1983-04-02 06:00:00  blood 2812 #> 830  80.7      4 1983 1983-04-02 06:00:00   bone 2812 #> 831  99.2      5 1983 1983-05-02 16:00:00  blood 2813 #> 832  99.2      5 1983 1983-05-02 16:00:00   bone 2813 #> 833  91.1      6 1983 1983-06-02 02:00:00  blood 2814 #> 834  91.1      6 1983 1983-06-02 02:00:00   bone 2814 #> 835  82.2      7 1983 1983-07-02 12:00:00  blood 2815 #> 836  82.2      7 1983 1983-07-02 12:00:00   bone 2815 #> 837  71.8      8 1983 1983-08-01 22:00:00  blood 2816 #> 838  71.8      8 1983 1983-08-01 22:00:00   bone 2816 #> 839  50.3      9 1983 1983-09-01 08:00:00  blood 2817 #> 840  50.3      9 1983 1983-09-01 08:00:00   bone 2817 #> 841  55.8     10 1983 1983-10-01 18:00:00  blood 2818 #> 842  55.8     10 1983 1983-10-01 18:00:00   bone 2818 #> 843  33.3     11 1983 1983-11-01 04:00:00  blood 2819 #> 844  33.3     11 1983 1983-11-01 04:00:00   bone 2819 #> 845  33.4     12 1983 1983-12-01 14:00:00  blood 2820 #> 846  33.4     12 1983 1983-12-01 14:00:00   bone 2820 #>   # An xts object example library(xts) #> Warning: package 'xts' was built under R version 4.3.2 #> Loading required package: zoo #> Warning: package 'zoo' was built under R version 4.3.2 #>  #> Attaching package: 'zoo' #> The following objects are masked from 'package:base': #>  #>     as.Date, as.Date.numeric dates <- seq(as.Date(\\\"2001-05-01\\\"), length=30, by=\\\"quarter\\\") data  <- cbind(c(gas = rpois(30, cumprod(1+rnorm(30, mean = 0.01, sd = 0.001)))), c(oil = rpois(30, cumprod(1+rnorm(30, mean = 0.01, sd = 0.001))))) series <- xts(x = data, order.by = dates) colnames(series) <- c('gas', 'oil') head(series) #>            gas oil #> 2001-05-01   1   0 #> 2001-08-01   1   5 #> 2001-11-01   0   0 #> 2002-02-01   0   1 #> 2002-05-01   2   1 #> 2002-08-01   0   1 series_to_mvgam(series, freq = 4, train_prop = 0.85) #> $data_train #>    y season year       date series time #> 1  1      2 2001 2001-05-01    gas    1 #> 2  0      2 2001 2001-05-01    oil    1 #> 3  1      3 2001 2001-08-01    gas    2 #> 4  5      3 2001 2001-08-01    oil    2 #> 5  0      4 2001 2001-11-01    gas    3 #> 6  0      4 2001 2001-11-01    oil    3 #> 7  0      1 2002 2002-02-01    gas    4 #> 8  1      1 2002 2002-02-01    oil    4 #> 9  2      2 2002 2002-05-01    gas    5 #> 10 1      2 2002 2002-05-01    oil    5 #> 11 0      3 2002 2002-08-01    gas    6 #> 12 1      3 2002 2002-08-01    oil    6 #> 13 2      4 2002 2002-11-01    gas    7 #> 14 3      4 2002 2002-11-01    oil    7 #> 15 2      1 2003 2003-02-01    gas    8 #> 16 0      1 2003 2003-02-01    oil    8 #> 17 1      2 2003 2003-05-01    gas    9 #> 18 1      2 2003 2003-05-01    oil    9 #> 19 3      3 2003 2003-08-01    gas   10 #> 20 0      3 2003 2003-08-01    oil   10 #> 21 0      4 2003 2003-11-01    gas   11 #> 22 1      4 2003 2003-11-01    oil   11 #> 23 2      1 2004 2004-02-01    gas   12 #> 24 1      1 2004 2004-02-01    oil   12 #> 25 0      2 2004 2004-05-01    gas   13 #> 26 1      2 2004 2004-05-01    oil   13 #> 27 3      3 2004 2004-08-01    gas   14 #> 28 0      3 2004 2004-08-01    oil   14 #> 29 2      4 2004 2004-11-01    gas   15 #> 30 2      4 2004 2004-11-01    oil   15 #> 31 1      1 2005 2005-02-01    gas   16 #> 32 5      1 2005 2005-02-01    oil   16 #> 33 1      2 2005 2005-05-01    gas   17 #> 34 3      2 2005 2005-05-01    oil   17 #> 35 0      3 2005 2005-08-01    gas   18 #> 36 1      3 2005 2005-08-01    oil   18 #> 37 2      4 2005 2005-11-01    gas   19 #> 38 2      4 2005 2005-11-01    oil   19 #> 39 1      1 2006 2006-02-01    gas   20 #> 40 1      1 2006 2006-02-01    oil   20 #> 41 1      2 2006 2006-05-01    gas   21 #> 42 0      2 2006 2006-05-01    oil   21 #> 43 2      3 2006 2006-08-01    gas   22 #> 44 1      3 2006 2006-08-01    oil   22 #> 45 0      4 2006 2006-11-01    gas   23 #> 46 0      4 2006 2006-11-01    oil   23 #> 47 0      1 2007 2007-02-01    gas   24 #> 48 0      1 2007 2007-02-01    oil   24 #> 49 2      2 2007 2007-05-01    gas   25 #> 50 1      2 2007 2007-05-01    oil   25 #>  #> $data_test #>    y season year       date series time #> 1  1      3 2007 2007-08-01    gas   26 #> 2  3      3 2007 2007-08-01    oil   26 #> 3  0      4 2007 2007-11-01    gas   27 #> 4  2      4 2007 2007-11-01    oil   27 #> 5  0      1 2008 2008-02-01    gas   28 #> 6  0      1 2008 2008-02-01    oil   28 #> 7  3      2 2008 2008-05-01    gas   29 #> 8  2      2 2008 2008-05-01    oil   29 #> 9  2      3 2008 2008-08-01    gas   30 #> 10 2      3 2008 2008-08-01    oil   30 #>\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/sim_mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Simulate a set of discrete time series for mvgam modelling — sim_mvgam\",\"title\":\"Simulate a set of discrete time series for mvgam modelling — sim_mvgam\",\"text\":\"function simulates discrete time series data fitting multivariate GAM includes shared seasonality dependence state-space latent dynamic factors. Random dependencies among series, .e. correlations long-term trends, included form correlated loadings latent dynamic factors\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/sim_mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Simulate a set of discrete time series for mvgam modelling — sim_mvgam\",\"text\":\"\",\"code\":\"sim_mvgam(   T = 100,   n_series = 3,   seasonality = \\\"shared\\\",   use_lv = FALSE,   n_lv = 1,   trend_model = \\\"RW\\\",   drift = FALSE,   prop_trend = 0.2,   trend_rel,   freq = 12,   family = poisson(),   phi,   shape,   sigma,   nu,   mu,   prop_missing = 0,   prop_train = 0.85 )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/sim_mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Simulate a set of discrete time series for mvgam modelling — sim_mvgam\",\"text\":\"T integer. Number observations (timepoints) n_series integer. Number discrete time series seasonality character. Either shared, meaning series share exact seasonal pattern, hierarchical, meaning global seasonality series' pattern can deviate slightly use_lv logical. TRUE, use dynamic factors estimate series' latent trends reduced dimension format. FALSE, estimate independent latent trends series n_lv integer. Number latent dynamic factors generating series' trends trend_model character specifying time series dynamics latent trend. Options : None (latent trend component; .e. GAM component contributes linear predictor, observation process source error; similarly estimated gam) RW (random walk possible drift) AR1 (possible drift) AR2 (possible drift) AR3 (possible drift) VAR1 (contemporaneously uncorrelated VAR1) VAR1cor (contemporaneously correlated VAR1) GP (Gaussian Process squared exponential kernel) See mvgam_trends details drift logical, simulate drift term trend prop_trend numeric. Relative importance trend series. 0 1 trend_rel Depracated. Use prop_trend instead freq integer. seasonal frequency series family family specifying exponential observation family series. Currently supported families : nb(), poisson(), tweedie(), gaussian(), betar(), lognormal(), student() Gamma() phi vector dispersion parameters series (.e. size Negative Binomial phi Tweedie Beta). length(phi) < n_series, first element phi replicated n_series times. Defaults 5 Negative Binomial Tweedie; 10 Beta shape vector shape parameters series (.e. shape Gamma) length(shape) < n_series, first element shape replicated n_series times. Defaults 10 sigma vector scale parameters series (.e. sd Normal Student-T, log(sd) LogNormal). length(sigma) < n_series, first element sigma replicated n_series times. Defaults 0.5 Normal Student-T; 0.2 Lognormal nu vector degrees freedom parameters series (.e. nu Student-T) length(nu) < n_series, first element nu replicated n_series times. Defaults 3 mu vector location parameters series. length(mu) < n_series, first element mu replicated n_series times. Defaults small random values -0.5 0.5 link scale prop_missing numeric stating proportion observations missing. 0 0.8, inclusive prop_train numeric stating proportion data use training. 0.2 1\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/sim_mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Simulate a set of discrete time series for mvgam modelling — sim_mvgam\",\"text\":\"list object containing outputs needed mvgam, including 'data_train' 'data_test', well additional information simulated seasonality trend dependencies\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/sim_mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Simulate a set of discrete time series for mvgam modelling — sim_mvgam\",\"text\":\"\",\"code\":\"#Simulate series with observations bounded at 0 and 1 (Beta responses) sim_data <- sim_mvgam(family = betar(), trend_model = 'GP', prop_trend = 0.6) plot_mvgam_series(data = sim_data$data_train, series = 'all')   #Now simulate series with overdispersed discrete observations sim_data <- sim_mvgam(family = nb(), trend_model = 'GP', prop_trend = 0.6, phi = 10) plot_mvgam_series(data = sim_data$data_train, series = 'all')\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/summary.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Summary for a fitted mvgam object — summary.mvgam\",\"title\":\"Summary for a fitted mvgam object — summary.mvgam\",\"text\":\"functions take fitted mvgam object return various useful summaries\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/summary.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Summary for a fitted mvgam object — summary.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam summary(object, include_betas = TRUE, digits = 2, ...)  # S3 method for mvgam_prefit summary(object, ...)  # S3 method for mvgam coef(object, summarise = TRUE, ...)\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/summary.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Summary for a fitted mvgam object — summary.mvgam\",\"text\":\"object list object returned mvgam include_betas Logical. Print summary includes posterior summaries linear predictor beta coefficients (including spline coefficients)? Defaults TRUE use FALSE concise summary digits number significant digits printing summary; defaults 2. ... Ignored summarise logical. Summaries coefficients returned TRUE. Otherwise full posterior distribution returned\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/summary.mvgam.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Summary for a fitted mvgam object — summary.mvgam\",\"text\":\"summary.mvgam summary.mvgam_prefit, list printed -screen showing summaries model coef.mvgam, either matrix posterior coefficient distributions (summarise == FALSE data.frame coefficient summaries)\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/summary.mvgam.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Summary for a fitted mvgam object — summary.mvgam\",\"text\":\"summary.mvgam summary.mvgam_prefit return brief summaries model's call, along posterior intervals key parameters model. Note smooths extra penalties null space, summaries rho parameters may include penalty terms number smooths original model formula. Approximate p-values smooth terms also returned, methods used calculation following used mgcv equivalents (see summary.gam details). Estimated Degrees Freedom (edf) smooth terms computed using edf.type = 1 described documentation jagam. Experiments suggest p-values tend conservative might returned equivalent model fit summary.gam using method = 'REML' coef.mvgam returns either summaries full posterior estimates GAM component coefficients\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/summary.mvgam.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"Summary for a fitted mvgam object — summary.mvgam\",\"text\":\"Nicholas J Clark\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/update.mvgam.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Update an existing mvgam object — update.mvgam\",\"title\":\"Update an existing mvgam object — update.mvgam\",\"text\":\"function allows previously fitted mvgam model updated\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/update.mvgam.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Update an existing mvgam object — update.mvgam\",\"text\":\"\",\"code\":\"# S3 method for mvgam update(   object,   formula,   trend_formula,   data,   newdata,   trend_model,   trend_map,   use_lv,   n_lv,   family,   priors,   lfo = FALSE,   ... )\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/update.mvgam.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Update an existing mvgam object — update.mvgam\",\"text\":\"object list object returned mvgam. See mvgam() formula Optional new formula object. Note, mvgam currently support dynamic formula updates removal specific terms - term. updating, entire formula needs supplied trend_formula optional character string specifying GAM process model formula. supplied, linear predictor modelled latent trends capture process model evolution separately observation model. response variable specified left-hand side formula (.e. valid option ~ season + s(year)). Also note use identifier series formula specify effects vary across time series. Instead use trend. ensure models trend_map supplied still work consistently (.e. allowing effects vary across process models, even time series share underlying process model). feature currently available RW(), AR() VAR() trend models. nmix() family models, trend_formula used set linear predictor underlying latent abundance data dataframe list containing model response variable covariates required GAM formula optional trend_formula. include columns: series (factor index series IDs;number levels identical number unique series labels (.e. n_series = length(levels(data$series)))) time (numeric integer index time point observation). variables included linear predictor formula must also present newdata Optional dataframe list test data containing least series time addition variables included linear predictor formula. included, observations variable y set NA fitting model posterior simulations can obtained trend_model character  function specifying time series dynamics latent trend. Options : None (latent trend component; .e. GAM component contributes linear predictor, observation process source error; similarly estimated gam) 'RW' RW() 'AR1' AR(p = 1) 'AR2' AR(p = 2) 'AR3' AR(p = 3) 'VAR1'  VAR()(available Stan) 'PWlogistic, 'PWlinear' PW() (available Stan) 'GP' GP() (Gaussian Process squared exponential kernel; available Stan) trend types apart GP() PW(), moving average /correlated process error terms can also estimated (example, RW(cor = TRUE) set multivariate Random Walk n_series > 1). See mvgam_trends details trend_map Optional data.frame specifying series depend latent trends. Useful allowing multiple series depend latent trend process, different observation processes. supplied, latent factor model set setting use_lv = TRUE using mapping set shared trends. Needs column names series trend, integer values trend column state trend series depend . series column single unique entry series data (names perfectly match factor levels series variable data). See examples details use_lv logical. TRUE, use dynamic factors estimate series' latent trends reduced dimension format. available RW(), AR() GP() trend models. Defaults FALSE n_lv integer number latent dynamic factors use use_lv == TRUE. > n_series. Defaults arbitrarily min(2, floor(n_series / 2)) family family specifying exponential observation family series. Currently supported families : nb() count data poisson() count data gaussian() real-valued data betar() proportional data (0,1) lognormal() non-negative real-valued data student_t() real-valued data Gamma() non-negative real-valued data nmix() count data imperfect detection modeled via State-Space N-Mixture model. latent states Poisson, capturing 'true' latent abundance, observation process Binomial account imperfect detection. See mvgam_families example use family Note nb() poisson() available using JAGS backend. Default poisson(). See mvgam_families details priors optional data.frame prior definitions (JAGS Stan syntax). using Stan, can also object class brmsprior (see. prior details). See get_mvgam_priors 'Details' information changing default prior distributions lfo Logical indicating whether part call lfo_cv.mvgam. Returns lighter version model residuals fewer monitored parameters speed post-processing. downstream functions work properly, users always leave set FALSE ... arguments passed mvgam\",\"code\":\"\"},{\"path\":\"https://nicholasjclark.github.io/mvgam/reference/update.mvgam.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Update an existing mvgam object — update.mvgam\",\"text\":\"\",\"code\":\"if (FALSE) { # Simulate some data and fit a Poisson AR1 model simdat <- sim_mvgam(n_series = 1, trend_model = 'AR1') mod <- mvgam(y ~ s(season, bs = 'cc'),             trend_model = 'AR1',             data = simdat$data_train) summary(mod)  # Update to an AR2 model updated_mod <- update(mod, trend_model = 'AR2') summary(updated_mod)  # Now update to a Negative Binomial AR1 updated_mod <- update(mod, family = nb()) summary(updated_mod) }\"}]\n"
  },
  {
    "path": "docs/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/404.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/index.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/nmixtures.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/shared_states.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/authors.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/index.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/LICENSE-text.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/LICENSE.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/add_tweedie_lines.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/all_neon_tick_data.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/code.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/conditional_effects.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/dynamic.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/evaluate_mvgams.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/fitted.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/forecast.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/formula.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/get_monitor_pars.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/get_mvgam_priors.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/GP.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/hindcast.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/index-mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/index.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/lfo_cv.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/logLik.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/loo.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mcmc_plot.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/model.frame.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/monotonic.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam-class.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam_diagnostics.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam_draws.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam_families.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam_forecast-class.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam_formulae.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam_marginaleffects.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/mvgam_trends.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/pairs.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_fc.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_init.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_online.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/pfilter_mvgam_smooth.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/piecewise_trends.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/pipe.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot.mvgam_lfo.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_effects.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_factors.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_forecasts.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_pterms.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_randomeffects.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_resids.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_series.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_smooth.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_trend.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/plot_mvgam_uncertainty.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/portal_data.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/posterior_epred.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/posterior_linpred.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/posterior_predict.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/ppc.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/predict.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/print.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/residuals.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/RW.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/score.mvgam_forecast.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/series_to_mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/sim_mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/summary.mvgam.html</loc>\n  </url>\n  <url>\n    <loc>https://nicholasjclark.github.io/mvgam/reference/update.mvgam.html</loc>\n  </url>\n</urlset>\n"
  },
  {
    "path": "index.Rmd",
    "content": "---\noutput: github_document\nalways_allow_html: true\n---\n\n# mvgam\n\n> **M**ulti**V**ariate (Dynamic) **G**eneralized **A**dditive **M**odels\n\nThe `mvgam` 📦 fits Bayesian Dynamic Generalized Additive Models (DGAMs) that can include highly flexible nonlinear predictor effects, latent variables and multivariate time series models. The package does this by relying on functionalities from the impressive [`brms`](https://paulbuerkner.com/brms/){target=\"_blank\"} and [`mgcv`](https://cran.r-project.org/package=mgcv){target=\"_blank\"} packages. Parameters are estimated using the probabilistic programming language [`Stan`](https://mc-stan.org/), giving users access to the most advanced Bayesian inference algorithms available. This allows `mvgam` to fit a very wide range of models, including:\n\n* [Multivariate State-Space Time Series Models](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html){target=\"_blank\"}\n* [Continuous-Time Autoregressive Time Series Models](https://nicholasjclark.github.io/mvgam/reference/RW.html#ref-examples){target=\"_blank\"}\n* [Shared Signal Time Series Models](https://nicholasjclark.github.io/mvgam/articles/shared_states.html){target=\"_blank\"}\n* [Dynamic Factor Models](https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html){target=\"_blank\"}\n* [Hierarchical N-mixture Models](https://nicholasjclark.github.io/mvgam/articles/nmixtures.html){target=\"_blank\"}\n* [Hierarchical Generalized Additive Models](https://www.youtube.com/watch?v=2POK_FVwCHk){target=\"_blank\"}\n* [Joint Species Distribution Models](https://nicholasjclark.github.io/mvgam/reference/jsdgam.html){target=\"_blank\"}\n  \n## Installation\nInstall the stable version from `CRAN` using: `install.packages('mvgam')`, or install the development version from `GitHub` using:\n`devtools::install_github(\"nicholasjclark/mvgam\")`. You will also need a working version of `Stan` installed (along with either `rstan` and/or `cmdstanr`). Please refer to installation links for `Stan` with `rstan` [here](https://mc-stan.org/users/interfaces/rstan){target=\"_blank\"}, or for `Stan` with `cmdstandr` [here](https://mc-stan.org/cmdstanr/){target=\"_blank\"}.\n\n## Introductory seminar\n<center>\n<div style=\"display: flex; justify-content: center;\">\n<iframe style=\"aspect-ratio: 16 / 9; width: 100% !important;\" src=\"https://www.youtube.com/embed/0zZopLlomsQ?si=fWBVTPRDMi9TXcIy\" data-external = \"1\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n</center>\n</div>\n\n## Cheatsheet\n[![`mvgam` usage cheatsheet](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.png)](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf)\n\n## Getting started\n`mvgam` was originally designed to analyse and forecast non-negative integer-valued data (counts). These data are traditionally challenging to analyse with existing time-series analysis packages. But further development of `mvgam` has resulted in support for a growing number of observation families that extend to other types of data. Currently, the package can handle data for the following families:  \n  \n* `gaussian()` for real-valued data \n* `student_t()` for heavy-tailed real-valued data\n* `lognormal()` for non-negative real-valued data\n* `Gamma()` for non-negative real-valued data\n* `betar()` for proportional data on `(0,1)`\n* `bernoulli()` for binary data\n* `poisson()` for count data\n* `nb()` for overdispersed count data\n* `binomial()` for count data with known number of trials\n* `beta_binomial()` for overdispersed count data with known number of trials\n* `nmix()` for count data with imperfect detection (unknown number of trials)\n  \nSee `?mvgam_families` for more information. Below is a simple example for simulating and modelling proportional data with `Beta` observations over a set of seasonal series with independent Gaussian Process dynamic trends:\n```{r, include = FALSE}\nlibrary(mvgam)\n```\n\n```{r}\nset.seed(100)\ndata <- sim_mvgam(\n  family = betar(),\n  T = 80,\n  trend_model = GP(),\n  prop_trend = 0.5, \n  seasonality = 'shared'\n)\n```\n\nPlot the series to see how they evolve over time\n```{r, eval = FALSE}\nplot_mvgam_series(\n  data = data$data_train, \n  series = 'all'\n)\n```\n\n![Visualizing multivariate proportional time series using the mvgam R  package #rstats](man/figures/README-beta_sim-1.png)\n\nFit a State-Space GAM to these series that uses a hierarchical cyclic seasonal smooth term to capture variation in seasonality among series. The model also includes series-specific latent Gaussian Processes with squared exponential covariance functions to capture temporal dynamics\n```{r, eval = FALSE}\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 7) +\n    s(season, by = series, m = 1, k = 5),\n  trend_model = GP(),\n  data = data$data_train,\n  newdata = data$data_test,\n  family = betar()\n)\n```\n\nPlot the estimated posterior hindcast and forecast distributions for each series\n```{r eval = FALSE}\nlibrary(patchwork)\nfc <- forecast(mod)\nwrap_plots(\n  plot(fc, series = 1), \n  plot(fc, series = 2), \n  plot(fc, series = 3), \n  ncol = 2\n)\n```\n\n![Forecasting multivariate time series with Dynamic Generalized Additive Models](man/figures/README-beta_fc-1.png)\n\nVarious `S3` functions can be used to inspect parameter estimates, plot smooth functions and residuals, and evaluate models through posterior predictive checks or forecast comparisons. Please see [the package documentation](https://nicholasjclark.github.io/mvgam/reference/index.html) for more detailed examples.\n\n## Vignettes\nYou can set `build_vignettes = TRUE` when installing but be aware this will slow down the installation drastically. Instead, you can always access the vignette htmls online at [https://nicholasjclark.github.io/mvgam/articles/](https://nicholasjclark.github.io/mvgam/articles/)\n\n## Citing `mvgam` and related software\nWhen using any software please make sure to appropriately acknowledge the hard work that developers and maintainers put into making these packages available. Citations are currently the best way to formally acknowledge this work (but feel free to ⭐ [the repo](https://github.com/nicholasjclark/mvgam) as well), so we highly encourage you to cite any packages that you rely on for your research.\n\nWhen using `mvgam`, please cite the following:\n\n> Clark, N.J. and Wells, K. (2023). Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series. *Methods in Ecology and Evolution*. DOI: https://doi.org/10.1111/2041-210X.13974\n\nAs `mvgam` acts as an interface to `Stan`, please additionally cite:\n\n> Carpenter B., Gelman A., Hoffman M. D., Lee D., Goodrich B., Betancourt M., Brubaker M., Guo J., Li P., and Riddell A. (2017). Stan: A probabilistic programming language. *Journal of Statistical Software*. 76(1). DOI: https://doi.org/10.18637/jss.v076.i01\n\n`mvgam` relies on several other `R` packages and, of course, on `R` itself. Use `how_to_cite()` after you have fitted a model to simplify the process of finding appropriate citations for your software setup.\n\n\n## Other resources\nA number of case studies and step-by-step webinars have been compiled to highlight how GAMs and DGAMs can be useful for analysing multivariate data:\n  \n* [Time series in R and Stan using the `mvgam` package](https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3){target=\"_blank\"}\n* [Ecological Forecasting with Dynamic Generalized Additive Models](https://www.youtube.com/watch?v=0zZopLlomsQ){target=\"_blank\"}\n* [State-Space Vector Autoregressions in `mvgam`](https://ecogambler.netlify.app/blog/vector-autoregressions/){target=\"_blank\"}\n* [How to interpret and report nonlinear effects from Generalized Additive Models](https://ecogambler.netlify.app/blog/interpreting-gams/){target=\"_blank\"}\n* [Phylogenetic smoothing using mgcv](https://ecogambler.netlify.app/blog/phylogenetic-smooths-mgcv/){target=\"_blank\"}\n* [Distributed lags (and hierarchical distributed lags) using mgcv and mvgam](https://ecogambler.netlify.app/blog/distributed-lags-mgcv/){target=\"_blank\"}\n* [Incorporating time-varying seasonality in forecast models](https://ecogambler.netlify.app/blog/time-varying-seasonality/){target=\"_blank\"}\n\n## Getting help\nIf you encounter a clear bug, please file an issue with a minimal reproducible example on [GitHub](https://github.com/nicholasjclark/mvgam/issues). Please also feel free to use the [`mvgam` Discussion Board](https://github.com/nicholasjclark/mvgam/discussions) to hunt for or post other discussion topics related to the package, and do check out the [`mvgam` changelog](https://nicholasjclark.github.io/mvgam/news/index.html) for any updates about recent upgrades that the package has incorporated.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please reach out if you are interested (n.clark'at'uq.edu.au). Other contributions are also very welcome, but please see [The Contributor Instructions](https://github.com/nicholasjclark/mvgam/blob/master/.github/CONTRIBUTING.md) for general guidelines. Note that\nby participating in this project you agree to abide by the terms of its [Contributor Code of Conduct](https://dplyr.tidyverse.org/CODE_OF_CONDUCT).\n"
  },
  {
    "path": "index.md",
    "content": "# mvgam\n\n> **M**ulti**V**ariate (Dynamic) **G**eneralized **A**dditive **M**odels\n\nThe `mvgam` 📦 fits Bayesian Dynamic Generalized Additive Models (DGAMs)\nthat can include highly flexible nonlinear predictor effects, latent\nvariables and multivariate time series models. The package does this by\nrelying on functionalities from the impressive\n<a href=\"https://paulbuerkner.com/brms/\"\ntarget=\"_blank\"><code>brms</code></a> and\n<a href=\"https://cran.r-project.org/package=mgcv\"\ntarget=\"_blank\"><code>mgcv</code></a> packages. Parameters are estimated\nusing the probabilistic programming language\n[`Stan`](https://mc-stan.org/), giving users access to the most advanced\nBayesian inference algorithms available. This allows `mvgam` to fit a\nvery wide range of models, including:\n\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\"\n    target=\"_blank\">Multivariate State-Space Time Series Models</a>\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/reference/RW.html#ref-examples\"\n    target=\"_blank\">Continuous-Time Autoregressive Time Series Models</a>\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\"\n    target=\"_blank\">Shared Signal Time Series Models</a>\n-   <a\n    href=\"https://nicholasjclark.github.io/mvgam/reference/lv_correlations.html\"\n    target=\"_blank\">Dynamic Factor Models</a>\n-   <a href=\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\"\n    target=\"_blank\">Hierarchical N-mixture Models</a>\n-   <a href=\"https://www.youtube.com/watch?v=2POK_FVwCHk\"\n    target=\"_blank\">Hierarchical Generalized Additive Models</a>\n-   <a href=\"https://nicholasjclark.github.io/mvgam/reference/jsdgam.html\"\n    target=\"_blank\">Joint Species Distribution Models</a>\n\n## Installation\n\nInstall the stable version from `CRAN` using:\n`install.packages('mvgam')`, or install the development version from\n`GitHub` using: `devtools::install_github(\"nicholasjclark/mvgam\")`. You\nwill also need a working version of `Stan` installed (along with either\n`rstan` and/or `cmdstanr`). Please refer to installation links for\n`Stan` with `rstan` <a href=\"https://mc-stan.org/users/interfaces/rstan\"\ntarget=\"_blank\">here</a>, or for `Stan` with `cmdstandr`\n<a href=\"https://mc-stan.org/cmdstanr/\" target=\"_blank\">here</a>.\n\n## Introductory seminar\n\n<center>\n\n<iframe style=\"aspect-ratio: 16 / 9; width: 100% !important;\" src=\"https://www.youtube.com/embed/0zZopLlomsQ?si=fWBVTPRDMi9TXcIy\" data-external=\"1\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\n</iframe>\n</center>\n\n## Cheatsheet\n\n[![`mvgam` usage\ncheatsheet](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.png)](https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf)\n\n## Getting started\n\n`mvgam` was originally designed to analyse and forecast non-negative\ninteger-valued data (counts). These data are traditionally challenging\nto analyse with existing time-series analysis packages. But further\ndevelopment of `mvgam` has resulted in support for a growing number of\nobservation families that extend to other types of data. Currently, the\npackage can handle data for the following families:\n\n-   `gaussian()` for real-valued data\n-   `student_t()` for heavy-tailed real-valued data\n-   `lognormal()` for non-negative real-valued data\n-   `Gamma()` for non-negative real-valued data\n-   `betar()` for proportional data on `(0,1)`\n-   `bernoulli()` for binary data\n-   `poisson()` for count data\n-   `nb()` for overdispersed count data\n-   `binomial()` for count data with known number of trials\n-   `beta_binomial()` for overdispersed count data with known number of\n    trials\n-   `nmix()` for count data with imperfect detection (unknown number of\n    trials)\n\nSee `?mvgam_families` for more information. Below is a simple example\nfor simulating and modelling proportional data with `Beta` observations\nover a set of seasonal series with independent Gaussian Process dynamic\ntrends:\n\n    set.seed(100)\n    data <- sim_mvgam(\n      family = betar(),\n      T = 80,\n      trend_model = GP(),\n      prop_trend = 0.5, \n      seasonality = 'shared'\n    )\n\nPlot the series to see how they evolve over time\n\n    plot_mvgam_series(\n      data = data$data_train, \n      series = 'all'\n    )\n\n<figure>\n<img src=\"man/figures/README-beta_sim-1.png\"\nalt=\"Visualizing multivariate proportional time series using the mvgam R package #rstats\" />\n<figcaption aria-hidden=\"true\">Visualizing multivariate proportional\ntime series using the mvgam R package #rstats</figcaption>\n</figure>\n\nFit a State-Space GAM to these series that uses a hierarchical cyclic\nseasonal smooth term to capture variation in seasonality among series.\nThe model also includes series-specific latent Gaussian Processes with\nsquared exponential covariance functions to capture temporal dynamics\n\n    mod <- mvgam(\n      y ~ s(season, bs = 'cc', k = 7) +\n        s(season, by = series, m = 1, k = 5),\n      trend_model = GP(),\n      data = data$data_train,\n      newdata = data$data_test,\n      family = betar()\n    )\n\nPlot the estimated posterior hindcast and forecast distributions for\neach series\n\n    library(patchwork)\n    fc <- forecast(mod)\n    wrap_plots(\n      plot(fc, series = 1), \n      plot(fc, series = 2), \n      plot(fc, series = 3), \n      ncol = 2\n    )\n\n<figure>\n<img src=\"man/figures/README-beta_fc-1.png\"\nalt=\"Forecasting multivariate time series with Dynamic Generalized Additive Models\" />\n<figcaption aria-hidden=\"true\">Forecasting multivariate time series with\nDynamic Generalized Additive Models</figcaption>\n</figure>\n\nVarious `S3` functions can be used to inspect parameter estimates, plot\nsmooth functions and residuals, and evaluate models through posterior\npredictive checks or forecast comparisons. Please see [the package\ndocumentation](https://nicholasjclark.github.io/mvgam/reference/index.html)\nfor more detailed examples.\n\n## Vignettes\n\nYou can set `build_vignettes = TRUE` when installing but be aware this\nwill slow down the installation drastically. Instead, you can always\naccess the vignette htmls online at\n<https://nicholasjclark.github.io/mvgam/articles/>\n\n## Citing `mvgam` and related software\n\nWhen using any software please make sure to appropriately acknowledge\nthe hard work that developers and maintainers put into making these\npackages available. Citations are currently the best way to formally\nacknowledge this work (but feel free to ⭐ [the\nrepo](https://github.com/nicholasjclark/mvgam) as well), so we highly\nencourage you to cite any packages that you rely on for your research.\n\nWhen using `mvgam`, please cite the following:\n\n> Clark, N.J. and Wells, K. (2023). Dynamic Generalized Additive Models\n> (DGAMs) for forecasting discrete ecological time series. *Methods in\n> Ecology and Evolution*. DOI: <https://doi.org/10.1111/2041-210X.13974>\n\nAs `mvgam` acts as an interface to `Stan`, please additionally cite:\n\n> Carpenter B., Gelman A., Hoffman M. D., Lee D., Goodrich B.,\n> Betancourt M., Brubaker M., Guo J., Li P., and Riddell A. (2017).\n> Stan: A probabilistic programming language. *Journal of Statistical\n> Software*. 76(1). DOI: <https://doi.org/10.18637/jss.v076.i01>\n\n`mvgam` relies on several other `R` packages and, of course, on `R`\nitself. Use `how_to_cite()` after you have fitted a model to simplify\nthe process of finding appropriate citations for your software setup.\n\n## Other resources\n\nA number of case studies and step-by-step webinars have been compiled to\nhighlight how GAMs and DGAMs can be useful for analysing multivariate\ndata:\n\n-   <a\n    href=\"https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3\"\n    target=\"_blank\">Time series in R and Stan using the <code>mvgam</code>\n    package</a>\n-   <a href=\"https://www.youtube.com/watch?v=0zZopLlomsQ\"\n    target=\"_blank\">Ecological Forecasting with Dynamic Generalized Additive\n    Models</a>\n-   <a href=\"https://ecogambler.netlify.app/blog/vector-autoregressions/\"\n    target=\"_blank\">State-Space Vector Autoregressions in\n    <code>mvgam</code></a>\n-   <a href=\"https://ecogambler.netlify.app/blog/interpreting-gams/\"\n    target=\"_blank\">How to interpret and report nonlinear effects from\n    Generalized Additive Models</a>\n-   <a href=\"https://ecogambler.netlify.app/blog/phylogenetic-smooths-mgcv/\"\n    target=\"_blank\">Phylogenetic smoothing using mgcv</a>\n-   <a href=\"https://ecogambler.netlify.app/blog/distributed-lags-mgcv/\"\n    target=\"_blank\">Distributed lags (and hierarchical distributed lags)\n    using mgcv and mvgam</a>\n-   <a href=\"https://ecogambler.netlify.app/blog/time-varying-seasonality/\"\n    target=\"_blank\">Incorporating time-varying seasonality in forecast\n    models</a>\n\n## Getting help\n\nIf you encounter a clear bug, please file an issue with a minimal\nreproducible example on\n[GitHub](https://github.com/nicholasjclark/mvgam/issues). Please also\nfeel free to use the [`mvgam` Discussion\nBoard](https://github.com/nicholasjclark/mvgam/discussions) to hunt for\nor post other discussion topics related to the package, and do check out\nthe [`mvgam`\nchangelog](https://nicholasjclark.github.io/mvgam/news/index.html) for\nany updates about recent upgrades that the package has incorporated.\n\n## Interested in contributing?\n\nI’m actively seeking PhD students and other researchers to work in the\nareas of ecological forecasting, multivariate model evaluation and\ndevelopment of `mvgam`. Please reach out if you are interested\n(n.clark’at’uq.edu.au). Other contributions are also very welcome, but\nplease see [The Contributor\nInstructions](https://github.com/nicholasjclark/mvgam/blob/master/.github/CONTRIBUTING.md)\nfor general guidelines. Note that by participating in this project you\nagree to abide by the terms of its [Contributor Code of\nConduct](https://dplyr.tidyverse.org/CODE_OF_CONDUCT).\n"
  },
  {
    "path": "inst/CITATION",
    "content": "citHeader(\"To cite mvgam in publications use:\")\n\nbibentry(\n  bibtype = \"Article\",\n  title = \"Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series\",\n  author = c(person(given = \"Nicholas J\", family = \"Clark\"),\n             person(given = \"Konstans\", family = \"Wells\")),\n  journal = \"Methods in Ecology and Evolution\",\n  year = \"2023\",\n  volume = \"14\",\n  number = \"\",\n  pages = \"771-784\",\n  doi = \"10.18637/jss.v100.i05\",\n  textVersion = paste(\n    \"Clark & Wells (2023).\",\n    \"Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series.\",\n    \"Methods in Ecology and Evolution, 14, 771-784.\",\n    \"doi.org/10.1111/2041-210X.13974\"\n  ),\n  encoding = \"UTF-8\"\n)\n"
  },
  {
    "path": "inst/doc/data_in_mvgam.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nsimdat <- sim_mvgam(\n  n_series = 4,\n  T = 24,\n  prop_missing = 0.2\n)\nhead(simdat$data_train, 16)\n\n\n## --------------------------------------------------------------------------------\nclass(simdat$data_train$series)\nlevels(simdat$data_train$series)\n\n\n## --------------------------------------------------------------------------------\nall(\n  levels(simdat$data_train$series) %in%\n    unique(simdat$data_train$series)\n)\n\n\n## --------------------------------------------------------------------------------\nsummary(glm(\n  y ~ series + time,\n  data = simdat$data_train,\n  family = poisson()\n))\n\n\n## --------------------------------------------------------------------------------\nsummary(mgcv::gam(\n  y ~ series + s(time, by = series),\n  data = simdat$data_train,\n  family = poisson()\n))\n\n\n## --------------------------------------------------------------------------------\ngauss_dat <- data.frame(\n  outcome = rnorm(10),\n  series = factor(\"series1\", levels = \"series1\"),\n  time = 1:10\n)\ngauss_dat\n\n\n## --------------------------------------------------------------------------------\nmgcv::gam(outcome ~ time, family = betar(), data = gauss_dat)\n\n\n## ----error=TRUE------------------------------------------------------------------\ntry({\n  mvgam(outcome ~ time, family = betar(), data = gauss_dat)\n})\n\n\n## --------------------------------------------------------------------------------\n# A function to ensure all timepoints within a sequence are identical\nall_times_avail <- function(time, min_time, max_time) {\n  identical(\n    as.numeric(sort(time)),\n    as.numeric(seq.int(from = min_time, to = max_time))\n  )\n}\n\n# Get min and max times from the data\nmin_time <- min(simdat$data_train$time)\nmax_time <- max(simdat$data_train$time)\n\n# Check that all times are recorded for each series\ndata.frame(\n  series = simdat$data_train$series,\n  time = simdat$data_train$time\n) %>%\n  dplyr::group_by(series) %>%\n  dplyr::summarise(\n    all_there = all_times_avail(\n      time,\n      min_time,\n      max_time\n    )\n  ) -> checked_times\nif (any(checked_times$all_there == FALSE)) {\n  warning(\n    \"One or more series in is missing observations for one or more timepoints\"\n  )\n} else {\n  cat(\"All series have observations at all timepoints :)\")\n}\n\n\n## --------------------------------------------------------------------------------\nbad_times <- data.frame(\n  time = seq(1, 16, by = 2),\n  series = factor(\"series_1\"),\n  outcome = rnorm(8)\n)\nbad_times\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(outcome ~ 1, data = bad_times, family = gaussian())\n})\n\n\n## --------------------------------------------------------------------------------\nbad_times %>%\n  dplyr::right_join(expand.grid(\n    time = seq(\n      min(bad_times$time),\n      max(bad_times$time)\n    ),\n    series = factor(unique(bad_times$series), levels = levels(bad_times$series))\n  )) %>%\n  dplyr::arrange(time) -> good_times\ngood_times\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(outcome ~ 1, data = good_times, family = gaussian())\n})\n\n\n## --------------------------------------------------------------------------------\nbad_levels <- data.frame(\n  time = 1:8,\n  series = factor(\n    \"series_1\",\n    levels = c(\n      \"series_1\",\n      \"series_2\"\n    )\n  ),\n  outcome = rnorm(8)\n)\n\nlevels(bad_levels$series)\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(outcome ~ 1, data = bad_levels, family = gaussian())\n})\n\n\n## --------------------------------------------------------------------------------\nsetdiff(levels(bad_levels$series), unique(bad_levels$series))\n\n\n## --------------------------------------------------------------------------------\nbad_levels %>%\n  dplyr::mutate(series = droplevels(series)) -> good_levels\nlevels(good_levels$series)\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    outcome ~ 1,\n    data = good_levels,\n    family = gaussian()\n  )\n})\n\n\n## --------------------------------------------------------------------------------\nmiss_dat <- data.frame(\n  outcome = rnorm(10),\n  cov = c(NA, rnorm(9)),\n  series = factor(\"series1\", levels = \"series1\"),\n  time = 1:10\n)\nmiss_dat\n\n\n## ----error = TRUE----------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    outcome ~ cov,\n    data = miss_dat,\n    family = gaussian()\n  )\n})\n\n\n## --------------------------------------------------------------------------------\nmiss_dat <- list(\n  outcome = rnorm(10),\n  series = factor(\"series1\", levels = \"series1\"),\n  time = 1:10\n)\nmiss_dat$cov <- matrix(rnorm(50), ncol = 5, nrow = 10)\nmiss_dat$cov[2, 3] <- NA\n\n\n## ----error=TRUE------------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    outcome ~ cov,\n    data = miss_dat,\n    family = gaussian()\n  )\n})\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = \"all\"\n)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = 1\n)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  y = \"y\",\n  series = 1\n)\n\n\n## --------------------------------------------------------------------------------\ndata(\"all_neon_tick_data\")\nstr(dplyr::ungroup(all_neon_tick_data))\n\n\n## --------------------------------------------------------------------------------\nplotIDs <- c(\n  \"SCBI_013\",\n  \"SCBI_002\",\n  \"SERC_001\",\n  \"SERC_005\",\n  \"SERC_006\",\n  \"SERC_012\",\n  \"BLAN_012\",\n  \"BLAN_005\"\n)\n\n\n## --------------------------------------------------------------------------------\nmodel_dat <- all_neon_tick_data %>%\n  dplyr::ungroup() %>%\n  dplyr::mutate(target = ixodes_scapularis) %>%\n  dplyr::filter(plotID %in% plotIDs) %>%\n  dplyr::select(Year, epiWeek, plotID, target) %>%\n  dplyr::mutate(epiWeek = as.numeric(epiWeek))\n\n\n## --------------------------------------------------------------------------------\nmodel_dat %>%\n  # Create all possible combos of plotID, Year and epiWeek;\n  # missing outcomes will be filled in as NA\n  dplyr::full_join(expand.grid(\n    plotID = unique(model_dat$plotID),\n    Year = unique(model_dat$Year),\n    epiWeek = seq(1, 52)\n  )) %>%\n  # left_join back to original data so plotID and siteID will\n  # match up, in case you need the siteID for anything else later on\n  dplyr::left_join(\n    all_neon_tick_data %>%\n      dplyr::select(siteID, plotID) %>%\n      dplyr::distinct()\n  ) -> model_dat\n\n\n## --------------------------------------------------------------------------------\nmodel_dat %>%\n  dplyr::mutate(\n    series = plotID,\n    y = target\n  ) %>%\n  dplyr::mutate(\n    siteID = factor(siteID),\n    series = factor(series)\n  ) %>%\n  dplyr::select(-target, -plotID) %>%\n  dplyr::arrange(Year, epiWeek, series) -> model_dat\n\n\n## --------------------------------------------------------------------------------\nmodel_dat %>%\n  dplyr::ungroup() %>%\n  dplyr::group_by(series) %>%\n  dplyr::arrange(Year, epiWeek) %>%\n  dplyr::mutate(time = seq(1, dplyr::n())) %>%\n  dplyr::ungroup() -> model_dat\n\n\n## --------------------------------------------------------------------------------\nlevels(model_dat$series)\n\n\n## ----error=TRUE------------------------------------------------------------------\ntry({\n  get_mvgam_priors(\n    y ~ 1,\n    data = model_dat,\n    family = poisson()\n  )\n})\n\n\n## --------------------------------------------------------------------------------\ntestmod <- mvgam(\n  y ~ s(epiWeek, by = series, bs = \"cc\") +\n    s(series, bs = \"re\"),\n  trend_model = AR(),\n  data = model_dat,\n  backend = \"cmdstanr\",\n  run_model = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\nstr(testmod$model_data)\n\n\n## --------------------------------------------------------------------------------\nstancode(testmod)\n"
  },
  {
    "path": "inst/doc/data_in_mvgam.Rmd",
    "content": "---\ntitle: \"Formatting data for use in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Formatting data for use in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThis vignette gives an example of how to take raw data and format it for use in `mvgam`. This is not an exhaustive example, as data can be recorded and stored in a variety of ways, which requires different approaches to wrangle the data into the necessary format for `mvgam`. For full details on the basic `mvgam` functionality, please see [the introductory vignette](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html) and [the growing set of walk through video tutorials on `mvgam` applications](https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3&si=lyg7qUrMLbD-tHCB).\n\n## Required *tidy* data format\nManipulating the data into a 'long' format (i.e. *tidy* format) is necessary for modelling in `mvgam`. By 'long' format, we mean that each `series x time` observation needs to have its own entry in the `dataframe` or `list` object that we wish to pass as data for to the two primary modelling functions, `mvgam()` and `jsdgam()`. A simple example can be viewed by simulating data using the `sim_mvgam()` function. See `?sim_mvgam` for more details\n```{r}\nsimdat <- sim_mvgam(\n  n_series = 4, \n  T = 24, \n  prop_missing = 0.2\n)\nhead(simdat$data_train, 16)\n```\n\n### `series` as a `factor` variable\nNotice how we have four different time series in these simulated data, and we have identified the series-level indicator as a `factor` variable.\n```{r}\nclass(simdat$data_train$series)\nlevels(simdat$data_train$series)\n```\n\nIt is important that the number of levels matches the number of unique series in the data to ensure indexing across series works properly in the underlying modelling functions. Several of the main workhorse functions in the package (including `mvgam()` and `get_mvgam_priors()`) will give an error if this is not the case, but it may be worth checking anyway:\n```{r}\nall(levels(simdat$data_train$series) %in% \n      unique(simdat$data_train$series))\n```\n\nNote that you can technically supply data that does not have a `series` indicator, and the package will generally assume that you are only using a single time series. There are exceptions to this, for example if you have grouped data and would like to estimate hierarchical dependencies (see an example of hierarchical process error correlations in the `?AR` documentation) or if you would like to set up a Joint Species Distribution Model (JSDM) using a Zero-Mean Multivariate Gaussian distribution for the latent residuals (see examples in the `?ZMVN` documentation).\n\n### A single outcome variable\nYou may also have notices that we do not spread the `numeric / integer`-classed outcome variable into different columns. Rather, there is only a single column for the outcome variable, labelled `y` in these simulated data (though the outcome does not have to be labelled `y`). This is another important requirement in `mvgam`, but it shouldn't be too unfamiliar to `R` users who frequently use modelling packages such as `lme4`, `mgcv`, `brms` or the many other regression modelling packages out there. The advantage of this format is that it is now very easy to specify effects that vary among time series:\n```{r}\nsummary(glm(\n  y ~ series + time,\n  data = simdat$data_train,\n  family = poisson()\n))\n```\n\n```{r}\nsummary(mgcv::gam(\n  y ~ series + s(time, by = series),\n  data = simdat$data_train,\n  family = poisson()\n))\n```\n\nDepending on the observation families you plan to use when building models, there may be some restrictions that need to be satisfied within the outcome variable. For example, a Beta regression can only handle proportional data, so values `>= 1` or `<= 0` are not allowed. Likewise, a Poisson regression can only handle non-negative integers. Most regression functions in `R` will assume the user knows all of this and so will not issue any warnings or errors if you choose the wrong distribution, but often this ends up leading to some unhelpful error from an optimizer that is difficult to interpret and diagnose. `mvgam` will attempt to provide some errors if you do something that is simply not allowed. For example, we can simulate data from a zero-centred Gaussian distribution (ensuring that some of our values will be `< 1`) and attempt a Beta regression in `mvgam` using the `betar` family:\n```{r}\ngauss_dat <- data.frame(\n  outcome = rnorm(10),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\ngauss_dat\n```\n\nA call to `gam()` using the `mgcv` package leads to a model that actually fits (though it does give an unhelpful warning message):\n```{r}\nmgcv::gam(outcome ~ time,\n  family = betar(),\n  data = gauss_dat\n)\n```\n\nBut the same call to `mvgam()` gives us something more useful:\n```{r error=TRUE}\nmvgam(outcome ~ time,\n  family = betar(),\n  data = gauss_dat\n)\n```\n\nPlease see `?mvgam_families` for more information on the types of responses that the package can handle and their restrictions\n\n### A `time` variable\nThe other requirement for most models that can be fit in `mvgam` is a `numeric / integer`-classed variable labelled `time`. This ensures the modelling software knows how to arrange the time series when building models. This setup still allows us to formulate multivariate time series models. If you plan to use any of the autoregressive dynamic trend functions available in `mvgam` (see `?mvgam_trends` for details of available dynamic processes), you will need to ensure your time series are entered with a fixed sampling interval (i.e. the time between timesteps 1 and 2 should be the same as the time between timesteps 2 and 3, etc...). But note that you can have missing observations for some (or all) series. `mvgam()` will check this for you, but again it is useful to ensure you have no missing timepoint x series combinations in your data. You can generally do this with a simple `dplyr` call:\n```{r}\n# A function to ensure all timepoints within a sequence are identical\nall_times_avail <- function(time, min_time, max_time) {\n  identical(\n    as.numeric(sort(time)),\n    as.numeric(seq.int(from = min_time, to = max_time))\n  )\n}\n\n# Get min and max times from the data\nmin_time <- min(simdat$data_train$time)\nmax_time <- max(simdat$data_train$time)\n\n# Check that all times are recorded for each series\ndata.frame(\n  series = simdat$data_train$series,\n  time = simdat$data_train$time\n) %>%\n  dplyr::group_by(series) %>%\n  dplyr::summarise(all_there = all_times_avail(\n    time,\n    min_time,\n    max_time\n  )) -> checked_times\nif (any(checked_times$all_there == FALSE)) {\n  warning(\"One or more series in is missing observations for one or more timepoints\")\n} else {\n  cat(\"All series have observations at all timepoints :)\")\n}\n```\n\nNote that models which use dynamic components will assume that smaller values of `time` are *older* (i.e. `time = 1` came *before* `time = 2`, etc...)\n\n### Irregular sampling intervals?\nMost `mvgam` dynamic trend models expect `time` to be measured in discrete, evenly-spaced intervals (i.e. one measurement per week, or one per year, for example; though missing values are allowed). But please note that irregularly sampled time intervals are allowed, in which case the `CAR()` trend model (continuous time autoregressive) is appropriate. You can see an example of this kind of model in the **Examples** section in `?CAR`. You can also use `trend_model = 'None'` (the default in `mvgam()`) and instead use a Gaussian Process to model temporal variation for irregularly-sampled time series. See the `?brms::gp` for details. But to reiterate the point from above, if you do not have time series data (or don't want to estimate latent temporal dynamics) but you would like to estimate correlated latent residuals among multivariate outcomes, you can set up models that use `trend_model = ZMVN(...)` without the need for a `time` variable (see `?ZMVN` for details).\n\n## Checking data with `get_mvgam_priors()`\nThe `get_mvgam_priors()` function is designed to return information about the parameters in a model whose prior distributions can be modified by the user. But in doing so, it will perform a series of checks to ensure the data are formatted properly. It can therefore be very useful to new users for ensuring there isn't anything strange going on in the data setup. For example, we can replicate the steps taken above (to check factor levels and timepoint x series combinations) with a single call to `get_mvgam_priors()`. Here we first simulate some data in which some of the timepoints in the `time` variable are not included in the data:\n```{r}\nbad_times <- data.frame(\n  time = seq(1, 16, by = 2),\n  series = factor(\"series_1\"),\n  outcome = rnorm(8)\n)\nbad_times\n```\n\nNext we call `get_mvgam_priors()` by simply specifying an intercept-only model, which is enough to trigger all the checks:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = bad_times,\n  family = gaussian()\n)\n```\n\nThis error is useful as it tells us where the problem is. There are many ways to fill in missing timepoints, so the correct way will have to be left up to the user. But if you don't have any covariates, it should be pretty easy using `expand.grid()`:\n```{r}\nbad_times %>%\n  dplyr::right_join(expand.grid(\n    time = seq(\n      min(bad_times$time),\n      max(bad_times$time)\n    ),\n    series = factor(unique(bad_times$series),\n      levels = levels(bad_times$series)\n    )\n  )) %>%\n  dplyr::arrange(time) -> good_times\ngood_times\n```\n\nNow the call to `get_mvgam_priors()`, using our filled in data, should work:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = good_times,\n  family = gaussian()\n)\n```\n\nThis function should also pick up on misaligned factor levels for the `series` variable. We can check this by again simulating, this time adding an additional factor level that is not included in the data:\n```{r}\nbad_levels <- data.frame(\n  time = 1:8,\n  series = factor(\"series_1\",\n    levels = c(\n      \"series_1\",\n      \"series_2\"\n    )\n  ),\n  outcome = rnorm(8)\n)\n\nlevels(bad_levels$series)\n```\n\nAnother call to `get_mvgam_priors()` brings up a useful error:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = bad_levels,\n  family = gaussian()\n)\n```\n\nFollowing the message's advice tells us there is a level for `series_2` in the `series` variable, but there are no observations for this series in the data:\n```{r}\nsetdiff(levels(bad_levels$series), \n        unique(bad_levels$series))\n```\n\nRe-assigning the levels fixes the issue:\n```{r}\nbad_levels %>%\n  dplyr::mutate(series = droplevels(series)) -> good_levels\nlevels(good_levels$series)\n```\n\n```{r error = TRUE}\nget_mvgam_priors(\n  outcome ~ 1,\n  data = good_levels,\n  family = gaussian()\n)\n```\n\n### Covariates with no `NA`s\nCovariates can be used in models just as you would when using `mgcv` (see `?formula.gam` for details of the formula syntax). But although the outcome variable can have `NA`s, covariates cannot. Most regression software will silently drop any raws in the model matrix that have `NA`s, which is not helpful when debugging. Both the `mvgam()` and `get_mvgam_priors()` functions will run some simple checks for you, and hopefully will return useful errors if it finds in missing values:\n```{r}\nmiss_dat <- data.frame(\n  outcome = rnorm(10),\n  cov = c(NA, rnorm(9)),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\nmiss_dat\n```\n\n```{r error = TRUE}\nget_mvgam_priors(\n  outcome ~ cov,\n  data = miss_dat,\n  family = gaussian()\n)\n```\n\nJust like with the `mgcv` package, `mvgam` can also accept data as a `list` object. This is useful if you want to set up linear functional predictors or even distributed lag predictors. The checks run by `mvgam` should still work on these data. Here we change the `cov` predictor to be a `matrix`:\n```{r}\nmiss_dat <- list(\n  outcome = rnorm(10),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\nmiss_dat$cov <- matrix(rnorm(50), ncol = 5, nrow = 10)\nmiss_dat$cov[2, 3] <- NA\n```\n\nA call to `get_mvgam_priors()` returns the same error:\n```{r error=TRUE}\nget_mvgam_priors(\n  outcome ~ cov,\n  data = miss_dat,\n  family = gaussian()\n)\n```\n\n## Plotting with `plot_mvgam_series()`\nPlotting the data is a useful way to ensure everything looks ok, once you've gone throug the above checks on factor levels and timepoint x series combinations. The `plot_mvgam_series()` function will take supplied data and plot either a series of line plots (if you choose `series = 'all'`) or a set of plots to describe the distribution for a single time series. For example, to plot all of the time series in our data, and highlight a single series in each plot, we can use:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = \"all\"\n)\n```\n\nOr we can look more closely at the distribution for the first time series:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = 1\n)\n```\n\nIf you have split your data into training and testing folds (i.e. for forecast evaluation), you can include the test data in your plots:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  y = \"y\",\n  series = 1\n)\n```\n\n## Example with NEON tick data\nTo give one example of how data can be reformatted for `mvgam` modelling, we will use observations from the National Ecological Observatory Network (NEON) tick drag cloth samples. *Ixodes scapularis* is a widespread tick species capable of transmitting a diversity of parasites to animals and humans, many of which are zoonotic. Due to the medical and ecological importance of this tick species, a common goal is to understand factors that influence their abundances. The NEON field team carries out standardised [long-term monitoring of tick abundances as well as other important indicators of ecological change](https://www.neonscience.org/data-collection/ticks){target=\"_blank\"}. Nymphal abundance of *I. scapularis* is routinely recorded across NEON plots using a field sampling method called drag cloth sampling, which is a common method for sampling ticks in the landscape. Field researchers sample ticks by dragging a large cloth behind themselves through terrain that is suspected of harboring ticks, usually working in a grid-like pattern. The sites have been sampled since 2014, resulting in a rich dataset of nymph abundance time series. These tick time series show strong seasonality and incorporate many of the challenging features associated with ecological data including overdispersion, high proportions of missingness and irregular sampling in time, making them useful for exploring the utility of dynamic GAMs. \n  \nWe begin by loading NEON tick data for the years 2014 - 2021, which were downloaded from NEON and prepared as described in [Clark & Wells 2022](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.13974){target=\"_blank\"}. You can read a bit about the data using the call `?all_neon_tick_data`\n```{r}\ndata(\"all_neon_tick_data\")\nstr(dplyr::ungroup(all_neon_tick_data))\n```\n\nFor this exercise, we will use the `epiWeek` variable as an index of seasonality, and we will only work with observations from a few sampling plots (labelled in the `plotID` column):\n```{r}\nplotIDs <- c(\n  \"SCBI_013\", \"SCBI_002\",\n  \"SERC_001\", \"SERC_005\",\n  \"SERC_006\", \"SERC_012\",\n  \"BLAN_012\", \"BLAN_005\"\n)\n```\n\nNow we can select the target species we want (*I. scapularis*), filter to the correct plot IDs and convert the `epiWeek` variable from `character` to `numeric`:\n```{r}\nmodel_dat <- all_neon_tick_data %>%\n  dplyr::ungroup() %>%\n  dplyr::mutate(target = ixodes_scapularis) %>%\n  dplyr::filter(plotID %in% plotIDs) %>%\n  dplyr::select(Year, epiWeek, plotID, target) %>%\n  dplyr::mutate(epiWeek = as.numeric(epiWeek))\n```\n\nNow is the tricky part: we need to fill in missing observations with `NA`s. The tick data are sparse in that field observers do not go out and sample in each possible `epiWeek`. So there are many particular weeks in which observations are not included in the data. But we can use `expand.grid()` again to take care of this:\n```{r}\nmodel_dat %>%\n  # Create all possible combos of plotID, Year and epiWeek;\n  # missing outcomes will be filled in as NA\n  dplyr::full_join(expand.grid(\n    plotID = unique(model_dat$plotID),\n    Year = unique(model_dat$Year),\n    epiWeek = seq(1, 52)\n  )) %>%\n  # left_join back to original data so plotID and siteID will\n  # match up, in case you need the siteID for anything else later on\n  dplyr::left_join(all_neon_tick_data %>%\n    dplyr::select(siteID, plotID) %>%\n    dplyr::distinct()) -> model_dat\n```\n\nCreate the `series` variable needed for `mvgam` modelling:\n```{r}\nmodel_dat %>%\n  dplyr::mutate(\n    series = plotID,\n    y = target\n  ) %>%\n  dplyr::mutate(\n    siteID = factor(siteID),\n    series = factor(series)\n  ) %>%\n  dplyr::select(-target, -plotID) %>%\n  dplyr::arrange(Year, epiWeek, series) -> model_dat\n```\n\nNow create the `time` variable, which needs to track `Year` and `epiWeek` for each unique series. The `n` function from `dplyr` is often useful if generating a `time` index for grouped dataframes:\n```{r}\nmodel_dat %>%\n  dplyr::ungroup() %>%\n  dplyr::group_by(series) %>%\n  dplyr::arrange(Year, epiWeek) %>%\n  dplyr::mutate(time = seq(1, dplyr::n())) %>%\n  dplyr::ungroup() -> model_dat\n```\n\nCheck factor levels for the `series`:\n```{r}\nlevels(model_dat$series)\n```\n\nThis looks good, as does a more rigorous check using `get_mvgam_priors()`:\n```{r error=TRUE}\nget_mvgam_priors(\n  y ~ 1,\n  data = model_dat,\n  family = poisson()\n)\n```\n\nWe can also set up a model in `mvgam()` but use `run_model = FALSE` to further ensure all of the necessary steps for creating the modelling code and objects will run. It is recommended that you use the `cmdstanr` backend if possible, as the auto-formatting options available in this package are very useful for checking the package-generated `Stan` code for any inefficiencies that can be fixed to lead to sampling performance improvements:\n```{r}\ntestmod <- mvgam(\n  y ~ s(epiWeek, by = series, bs = \"cc\") +\n    s(series, bs = \"re\"),\n  trend_model = AR(),\n  data = model_dat,\n  backend = \"cmdstanr\",\n  run_model = FALSE\n)\n```\n\nThis call runs without issue, and the resulting object now contains the model code and data objects that are needed to initiate sampling:\n```{r}\nstr(testmod$model_data)\n```\n\n```{r}\nstancode(testmod)\n```\n\n## Further reading\nThe following papers and resources offer useful material about Dynamic GAMs and how they can be applied in practice:\n  \nClark, Nicholas J. and Wells, K. [Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series](https://doi.org/10.1111/2041-210X.13974). *Methods in Ecology and Evolution*. (2023): 14, 771-784.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nde Sousa, Heitor C., et al. [Severe fire regimes decrease resilience of ectothermic populations](https://doi.org/10.1111/1365-2656.14188). *Journal of Animal Ecology* (2024): 93(11), 1656-1669.  \n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant.](https://doi.org/10.1016/j.csda.2022.107659) *Computational Statistics & Data Analysis* (2023): 179, 107659.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.\n  \nZhu, L., et al. [Responses of a widespread pest insect to extreme high temperatures are stage-dependent and divergent among seasonal cohorts](https://doi.org/10.1111/1365-2435.14711). *Functional Ecology* (2025): 39, 165–180. https://doi.org/10.1111/1365-2435.14711\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "inst/doc/data_in_mvgam.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Formatting data for use in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Formatting data for use in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#required-tidy-data-format\" id=\"toc-required-tidy-data-format\">Required <em>tidy</em> data\nformat</a>\n<ul>\n<li><a href=\"#series-as-a-factor-variable\" id=\"toc-series-as-a-factor-variable\"><code>series</code> as a\n<code>factor</code> variable</a></li>\n<li><a href=\"#a-single-outcome-variable\" id=\"toc-a-single-outcome-variable\">A single outcome variable</a></li>\n<li><a href=\"#a-time-variable\" id=\"toc-a-time-variable\">A\n<code>time</code> variable</a></li>\n<li><a href=\"#irregular-sampling-intervals\" id=\"toc-irregular-sampling-intervals\">Irregular sampling\nintervals?</a></li>\n</ul></li>\n<li><a href=\"#checking-data-with-get_mvgam_priors\" id=\"toc-checking-data-with-get_mvgam_priors\">Checking data with\n<code>get_mvgam_priors()</code></a>\n<ul>\n<li><a href=\"#covariates-with-no-nas\" id=\"toc-covariates-with-no-nas\">Covariates with no\n<code>NA</code>s</a></li>\n</ul></li>\n<li><a href=\"#plotting-with-plot_mvgam_series\" id=\"toc-plotting-with-plot_mvgam_series\">Plotting with\n<code>plot_mvgam_series()</code></a></li>\n<li><a href=\"#example-with-neon-tick-data\" id=\"toc-example-with-neon-tick-data\">Example with NEON tick\ndata</a></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>This vignette gives an example of how to take raw data and format it\nfor use in <code>mvgam</code>. This is not an exhaustive example, as\ndata can be recorded and stored in a variety of ways, which requires\ndifferent approaches to wrangle the data into the necessary format for\n<code>mvgam</code>. For full details on the basic <code>mvgam</code>\nfunctionality, please see <a href=\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\">the\nintroductory vignette</a> and <a href=\"https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3&amp;si=lyg7qUrMLbD-tHCB\">the\ngrowing set of walk through video tutorials on <code>mvgam</code>\napplications</a>.</p>\n<div id=\"required-tidy-data-format\" class=\"section level2\">\n<h2>Required <em>tidy</em> data format</h2>\n<p>Manipulating the data into a ‘long’ format (i.e. <em>tidy</em>\nformat) is necessary for modelling in <code>mvgam</code>. By ‘long’\nformat, we mean that each <code>series x time</code> observation needs\nto have its own entry in the <code>dataframe</code> or <code>list</code>\nobject that we wish to pass as data for to the two primary modelling\nfunctions, <code>mvgam()</code> and <code>jsdgam()</code>. A simple\nexample can be viewed by simulating data using the\n<code>sim_mvgam()</code> function. See <code>?sim_mvgam</code> for more\ndetails</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a>simdat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>  <span class=\"at\">n_series =</span> <span class=\"dv\">4</span>, </span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>  <span class=\"at\">T =</span> <span class=\"dv\">24</span>, </span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">prop_missing =</span> <span class=\"fl\">0.2</span></span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(simdat<span class=\"sc\">$</span>data_train, <span class=\"dv\">16</span>)</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     y season year   series time</span></span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   3      1    1 series_1    1</span></span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   2      1    1 series_2    1</span></span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   2      1    1 series_3    1</span></span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   7      1    1 series_4    1</span></span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   1      2    1 series_1    2</span></span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6   3      2    1 series_2    2</span></span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7   3      2    1 series_3    2</span></span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   1      2    1 series_4    2</span></span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   1      3    1 series_1    3</span></span>\n<span id=\"cb1-17\"><a href=\"#cb1-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  4      3    1 series_2    3</span></span>\n<span id=\"cb1-18\"><a href=\"#cb1-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11  4      3    1 series_3    3</span></span>\n<span id=\"cb1-19\"><a href=\"#cb1-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 NA      3    1 series_4    3</span></span>\n<span id=\"cb1-20\"><a href=\"#cb1-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 NA      4    1 series_1    4</span></span>\n<span id=\"cb1-21\"><a href=\"#cb1-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14  2      4    1 series_2    4</span></span>\n<span id=\"cb1-22\"><a href=\"#cb1-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15  2      4    1 series_3    4</span></span>\n<span id=\"cb1-23\"><a href=\"#cb1-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16  5      4    1 series_4    4</span></span></code></pre></div>\n<div id=\"series-as-a-factor-variable\" class=\"section level3\">\n<h3><code>series</code> as a <code>factor</code> variable</h3>\n<p>Notice how we have four different time series in these simulated\ndata, and we have identified the series-level indicator as a\n<code>factor</code> variable.</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">class</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series)</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;factor&quot;</span></span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series)</span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_1&quot; &quot;series_2&quot; &quot;series_3&quot; &quot;series_4&quot;</span></span></code></pre></div>\n<p>It is important that the number of levels matches the number of\nunique series in the data to ensure indexing across series works\nproperly in the underlying modelling functions. Several of the main\nworkhorse functions in the package (including <code>mvgam()</code> and\n<code>get_mvgam_priors()</code>) will give an error if this is not the\ncase, but it may be worth checking anyway:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a><span class=\"fu\">all</span>(<span class=\"fu\">levels</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series) <span class=\"sc\">%in%</span> </span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>      <span class=\"fu\">unique</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series))</span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] TRUE</span></span></code></pre></div>\n<p>Note that you can technically supply data that does not have a\n<code>series</code> indicator, and the package will generally assume\nthat you are only using a single time series. There are exceptions to\nthis, for example if you have grouped data and would like to estimate\nhierarchical dependencies (see an example of hierarchical process error\ncorrelations in the <code>?AR</code> documentation) or if you would like\nto set up a Joint Species Distribution Model (JSDM) using a Zero-Mean\nMultivariate Gaussian distribution for the latent residuals (see\nexamples in the <code>?ZMVN</code> documentation).</p>\n</div>\n<div id=\"a-single-outcome-variable\" class=\"section level3\">\n<h3>A single outcome variable</h3>\n<p>You may also have notices that we do not spread the\n<code>numeric / integer</code>-classed outcome variable into different\ncolumns. Rather, there is only a single column for the outcome variable,\nlabelled <code>y</code> in these simulated data (though the outcome does\nnot have to be labelled <code>y</code>). This is another important\nrequirement in <code>mvgam</code>, but it shouldn’t be too unfamiliar to\n<code>R</code> users who frequently use modelling packages such as\n<code>lme4</code>, <code>mgcv</code>, <code>brms</code> or the many\nother regression modelling packages out there. The advantage of this\nformat is that it is now very easy to specify effects that vary among\ntime series:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(<span class=\"fu\">glm</span>(</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> series <span class=\"sc\">+</span> time,</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>))</span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Call:</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; glm(formula = y ~ series + time, family = poisson(), data = simdat$data_train)</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Coefficients:</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                Estimate Std. Error z value Pr(&gt;|z|)    </span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    -0.31987    0.37647  -0.850 0.395515    </span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_2  1.28070    0.37645   3.402 0.000669 ***</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_3  1.18080    0.38064   3.102 0.001921 ** </span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_4  1.17583    0.38161   3.081 0.002061 ** </span></span>\n<span id=\"cb4-16\"><a href=\"#cb4-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; time           -0.01996    0.01888  -1.057 0.290507    </span></span>\n<span id=\"cb4-17\"><a href=\"#cb4-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb4-18\"><a href=\"#cb4-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb4-19\"><a href=\"#cb4-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-20\"><a href=\"#cb4-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Dispersion parameter for poisson family taken to be 1)</span></span>\n<span id=\"cb4-21\"><a href=\"#cb4-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-22\"><a href=\"#cb4-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Null deviance: 115.3  on 59  degrees of freedom</span></span>\n<span id=\"cb4-23\"><a href=\"#cb4-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Residual deviance:  96.7  on 55  degrees of freedom</span></span>\n<span id=\"cb4-24\"><a href=\"#cb4-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   (12 observations deleted due to missingness)</span></span>\n<span id=\"cb4-25\"><a href=\"#cb4-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AIC: 214.96</span></span>\n<span id=\"cb4-26\"><a href=\"#cb4-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb4-27\"><a href=\"#cb4-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Number of Fisher Scoring iterations: 5</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mgcv<span class=\"sc\">::</span><span class=\"fu\">gam</span>(</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> series <span class=\"sc\">+</span> <span class=\"fu\">s</span>(time, <span class=\"at\">by =</span> series),</span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a>))</span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family: poisson </span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function: log </span></span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-10\"><a href=\"#cb5-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Formula:</span></span>\n<span id=\"cb5-11\"><a href=\"#cb5-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ series + s(time, by = series)</span></span>\n<span id=\"cb5-12\"><a href=\"#cb5-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-13\"><a href=\"#cb5-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Parametric coefficients:</span></span>\n<span id=\"cb5-14\"><a href=\"#cb5-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                Estimate Std. Error z value Pr(&gt;|z|)   </span></span>\n<span id=\"cb5-15\"><a href=\"#cb5-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)     -0.8004     0.4355  -1.838  0.06608 . </span></span>\n<span id=\"cb5-16\"><a href=\"#cb5-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_2   0.9043     0.5742   1.575  0.11526   </span></span>\n<span id=\"cb5-17\"><a href=\"#cb5-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_3   1.4777     0.4741   3.117  0.00183 **</span></span>\n<span id=\"cb5-18\"><a href=\"#cb5-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_4   1.3673     0.4806   2.845  0.00445 **</span></span>\n<span id=\"cb5-19\"><a href=\"#cb5-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb5-20\"><a href=\"#cb5-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb5-21\"><a href=\"#cb5-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-22\"><a href=\"#cb5-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of smooth terms:</span></span>\n<span id=\"cb5-23\"><a href=\"#cb5-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                          edf Ref.df Chi.sq p-value  </span></span>\n<span id=\"cb5-24\"><a href=\"#cb5-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_1 1.000  1.000  4.784  0.0287 *</span></span>\n<span id=\"cb5-25\"><a href=\"#cb5-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_2 5.767  6.810 15.826  0.0213 *</span></span>\n<span id=\"cb5-26\"><a href=\"#cb5-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_3 1.000  1.000  0.214  0.6433  </span></span>\n<span id=\"cb5-27\"><a href=\"#cb5-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_4 3.589  4.434 10.772  0.0395 *</span></span>\n<span id=\"cb5-28\"><a href=\"#cb5-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb5-29\"><a href=\"#cb5-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb5-30\"><a href=\"#cb5-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb5-31\"><a href=\"#cb5-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; R-sq.(adj) =  0.541   Deviance explained = 60.4%</span></span>\n<span id=\"cb5-32\"><a href=\"#cb5-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; UBRE = 0.27372  Scale est. = 1         n = 60</span></span></code></pre></div>\n<p>Depending on the observation families you plan to use when building\nmodels, there may be some restrictions that need to be satisfied within\nthe outcome variable. For example, a Beta regression can only handle\nproportional data, so values <code>&gt;= 1</code> or\n<code>&lt;= 0</code> are not allowed. Likewise, a Poisson regression can\nonly handle non-negative integers. Most regression functions in\n<code>R</code> will assume the user knows all of this and so will not\nissue any warnings or errors if you choose the wrong distribution, but\noften this ends up leading to some unhelpful error from an optimizer\nthat is difficult to interpret and diagnose. <code>mvgam</code> will\nattempt to provide some errors if you do something that is simply not\nallowed. For example, we can simulate data from a zero-centred Gaussian\ndistribution (ensuring that some of our values will be\n<code>&lt; 1</code>) and attempt a Beta regression in <code>mvgam</code>\nusing the <code>betar</code> family:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a>gauss_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">10</span>),</span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series1&quot;</span>,</span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"st\">&quot;series1&quot;</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">10</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a>gauss_dat</span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        outcome  series time</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  -0.57990666 series1    1</span></span>\n<span id=\"cb6-11\"><a href=\"#cb6-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  -0.86642679 series1    2</span></span>\n<span id=\"cb6-12\"><a href=\"#cb6-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.20127362 series1    3</span></span>\n<span id=\"cb6-13\"><a href=\"#cb6-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   1.36763744 series1    4</span></span>\n<span id=\"cb6-14\"><a href=\"#cb6-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  -0.03516434 series1    5</span></span>\n<span id=\"cb6-15\"><a href=\"#cb6-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6   0.23979092 series1    6</span></span>\n<span id=\"cb6-16\"><a href=\"#cb6-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7   0.01013158 series1    7</span></span>\n<span id=\"cb6-17\"><a href=\"#cb6-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8  -0.54771525 series1    8</span></span>\n<span id=\"cb6-18\"><a href=\"#cb6-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9  -0.48140890 series1    9</span></span>\n<span id=\"cb6-19\"><a href=\"#cb6-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 -1.20075974 series1   10</span></span></code></pre></div>\n<p>A call to <code>gam()</code> using the <code>mgcv</code> package\nleads to a model that actually fits (though it does give an unhelpful\nwarning message):</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a>mgcv<span class=\"sc\">::</span><span class=\"fu\">gam</span>(outcome <span class=\"sc\">~</span> time,</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> gauss_dat</span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family: Beta regression(0.124) </span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function: logit </span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Formula:</span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; outcome ~ time</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total model degrees of freedom 2 </span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; REML score: -180.7085</span></span></code></pre></div>\n<p>But the same call to <code>mvgam()</code> gives us something more\nuseful:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">mvgam</span>(outcome <span class=\"sc\">~</span> time,</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> gauss_dat</span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Error: Values &lt;= 0 not allowed for beta responses</span></span></code></pre></div>\n<p>Please see <code>?mvgam_families</code> for more information on the\ntypes of responses that the package can handle and their\nrestrictions</p>\n</div>\n<div id=\"a-time-variable\" class=\"section level3\">\n<h3>A <code>time</code> variable</h3>\n<p>The other requirement for most models that can be fit in\n<code>mvgam</code> is a <code>numeric / integer</code>-classed variable\nlabelled <code>time</code>. This ensures the modelling software knows\nhow to arrange the time series when building models. This setup still\nallows us to formulate multivariate time series models. If you plan to\nuse any of the autoregressive dynamic trend functions available in\n<code>mvgam</code> (see <code>?mvgam_trends</code> for details of\navailable dynamic processes), you will need to ensure your time series\nare entered with a fixed sampling interval (i.e. the time between\ntimesteps 1 and 2 should be the same as the time between timesteps 2 and\n3, etc…). But note that you can have missing observations for some (or\nall) series. <code>mvgam()</code> will check this for you, but again it\nis useful to ensure you have no missing timepoint x series combinations\nin your data. You can generally do this with a simple <code>dplyr</code>\ncall:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"co\"># A function to ensure all timepoints within a sequence are identical</span></span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a>all_times_avail <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(time, min_time, max_time) {</span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a>  <span class=\"fu\">identical</span>(</span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a>    <span class=\"fu\">as.numeric</span>(<span class=\"fu\">sort</span>(time)),</span>\n<span id=\"cb9-5\"><a href=\"#cb9-5\" tabindex=\"-1\"></a>    <span class=\"fu\">as.numeric</span>(<span class=\"fu\">seq.int</span>(<span class=\"at\">from =</span> min_time, <span class=\"at\">to =</span> max_time))</span>\n<span id=\"cb9-6\"><a href=\"#cb9-6\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb9-7\"><a href=\"#cb9-7\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb9-8\"><a href=\"#cb9-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb9-9\"><a href=\"#cb9-9\" tabindex=\"-1\"></a><span class=\"co\"># Get min and max times from the data</span></span>\n<span id=\"cb9-10\"><a href=\"#cb9-10\" tabindex=\"-1\"></a>min_time <span class=\"ot\">&lt;-</span> <span class=\"fu\">min</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>time)</span>\n<span id=\"cb9-11\"><a href=\"#cb9-11\" tabindex=\"-1\"></a>max_time <span class=\"ot\">&lt;-</span> <span class=\"fu\">max</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>time)</span>\n<span id=\"cb9-12\"><a href=\"#cb9-12\" tabindex=\"-1\"></a></span>\n<span id=\"cb9-13\"><a href=\"#cb9-13\" tabindex=\"-1\"></a><span class=\"co\"># Check that all times are recorded for each series</span></span>\n<span id=\"cb9-14\"><a href=\"#cb9-14\" tabindex=\"-1\"></a><span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb9-15\"><a href=\"#cb9-15\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series,</span>\n<span id=\"cb9-16\"><a href=\"#cb9-16\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>time</span>\n<span id=\"cb9-17\"><a href=\"#cb9-17\" tabindex=\"-1\"></a>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-18\"><a href=\"#cb9-18\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">group_by</span>(series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-19\"><a href=\"#cb9-19\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">summarise</span>(<span class=\"at\">all_there =</span> <span class=\"fu\">all_times_avail</span>(</span>\n<span id=\"cb9-20\"><a href=\"#cb9-20\" tabindex=\"-1\"></a>    time,</span>\n<span id=\"cb9-21\"><a href=\"#cb9-21\" tabindex=\"-1\"></a>    min_time,</span>\n<span id=\"cb9-22\"><a href=\"#cb9-22\" tabindex=\"-1\"></a>    max_time</span>\n<span id=\"cb9-23\"><a href=\"#cb9-23\" tabindex=\"-1\"></a>  )) <span class=\"ot\">-&gt;</span> checked_times</span>\n<span id=\"cb9-24\"><a href=\"#cb9-24\" tabindex=\"-1\"></a><span class=\"cf\">if</span> (<span class=\"fu\">any</span>(checked_times<span class=\"sc\">$</span>all_there <span class=\"sc\">==</span> <span class=\"cn\">FALSE</span>)) {</span>\n<span id=\"cb9-25\"><a href=\"#cb9-25\" tabindex=\"-1\"></a>  <span class=\"fu\">warning</span>(<span class=\"st\">&quot;One or more series in is missing observations for one or more timepoints&quot;</span>)</span>\n<span id=\"cb9-26\"><a href=\"#cb9-26\" tabindex=\"-1\"></a>} <span class=\"cf\">else</span> {</span>\n<span id=\"cb9-27\"><a href=\"#cb9-27\" tabindex=\"-1\"></a>  <span class=\"fu\">cat</span>(<span class=\"st\">&quot;All series have observations at all timepoints :)&quot;</span>)</span>\n<span id=\"cb9-28\"><a href=\"#cb9-28\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb9-29\"><a href=\"#cb9-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; All series have observations at all timepoints :)</span></span></code></pre></div>\n<p>Note that models which use dynamic components will assume that\nsmaller values of <code>time</code> are <em>older</em>\n(i.e. <code>time = 1</code> came <em>before</em> <code>time = 2</code>,\netc…)</p>\n</div>\n<div id=\"irregular-sampling-intervals\" class=\"section level3\">\n<h3>Irregular sampling intervals?</h3>\n<p>Most <code>mvgam</code> dynamic trend models expect <code>time</code>\nto be measured in discrete, evenly-spaced intervals (i.e. one\nmeasurement per week, or one per year, for example; though missing\nvalues are allowed). But please note that irregularly sampled time\nintervals are allowed, in which case the <code>CAR()</code> trend model\n(continuous time autoregressive) is appropriate. You can see an example\nof this kind of model in the <strong>Examples</strong> section in\n<code>?CAR</code>. You can also use <code>trend_model = &#39;None&#39;</code>\n(the default in <code>mvgam()</code>) and instead use a Gaussian Process\nto model temporal variation for irregularly-sampled time series. See the\n<code>?brms::gp</code> for details. But to reiterate the point from\nabove, if you do not have time series data (or don’t want to estimate\nlatent temporal dynamics) but you would like to estimate correlated\nlatent residuals among multivariate outcomes, you can set up models that\nuse <code>trend_model = ZMVN(...)</code> without the need for a\n<code>time</code> variable (see <code>?ZMVN</code> for details).</p>\n</div>\n</div>\n<div id=\"checking-data-with-get_mvgam_priors\" class=\"section level2\">\n<h2>Checking data with <code>get_mvgam_priors()</code></h2>\n<p>The <code>get_mvgam_priors()</code> function is designed to return\ninformation about the parameters in a model whose prior distributions\ncan be modified by the user. But in doing so, it will perform a series\nof checks to ensure the data are formatted properly. It can therefore be\nvery useful to new users for ensuring there isn’t anything strange going\non in the data setup. For example, we can replicate the steps taken\nabove (to check factor levels and timepoint x series combinations) with\na single call to <code>get_mvgam_priors()</code>. Here we first simulate\nsome data in which some of the timepoints in the <code>time</code>\nvariable are not included in the data:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>bad_times <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"fu\">seq</span>(<span class=\"dv\">1</span>, <span class=\"dv\">16</span>, <span class=\"at\">by =</span> <span class=\"dv\">2</span>),</span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series_1&quot;</span>),</span>\n<span id=\"cb10-4\"><a href=\"#cb10-4\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">8</span>)</span>\n<span id=\"cb10-5\"><a href=\"#cb10-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb10-6\"><a href=\"#cb10-6\" tabindex=\"-1\"></a>bad_times</span>\n<span id=\"cb10-7\"><a href=\"#cb10-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   time   series    outcome</span></span>\n<span id=\"cb10-8\"><a href=\"#cb10-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1    1 series_1  1.6357848</span></span>\n<span id=\"cb10-9\"><a href=\"#cb10-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2    3 series_1 -0.3858940</span></span>\n<span id=\"cb10-10\"><a href=\"#cb10-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3    5 series_1  1.7655861</span></span>\n<span id=\"cb10-11\"><a href=\"#cb10-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4    7 series_1 -1.4477319</span></span>\n<span id=\"cb10-12\"><a href=\"#cb10-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5    9 series_1 -1.0557525</span></span>\n<span id=\"cb10-13\"><a href=\"#cb10-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6   11 series_1  0.4308398</span></span>\n<span id=\"cb10-14\"><a href=\"#cb10-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7   13 series_1  1.9072537</span></span>\n<span id=\"cb10-15\"><a href=\"#cb10-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   15 series_1  0.1525545</span></span></code></pre></div>\n<p>Next we call <code>get_mvgam_priors()</code> by simply specifying an\nintercept-only model, which is enough to trigger all the checks:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> bad_times,</span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Error: One or more series in data is missing observations for one or more timepoints</span></span></code></pre></div>\n<p>This error is useful as it tells us where the problem is. There are\nmany ways to fill in missing timepoints, so the correct way will have to\nbe left up to the user. But if you don’t have any covariates, it should\nbe pretty easy using <code>expand.grid()</code>:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a>bad_times <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">right_join</span>(<span class=\"fu\">expand.grid</span>(</span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"fu\">seq</span>(</span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a>      <span class=\"fu\">min</span>(bad_times<span class=\"sc\">$</span>time),</span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a>      <span class=\"fu\">max</span>(bad_times<span class=\"sc\">$</span>time)</span>\n<span id=\"cb12-6\"><a href=\"#cb12-6\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb12-7\"><a href=\"#cb12-7\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"fu\">unique</span>(bad_times<span class=\"sc\">$</span>series),</span>\n<span id=\"cb12-8\"><a href=\"#cb12-8\" tabindex=\"-1\"></a>      <span class=\"at\">levels =</span> <span class=\"fu\">levels</span>(bad_times<span class=\"sc\">$</span>series)</span>\n<span id=\"cb12-9\"><a href=\"#cb12-9\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb12-10\"><a href=\"#cb12-10\" tabindex=\"-1\"></a>  )) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb12-11\"><a href=\"#cb12-11\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(time) <span class=\"ot\">-&gt;</span> good_times</span>\n<span id=\"cb12-12\"><a href=\"#cb12-12\" tabindex=\"-1\"></a>good_times</span>\n<span id=\"cb12-13\"><a href=\"#cb12-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    time   series    outcome</span></span>\n<span id=\"cb12-14\"><a href=\"#cb12-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1     1 series_1  1.6357848</span></span>\n<span id=\"cb12-15\"><a href=\"#cb12-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2     2 series_1         NA</span></span>\n<span id=\"cb12-16\"><a href=\"#cb12-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3     3 series_1 -0.3858940</span></span>\n<span id=\"cb12-17\"><a href=\"#cb12-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4     4 series_1         NA</span></span>\n<span id=\"cb12-18\"><a href=\"#cb12-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5     5 series_1  1.7655861</span></span>\n<span id=\"cb12-19\"><a href=\"#cb12-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6     6 series_1         NA</span></span>\n<span id=\"cb12-20\"><a href=\"#cb12-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7     7 series_1 -1.4477319</span></span>\n<span id=\"cb12-21\"><a href=\"#cb12-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8     8 series_1         NA</span></span>\n<span id=\"cb12-22\"><a href=\"#cb12-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9     9 series_1 -1.0557525</span></span>\n<span id=\"cb12-23\"><a href=\"#cb12-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10   10 series_1         NA</span></span>\n<span id=\"cb12-24\"><a href=\"#cb12-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11   11 series_1  0.4308398</span></span>\n<span id=\"cb12-25\"><a href=\"#cb12-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12   12 series_1         NA</span></span>\n<span id=\"cb12-26\"><a href=\"#cb12-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13   13 series_1  1.9072537</span></span>\n<span id=\"cb12-27\"><a href=\"#cb12-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14   14 series_1         NA</span></span>\n<span id=\"cb12-28\"><a href=\"#cb12-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15   15 series_1  0.1525545</span></span></code></pre></div>\n<p>Now the call to <code>get_mvgam_priors()</code>, using our filled in\ndata, should work:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> good_times,</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb13-5\"><a href=\"#cb13-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb13-6\"><a href=\"#cb13-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb13-7\"><a href=\"#cb13-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb13-8\"><a href=\"#cb13-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                   prior                   example_change</span></span>\n<span id=\"cb13-9\"><a href=\"#cb13-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.3, 2.5);      (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb13-10\"><a href=\"#cb13-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(-0.76, 0.83);</span></span>\n<span id=\"cb13-11\"><a href=\"#cb13-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb13-12\"><a href=\"#cb13-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb13-13\"><a href=\"#cb13-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<p>This function should also pick up on misaligned factor levels for the\n<code>series</code> variable. We can check this by again simulating,\nthis time adding an additional factor level that is not included in the\ndata:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a>bad_levels <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">8</span>,</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series_1&quot;</span>,</span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;series_1&quot;</span>,</span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;series_2&quot;</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">8</span>)</span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(bad_levels<span class=\"sc\">$</span>series)</span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_1&quot; &quot;series_2&quot;</span></span></code></pre></div>\n<p>Another call to <code>get_mvgam_priors()</code> brings up a useful\nerror:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> bad_levels,</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Error: Mismatch between factor levels of &quot;series&quot; and unique values of &quot;series&quot;</span></span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use</span></span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   `setdiff(levels(data$series), unique(data$series))` </span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; and</span></span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   `intersect(levels(data$series), unique(data$series))`</span></span>\n<span id=\"cb15-10\"><a href=\"#cb15-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; for guidance</span></span></code></pre></div>\n<p>Following the message’s advice tells us there is a level for\n<code>series_2</code> in the <code>series</code> variable, but there are\nno observations for this series in the data:</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">setdiff</span>(<span class=\"fu\">levels</span>(bad_levels<span class=\"sc\">$</span>series), </span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a>        <span class=\"fu\">unique</span>(bad_levels<span class=\"sc\">$</span>series))</span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_2&quot;</span></span></code></pre></div>\n<p>Re-assigning the levels fixes the issue:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a>bad_levels <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">droplevels</span>(series)) <span class=\"ot\">-&gt;</span> good_levels</span>\n<span id=\"cb17-3\"><a href=\"#cb17-3\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(good_levels<span class=\"sc\">$</span>series)</span>\n<span id=\"cb17-4\"><a href=\"#cb17-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;series_1&quot;</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  outcome <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> good_levels,</span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                  prior                  example_change</span></span>\n<span id=\"cb18-10\"><a href=\"#cb18-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  (Intercept) ~ student_t(3, 0, 2.5);     (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb18-11\"><a href=\"#cb18-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(0.46, 0.96);</span></span>\n<span id=\"cb18-12\"><a href=\"#cb18-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb18-13\"><a href=\"#cb18-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb18-14\"><a href=\"#cb18-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<div id=\"covariates-with-no-nas\" class=\"section level3\">\n<h3>Covariates with no <code>NA</code>s</h3>\n<p>Covariates can be used in models just as you would when using\n<code>mgcv</code> (see <code>?formula.gam</code> for details of the\nformula syntax). But although the outcome variable can have\n<code>NA</code>s, covariates cannot. Most regression software will\nsilently drop any raws in the model matrix that have <code>NA</code>s,\nwhich is not helpful when debugging. Both the <code>mvgam()</code> and\n<code>get_mvgam_priors()</code> functions will run some simple checks\nfor you, and hopefully will return useful errors if it finds in missing\nvalues:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a>miss_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">10</span>),</span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a>  <span class=\"at\">cov =</span> <span class=\"fu\">c</span>(<span class=\"cn\">NA</span>, <span class=\"fu\">rnorm</span>(<span class=\"dv\">9</span>)),</span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series1&quot;</span>,</span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"st\">&quot;series1&quot;</span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">10</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a>miss_dat</span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       outcome          cov  series time</span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  -0.5965054           NA series1    1</span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   0.2126416  0.154650377 series1    2</span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.9601485  1.553717403 series1    3</span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4  -0.8857684 -0.507988552 series1    4</span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  -0.4037936  0.245187700 series1    5</span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  -0.4738641 -0.009847922 series1    6</span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7  -1.2390329  0.342620485 series1    7</span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   1.9631220 -0.642393988 series1    8</span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9  -1.6783068 -1.335488789 series1    9</span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 -1.3909946 -0.254555529 series1   10</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb20-2\"><a href=\"#cb20-2\" tabindex=\"-1\"></a>  outcome <span class=\"sc\">~</span> cov,</span>\n<span id=\"cb20-3\"><a href=\"#cb20-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> miss_dat,</span>\n<span id=\"cb20-4\"><a href=\"#cb20-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb20-5\"><a href=\"#cb20-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb20-6\"><a href=\"#cb20-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb20-7\"><a href=\"#cb20-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb20-8\"><a href=\"#cb20-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2                                  cov            1     cov fixed effect</span></span>\n<span id=\"cb20-9\"><a href=\"#cb20-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb20-10\"><a href=\"#cb20-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                    prior                   example_change</span></span>\n<span id=\"cb20-11\"><a href=\"#cb20-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, -0.5, 2.5);      (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb20-12\"><a href=\"#cb20-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2              cov ~ student_t(3, 0, 2);              cov ~ normal(0, 1);</span></span>\n<span id=\"cb20-13\"><a href=\"#cb20-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(-0.43, 0.49);</span></span>\n<span id=\"cb20-14\"><a href=\"#cb20-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb20-15\"><a href=\"#cb20-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb20-16\"><a href=\"#cb20-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span>\n<span id=\"cb20-17\"><a href=\"#cb20-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3             NA             NA</span></span></code></pre></div>\n<p>Just like with the <code>mgcv</code> package, <code>mvgam</code> can\nalso accept data as a <code>list</code> object. This is useful if you\nwant to set up linear functional predictors or even distributed lag\npredictors. The checks run by <code>mvgam</code> should still work on\nthese data. Here we change the <code>cov</code> predictor to be a\n<code>matrix</code>:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>miss_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">list</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  <span class=\"at\">outcome =</span> <span class=\"fu\">rnorm</span>(<span class=\"dv\">10</span>),</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(<span class=\"st\">&quot;series1&quot;</span>,</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>    <span class=\"at\">levels =</span> <span class=\"st\">&quot;series1&quot;</span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">10</span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a>miss_dat<span class=\"sc\">$</span>cov <span class=\"ot\">&lt;-</span> <span class=\"fu\">matrix</span>(<span class=\"fu\">rnorm</span>(<span class=\"dv\">50</span>), <span class=\"at\">ncol =</span> <span class=\"dv\">5</span>, <span class=\"at\">nrow =</span> <span class=\"dv\">10</span>)</span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a>miss_dat<span class=\"sc\">$</span>cov[<span class=\"dv\">2</span>, <span class=\"dv\">3</span>] <span class=\"ot\">&lt;-</span> <span class=\"cn\">NA</span></span></code></pre></div>\n<p>A call to <code>get_mvgam_priors()</code> returns the same error:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>  outcome <span class=\"sc\">~</span> cov,</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> miss_dat,</span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>()</span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                             param_name param_length           param_info</span></span>\n<span id=\"cb22-7\"><a href=\"#cb22-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1                          (Intercept)            1          (Intercept)</span></span>\n<span id=\"cb22-8\"><a href=\"#cb22-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2                                 cov1            1    cov1 fixed effect</span></span>\n<span id=\"cb22-9\"><a href=\"#cb22-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3                                 cov2            1    cov2 fixed effect</span></span>\n<span id=\"cb22-10\"><a href=\"#cb22-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4                                 cov3            1    cov3 fixed effect</span></span>\n<span id=\"cb22-11\"><a href=\"#cb22-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5                                 cov4            1    cov4 fixed effect</span></span>\n<span id=\"cb22-12\"><a href=\"#cb22-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6                                 cov5            1    cov5 fixed effect</span></span>\n<span id=\"cb22-13\"><a href=\"#cb22-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7 vector&lt;lower=0&gt;[n_series] sigma_obs;            1 observation error sd</span></span>\n<span id=\"cb22-14\"><a href=\"#cb22-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                   prior                   example_change</span></span>\n<span id=\"cb22-15\"><a href=\"#cb22-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ student_t(3, 0.2, 2.5);      (Intercept) ~ normal(0, 1);</span></span>\n<span id=\"cb22-16\"><a href=\"#cb22-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2            cov1 ~ student_t(3, 0, 2);             cov1 ~ normal(0, 1);</span></span>\n<span id=\"cb22-17\"><a href=\"#cb22-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3            cov2 ~ student_t(3, 0, 2);             cov2 ~ normal(0, 1);</span></span>\n<span id=\"cb22-18\"><a href=\"#cb22-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4            cov3 ~ student_t(3, 0, 2);             cov3 ~ normal(0, 1);</span></span>\n<span id=\"cb22-19\"><a href=\"#cb22-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5            cov4 ~ student_t(3, 0, 2);             cov4 ~ normal(0, 1);</span></span>\n<span id=\"cb22-20\"><a href=\"#cb22-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6            cov5 ~ student_t(3, 0, 2);             cov5 ~ normal(0, 1);</span></span>\n<span id=\"cb22-21\"><a href=\"#cb22-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7  sigma_obs ~ inv_gamma(1.418, 0.452); sigma_obs ~ normal(-0.86, 0.33);</span></span>\n<span id=\"cb22-22\"><a href=\"#cb22-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb22-23\"><a href=\"#cb22-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb22-24\"><a href=\"#cb22-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span>\n<span id=\"cb22-25\"><a href=\"#cb22-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3             NA             NA</span></span>\n<span id=\"cb22-26\"><a href=\"#cb22-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4             NA             NA</span></span>\n<span id=\"cb22-27\"><a href=\"#cb22-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5             NA             NA</span></span>\n<span id=\"cb22-28\"><a href=\"#cb22-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6             NA             NA</span></span>\n<span id=\"cb22-29\"><a href=\"#cb22-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7             NA             NA</span></span></code></pre></div>\n</div>\n</div>\n<div id=\"plotting-with-plot_mvgam_series\" class=\"section level2\">\n<h2>Plotting with <code>plot_mvgam_series()</code></h2>\n<p>Plotting the data is a useful way to ensure everything looks ok, once\nyou’ve gone throug the above checks on factor levels and timepoint x\nseries combinations. The <code>plot_mvgam_series()</code> function will\ntake supplied data and plot either a series of line plots (if you choose\n<code>series = &#39;all&#39;</code>) or a set of plots to describe the\ndistribution for a single time series. For example, to plot all of the\ntime series in our data, and highlight a single series in each plot, we\ncan use:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb23-3\"><a href=\"#cb23-3\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> <span class=\"st\">&quot;y&quot;</span>,</span>\n<span id=\"cb23-4\"><a href=\"#cb23-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span></span>\n<span id=\"cb23-5\"><a href=\"#cb23-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Or we can look more closely at the distribution for the first time\nseries:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> <span class=\"st\">&quot;y&quot;</span>,</span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>If you have split your data into training and testing folds (i.e. for\nforecast evaluation), you can include the test data in your plots:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test,</span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> <span class=\"st\">&quot;y&quot;</span>,</span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"example-with-neon-tick-data\" class=\"section level2\">\n<h2>Example with NEON tick data</h2>\n<p>To give one example of how data can be reformatted for\n<code>mvgam</code> modelling, we will use observations from the National\nEcological Observatory Network (NEON) tick drag cloth samples.\n<em>Ixodes scapularis</em> is a widespread tick species capable of\ntransmitting a diversity of parasites to animals and humans, many of\nwhich are zoonotic. Due to the medical and ecological importance of this\ntick species, a common goal is to understand factors that influence\ntheir abundances. The NEON field team carries out standardised <a href=\"https://www.neonscience.org/data-collection/ticks\" target=\"_blank\">long-term monitoring of tick abundances as well as other\nimportant indicators of ecological change</a>. Nymphal abundance of\n<em>I. scapularis</em> is routinely recorded across NEON plots using a\nfield sampling method called drag cloth sampling, which is a common\nmethod for sampling ticks in the landscape. Field researchers sample\nticks by dragging a large cloth behind themselves through terrain that\nis suspected of harboring ticks, usually working in a grid-like pattern.\nThe sites have been sampled since 2014, resulting in a rich dataset of\nnymph abundance time series. These tick time series show strong\nseasonality and incorporate many of the challenging features associated\nwith ecological data including overdispersion, high proportions of\nmissingness and irregular sampling in time, making them useful for\nexploring the utility of dynamic GAMs.</p>\n<p>We begin by loading NEON tick data for the years 2014 - 2021, which\nwere downloaded from NEON and prepared as described in <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.13974\" target=\"_blank\">Clark &amp; Wells 2022</a>. You can read a bit about the\ndata using the call <code>?all_neon_tick_data</code></p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">data</span>(<span class=\"st\">&quot;all_neon_tick_data&quot;</span>)</span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>(all_neon_tick_data))</span>\n<span id=\"cb26-3\"><a href=\"#cb26-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; tibble [3,505 × 24] (S3: tbl_df/tbl/data.frame)</span></span>\n<span id=\"cb26-4\"><a href=\"#cb26-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ Year                : num [1:3505] 2015 2015 2015 2015 2015 ...</span></span>\n<span id=\"cb26-5\"><a href=\"#cb26-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ epiWeek             : chr [1:3505] &quot;37&quot; &quot;38&quot; &quot;39&quot; &quot;40&quot; ...</span></span>\n<span id=\"cb26-6\"><a href=\"#cb26-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ yearWeek            : chr [1:3505] &quot;201537&quot; &quot;201538&quot; &quot;201539&quot; &quot;201540&quot; ...</span></span>\n<span id=\"cb26-7\"><a href=\"#cb26-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ plotID              : chr [1:3505] &quot;BLAN_005&quot; &quot;BLAN_005&quot; &quot;BLAN_005&quot; &quot;BLAN_005&quot; ...</span></span>\n<span id=\"cb26-8\"><a href=\"#cb26-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ siteID              : chr [1:3505] &quot;BLAN&quot; &quot;BLAN&quot; &quot;BLAN&quot; &quot;BLAN&quot; ...</span></span>\n<span id=\"cb26-9\"><a href=\"#cb26-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ nlcdClass           : chr [1:3505] &quot;deciduousForest&quot; &quot;deciduousForest&quot; &quot;deciduousForest&quot; &quot;deciduousForest&quot; ...</span></span>\n<span id=\"cb26-10\"><a href=\"#cb26-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ decimalLatitude     : num [1:3505] 39.1 39.1 39.1 39.1 39.1 ...</span></span>\n<span id=\"cb26-11\"><a href=\"#cb26-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ decimalLongitude    : num [1:3505] -78 -78 -78 -78 -78 ...</span></span>\n<span id=\"cb26-12\"><a href=\"#cb26-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ elevation           : num [1:3505] 168 168 168 168 168 ...</span></span>\n<span id=\"cb26-13\"><a href=\"#cb26-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ totalSampledArea    : num [1:3505] 162 NA NA NA 162 NA NA NA NA 164 ...</span></span>\n<span id=\"cb26-14\"><a href=\"#cb26-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ amblyomma_americanum: num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-15\"><a href=\"#cb26-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ ixodes_scapularis   : num [1:3505] 2 NA NA NA 0 NA NA NA NA 0 ...</span></span>\n<span id=\"cb26-16\"><a href=\"#cb26-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ time                : Date[1:3505], format: &quot;2015-09-13&quot; &quot;2015-09-20&quot; ...</span></span>\n<span id=\"cb26-17\"><a href=\"#cb26-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMin_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-18\"><a href=\"#cb26-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMin_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-19\"><a href=\"#cb26-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMax_precent       : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-20\"><a href=\"#cb26-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ RHMax_variance      : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-21\"><a href=\"#cb26-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMin_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-22\"><a href=\"#cb26-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMin_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-23\"><a href=\"#cb26-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMax_degC     : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-24\"><a href=\"#cb26-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ airTempMax_variance : num [1:3505] NA NA NA NA NA NA NA NA NA NA ...</span></span>\n<span id=\"cb26-25\"><a href=\"#cb26-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ soi                 : num [1:3505] -18.4 -17.9 -23.5 -28.4 -25.9 ...</span></span>\n<span id=\"cb26-26\"><a href=\"#cb26-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ cum_sdd             : num [1:3505] 173 173 173 173 173 ...</span></span>\n<span id=\"cb26-27\"><a href=\"#cb26-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ cum_gdd             : num [1:3505] 1129 1129 1129 1129 1129 ...</span></span></code></pre></div>\n<p>For this exercise, we will use the <code>epiWeek</code> variable as\nan index of seasonality, and we will only work with observations from a\nfew sampling plots (labelled in the <code>plotID</code> column):</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>plotIDs <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;SCBI_013&quot;</span>, <span class=\"st\">&quot;SCBI_002&quot;</span>,</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;SERC_001&quot;</span>, <span class=\"st\">&quot;SERC_005&quot;</span>,</span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;SERC_006&quot;</span>, <span class=\"st\">&quot;SERC_012&quot;</span>,</span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;BLAN_012&quot;</span>, <span class=\"st\">&quot;BLAN_005&quot;</span></span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Now we can select the target species we want (<em>I.\nscapularis</em>), filter to the correct plot IDs and convert the\n<code>epiWeek</code> variable from <code>character</code> to\n<code>numeric</code>:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a>model_dat <span class=\"ot\">&lt;-</span> all_neon_tick_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>() <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-3\"><a href=\"#cb28-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">target =</span> ixodes_scapularis) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-4\"><a href=\"#cb28-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(plotID <span class=\"sc\">%in%</span> plotIDs) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-5\"><a href=\"#cb28-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(Year, epiWeek, plotID, target) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb28-6\"><a href=\"#cb28-6\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">epiWeek =</span> <span class=\"fu\">as.numeric</span>(epiWeek))</span></code></pre></div>\n<p>Now is the tricky part: we need to fill in missing observations with\n<code>NA</code>s. The tick data are sparse in that field observers do\nnot go out and sample in each possible <code>epiWeek</code>. So there\nare many particular weeks in which observations are not included in the\ndata. But we can use <code>expand.grid()</code> again to take care of\nthis:</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a>model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a>  <span class=\"co\"># Create all possible combos of plotID, Year and epiWeek;</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a>  <span class=\"co\"># missing outcomes will be filled in as NA</span></span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">full_join</span>(<span class=\"fu\">expand.grid</span>(</span>\n<span id=\"cb29-5\"><a href=\"#cb29-5\" tabindex=\"-1\"></a>    <span class=\"at\">plotID =</span> <span class=\"fu\">unique</span>(model_dat<span class=\"sc\">$</span>plotID),</span>\n<span id=\"cb29-6\"><a href=\"#cb29-6\" tabindex=\"-1\"></a>    <span class=\"at\">Year =</span> <span class=\"fu\">unique</span>(model_dat<span class=\"sc\">$</span>Year),</span>\n<span id=\"cb29-7\"><a href=\"#cb29-7\" tabindex=\"-1\"></a>    <span class=\"at\">epiWeek =</span> <span class=\"fu\">seq</span>(<span class=\"dv\">1</span>, <span class=\"dv\">52</span>)</span>\n<span id=\"cb29-8\"><a href=\"#cb29-8\" tabindex=\"-1\"></a>  )) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-9\"><a href=\"#cb29-9\" tabindex=\"-1\"></a>  <span class=\"co\"># left_join back to original data so plotID and siteID will</span></span>\n<span id=\"cb29-10\"><a href=\"#cb29-10\" tabindex=\"-1\"></a>  <span class=\"co\"># match up, in case you need the siteID for anything else later on</span></span>\n<span id=\"cb29-11\"><a href=\"#cb29-11\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">left_join</span>(all_neon_tick_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-12\"><a href=\"#cb29-12\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(siteID, plotID) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb29-13\"><a href=\"#cb29-13\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">distinct</span>()) <span class=\"ot\">-&gt;</span> model_dat</span></code></pre></div>\n<p>Create the <code>series</code> variable needed for <code>mvgam</code>\nmodelling:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a>model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> plotID,</span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a>    <span class=\"at\">y =</span> target</span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a>    <span class=\"at\">siteID =</span> <span class=\"fu\">factor</span>(siteID),</span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">factor</span>(series)</span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(<span class=\"sc\">-</span>target, <span class=\"sc\">-</span>plotID) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb30-11\"><a href=\"#cb30-11\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(Year, epiWeek, series) <span class=\"ot\">-&gt;</span> model_dat</span></code></pre></div>\n<p>Now create the <code>time</code> variable, which needs to track\n<code>Year</code> and <code>epiWeek</code> for each unique series. The\n<code>n</code> function from <code>dplyr</code> is often useful if\ngenerating a <code>time</code> index for grouped dataframes:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb31-1\"><a href=\"#cb31-1\" tabindex=\"-1\"></a>model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-2\"><a href=\"#cb31-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>() <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-3\"><a href=\"#cb31-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">group_by</span>(series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-4\"><a href=\"#cb31-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(Year, epiWeek) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-5\"><a href=\"#cb31-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">time =</span> <span class=\"fu\">seq</span>(<span class=\"dv\">1</span>, dplyr<span class=\"sc\">::</span><span class=\"fu\">n</span>())) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb31-6\"><a href=\"#cb31-6\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>() <span class=\"ot\">-&gt;</span> model_dat</span></code></pre></div>\n<p>Check factor levels for the <code>series</code>:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb32-1\"><a href=\"#cb32-1\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(model_dat<span class=\"sc\">$</span>series)</span>\n<span id=\"cb32-2\"><a href=\"#cb32-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;BLAN_005&quot; &quot;BLAN_012&quot; &quot;SCBI_002&quot; &quot;SCBI_013&quot; &quot;SERC_001&quot; &quot;SERC_005&quot; &quot;SERC_006&quot;</span></span>\n<span id=\"cb32-3\"><a href=\"#cb32-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [8] &quot;SERC_012&quot;</span></span></code></pre></div>\n<p>This looks good, as does a more rigorous check using\n<code>get_mvgam_priors()</code>:</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb33-1\"><a href=\"#cb33-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb33-2\"><a href=\"#cb33-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb33-3\"><a href=\"#cb33-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat,</span>\n<span id=\"cb33-4\"><a href=\"#cb33-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb33-5\"><a href=\"#cb33-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb33-6\"><a href=\"#cb33-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    param_name param_length  param_info                                  prior</span></span>\n<span id=\"cb33-7\"><a href=\"#cb33-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept)            1 (Intercept) (Intercept) ~ student_t(3, -2.3, 2.5);</span></span>\n<span id=\"cb33-8\"><a href=\"#cb33-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                example_change new_lowerbound new_upperbound</span></span>\n<span id=\"cb33-9\"><a href=\"#cb33-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 (Intercept) ~ normal(0, 1);             NA             NA</span></span></code></pre></div>\n<p>We can also set up a model in <code>mvgam()</code> but use\n<code>run_model = FALSE</code> to further ensure all of the necessary\nsteps for creating the modelling code and objects will run. It is\nrecommended that you use the <code>cmdstanr</code> backend if possible,\nas the auto-formatting options available in this package are very useful\nfor checking the package-generated <code>Stan</code> code for any\ninefficiencies that can be fixed to lead to sampling performance\nimprovements:</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb34-1\"><a href=\"#cb34-1\" tabindex=\"-1\"></a>testmod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb34-2\"><a href=\"#cb34-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"fu\">s</span>(epiWeek, <span class=\"at\">by =</span> series, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb34-3\"><a href=\"#cb34-3\" tabindex=\"-1\"></a>    <span class=\"fu\">s</span>(series, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>),</span>\n<span id=\"cb34-4\"><a href=\"#cb34-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb34-5\"><a href=\"#cb34-5\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat,</span>\n<span id=\"cb34-6\"><a href=\"#cb34-6\" tabindex=\"-1\"></a>  <span class=\"at\">backend =</span> <span class=\"st\">&quot;cmdstanr&quot;</span>,</span>\n<span id=\"cb34-7\"><a href=\"#cb34-7\" tabindex=\"-1\"></a>  <span class=\"at\">run_model =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb34-8\"><a href=\"#cb34-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>This call runs without issue, and the resulting object now contains\nthe model code and data objects that are needed to initiate\nsampling:</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb35-1\"><a href=\"#cb35-1\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(testmod<span class=\"sc\">$</span>model_data)</span>\n<span id=\"cb35-2\"><a href=\"#cb35-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 25</span></span>\n<span id=\"cb35-3\"><a href=\"#cb35-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ y           : num [1:416, 1:8] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...</span></span>\n<span id=\"cb35-4\"><a href=\"#cb35-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n           : int 416</span></span>\n<span id=\"cb35-5\"><a href=\"#cb35-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ X           : num [1:3328, 1:73] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb35-6\"><a href=\"#cb35-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb35-7\"><a href=\"#cb35-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:3328] &quot;1&quot; &quot;2&quot; &quot;3&quot; &quot;4&quot; ...</span></span>\n<span id=\"cb35-8\"><a href=\"#cb35-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:73] &quot;X.Intercept.&quot; &quot;V2&quot; &quot;V3&quot; &quot;V4&quot; ...</span></span>\n<span id=\"cb35-9\"><a href=\"#cb35-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S1          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-10\"><a href=\"#cb35-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ zero        : num [1:73] 0 0 0 0 0 0 0 0 0 0 ...</span></span>\n<span id=\"cb35-11\"><a href=\"#cb35-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S2          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-12\"><a href=\"#cb35-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S3          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-13\"><a href=\"#cb35-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S4          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-14\"><a href=\"#cb35-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S5          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-15\"><a href=\"#cb35-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S6          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-16\"><a href=\"#cb35-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S7          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-17\"><a href=\"#cb35-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ S8          : num [1:8, 1:8] 1.037 -0.416 0.419 0.117 0.188 ...</span></span>\n<span id=\"cb35-18\"><a href=\"#cb35-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ p_coefs     : Named num 0</span></span>\n<span id=\"cb35-19\"><a href=\"#cb35-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;names&quot;)= chr &quot;(Intercept)&quot;</span></span>\n<span id=\"cb35-20\"><a href=\"#cb35-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ p_taus      : num 1.02</span></span>\n<span id=\"cb35-21\"><a href=\"#cb35-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ ytimes      : int [1:416, 1:8] 1 9 17 25 33 41 49 57 65 73 ...</span></span>\n<span id=\"cb35-22\"><a href=\"#cb35-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n_series    : int 8</span></span>\n<span id=\"cb35-23\"><a href=\"#cb35-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ sp          : Named num [1:9] 0.368 0.368 0.368 0.368 0.368 ...</span></span>\n<span id=\"cb35-24\"><a href=\"#cb35-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;names&quot;)= chr [1:9] &quot;s(epiWeek):seriesBLAN_005&quot; &quot;s(epiWeek):seriesBLAN_012&quot; &quot;s(epiWeek):seriesSCBI_002&quot; &quot;s(epiWeek):seriesSCBI_013&quot; ...</span></span>\n<span id=\"cb35-25\"><a href=\"#cb35-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ y_observed  : num [1:416, 1:8] 0 0 0 0 0 0 0 0 0 0 ...</span></span>\n<span id=\"cb35-26\"><a href=\"#cb35-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ total_obs   : int 3328</span></span>\n<span id=\"cb35-27\"><a href=\"#cb35-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ num_basis   : int 73</span></span>\n<span id=\"cb35-28\"><a href=\"#cb35-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n_sp        : num 9</span></span>\n<span id=\"cb35-29\"><a href=\"#cb35-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ n_nonmissing: int 400</span></span>\n<span id=\"cb35-30\"><a href=\"#cb35-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ obs_ind     : int [1:400] 89 93 98 101 115 118 121 124 127 130 ...</span></span>\n<span id=\"cb35-31\"><a href=\"#cb35-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ flat_ys     : num [1:400] 2 0 0 0 0 0 0 25 36 14 ...</span></span>\n<span id=\"cb35-32\"><a href=\"#cb35-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ flat_xs     : num [1:400, 1:73] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb35-33\"><a href=\"#cb35-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb35-34\"><a href=\"#cb35-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:400] &quot;705&quot; &quot;737&quot; &quot;777&quot; &quot;801&quot; ...</span></span>\n<span id=\"cb35-35\"><a href=\"#cb35-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..$ : chr [1:73] &quot;X.Intercept.&quot; &quot;V2&quot; &quot;V3&quot; &quot;V4&quot; ...</span></span>\n<span id=\"cb35-36\"><a href=\"#cb35-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;trend_model&quot;)= chr &quot;AR1&quot;</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb36-1\"><a href=\"#cb36-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(testmod)</span>\n<span id=\"cb36-2\"><a href=\"#cb36-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb36-3\"><a href=\"#cb36-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb36-4\"><a href=\"#cb36-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb36-5\"><a href=\"#cb36-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb36-6\"><a href=\"#cb36-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span></span>\n<span id=\"cb36-7\"><a href=\"#cb36-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb36-8\"><a href=\"#cb36-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb36-9\"><a href=\"#cb36-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] zero; // prior locations for basis coefficients</span></span>\n<span id=\"cb36-10\"><a href=\"#cb36-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb36-11\"><a href=\"#cb36-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb36-12\"><a href=\"#cb36-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S1; // mgcv smooth penalty matrix S1</span></span>\n<span id=\"cb36-13\"><a href=\"#cb36-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S2; // mgcv smooth penalty matrix S2</span></span>\n<span id=\"cb36-14\"><a href=\"#cb36-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S3; // mgcv smooth penalty matrix S3</span></span>\n<span id=\"cb36-15\"><a href=\"#cb36-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S4; // mgcv smooth penalty matrix S4</span></span>\n<span id=\"cb36-16\"><a href=\"#cb36-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S5; // mgcv smooth penalty matrix S5</span></span>\n<span id=\"cb36-17\"><a href=\"#cb36-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S6; // mgcv smooth penalty matrix S6</span></span>\n<span id=\"cb36-18\"><a href=\"#cb36-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S7; // mgcv smooth penalty matrix S7</span></span>\n<span id=\"cb36-19\"><a href=\"#cb36-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[8, 8] S8; // mgcv smooth penalty matrix S8</span></span>\n<span id=\"cb36-20\"><a href=\"#cb36-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb36-21\"><a href=\"#cb36-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb36-22\"><a href=\"#cb36-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb36-23\"><a href=\"#cb36-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb36-24\"><a href=\"#cb36-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-25\"><a href=\"#cb36-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb36-26\"><a href=\"#cb36-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb36-27\"><a href=\"#cb36-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb36-28\"><a href=\"#cb36-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-29\"><a href=\"#cb36-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect variances</span></span>\n<span id=\"cb36-30\"><a href=\"#cb36-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[1] sigma_raw;</span></span>\n<span id=\"cb36-31\"><a href=\"#cb36-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-32\"><a href=\"#cb36-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect means</span></span>\n<span id=\"cb36-33\"><a href=\"#cb36-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[1] mu_raw;</span></span>\n<span id=\"cb36-34\"><a href=\"#cb36-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-35\"><a href=\"#cb36-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent trend AR1 terms</span></span>\n<span id=\"cb36-36\"><a href=\"#cb36-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=-1, upper=1&gt;[n_series] ar1;</span></span>\n<span id=\"cb36-37\"><a href=\"#cb36-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-38\"><a href=\"#cb36-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent trend variance parameters</span></span>\n<span id=\"cb36-39\"><a href=\"#cb36-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_series] sigma;</span></span>\n<span id=\"cb36-40\"><a href=\"#cb36-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-41\"><a href=\"#cb36-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent trends</span></span>\n<span id=\"cb36-42\"><a href=\"#cb36-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span id=\"cb36-43\"><a href=\"#cb36-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-44\"><a href=\"#cb36-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb36-45\"><a href=\"#cb36-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp] lambda;</span></span>\n<span id=\"cb36-46\"><a href=\"#cb36-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-47\"><a href=\"#cb36-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb36-48\"><a href=\"#cb36-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb36-49\"><a href=\"#cb36-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb36-50\"><a href=\"#cb36-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : 65] = b_raw[1 : 65];</span></span>\n<span id=\"cb36-51\"><a href=\"#cb36-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[66 : 73] = mu_raw[1] + b_raw[66 : 73] * sigma_raw[1];</span></span>\n<span id=\"cb36-52\"><a href=\"#cb36-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-53\"><a href=\"#cb36-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb36-54\"><a href=\"#cb36-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population variances</span></span>\n<span id=\"cb36-55\"><a href=\"#cb36-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma_raw ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb36-56\"><a href=\"#cb36-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-57\"><a href=\"#cb36-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population means</span></span>\n<span id=\"cb36-58\"><a href=\"#cb36-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   mu_raw ~ std_normal();</span></span>\n<span id=\"cb36-59\"><a href=\"#cb36-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-60\"><a href=\"#cb36-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)...</span></span>\n<span id=\"cb36-61\"><a href=\"#cb36-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, -2.3, 2.5);</span></span>\n<span id=\"cb36-62\"><a href=\"#cb36-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-63\"><a href=\"#cb36-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesBLAN_005...</span></span>\n<span id=\"cb36-64\"><a href=\"#cb36-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2 : 9] ~ multi_normal_prec(zero[2 : 9], S1[1 : 8, 1 : 8] * lambda[1]);</span></span>\n<span id=\"cb36-65\"><a href=\"#cb36-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-66\"><a href=\"#cb36-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesBLAN_012...</span></span>\n<span id=\"cb36-67\"><a href=\"#cb36-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[10 : 17] ~ multi_normal_prec(zero[10 : 17],</span></span>\n<span id=\"cb36-68\"><a href=\"#cb36-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S2[1 : 8, 1 : 8] * lambda[2]);</span></span>\n<span id=\"cb36-69\"><a href=\"#cb36-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-70\"><a href=\"#cb36-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSCBI_002...</span></span>\n<span id=\"cb36-71\"><a href=\"#cb36-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[18 : 25] ~ multi_normal_prec(zero[18 : 25],</span></span>\n<span id=\"cb36-72\"><a href=\"#cb36-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S3[1 : 8, 1 : 8] * lambda[3]);</span></span>\n<span id=\"cb36-73\"><a href=\"#cb36-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-74\"><a href=\"#cb36-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSCBI_013...</span></span>\n<span id=\"cb36-75\"><a href=\"#cb36-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[26 : 33] ~ multi_normal_prec(zero[26 : 33],</span></span>\n<span id=\"cb36-76\"><a href=\"#cb36-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S4[1 : 8, 1 : 8] * lambda[4]);</span></span>\n<span id=\"cb36-77\"><a href=\"#cb36-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-78\"><a href=\"#cb36-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_001...</span></span>\n<span id=\"cb36-79\"><a href=\"#cb36-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[34 : 41] ~ multi_normal_prec(zero[34 : 41],</span></span>\n<span id=\"cb36-80\"><a href=\"#cb36-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S5[1 : 8, 1 : 8] * lambda[5]);</span></span>\n<span id=\"cb36-81\"><a href=\"#cb36-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-82\"><a href=\"#cb36-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_005...</span></span>\n<span id=\"cb36-83\"><a href=\"#cb36-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[42 : 49] ~ multi_normal_prec(zero[42 : 49],</span></span>\n<span id=\"cb36-84\"><a href=\"#cb36-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S6[1 : 8, 1 : 8] * lambda[6]);</span></span>\n<span id=\"cb36-85\"><a href=\"#cb36-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-86\"><a href=\"#cb36-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_006...</span></span>\n<span id=\"cb36-87\"><a href=\"#cb36-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[50 : 57] ~ multi_normal_prec(zero[50 : 57],</span></span>\n<span id=\"cb36-88\"><a href=\"#cb36-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S7[1 : 8, 1 : 8] * lambda[7]);</span></span>\n<span id=\"cb36-89\"><a href=\"#cb36-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-90\"><a href=\"#cb36-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(epiWeek):seriesSERC_012...</span></span>\n<span id=\"cb36-91\"><a href=\"#cb36-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[58 : 65] ~ multi_normal_prec(zero[58 : 65],</span></span>\n<span id=\"cb36-92\"><a href=\"#cb36-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                      S8[1 : 8, 1 : 8] * lambda[8]);</span></span>\n<span id=\"cb36-93\"><a href=\"#cb36-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-94\"><a href=\"#cb36-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior (non-centred) for s(series)...</span></span>\n<span id=\"cb36-95\"><a href=\"#cb36-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[66 : 73] ~ std_normal();</span></span>\n<span id=\"cb36-96\"><a href=\"#cb36-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-97\"><a href=\"#cb36-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for AR parameters</span></span>\n<span id=\"cb36-98\"><a href=\"#cb36-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ar1 ~ std_normal();</span></span>\n<span id=\"cb36-99\"><a href=\"#cb36-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-100\"><a href=\"#cb36-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for smoothing parameters</span></span>\n<span id=\"cb36-101\"><a href=\"#cb36-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda ~ normal(5, 30);</span></span>\n<span id=\"cb36-102\"><a href=\"#cb36-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-103\"><a href=\"#cb36-103\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for latent trend variance parameters</span></span>\n<span id=\"cb36-104\"><a href=\"#cb36-104\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb36-105\"><a href=\"#cb36-105\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-106\"><a href=\"#cb36-106\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // trend estimates</span></span>\n<span id=\"cb36-107\"><a href=\"#cb36-107\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   trend[1, 1 : n_series] ~ normal(0, sigma);</span></span>\n<span id=\"cb36-108\"><a href=\"#cb36-108\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb36-109\"><a href=\"#cb36-109\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     trend[2 : n, s] ~ normal(ar1[s] * trend[1 : (n - 1), s], sigma[s]);</span></span>\n<span id=\"cb36-110\"><a href=\"#cb36-110\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-111\"><a href=\"#cb36-111\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb36-112\"><a href=\"#cb36-112\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb36-113\"><a href=\"#cb36-113\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     vector[n_nonmissing] flat_trends;</span></span>\n<span id=\"cb36-114\"><a href=\"#cb36-114\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_trends = to_vector(trend)[obs_ind];</span></span>\n<span id=\"cb36-115\"><a href=\"#cb36-115\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span></span>\n<span id=\"cb36-116\"><a href=\"#cb36-116\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               append_row(b, 1.0));</span></span>\n<span id=\"cb36-117\"><a href=\"#cb36-117\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-118\"><a href=\"#cb36-118\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb36-119\"><a href=\"#cb36-119\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb36-120\"><a href=\"#cb36-120\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb36-121\"><a href=\"#cb36-121\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb36-122\"><a href=\"#cb36-122\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp] rho;</span></span>\n<span id=\"cb36-123\"><a href=\"#cb36-123\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_series] tau;</span></span>\n<span id=\"cb36-124\"><a href=\"#cb36-124\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb36-125\"><a href=\"#cb36-125\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   rho = log(lambda);</span></span>\n<span id=\"cb36-126\"><a href=\"#cb36-126\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb36-127\"><a href=\"#cb36-127\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     tau[s] = pow(sigma[s], -2.0);</span></span>\n<span id=\"cb36-128\"><a href=\"#cb36-128\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-129\"><a href=\"#cb36-129\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb36-130\"><a href=\"#cb36-130\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb36-131\"><a href=\"#cb36-131\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb36-132\"><a href=\"#cb36-132\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb36-133\"><a href=\"#cb36-133\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span></span>\n<span id=\"cb36-134\"><a href=\"#cb36-134\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb36-135\"><a href=\"#cb36-135\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb36-136\"><a href=\"#cb36-136\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nDynamic GAMs and how they can be applied in practice:</p>\n<p>Clark, Nicholas J. and Wells, K. <a href=\"https://doi.org/10.1111/2041-210X.13974\">Dynamic Generalized\nAdditive Models (DGAMs) for forecasting discrete ecological time\nseries</a>. <em>Methods in Ecology and Evolution</em>. (2023): 14,\n771-784.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>de Sousa, Heitor C., et al. <a href=\"https://doi.org/10.1111/1365-2656.14188\">Severe fire regimes\ndecrease resilience of ectothermic populations</a>. <em>Journal of\nAnimal Ecology</em> (2024): 93(11), 1656-1669.</p>\n<p>Hannaford, Naomi E., et al. <a href=\"https://doi.org/10.1016/j.csda.2022.107659\">A sparse Bayesian\nhierarchical vector autoregressive model for microbial dynamics in a\nwastewater treatment plant.</a> <em>Computational Statistics &amp; Data\nAnalysis</em> (2023): 179, 107659.</p>\n<p>Karunarathna, K.A.N.K., et al. <a href=\"https://doi.org/10.1016/j.ecolmodel.2024.110648\">Modelling\nnonlinear responses of a desert rodent species to environmental change\nwith hierarchical dynamic generalized additive models</a>.\n<em>Ecological Modelling</em> (2024): 490, 110648.</p>\n<p>Zhu, L., et al. <a href=\"https://doi.org/10.1111/1365-2435.14711\">Responses of a widespread\npest insect to extreme high temperatures are stage-dependent and\ndivergent among seasonal cohorts</a>. <em>Functional Ecology</em>\n(2025): 39, 165–180. <a href=\"https://doi.org/10.1111/1365-2435.14711\" class=\"uri\">https://doi.org/10.1111/1365-2435.14711</a></p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "inst/doc/forecast_evaluation.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nset.seed(1)\nsimdat <- sim_mvgam(\n  T = 100,\n  n_series = 3,\n  mu = 2,\n  trend_model = GP(),\n  prop_trend = 0.75,\n  family = poisson(),\n  prop_missing = 0.10\n)\n\n\n## --------------------------------------------------------------------------------\nstr(simdat)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  series = \"all\"\n)\n\n\n## ----fig.alt = \"Plotting time series features for GAM models in mvgam\"-----------\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  series = 1\n)\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  newdata = simdat$data_test\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod1 <- mvgam(\n#   y ~ s(season, bs = \"cc\", k = 8) +\n#     s(time, by = series, bs = \"cr\", k = 20),\n#   knots = list(season = c(0.5, 12.5)),\n#   trend_model = \"None\",\n#   data = simdat$data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod1, include_betas = FALSE)\n\n\n## ----fig.alt = \"Plotting GAM smooth functions using mvgam\"-----------------------\nconditional_effects(mod1, type = \"link\")\n\n\n## ----include=FALSE, message=FALSE------------------------------------------------\nmod2 <- mvgam(\n  y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod2 <- mvgam(y ~ 1,\n#   trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n#   trend_knots = list(season = c(0.5, 12.5)),\n#   trend_model = AR(cor = TRUE),\n#   noncentred = TRUE,\n#   data = simdat$data_train,\n#   silent = 1\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod2, include_betas = FALSE)\n\n\n## ----fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"---------\nmcmc_plot(mod2, variable = \"ar\", regex = TRUE, type = \"areas\")\n\n\n## ----fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"---------\nmcmc_plot(mod2, variable = \"sigma\", regex = TRUE, type = \"areas\")\n\n\n## ----fig.alt = \"Plotting latent Gaussian Process effects in mvgam and marginaleffects\"----\nconditional_effects(mod2, type = \"link\")\n\n\n## --------------------------------------------------------------------------------\nfc_mod1 <- forecast(mod1, newdata = simdat$data_test)\nfc_mod2 <- forecast(mod2, newdata = simdat$data_test)\n\n\n## --------------------------------------------------------------------------------\nstr(fc_mod1)\n\n\n## --------------------------------------------------------------------------------\nplot(fc_mod1, series = 1)\nplot(fc_mod2, series = 1)\n\nplot(fc_mod1, series = 2)\nplot(fc_mod2, series = 2)\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod2 <- mvgam(\n  y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod2 <- mvgam(y ~ 1,\n#   trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n#   trend_knots = list(season = c(0.5, 12.5)),\n#   trend_model = AR(cor = TRUE),\n#   noncentred = TRUE,\n#   data = simdat$data_train,\n#   newdata = simdat$data_test,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nfc_mod2 <- forecast(mod2)\n\n\n## ----warning=FALSE, fig.alt = \"Plotting posterior forecast distributions using mvgam and R\"----\nplot(fc_mod2, series = 1)\n\n\n## ----warning=FALSE---------------------------------------------------------------\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\nstr(crps_mod1)\ncrps_mod1$series_1\n\n\n## ----warning=FALSE---------------------------------------------------------------\ncrps_mod1 <- score(fc_mod1, score = \"crps\", interval_width = 0.6)\ncrps_mod1$series_1\n\n\n## --------------------------------------------------------------------------------\nlink_mod1 <- forecast(mod1, newdata = simdat$data_test, type = \"link\")\nscore(link_mod1, score = \"elpd\")$series_1\n\n\n## --------------------------------------------------------------------------------\nenergy_mod2 <- score(fc_mod2, score = \"energy\")\nstr(energy_mod2)\n\n\n## --------------------------------------------------------------------------------\nenergy_mod2$all_series\n\n\n## --------------------------------------------------------------------------------\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\ncrps_mod2 <- score(fc_mod2, score = \"crps\")\n\ndiff_scores <- crps_mod2$series_1$score -\n  crps_mod1$series_1$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(\n  main = paste0(\n    \"AR(1) better in \",\n    ar1_better,\n    \" of \",\n    length(diff_scores),\n    \" evaluations\",\n    \"\\nMean difference = \",\n    round(mean(diff_scores, na.rm = TRUE), 2)\n  )\n)\n\n\ndiff_scores <- crps_mod2$series_2$score -\n  crps_mod1$series_2$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(\n  main = paste0(\n    \"AR(1) better in \",\n    ar1_better,\n    \" of \",\n    length(diff_scores),\n    \" evaluations\",\n    \"\\nMean difference = \",\n    round(mean(diff_scores, na.rm = TRUE), 2)\n  )\n)\n\ndiff_scores <- crps_mod2$series_3$score -\n  crps_mod1$series_3$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(\n  main = paste0(\n    \"AR(1) better in \",\n    ar1_better,\n    \" of \",\n    length(diff_scores),\n    \" evaluations\",\n    \"\\nMean difference = \",\n    round(mean(diff_scores, na.rm = TRUE), 2)\n  )\n)\n"
  },
  {
    "path": "inst/doc/forecast_evaluation.Rmd",
    "content": "---\ntitle: \"Forecasting and forecast evaluation in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Forecasting and forecast evaluation in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to produce probabilistic forecasts and to evaluate those forecasts using a variety of proper scoring rules.\n\n## Simulating discrete time series\nWe begin by simulating some data to show how forecasts are computed and evaluated in `mvgam`. The `sim_mvgam()` function can be used to simulate series that come from a variety of response distributions as well as seasonal patterns and/or dynamic temporal patterns. Here we simulate a collection of three time count-valued series. These series all share the same seasonal pattern but have different temporal dynamics. By setting `trend_model = GP()` and `prop_trend = 0.75`, we are generating time series that have smooth underlying temporal trends (evolving as Gaussian Processes with squared exponential kernel) and moderate seasonal patterns. The observations are Poisson-distributed and we allow 10% of observations to be missing.\n```{r}\nset.seed(1)\nsimdat <- sim_mvgam(\n  T = 100,\n  n_series = 3,\n  mu = 2,\n  trend_model = GP(),\n  prop_trend = 0.75,\n  family = poisson(),\n  prop_missing = 0.10\n)\n```\n\nThe returned object is a `list` containing training and testing data (`sim_mvgam()` automatically splits the data into these folds for us) together with some other information about the data generating process that was used to simulate the data\n```{r}\nstr(simdat)\n```\n\nEach series in this case has a shared seasonal pattern. The resulting time series are similar to what we might encounter when dealing with count-valued data that can take small counts:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  series = \"all\"\n)\n```\n\nFor individual series, we can plot the training and testing data, as well as some more specific features of the observed data:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  series = 1\n)\n```\n\n### Modelling dynamics with splines\nThe first model we will fit uses a shared cyclic spline to capture the repeated seasonality, as well as series-specific splines of time to capture the long-term dynamics. We allow the temporal splines to be fairly complex so they can capture as much of the temporal variation as possible:\n```{r include=FALSE}\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  newdata = simdat$data_test\n)\n```\n\n```{r eval=FALSE}\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, bs = \"cr\", k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\nThe model fits without issue:\n```{r}\nsummary(mod1, include_betas = FALSE)\n```\n\nAnd we can plot the conditional effects of the splines (on the link scale) to see that they are estimated to be highly nonlinear\n```{r, fig.alt = \"Plotting GAM smooth functions using mvgam\"}\nconditional_effects(mod1, type = \"link\")\n```\n\n### Modelling dynamics with a correlated AR1\nBefore showing how to produce and evaluate forecasts, we will fit a second model to these data so the two models can be compared. This model is equivalent to the above, except we now use a correlated AR(1) process to model series-specific dynamics. See `?AR` for more details.\n```{r include=FALSE, message=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n```\n\n```{r eval=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n```\n\nThe summary for this model now contains information on the autoregressive and process error parameters for each time series:\n```{r}\nsummary(mod2, include_betas = FALSE)\n```\n\nWe can plot the posteriors for these parameters, and for any other parameter for that matter, using `bayesplot` routines. First the autoregressive parameters:\n```{r, fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"}\nmcmc_plot(mod2, variable = \"ar\", regex = TRUE, type = \"areas\")\n```\n\nAnd now the variance ($\\sigma$) parameters:\n```{r, fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"}\nmcmc_plot(mod2, variable = \"sigma\", regex = TRUE, type = \"areas\")\n```\n\nWe can again plot the conditional seasonal effect:\n```{r, fig.alt = \"Plotting latent Gaussian Process effects in mvgam and marginaleffects\"}\nconditional_effects(mod2, type = \"link\")\n```\n\nThe estimates for the seasonal component are fairly similar for the two models, but below we will see if they produce similar forecasts\n\n## Forecasting with the `forecast()` function\nProbabilistic forecasts can be computed in two main ways in `mvgam`. The first is to take a model that was fit only to training data (as we did above in the two example models) and produce temporal predictions from the posterior predictive distribution by feeding `newdata` to the `forecast()` function. It is crucial that any `newdata` fed to the `forecast()` function follows on sequentially from the data that was used to fit the model (this is not internally checked by the package because it might be a headache to do so when data are not supplied in a specific time-order). When calling the `forecast()` function, you have the option to generate different kinds of predictions (i.e. predicting on the link scale, response scale or to produce expectations; see `?forecast.mvgam` for details). We will use the default and produce forecasts on the response scale, which is the most common way to evaluate forecast distributions\n```{r}\nfc_mod1 <- forecast(mod1, newdata = simdat$data_test)\nfc_mod2 <- forecast(mod2, newdata = simdat$data_test)\n```\n\nThe objects we have created are of class `mvgam_forecast`, which contain information on hindcast distributions, forecast distributions and true observations for each series in the data:\n```{r}\nstr(fc_mod1)\n```\n\nWe can plot the forecasts for some series from each model using the `S3 plot` method for objects of this class:\n```{r}\nplot(fc_mod1, series = 1)\nplot(fc_mod2, series = 1)\n\nplot(fc_mod1, series = 2)\nplot(fc_mod2, series = 2)\n```\n\nClearly the two models do not produce equivalent forecasts. We will come back to scoring these forecasts in a moment.\n\n## Forecasting with `newdata` in `mvgam()`\nThe second way we can produce forecasts in `mvgam` is to feed the testing data directly to the `mvgam()` function as `newdata`. This will include the testing data as missing observations so that they are automatically predicted from the posterior predictive distribution using the `generated quantities` block in `Stan`. As an example, we can refit `mod2` but include the testing data for automatic forecasts:\n```{r include=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n```\n\nBecause the model already contains a forecast distribution, we do not need to feed `newdata` to the `forecast()` function:\n```{r}\nfc_mod2 <- forecast(mod2)\n```\n\nThe forecasts will be nearly identical to those calculated previously:\n```{r warning=FALSE, fig.alt = \"Plotting posterior forecast distributions using mvgam and R\"}\nplot(fc_mod2, series = 1)\n```\n\n## Scoring forecast distributions\nA primary purpose of the `mvgam_forecast` class is to readily allow forecast evaluations for each series in the data, using a variety of possible scoring functions. See `?mvgam::score.mvgam_forecast` to view the types of scores that are available. A useful scoring metric is the Continuous Rank Probability Score (CRPS). A CRPS value is similar to what we might get if we calculated a weighted absolute error using the full forecast distribution.\n```{r warning=FALSE}\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\nstr(crps_mod1)\ncrps_mod1$series_1\n```\n\nThe returned list contains a `data.frame` for each series in the data that shows the CRPS score for each evaluation in the testing data, along with some other useful information about the fit of the forecast distribution. In particular, we are given a logical value (1s and 0s) telling us whether the true value was within a pre-specified credible interval (i.e. the coverage of the forecast distribution). The default interval width is 0.9, so we would hope that the values in the `in_interval` column take a 1 approximately 90% of the time. This value can be changed if you wish to compute different coverages, say using a 60% interval:\n```{r warning=FALSE}\ncrps_mod1 <- score(fc_mod1, score = \"crps\", interval_width = 0.6)\ncrps_mod1$series_1\n```\n\nWe can also compare forecasts against out of sample observations using the [Expected Log Predictive Density (ELPD; also known as the log score)](https://link.springer.com/article/10.1007/s11222-016-9696-4){target=\"_blank\"}. The ELPD is a strictly proper scoring rule that can be applied to any distributional forecast, but to compute it we need predictions on the link scale rather than on the outcome scale. This is where it is advantageous to change the type of prediction we can get using the `forecast()` function:\n```{r}\nlink_mod1 <- forecast(mod1, newdata = simdat$data_test, type = \"link\")\nscore(link_mod1, score = \"elpd\")$series_1\n```\n\nFinally, when we have multiple time series it may also make sense to use a multivariate proper scoring rule. `mvgam` offers two such options: the Energy score and the Variogram score. The first penalizes forecast distributions that are less well calibrated against the truth, while the second penalizes forecasts that do not capture the observed true correlation structure. Which score to use depends on your goals, but both are very easy to compute:\n```{r}\nenergy_mod2 <- score(fc_mod2, score = \"energy\")\nstr(energy_mod2)\n```\n\nThe returned object still provides information on interval coverage for each individual series, but there is only a single score per horizon now (which is provided in the `all_series` slot):\n```{r}\nenergy_mod2$all_series\n```\n\nYou can use your score(s) of choice to compare different models. For example, we can compute and plot the difference in CRPS scores for each series in data. Here, a negative value means the AR(1) model (`mod2`) is better, while a positive value means the spline model (`mod1`) is better.\n```{r}\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\ncrps_mod2 <- score(fc_mod2, score = \"crps\")\n\ndiff_scores <- crps_mod2$series_1$score -\n  crps_mod1$series_1$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n\n\ndiff_scores <- crps_mod2$series_2$score -\n  crps_mod1$series_2$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n\ndiff_scores <- crps_mod2$series_3$score -\n  crps_mod1$series_3$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n```\n\nThe correlated AR(1) model consistently gives better forecasts, and the difference between scores tends to grow as the forecast horizon increases. This is not unexpected given the way that splines linearly extrapolate outside the range of training data\n\n## Further reading\nThe following papers and resources offer useful material about Bayesian forecasting and proper scoring rules:\n  \nClark N.J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ* 13:e18929 (2025) https://doi.org/10.7717/peerj.18929  \n  \nHyndman, Rob J., and George Athanasopoulos. [Forecasting: principles and practice](https://otexts.com/fpp3/distaccuracy.html). *OTexts*, (2018).\n  \nGneiting, Tilmann, and Adrian E. Raftery. [Strictly proper scoring rules, prediction, and estimation](https://www.tandfonline.com/doi/abs/10.1198/016214506000001437) *Journal of the American statistical Association* 102.477 (2007) 359-378.  \n  \nSimonis, Juniper L., et al. [Evaluating probabilistic ecological forecasts](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecy.3431) *Ecology* 102.8 (2021) e03431.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "inst/doc/forecast_evaluation.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Forecasting and forecast evaluation in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Forecasting and forecast evaluation in\nmvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#simulating-discrete-time-series\" id=\"toc-simulating-discrete-time-series\">Simulating discrete time\nseries</a>\n<ul>\n<li><a href=\"#modelling-dynamics-with-splines\" id=\"toc-modelling-dynamics-with-splines\">Modelling dynamics with\nsplines</a></li>\n<li><a href=\"#modelling-dynamics-with-a-correlated-ar1\" id=\"toc-modelling-dynamics-with-a-correlated-ar1\">Modelling dynamics\nwith a correlated AR1</a></li>\n</ul></li>\n<li><a href=\"#forecasting-with-the-forecast-function\" id=\"toc-forecasting-with-the-forecast-function\">Forecasting with the\n<code>forecast()</code> function</a></li>\n<li><a href=\"#forecasting-with-newdata-in-mvgam\" id=\"toc-forecasting-with-newdata-in-mvgam\">Forecasting with\n<code>newdata</code> in <code>mvgam()</code></a></li>\n<li><a href=\"#scoring-forecast-distributions\" id=\"toc-scoring-forecast-distributions\">Scoring forecast\ndistributions</a></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to produce probabilistic forecasts and to evaluate\nthose forecasts using a variety of proper scoring rules.</p>\n<div id=\"simulating-discrete-time-series\" class=\"section level2\">\n<h2>Simulating discrete time series</h2>\n<p>We begin by simulating some data to show how forecasts are computed\nand evaluated in <code>mvgam</code>. The <code>sim_mvgam()</code>\nfunction can be used to simulate series that come from a variety of\nresponse distributions as well as seasonal patterns and/or dynamic\ntemporal patterns. Here we simulate a collection of three time\ncount-valued series. These series all share the same seasonal pattern\nbut have different temporal dynamics. By setting\n<code>trend_model = GP()</code> and <code>prop_trend = 0.75</code>, we\nare generating time series that have smooth underlying temporal trends\n(evolving as Gaussian Processes with squared exponential kernel) and\nmoderate seasonal patterns. The observations are Poisson-distributed and\nwe allow 10% of observations to be missing.</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">1</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>simdat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(</span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>  <span class=\"at\">T =</span> <span class=\"dv\">100</span>,</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">n_series =</span> <span class=\"dv\">3</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"at\">mu =</span> <span class=\"dv\">2</span>,</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">GP</span>(),</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>  <span class=\"at\">prop_trend =</span> <span class=\"fl\">0.75</span>,</span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a>  <span class=\"at\">prop_missing =</span> <span class=\"fl\">0.10</span></span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The returned object is a <code>list</code> containing training and\ntesting data (<code>sim_mvgam()</code> automatically splits the data\ninto these folds for us) together with some other information about the\ndata generating process that was used to simulate the data</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(simdat)</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 6</span></span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ data_train        :&#39;data.frame&#39;:  225 obs. of  5 variables:</span></span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ y     : int [1:225] 6 NA 11 2 5 20 7 8 NA 11 ...</span></span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ season: int [1:225] 1 1 1 2 2 2 3 3 3 4 ...</span></span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ year  : int [1:225] 1 1 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb2-7\"><a href=\"#cb2-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series: Factor w/ 3 levels &quot;series_1&quot;,&quot;series_2&quot;,..: 1 2 3 1 2 3 1 2 3 1 ...</span></span>\n<span id=\"cb2-8\"><a href=\"#cb2-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ time  : int [1:225] 1 1 1 2 2 2 3 3 3 4 ...</span></span>\n<span id=\"cb2-9\"><a href=\"#cb2-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ data_test         :&#39;data.frame&#39;:  75 obs. of  5 variables:</span></span>\n<span id=\"cb2-10\"><a href=\"#cb2-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ y     : int [1:75] 4 23 8 3 NA 3 1 20 8 3 ...</span></span>\n<span id=\"cb2-11\"><a href=\"#cb2-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ season: int [1:75] 4 4 4 5 5 5 6 6 6 7 ...</span></span>\n<span id=\"cb2-12\"><a href=\"#cb2-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ year  : int [1:75] 7 7 7 7 7 7 7 7 7 7 ...</span></span>\n<span id=\"cb2-13\"><a href=\"#cb2-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series: Factor w/ 3 levels &quot;series_1&quot;,&quot;series_2&quot;,..: 1 2 3 1 2 3 1 2 3 1 ...</span></span>\n<span id=\"cb2-14\"><a href=\"#cb2-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ time  : int [1:75] 76 76 76 77 77 77 78 78 78 79 ...</span></span>\n<span id=\"cb2-15\"><a href=\"#cb2-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ true_corrs        : num [1:3, 1:3] 1 0.0861 0.1161 0.0861 1 ...</span></span>\n<span id=\"cb2-16\"><a href=\"#cb2-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ true_trends       : num [1:100, 1:3] -0.851 -0.758 -0.664 -0.571 -0.48 ...</span></span>\n<span id=\"cb2-17\"><a href=\"#cb2-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ global_seasonality: num [1:100] -0.966 -0.197 0.771 1.083 0.37 ...</span></span>\n<span id=\"cb2-18\"><a href=\"#cb2-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_params      :List of 2</span></span>\n<span id=\"cb2-19\"><a href=\"#cb2-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ alpha: num [1:3] 0.883 0.936 1.036</span></span>\n<span id=\"cb2-20\"><a href=\"#cb2-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ rho  : num [1:3] 7.54 4.01 7.49</span></span></code></pre></div>\n<p>Each series in this case has a shared seasonal pattern. The resulting\ntime series are similar to what we might encounter when dealing with\ncount-valued data that can take small counts:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>For individual series, we can plot the training and testing data, as\nwell as some more specific features of the observed data:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test,</span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting time series features for GAM models in mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting time series features for GAM models in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"modelling-dynamics-with-splines\" class=\"section level3\">\n<h3>Modelling dynamics with splines</h3>\n<p>The first model we will fit uses a shared cyclic spline to capture\nthe repeated seasonality, as well as series-specific splines of time to\ncapture the long-term dynamics. We allow the temporal splines to be\nfairly complex so they can capture as much of the temporal variation as\npossible:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>    <span class=\"fu\">s</span>(time, <span class=\"at\">by =</span> series, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cr&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">20</span>),</span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"at\">knots =</span> <span class=\"fu\">list</span>(<span class=\"at\">season =</span> <span class=\"fu\">c</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span>)),</span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"st\">&quot;None&quot;</span>,</span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model fits without issue:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod1, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ s(season, bs = &quot;cc&quot;, k = 8) + s(time, by = series, k = 20)</span></span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000022e41d5a728&gt;</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb6-11\"><a href=\"#cb6-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-12\"><a href=\"#cb6-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb6-13\"><a href=\"#cb6-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb6-14\"><a href=\"#cb6-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-15\"><a href=\"#cb6-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb6-16\"><a href=\"#cb6-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb6-17\"><a href=\"#cb6-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-18\"><a href=\"#cb6-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb6-19\"><a href=\"#cb6-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 100 </span></span>\n<span id=\"cb6-20\"><a href=\"#cb6-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-21\"><a href=\"#cb6-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb6-22\"><a href=\"#cb6-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb6-23\"><a href=\"#cb6-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb6-24\"><a href=\"#cb6-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb6-25\"><a href=\"#cb6-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-26\"><a href=\"#cb6-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb6-27\"><a href=\"#cb6-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb6-28\"><a href=\"#cb6-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)  1.9 1.9     2    1   979</span></span>\n<span id=\"cb6-29\"><a href=\"#cb6-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-30\"><a href=\"#cb6-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb6-31\"><a href=\"#cb6-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                          edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb6-32\"><a href=\"#cb6-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season)              3.418      6  22.91  &lt; 2e-16 ***</span></span>\n<span id=\"cb6-33\"><a href=\"#cb6-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_1 8.763     19  30.85 4.25e-06 ***</span></span>\n<span id=\"cb6-34\"><a href=\"#cb6-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_2 9.635     19  41.49  &lt; 2e-16 ***</span></span>\n<span id=\"cb6-35\"><a href=\"#cb6-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriesseries_3 6.676     19  56.28   0.0862 .  </span></span>\n<span id=\"cb6-36\"><a href=\"#cb6-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb6-37\"><a href=\"#cb6-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb6-38\"><a href=\"#cb6-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-39\"><a href=\"#cb6-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb6-40\"><a href=\"#cb6-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb6-41\"><a href=\"#cb6-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb6-42\"><a href=\"#cb6-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb6-43\"><a href=\"#cb6-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✖ 51 of 2000 iterations saturated the maximum tree depth of 10 (2.55%)</span></span>\n<span id=\"cb6-44\"><a href=\"#cb6-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Try a larger max_treedepth to avoid saturation</span></span>\n<span id=\"cb6-45\"><a href=\"#cb6-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-46\"><a href=\"#cb6-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb6-47\"><a href=\"#cb6-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb6-48\"><a href=\"#cb6-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb6-49\"><a href=\"#cb6-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb6-50\"><a href=\"#cb6-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>And we can plot the conditional effects of the splines (on the link\nscale) to see that they are estimated to be highly nonlinear</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting GAM smooth functions using mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting GAM smooth functions using mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" aria-label=\"Plotting GAM smooth functions using mvgam\" src=\"data:image/png;base64,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\" alt=\"Plotting GAM smooth functions using mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"modelling-dynamics-with-a-correlated-ar1\" class=\"section level3\">\n<h3>Modelling dynamics with a correlated AR1</h3>\n<p>Before showing how to produce and evaluate forecasts, we will fit a\nsecond model to these data so the two models can be compared. This model\nis equivalent to the above, except we now use a correlated AR(1) process\nto model series-specific dynamics. See <code>?AR</code> for more\ndetails.</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a>mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(y <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_knots =</span> <span class=\"fu\">list</span>(<span class=\"at\">season =</span> <span class=\"fu\">c</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span>)),</span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(<span class=\"at\">cor =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary for this model now contains information on the\nautoregressive and process error parameters for each time series:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod2, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ 1</span></span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000022e41d5a728&gt;</span></span>\n<span id=\"cb9-5\"><a href=\"#cb9-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-6\"><a href=\"#cb9-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb9-7\"><a href=\"#cb9-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(season, bs = &quot;cc&quot;, k = 8) - 1</span></span>\n<span id=\"cb9-8\"><a href=\"#cb9-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000022e41d5a728&gt;</span></span>\n<span id=\"cb9-9\"><a href=\"#cb9-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-10\"><a href=\"#cb9-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb9-11\"><a href=\"#cb9-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb9-12\"><a href=\"#cb9-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-13\"><a href=\"#cb9-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb9-14\"><a href=\"#cb9-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb9-15\"><a href=\"#cb9-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-16\"><a href=\"#cb9-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb9-17\"><a href=\"#cb9-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR(cor = TRUE)</span></span>\n<span id=\"cb9-18\"><a href=\"#cb9-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-19\"><a href=\"#cb9-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb9-20\"><a href=\"#cb9-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb9-21\"><a href=\"#cb9-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-22\"><a href=\"#cb9-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb9-23\"><a href=\"#cb9-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb9-24\"><a href=\"#cb9-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-25\"><a href=\"#cb9-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb9-26\"><a href=\"#cb9-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 75 </span></span>\n<span id=\"cb9-27\"><a href=\"#cb9-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-28\"><a href=\"#cb9-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb9-29\"><a href=\"#cb9-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb9-30\"><a href=\"#cb9-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb9-31\"><a href=\"#cb9-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb9-32\"><a href=\"#cb9-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-33\"><a href=\"#cb9-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb9-34\"><a href=\"#cb9-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb9-35\"><a href=\"#cb9-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)  1.8   2   2.4 1.01   512</span></span>\n<span id=\"cb9-36\"><a href=\"#cb9-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-37\"><a href=\"#cb9-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb9-38\"><a href=\"#cb9-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb9-39\"><a href=\"#cb9-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.23 0.32  0.44 1.01   318</span></span>\n<span id=\"cb9-40\"><a href=\"#cb9-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[2] 0.30 0.43  0.58 1.01   498</span></span>\n<span id=\"cb9-41\"><a href=\"#cb9-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[3] 0.18 0.25  0.36 1.01   329</span></span>\n<span id=\"cb9-42\"><a href=\"#cb9-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-43\"><a href=\"#cb9-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb9-44\"><a href=\"#cb9-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb9-45\"><a href=\"#cb9-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.75 0.89  0.99 1.01   438</span></span>\n<span id=\"cb9-46\"><a href=\"#cb9-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[2] 0.66 0.83  0.96 1.02   379</span></span>\n<span id=\"cb9-47\"><a href=\"#cb9-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[3] 0.87 0.96  1.00 1.01   478</span></span>\n<span id=\"cb9-48\"><a href=\"#cb9-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-49\"><a href=\"#cb9-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb9-50\"><a href=\"#cb9-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb9-51\"><a href=\"#cb9-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season) 1.737      6  23.81 1.22e-05 ***</span></span>\n<span id=\"cb9-52\"><a href=\"#cb9-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb9-53\"><a href=\"#cb9-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb9-54\"><a href=\"#cb9-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-55\"><a href=\"#cb9-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb9-56\"><a href=\"#cb9-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb9-57\"><a href=\"#cb9-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb9-58\"><a href=\"#cb9-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb9-59\"><a href=\"#cb9-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb9-60\"><a href=\"#cb9-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-61\"><a href=\"#cb9-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb9-62\"><a href=\"#cb9-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb9-63\"><a href=\"#cb9-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb9-64\"><a href=\"#cb9-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb9-65\"><a href=\"#cb9-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>We can plot the posteriors for these parameters, and for any other\nparameter for that matter, using <code>bayesplot</code> routines. First\nthe autoregressive parameters:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(mod2, <span class=\"at\">variable =</span> <span class=\"st\">&quot;ar&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">type =</span> <span class=\"st\">&quot;areas&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Summarising latent Gaussian Process parameters in mvgam\" src=\"data:image/png;base64,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\" alt=\"Summarising latent Gaussian Process parameters in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>And now the variance (<span class=\"math inline\">\\(\\sigma\\)</span>)\nparameters:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(mod2, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">type =</span> <span class=\"st\">&quot;areas&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Summarising latent Gaussian Process parameters in mvgam\" src=\"data:image/png;base64,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\" alt=\"Summarising latent Gaussian Process parameters in mvgam\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can again plot the conditional seasonal effect:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(mod2, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting latent Gaussian Process effects in mvgam and marginaleffects\" src=\"data:image/png;base64,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\" alt=\"Plotting latent Gaussian Process effects in mvgam and marginaleffects\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The estimates for the seasonal component are fairly similar for the\ntwo models, but below we will see if they produce similar forecasts</p>\n</div>\n</div>\n<div id=\"forecasting-with-the-forecast-function\" class=\"section level2\">\n<h2>Forecasting with the <code>forecast()</code> function</h2>\n<p>Probabilistic forecasts can be computed in two main ways in\n<code>mvgam</code>. The first is to take a model that was fit only to\ntraining data (as we did above in the two example models) and produce\ntemporal predictions from the posterior predictive distribution by\nfeeding <code>newdata</code> to the <code>forecast()</code> function. It\nis crucial that any <code>newdata</code> fed to the\n<code>forecast()</code> function follows on sequentially from the data\nthat was used to fit the model (this is not internally checked by the\npackage because it might be a headache to do so when data are not\nsupplied in a specific time-order). When calling the\n<code>forecast()</code> function, you have the option to generate\ndifferent kinds of predictions (i.e. predicting on the link scale,\nresponse scale or to produce expectations; see\n<code>?forecast.mvgam</code> for details). We will use the default and\nproduce forecasts on the response scale, which is the most common way to\nevaluate forecast distributions</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a>fc_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod1, <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test)</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>fc_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod2, <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test)</span></code></pre></div>\n<p>The objects we have created are of class <code>mvgam_forecast</code>,\nwhich contain information on hindcast distributions, forecast\ndistributions and true observations for each series in the data:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(fc_mod1)</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 16</span></span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ call              :Class &#39;formula&#39;  language y ~ s(season, bs = &quot;cc&quot;, k = 8) + s(time, by = series, k = 20)</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;.Environment&quot;)=&lt;environment: 0x0000022e41d5a728&gt; </span></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family            : chr &quot;poisson&quot;</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family_pars       : NULL</span></span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_model       : chr &quot;None&quot;</span></span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ fit_engine        : chr &quot;stan&quot;</span></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ type              : chr &quot;response&quot;</span></span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_names      : Factor w/ 3 levels &quot;series_1&quot;,&quot;series_2&quot;,..: 1 2 3</span></span>\n<span id=\"cb14-14\"><a href=\"#cb14-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_observations:List of 3</span></span>\n<span id=\"cb14-15\"><a href=\"#cb14-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:75] 6 2 7 11 8 6 9 11 7 4 ...</span></span>\n<span id=\"cb14-16\"><a href=\"#cb14-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:75] NA 5 8 2 1 NA 2 4 0 2 ...</span></span>\n<span id=\"cb14-17\"><a href=\"#cb14-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:75] 11 20 NA 36 44 34 57 50 26 28 ...</span></span>\n<span id=\"cb14-18\"><a href=\"#cb14-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_times       :List of 3</span></span>\n<span id=\"cb14-19\"><a href=\"#cb14-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb14-20\"><a href=\"#cb14-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb14-21\"><a href=\"#cb14-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:75] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb14-22\"><a href=\"#cb14-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_observations :List of 3</span></span>\n<span id=\"cb14-23\"><a href=\"#cb14-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:25] 4 3 1 3 1 NA NA 7 9 8 ...</span></span>\n<span id=\"cb14-24\"><a href=\"#cb14-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:25] 23 NA 20 20 14 7 6 6 6 1 ...</span></span>\n<span id=\"cb14-25\"><a href=\"#cb14-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:25] 8 3 8 3 NA 1 1 9 8 NA ...</span></span>\n<span id=\"cb14-26\"><a href=\"#cb14-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_times        :List of 3</span></span>\n<span id=\"cb14-27\"><a href=\"#cb14-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span></span>\n<span id=\"cb14-28\"><a href=\"#cb14-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span></span>\n<span id=\"cb14-29\"><a href=\"#cb14-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: int [1:25] 76 77 78 79 80 81 82 83 84 85 ...</span></span>\n<span id=\"cb14-30\"><a href=\"#cb14-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ hindcasts         :List of 3</span></span>\n<span id=\"cb14-31\"><a href=\"#cb14-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: num [1:2000, 1:75] 3 3 1 0 2 3 5 5 2 1 ...</span></span>\n<span id=\"cb14-32\"><a href=\"#cb14-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-33\"><a href=\"#cb14-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-34\"><a href=\"#cb14-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] &quot;ypred[1,1]&quot; &quot;ypred[2,1]&quot; &quot;ypred[3,1]&quot; &quot;ypred[4,1]&quot; ...</span></span>\n<span id=\"cb14-35\"><a href=\"#cb14-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: num [1:2000, 1:75] 3 4 2 5 7 8 7 2 7 10 ...</span></span>\n<span id=\"cb14-36\"><a href=\"#cb14-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-37\"><a href=\"#cb14-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-38\"><a href=\"#cb14-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] &quot;ypred[1,2]&quot; &quot;ypred[2,2]&quot; &quot;ypred[3,2]&quot; &quot;ypred[4,2]&quot; ...</span></span>\n<span id=\"cb14-39\"><a href=\"#cb14-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: num [1:2000, 1:75] 11 28 13 12 14 20 12 7 31 27 ...</span></span>\n<span id=\"cb14-40\"><a href=\"#cb14-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-41\"><a href=\"#cb14-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-42\"><a href=\"#cb14-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:75] &quot;ypred[1,3]&quot; &quot;ypred[2,3]&quot; &quot;ypred[3,3]&quot; &quot;ypred[4,3]&quot; ...</span></span>\n<span id=\"cb14-43\"><a href=\"#cb14-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ forecasts         :List of 3</span></span>\n<span id=\"cb14-44\"><a href=\"#cb14-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_1: num [1:2000, 1:25] 4 1 1 5 5 6 2 3 2 0 ...</span></span>\n<span id=\"cb14-45\"><a href=\"#cb14-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-46\"><a href=\"#cb14-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-47\"><a href=\"#cb14-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] &quot;ypred[76,1]&quot; &quot;ypred[77,1]&quot; &quot;ypred[78,1]&quot; &quot;ypred[79,1]&quot; ...</span></span>\n<span id=\"cb14-48\"><a href=\"#cb14-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_2: num [1:2000, 1:25] 26 33 21 34 12 28 33 16 23 39 ...</span></span>\n<span id=\"cb14-49\"><a href=\"#cb14-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-50\"><a href=\"#cb14-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-51\"><a href=\"#cb14-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] &quot;ypred[76,2]&quot; &quot;ypred[77,2]&quot; &quot;ypred[78,2]&quot; &quot;ypred[79,2]&quot; ...</span></span>\n<span id=\"cb14-52\"><a href=\"#cb14-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ series_3: num [1:2000, 1:25] 10 5 3 7 4 2 8 11 3 10 ...</span></span>\n<span id=\"cb14-53\"><a href=\"#cb14-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb14-54\"><a href=\"#cb14-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb14-55\"><a href=\"#cb14-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:25] &quot;ypred[76,3]&quot; &quot;ypred[77,3]&quot; &quot;ypred[78,3]&quot; &quot;ypred[79,3]&quot; ...</span></span>\n<span id=\"cb14-56\"><a href=\"#cb14-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;class&quot;)= chr &quot;mvgam_forecast&quot;</span></span></code></pre></div>\n<p>We can plot the forecasts for some series from each model using the\n<code>S3 plot</code> method for objects of this class:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod1, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod2, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a></span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod1, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod2, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAAAt1BMVEUAAAAAADoAAGYAOpAAZrYzMzM6AAA6ADo6kNtNTU1NTW5NTY5NbqtNjshmAABmAGZmtv9uTU1uTW5uTY5ubo5ubqtuq+SOTU2OTW6OTY6Obk2OyP+PJyeQOgCQtpCQ2/+iUFCrbk2rbm6rbo6ryKur5OSr5P+zs7O2ZgC2//+5fHzHmZnIjk3I///bkDrb/7bb///cvLzkq27k////tmb/yI7/25D/5Kv//7b//8j//9v//+T///8XLV0xAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAgAElEQVR4nO3da2PbNpoFYLVNZqo27abtJmnXzlaZmY1TKc6MnKSuY/z/37WiRIrE7b2AAG8650NqWwABEE9JkJbolUGQAlmN3QFkmQEspEgACykSwEKKBLCQIgEspEi0sABxMpn2VADWbDPtqQCs2WbaUwFYSJEAFlIkgIUUCWAhRQJYs820pwKwZptpTwVgzTbTngrAmm2mPRWAhRQJYCFFAlhIkQAWUiSANdtMeyoAa7aZ9lQA1mwz7akArNlm2lMBWEiRABZSJICF1Nln3RpgIXUACzkm81TsAQs5Zr6w7tbr9fe35uHV+tlHSXlk0MwX1vur6t/HN1fm7gdJeWTQ5J2K/XCwHv/xtvrPw2+35v6XW748MucMCOtwClyvr8z9i4/m4dfK2NNDAGuhGRDW/c9vq6PW52cNLKZ83twM1RBSZT8grGPeX7VHLEn5bAGsQTMCrJHWWIDFJetUDAmrOgc+/vP28c3LMa4KAYtLzqnYD3rEuluvv3trRrqPBVhc5gsrR/nkABYXwEoKYA2Y/eJh3QS+QuRJxAFYCJ1esLLKmi4syEoIYEUCWPKEpgKwIgEseQBLEcCSJx+sPWAhbQBLEcDqF8CK5KzpBrBSAliRAFavJNoALIROIo4LgwVZdAJTkYZjD1hIJ4ClyFkTYLEBLEUASx7AUgSwegWwYgGsXgGsWACrV5Jw7AELoZOGY19EFmDNNv5UAFY0FizIIgNYigCWPGFYehyAhVgBLEUaTDeAlRAljn1bCbAQIlpY+3MlwEKIqGHtDWAhfAArlrMmwOLjTYUWx6k0YCF2ssDaXyQsyKLSF9beT8neZS6vC2ApAljyBGGBlzCAFU0IFo5b0ih1XDgsnBDFGRAWXxKwlpP+sOR12RJTh4UlfDSRxbsUR8jV5cDCtWE87lQocVw0LNx0IAJY8rRXgoDFBrDkAaweAax4AKtHACuezj0GwNJGhyPoCrAQP4AVD2ApElu8y3QAFmBFMiIsQUHAmm2cqVDqACzAigSw5AGs9Oh0hF0BFuIFsIiEYUGWJIBFBLDSA1hEAEuRXov3CCzx3VVt77KX1wWwFAEseWpGN4AliD0VOhwxVwuFdQNYikRhCXT0gyUpN0FYN4CVEMAiAljpASwigJUewCICWOkBLCKApQkW7+IAliaAJQ5gaWJNhVIHYAFWNIAlDmAlB7CoAFZyZgbr8c2VMQ+v1s8+ysr3DGAlZ0hYonI0lLv11RHX3Q+y8j0DWMmZF6z7//6fK/Pw2625/+VWUr5vYrAgK5TRFu+9YT3+4/8OR6v7Fx/Nw69vD98/PWQIWH5KNjrbdKdCqyMKS/qeG1Xv3Ny9rE6Dn581sLjyvQNYmvSAFXc1BKzDoerROmIx5fsHsDSZLay7dZWXw6+xAEudWcEyp9sNj29eDnxVCFjqzBHW8PexAEuducHqX14VwEoNYJEBLE3GWrzLigHWbNOZCi0OwAKseABLHMDSJA6LnXbAAixRAIsOYCUGsOgAVmIAi0zUFWAxASwygKVKOxVqHYAFWPGkwyJcXRgsyAoEsKQBLFUASxrASgxg0QGstKh1ABZgSTIsLGExwJp/ssIS3qpgOwVYs815KgCLCWCpAljSAJYqzVTocQAWYBEBLGkAKymAxQWwkgJYXAArJQk4AAuw+AAWG8BSpZ4KPQ7SFWBdfABLGsBSZTaw3q1WX/9x+O+n4798+ewBLFVOU5GgY2BY7775j/m0ej5NWJAVy9CwhPxaKH/9+Pz47xPAmlVmAst8ef0EsOaUycM6ngpNBWwFWPNJio6BYZl3X/1e/efLa8AaK6phHqdiDrBEAaySWTysv/4rdtAqCItyBVh+AEsYwDKqcQKWMIClg3UMYPEBLMAqEsAy+oHmhyX7RSPbMcCaUgaBxbgCrAVGNdDUxTtgXSQs+UjnCCtfeUUAawawZPqMA+WvH58zvyoErKJZKqx3T8yHr//48ERaPm/ipC4Klm6os4B1OGB9eT3e+7EirlarVcL9nXlmubD++vFbwBovC4X15fW3n776vTohyspnDgnrMmTp15OzgGX+/NvqSfOGP0n5vCHXWIDlpZqKFBwjwBJkrKtCwPICWMIA1nJhfVitnn+Y2KkQsCKhYFETPwKsd9/8+3THQVg+b6LLK8CKZh6wjrcbnk/ndkNzQQhY0QCWIIA1CCzOVYlT4YfqVFjdIxWWzxvAWiws8+kwlSvKFdZYJaMbauLivRcsmb6md5rgqrBgAKtIAGuRsE7vxTpmKov3i5OlG+pMYAkDWAWjH+o8YH15/VxVPm8YV4AVSglYontgbM+c+1iq8nkDWIuFZehfE/rlswawBoHFuypxxBpz8Q5Ygyzex4AlHU2ZAJYeVgKOKcD6vF5/f2vMw6v1s4+S8v0CWAuGZb0f6/6XW3P3g3l8c1X9J1g+ZwBrubD892MdcD38dns0FiifNYClX7zPBFbgbTOHQ9X9i4/m4de3h2+eHgJYBTN5WCJ8p5Cw7n/67q35/KyB5ZbPG8BaLKzA+7EOotojllc+azhYFyBLPdS5wAq8H+v91VTWWIDlJGnxLnBVApaV+hz4+OblJK4KAcvJbGGZu/X6sMaayn0swHIyI1ijPh8LsHLCis18L1gifG3v2oz6fCzAyrl4nxSscZ+PBVhLhjXi87EAa7Gwxn0+FmAtFta4z8cCLOVQZ7R4l42mUABLDUuvQ+JKdKtC0DtdBoBlIsiKtTyVtCMXFQcsUVo/3Sc2XJasduSi0oAlCWBpYdFM9DVYNYA11ywV1qgfWLX8BF0tHlZn5LIKc4E16gdWw5YuC5Z2qMPCkthrM5kPrAKWFlaxxXt2WKN+YBWwlgtLNppCAawBYMlcAdbCsmBYH8Z7BilgDbB4HwvWh2p1NdJTkwFr4rAk9joJ3G4Y5/1YgAVYRSKAtXRZ6qHOBdbUT4WAZWXgxXsfWBNfvAOWlTnBkoymUABLDasvjmFg1U8EEZfPHcDKAWsXmHmhpqAanT2rd80XgBXu1pBtKYdKwtpTxYaEdVpfTfp3hYBlZyawpv+2GcCyE3AVgKV3lR2WJIBVsK2ssPbRUhcFS+Jq4bC0Qw0s3nPDktiL9U45esAq11RvWLsArARXgDVA5gbLkwVYgDUZWIKFP9+77jcjPnhNBGsEWWPBkrQbcuXCUmhSXVGynZvKg9cmCmvINrPD2gfKqGARhdnOTeXBa4A1Nizdwp/t3FQevAZYvWHtArDkrkrCGvPBa/HPPwNWJO7i3Ye1nwisUR+8Fn1iA2BFkheWfxZN+Nhit3fK0QNWybb6wNrtArIAC7CWDOtwKhzrbTNYY6lhhV0lwvLPohlhWX8CU1A+Z3hUgOUkOyzNrQq2d1N5P5YM1tCyBm2zF6xdflhkebZ3U3nwGmD1grXrCUt9Rcn2zoJC3hoNlM8YwEpavJvaVwZYx02Z1mtGWGM+HwuwUmAdr6VtV6mwjptqtpcZliSAVbaxBFg7J0mufFh0+N4pRw9YZRsbElZbsjis8T5iD1hJi/fDf1xXCli78xeBNVZOWCM+FASwtLBuWhNZYOlOomz3JvIYI6GrC4LFNpsD1s7ZBmANk2EbHRpWUzhp3c+OZiKnQgGopcPSDvVmFXY1RVjjLd45V+f3PpRpnu7VsI01Q2XLZ4G1S7wHxg5nIrcbACsfLCmPHiYBK0uvhm2sF6zt9GCdPlM41q90GFjtu7XKNE/3atDG5GusEA4FrD5n0cUcsSxhw2UUWNKRzgjWDG43AFZbPoQDsJwAVhZY256w5FeU7HBCj4oc4XOFk4Q1bKPKkd5Ui/cesIKuisAa9a3JgLVkWJKMAEv/p0Byd2rY1nrDEvEYFNaX199yH9UZHpb+wVHZOzVsa+mwtkPB2ilhHZ/aQMsCrOKtSWGFDljyc+GQsCZ5Vei+WKZ9ulPDtjYIrLCrgWDd/7ReXxnz8Gr97GOofMZQrgArXHw+sJy3zTz8+tbc//z28c2VufshWD5fpgrr/O8grfWBdfjRbmtO71SeHCzzqfu2mc+VpvdXD7/dmvtfboPls4VyNSKs+jfCA7WmklUt3ruuzp+F6AVLfKuCHQ4D5XDUun/x8XjwMubpIcPCCrxYpv1InxYLK+ZqKFiPb16az88aWHz55Ewb1iCN6mEdl1X5YKlurrLDId828/Dq5WEJ/6I8rIir0WHdtP8ZpDn5SG8aWGdZxmzla6wBYQVy/9PhmtAMscaaLKwBG1XD2u/a68Bd/bX0qrAXrF1PWCdXx9Nh6atCwMoGazs1WM15sD0V3q2rXA1xH0sBa5QHoQ3cnA7W1oPF8wi5KnjEqu9jUe9xGAPWSIesGcDqWFLBCh6wysEa71c6lw2LHny0zupsyUpxWDvAytentC2ktDQiLM3Cnx3UND4JDVhJsEKuJgnr9Csd8m2kgKXYQEpLY8FS3qpgBzWNd5ACVgKs8JkQsLoBrBRYQVcSHZEzoeZOBTso76Egzz+M8EeamF07S1jyWuGRk7Vv4rAEd0gHh/Xum3+f/hamsHy2AJYz8OOvlJkqWWGJz6IpsI6/h34+odsNwZeLdIDrU1r9lJbksFaAxUYDa5wPJifVT2uqD6yNBtbWhSX6PWPKqfBDdSqc0H2syMtFusB0Kal+UktNc2R1BhbD44wpAdYuafFuvTVZUD5XAIsafqROANZGBGtHwRIe7dhRTfp2Q+zlIn2gu5RUPaklMazQAUsJK/CWmxKwxvvrX9yeHUHW8mGdKRWHNd5DQRYKS1YrEZap3ovsusoHy4T/RsUuBZah74365bNFC2sAWf0a1NRKg3W8cAzCYpfg3rIqACv2V3WSYI32DFJ2zw4Pq2eLhWHdRGFJ7jfYRykrZWBJMgQs4+1Z1f/NJbqkbFBVqResjeNKAGt38bCiBQDrKMucT34psEKuOlVNvjXWO/ok6JXPl6XBUlWKumJgVfexGkoFYDFHO3ZYLZR3h5X7B1YWYGnqJrUkhbV1YG2mCet4E4u/kwVYmrpJLfG1b2pYm01XVjosc75zUQDW8SZW9axIYfmM8XbovGEpK6XD2mwsWV1YFA/fVXuByd0DO6NkhwVYsj7JG9RWSoa1CYbVEThgiWHtZg3r/JNoifKyejQYrRPZQjKsFSUrERZzLgSszF2aFqybzLA6aywZrK0OlvvsBrp8xgDWyLDEl4UpsIQZB9bgi6zFw4q4WhSswP6cMax4pfAW4q6iTdavhl1xsOgDlvhgx+4HwBL1KQWWcSwtCRa/HyYMiyozA1jeByJywWpeva4yDiz2wx6AJetSHljBTShg3dg1jC/r+K0EVsyVcHk2S1jnnxFlSsuSTDNXtQCsG6vG6kypA+s6HdamlgVY5ZIOyy7vjEHclByWLauGReiInwk3DSxJXX5HjA8ruDeXAMupE9mCCtZNt0J9u+HacnXNLLKisDYqWHO4KgQsIaz6Rx6sa8AKZoKwRPMsqmq/omhLAMtsXFknWMYQf52CcMV+EqNbl90RgCXokrxFokp4A5SrEKwbH9ZZ1ukqsf67J7oD1kYAawdYubs0JVidV9tTYAvs+tqDdeRAw9pcAKz2p0Sh+Dxn8VYKVmALPWC1b/SrD1kUrF0Ax2bRsCI7MxlWDlmThOW9unJkXZ9geWusXUeWDct+U/NFwhKfC3PAkk20qKrzkqItFazNdavLu0Pqw9pGYNWySFjb2cOii8Vh9ZeVDouqUgCWfcjqwOrq2O1aWc4Bq5a1EcGy67K7YoGwesuaD6yOrNOZkIK1C8DaWK4Aa46wTPDKogcs62Bz/n304T99YYVlXTYsIQBVjxSyqBrh39uKYfmvbl1ZQVi7Tvaeq4OlzcaWRcNq6rJ7cWxYsZ05S1hkjeOfl2aacV6gt+2sjwSw/AOWGxdWtC67F6cGq32BLheZZhkAXZeGhhWWFYHl+XAvCwFr/rDIGqc3JohKC2GtaFi7mKtd3JUQ1gawcnQpEyxeyvRgxeuyexGwuB6JZdEVBFIoWIHCq+i5sH4ApP5MGL9V4dZld+OyYIkAKHvENMnUc15mirsvkcUpWI0s5QFLBmszA1jERFAFTeQWuwSAukvB7knrOS8zxd2XyOLbUrBM8zA/oi67G2cJ63SFNS1YXAWBFB+WW93KNiyrA2uXBKt9/OgyYIkLloVFuopvl60gkNL9DbxTPFQ4DqtZZAUTdVV/doyC1dZl9+NcYFm7toblVykOK7phrrxXnyodr97NLgBrmw6rvnXfgUXVZffjLGHVaywCVrosAhW1Xa6CRIoS1sqXdfy6vSzUwLo+wzqvsS4QVqSKfGuqZqgm2WpOAbqC9yJVfOXdOdgKYEVdbc6wqtA3GyYPSzBloaKxKvKtqZoR9JKtIJEyKqzmXNjCitRdKixDnPDkWxP1iJp7cTW/+/EK0XEES6927hsVTl+nwDq/l8u+VWGO73IO1WV35NxgNev2YB3F5gQdIqGIqzklyAqBzRHF3bnedmHFZBGubFjVrYr6cxmBAxZg9egQPfnSak4JskJgc0TxzmR34sM6/jgEq/MR6o0Pa0fBumb3ZDZY0VubVBQSmlKTgkU76ZaXSAndiyCK74Oy/EXWtiurA6t9BlLn42PWrQoC1jW3J/PBunG/EEQhoVMsOs2KzfH9YaTU5dlq3paJGoF+EKXDsPxF1rYjy3Jlg3JW7ydZJnImnDgsjQR+loeHRU+8Vdz5AbNpUemVDNY2Bqs9BVpLLXp51hywrrldmRHWjfVfSWITxpYNVyJeSulQJE5xrpq/5XiFUD/i21/FzoVhWFsbVnsdeJ0Ci92VNKz7X26NeXi1fvaRLd/dZWyr/v5j67CznAFWDEdsu/X3guLOj7hNOz8Ll9bC2noHrO5hi4W1zQjr8/r7W/P45src/cCWr3eCu+/JtPtOUIebZXcZJu1ErAnjwXebDDIJbMb/UVgKA8vZYUJY2zCsZnl12JT1fC0RLMGZkIT1/rt/HY5YD7/dno5cdPnTiAPTTaQu7X7MgCocnYu2RPS9D6om7MvP7rdee0S18GWdEpa75fqr5uZ4SFYQ1nbXoVHfjqo2tenI2kTvgVkHrL73sSpQ9y8+modf3x6+e3oIDSsw21S6e0xYODwX9o86cyvtCb2VGxIWVY2+vRAejF3eJMHaBGF5rlhYwdqZYH1+1sAiy4d3EBlrLqSlg3MRn1thV5itBGGF++PC4q8b3cHY5Y0K1s49F3oy4rC2gUVWpHbmIxZZPrKHqFj7Tlw6MBf+z5Q9CbVgvP9ZnE1GOxToYrhsaCzetp2VVfvV3pe168DaSmBVQBpXCli9f6Vzr1xj6aZTVyU+G8LJSmwguk1Nec12nW1H6648WPXXNawtechxU4u0V+/RM2EOWI9vXkqvCkO7iIiuStqsyXpCNRDbprj4mLC4A5YDy337aZwluzez3scK7SIiuirR2aDnUNYVooFQk1xx4/ZKss0UWJas5uvTZeH2fH8hAssYY7lqzoVBWOb0tzLPtdm9mfPOu7fvmehqxGbE+sZbOif+GoAMW96/NGQ36TyLRlLXhbXzYG2pM6F1Qdi8aMPquKr/uu8sYClrcHNznh99T8TbFybQDUkNZWeiH6RpYbXrosABq3tBKITVYckFsDTbF6Y/LEnt8IdKj0DqRVYH1kYGy5YVgbWZEyxl8egEJa+xRJuXRr89Y9y/6MRGB2vTcXXt3WlwYPm3Kowx1i+D2P05H1ipUy8cWOLWc0bZnfjjFThY3evALqxtHJbLkt2fhWCpoWjLp01X/q3njLI7q+ghy1pkWRd+HVj++qsDK3gPrHPAGvBx3MROklQQNJ1hurJvPGuU/dHC2liHnPZVm05zsIv9XZTxYBnhm1biO1VUIWm6Mm88vVNsTwXFk2FtdLDM6RbW9nj+ux4NlvhNK/GdKqqQNl9ZN66/+JP3U1B+FXmI1fa4yPJd1U9Itg5Y223XVft7xm17D6y9hXX8qnnAAxfASt/2yLBiT0eLw2rPZe5pLgCrqd3elpgELGc6A7NL7FW6hV4Tpt226gZ7v2hHazxYp2+21mVh0BUNy76inAqsZuHhvhgtH9qrdAu9Jky5ac2vBHtGO1pjH7LOX1sHnrArApZ1yDp5Ot/vMtUa61Sb3aWlrgovAlbeaEebBot0FYQVPN6xu7QYLO939XR5QdOZZky35QnDWlmwOl93z2i6A5azyPJcTQyWZMcJms40Y6oND3mDSzvaVfeQ1X3Q8fa0yGruL/gHLCGskKtm5c/O1liw2p8FdqqwhbQZozd8/LbbP107yX30usm2Ybqw9i4sUy2M9Aes07mQPGCZ420tdrbKwfLfG+4XP19XidrOM2PkZk/vMuh+cELRTM+LRMlgu13rwNq7sOpLueZW+zncAasLy3d1/HjO6bYWO1nlYYX3nLOfRG3nmTFyqz4seatDwzJmH4gFa+PA2kRgtb9zbg9roUwUlv/e22Fg0Vv3J27usHYWLN/JmZMNq5EVh3U8E44P68b7uV+8+UrUdqYpI7dqrDWWrtU+XfR7ybVRlYkeso63nCKuNq0my1X9Xq44rPMbZk5PVqZTGlZk1zE7VdxE0pTJN9qrVWW0o63KxM+Fm/oKMPKBHOv05/wCOyarc89+NzFYN9HSoraT54zaPFsvvVVdlKM9TgUNy36UTOCApYTV1h4Zln9NFS0tatuv430lnDSm31a9cJPRviSH6lhwj8Vh7eo3yJjqfGiqGw+m81Gv082CllLgPTfsAWtsWNGdx+1VQRPeswwUk0Z3264WbNItmOHX0UTPQps/TUV8kbWp19ntPy2s7rNFnUfLOLDcWxXnIxw7WUVhRfceu1cFTWhgxbfP1wo26RacEaytDWsnhWW5Aixu+4JaoSbdgmPAqpITVv3h1+4iyz0pTh0Wv1clTRj5Giu6fWVvozXEO0DeRWbzp0L0IsvUy6vjoqprw5iAq+ZT1S2ooKtpwvLvbQV3aq8m4u1qN9m/WUVSusbA6miwP+oVOgl2YbmPU/brspM1Bix+p/Zrg5gI1Rb7t9qrh6LS5Lmw66r7Ua+wK+uC0n6csnfAmiQsyU7t1QY1EZoN9m9VE13nmqngYHV/I8i5ahdZ7uOUu5saA5ZkFoILI2Hj6bMWacItEazSp9VAL2Lf+p2j2jalYV2TB6xhYYmujc6uEp4Uqp1GZyboDUaeHpoVVvzBpqEOUrvT0LB2W99V81GvqCtreeY99W87cVjCnRpro1wizzvO2iwBK7Sv+8CKpguJWvdHPs2zXFileOWHFbj6zQWrLRQ9F/aFFTjidQ536VC05evhKnZ72hpL1YYq7patZpO2x7bR+TYwWqLpTjElLMqVdRYlD1h7dq6Gvipk9xOVpmSvtvR9Sq6f1Jqo2W451bmQduUcsmL1Dxtg5wqw+D4l109qTdRst5zqkNUT1m6KsIhCwsbVF2qCotEi9NDYLRPdDL2i3KXWVChgHRdHcVfxWxXOAWtKsGRrUTLaZY/kt9PR3yuTQ2O3TPQy/itl+S61p0IMq/5rvDSs8K0K54DHztUkYCn7IGmNa5ItQjcmHIy4SeUgo1PR9RGMCJZ36vPvebEzNFNYMlmZYIWu7hJgBW8NByoJxhifir6wnIPdHGARyxJlH2TN0U1yRbjGZIOxX4jXVY6R2C8cLG6NZcOKupoUrHiUfejbnLpLyTXtF4St8c0S+4U9F5KqFgZL2YXe7an7lKeiWoqudB0GFufKkkVsgJ0fwBJ0Kbmm84KsNa5Zer/QsHhXHVjUBtj5mTusaMuCIqHCwS4xhamapr77lgzLr9a8HJ4K+lx4UbCUPbAaFHy8IenSkBgbvT1vf52fBUHsJGKIRNciU0HBEriqavKuLg9W81I/WNQA88Oihki8AYKGlR6RRHZ6FgnLlIBF3YaK1wQsYfLDUnbAadFt+fyS6bHGoodIbc+rYprlVXwv0SO02hUlo6x4GbYXc4cV3lhyZ8guJdR0X1G05pWW7hfA0u0vUYu9e0P2KKGq84qmteCxWJB8sIgybC9Gh6Vsn2myb2+YHumrui+pxi8t5ySXLKoI24lCsIy3V2LfKtuPN2ltjBMQ6pWgR9xW4jWiW5AO0H81OhULhkV9zMn5Vtl+tElnYyECbuHw5Z22SXow7iuprQVeLQ2LLEL2m+ydtjw1Z7oPp4hDofBfo0nIZjoOi6sQ2YC0tdCrfWAlVhsXlhkKFvW/P0kq2CtZh5zCali6K700WAIiidVGheXcRWr2S/hbZevRRv2tcaz8Xsk65G2g+YcuH92AqDW2nJNEFhldFfh7hZpLMmXj8Vb9zck7oeyQU5irRvVM2pqgnJNEFvlcFYEln1Rl4/FW/a1pSemmui3MVfO3q29NUM7J8mA5Xxd2Rc2S11T3q0jXVE223/KlqQ2wrYnKOYlw4Fhkc5UblvW16CNSfXPe2PHXvYEXnL64f9QkoUNOYcktA/5n8Q3EXqCnLsCh/hyFslqaq3ywrIhgKVtme7YK9E0KK3NfBol26sJ7qFQWDut8/gOs5cBi1ljqrqblxu2LCayxBupL3gyoJCFlYAnvIg0RQU9mCmvaGQ2WuqepgatRIoDy8Gr97KOifJUpzeWU+nI54aE8vrkydz/Iy59CTCJgXUJ4KA+/3Zr7X27F5U+JzWF9OZbc35Qs1NXcF+/3Lz6ah1/fHr56ekjf0Qx6ybvsTHtH8r37/KyBJSvPtAdYuTLtHak5YsnKIwNl2lNRao2FXHgkV4UvE64KkQtPoftYyKWn0J135NIDWLPNtKcCsGabaU8FYM02054KwJptpj0VgIUUCWAhRQJYSJEAFlIkgDXbTHsqAGu2mfZUANZsM+2pAKzZZtpToYYVyNPQD4cKGp9W46mwQnmaYRtofGGNAxYaL9I4YKHxIo1PewWIzDaAhRQJYCFFAlhIkQAWUiS9YVkfDhs09z+t11fG3K3X6+9v+eJ5UyXnk7IAAAH0SURBVLc6yuirtquhjzHy40eX61GTg+8Ly37I0ZCpPvZ///Nb8/5qjNZPrY43+uqJGiOM/HMluR41Pfi+sOwP4A+Zz9WY3l89/uMtWzR/6lZHG331f9UII3//3b8Oo61HTQ++Lyz7kSFD59Dy4Xh8PCMO3PCp1dFGXx0pRhl5JakeNT34vrDshxwNnOqxEtXZcPj/d+tWxxr9sc1RRl7BqkdND37OR6yHVy/rr8ZaZ401+s/nRfPQIx/siDXeGutwVXjeqWPBGmv071+evxoB1iBrLPshR0OmdlX9z/v4z6Hntm51pNGfToCjjLySVI+aHvx872N17uZ8N/zJqG51nNHXJ6AxRj7YfSwECQawkCIBLKRIAAspEsBCigSwkCIBLKRIAEuTL6/rj2U++fPvv4/dmWkHsLQBKVEASxvAEgWwtDnBOvz759//92+r1bd/Hv55fjpLfv3H2J2bTgBLmxbW3775j/mwqv75+o8vr58Y8+HwNXIKYGnTgXU4UJ3++fvvn6qj1V8/Ph+7d5MJYGnTORX+Xn93+OfD6Wrx27F7N5kAljYRWDgL2gEsbcKwPn2Fa0UrgKVNGNaX14dDFnS1ASxtwrCOtxvgqg1gIUUCWEiRABZSJICFFAlgIUUCWEiRABZSJICFFAlgIUUCWEiR/D/wp8P5QKU3cAAAAABJRU5ErkJggg==\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Clearly the two models do not produce equivalent forecasts. We will\ncome back to scoring these forecasts in a moment.</p>\n</div>\n<div id=\"forecasting-with-newdata-in-mvgam\" class=\"section level2\">\n<h2>Forecasting with <code>newdata</code> in <code>mvgam()</code></h2>\n<p>The second way we can produce forecasts in <code>mvgam</code> is to\nfeed the testing data directly to the <code>mvgam()</code> function as\n<code>newdata</code>. This will include the testing data as missing\nobservations so that they are automatically predicted from the posterior\npredictive distribution using the <code>generated quantities</code>\nblock in <code>Stan</code>. As an example, we can refit\n<code>mod2</code> but include the testing data for automatic\nforecasts:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a>mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(y <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_knots =</span> <span class=\"fu\">list</span>(<span class=\"at\">season =</span> <span class=\"fu\">c</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">12.5</span>)),</span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(<span class=\"at\">cor =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test,</span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Because the model already contains a forecast distribution, we do not\nneed to feed <code>newdata</code> to the <code>forecast()</code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a>fc_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod2)</span></code></pre></div>\n<p>The forecasts will be nearly identical to those calculated\npreviously:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc_mod2, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Plotting posterior forecast distributions using mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Plotting posterior forecast distributions using mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"scoring-forecast-distributions\" class=\"section level2\">\n<h2>Scoring forecast distributions</h2>\n<p>A primary purpose of the <code>mvgam_forecast</code> class is to\nreadily allow forecast evaluations for each series in the data, using a\nvariety of possible scoring functions. See\n<code>?mvgam::score.mvgam_forecast</code> to view the types of scores\nthat are available. A useful scoring metric is the Continuous Rank\nProbability Score (CRPS). A CRPS value is similar to what we might get\nif we calculated a weighted absolute error using the full forecast\ndistribution.</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>crps_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>)</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(crps_mod1)</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 4</span></span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_1  :&#39;data.frame&#39;:  25 obs. of  5 variables:</span></span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score         : num [1:25] 0.993 0.817 0.334 0.998 0.277 ...</span></span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 1 NA NA 0 0 0 ...</span></span>\n<span id=\"cb22-7\"><a href=\"#cb22-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb22-8\"><a href=\"#cb22-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-9\"><a href=\"#cb22-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; ...</span></span>\n<span id=\"cb22-10\"><a href=\"#cb22-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_2  :&#39;data.frame&#39;:  25 obs. of  5 variables:</span></span>\n<span id=\"cb22-11\"><a href=\"#cb22-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score         : num [1:25] 2.01 NA 6.55 14.69 17.43 ...</span></span>\n<span id=\"cb22-12\"><a href=\"#cb22-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 NA 1 1 1 0 0 0 0 0 ...</span></span>\n<span id=\"cb22-13\"><a href=\"#cb22-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb22-14\"><a href=\"#cb22-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-15\"><a href=\"#cb22-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; ...</span></span>\n<span id=\"cb22-16\"><a href=\"#cb22-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_3  :&#39;data.frame&#39;:  25 obs. of  5 variables:</span></span>\n<span id=\"cb22-17\"><a href=\"#cb22-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score         : num [1:25] 3.487 0.463 4.064 0.5 NA ...</span></span>\n<span id=\"cb22-18\"><a href=\"#cb22-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 0 1 0 1 NA 1 1 0 0 NA ...</span></span>\n<span id=\"cb22-19\"><a href=\"#cb22-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb22-20\"><a href=\"#cb22-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-21\"><a href=\"#cb22-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type    : chr [1:25] &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; &quot;crps&quot; ...</span></span>\n<span id=\"cb22-22\"><a href=\"#cb22-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ all_series:&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb22-23\"><a href=\"#cb22-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score       : num [1:25] 6.49 NA 10.95 16.18 NA ...</span></span>\n<span id=\"cb22-24\"><a href=\"#cb22-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb22-25\"><a href=\"#cb22-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type  : chr [1:25] &quot;sum_crps&quot; &quot;sum_crps&quot; &quot;sum_crps&quot; &quot;sum_crps&quot; ...</span></span>\n<span id=\"cb22-26\"><a href=\"#cb22-26\" tabindex=\"-1\"></a>crps_mod1<span class=\"sc\">$</span>series_1</span>\n<span id=\"cb22-27\"><a href=\"#cb22-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         score in_interval interval_width eval_horizon score_type</span></span>\n<span id=\"cb22-28\"><a href=\"#cb22-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   0.9932195           1            0.9            1       crps</span></span>\n<span id=\"cb22-29\"><a href=\"#cb22-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   0.8173380           1            0.9            2       crps</span></span>\n<span id=\"cb22-30\"><a href=\"#cb22-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.3338443           1            0.9            3       crps</span></span>\n<span id=\"cb22-31\"><a href=\"#cb22-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   0.9980710           1            0.9            4       crps</span></span>\n<span id=\"cb22-32\"><a href=\"#cb22-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   0.2773030           1            0.9            5       crps</span></span>\n<span id=\"cb22-33\"><a href=\"#cb22-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6          NA          NA            0.9            6       crps</span></span>\n<span id=\"cb22-34\"><a href=\"#cb22-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7          NA          NA            0.9            7       crps</span></span>\n<span id=\"cb22-35\"><a href=\"#cb22-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   6.1295615           0            0.9            8       crps</span></span>\n<span id=\"cb22-36\"><a href=\"#cb22-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   8.2855480           0            0.9            9       crps</span></span>\n<span id=\"cb22-37\"><a href=\"#cb22-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  7.4110365           0            0.9           10       crps</span></span>\n<span id=\"cb22-38\"><a href=\"#cb22-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 21.3898007           0            0.9           11       crps</span></span>\n<span id=\"cb22-39\"><a href=\"#cb22-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 35.2857677           0            0.9           12       crps</span></span>\n<span id=\"cb22-40\"><a href=\"#cb22-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 37.2882082           0            0.9           13       crps</span></span>\n<span id=\"cb22-41\"><a href=\"#cb22-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 36.4251945           0            0.9           14       crps</span></span>\n<span id=\"cb22-42\"><a href=\"#cb22-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 39.3858395           0            0.9           15       crps</span></span>\n<span id=\"cb22-43\"><a href=\"#cb22-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 42.3677532           0            0.9           16       crps</span></span>\n<span id=\"cb22-44\"><a href=\"#cb22-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 42.5461592           0            0.9           17       crps</span></span>\n<span id=\"cb22-45\"><a href=\"#cb22-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18 12.7316780           0            0.9           18       crps</span></span>\n<span id=\"cb22-46\"><a href=\"#cb22-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 13.7700235           0            0.9           19       crps</span></span>\n<span id=\"cb22-47\"><a href=\"#cb22-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  9.7282697           0            0.9           20       crps</span></span>\n<span id=\"cb22-48\"><a href=\"#cb22-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  4.7711443           0            0.9           21       crps</span></span>\n<span id=\"cb22-49\"><a href=\"#cb22-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  4.8054445           0            0.9           22       crps</span></span>\n<span id=\"cb22-50\"><a href=\"#cb22-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23  2.7825032           0            0.9           23       crps</span></span>\n<span id=\"cb22-51\"><a href=\"#cb22-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  0.8591737           1            0.9           24       crps</span></span>\n<span id=\"cb22-52\"><a href=\"#cb22-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  3.7808390           0            0.9           25       crps</span></span></code></pre></div>\n<p>The returned list contains a <code>data.frame</code> for each series\nin the data that shows the CRPS score for each evaluation in the testing\ndata, along with some other useful information about the fit of the\nforecast distribution. In particular, we are given a logical value (1s\nand 0s) telling us whether the true value was within a pre-specified\ncredible interval (i.e. the coverage of the forecast distribution). The\ndefault interval width is 0.9, so we would hope that the values in the\n<code>in_interval</code> column take a 1 approximately 90% of the time.\nThis value can be changed if you wish to compute different coverages,\nsay using a 60% interval:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a>crps_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>, <span class=\"at\">interval_width =</span> <span class=\"fl\">0.6</span>)</span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>crps_mod1<span class=\"sc\">$</span>series_1</span>\n<span id=\"cb23-3\"><a href=\"#cb23-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         score in_interval interval_width eval_horizon score_type</span></span>\n<span id=\"cb23-4\"><a href=\"#cb23-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   0.9932195           1            0.6            1       crps</span></span>\n<span id=\"cb23-5\"><a href=\"#cb23-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   0.8173380           1            0.6            2       crps</span></span>\n<span id=\"cb23-6\"><a href=\"#cb23-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   0.3338443           1            0.6            3       crps</span></span>\n<span id=\"cb23-7\"><a href=\"#cb23-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   0.9980710           1            0.6            4       crps</span></span>\n<span id=\"cb23-8\"><a href=\"#cb23-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   0.2773030           1            0.6            5       crps</span></span>\n<span id=\"cb23-9\"><a href=\"#cb23-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6          NA          NA            0.6            6       crps</span></span>\n<span id=\"cb23-10\"><a href=\"#cb23-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7          NA          NA            0.6            7       crps</span></span>\n<span id=\"cb23-11\"><a href=\"#cb23-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   6.1295615           0            0.6            8       crps</span></span>\n<span id=\"cb23-12\"><a href=\"#cb23-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   8.2855480           0            0.6            9       crps</span></span>\n<span id=\"cb23-13\"><a href=\"#cb23-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  7.4110365           0            0.6           10       crps</span></span>\n<span id=\"cb23-14\"><a href=\"#cb23-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 21.3898007           0            0.6           11       crps</span></span>\n<span id=\"cb23-15\"><a href=\"#cb23-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 35.2857677           0            0.6           12       crps</span></span>\n<span id=\"cb23-16\"><a href=\"#cb23-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 37.2882082           0            0.6           13       crps</span></span>\n<span id=\"cb23-17\"><a href=\"#cb23-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 36.4251945           0            0.6           14       crps</span></span>\n<span id=\"cb23-18\"><a href=\"#cb23-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 39.3858395           0            0.6           15       crps</span></span>\n<span id=\"cb23-19\"><a href=\"#cb23-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 42.3677532           0            0.6           16       crps</span></span>\n<span id=\"cb23-20\"><a href=\"#cb23-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 42.5461592           0            0.6           17       crps</span></span>\n<span id=\"cb23-21\"><a href=\"#cb23-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18 12.7316780           0            0.6           18       crps</span></span>\n<span id=\"cb23-22\"><a href=\"#cb23-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 13.7700235           0            0.6           19       crps</span></span>\n<span id=\"cb23-23\"><a href=\"#cb23-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  9.7282697           0            0.6           20       crps</span></span>\n<span id=\"cb23-24\"><a href=\"#cb23-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  4.7711443           0            0.6           21       crps</span></span>\n<span id=\"cb23-25\"><a href=\"#cb23-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  4.8054445           0            0.6           22       crps</span></span>\n<span id=\"cb23-26\"><a href=\"#cb23-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23  2.7825032           0            0.6           23       crps</span></span>\n<span id=\"cb23-27\"><a href=\"#cb23-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  0.8591737           0            0.6           24       crps</span></span>\n<span id=\"cb23-28\"><a href=\"#cb23-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  3.7808390           0            0.6           25       crps</span></span></code></pre></div>\n<p>We can also compare forecasts against out of sample observations\nusing the <a href=\"https://link.springer.com/article/10.1007/s11222-016-9696-4\" target=\"_blank\">Expected Log Predictive Density (ELPD; also known as the\nlog score)</a>. The ELPD is a strictly proper scoring rule that can be\napplied to any distributional forecast, but to compute it we need\npredictions on the link scale rather than on the outcome scale. This is\nwhere it is advantageous to change the type of prediction we can get\nusing the <code>forecast()</code> function:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a>link_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod1, <span class=\"at\">newdata =</span> simdat<span class=\"sc\">$</span>data_test, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a><span class=\"fu\">score</span>(link_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;elpd&quot;</span>)<span class=\"sc\">$</span>series_1</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         score eval_horizon score_type</span></span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   -2.155156            1       elpd</span></span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2   -1.956860            2       elpd</span></span>\n<span id=\"cb24-6\"><a href=\"#cb24-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   -1.242909            3       elpd</span></span>\n<span id=\"cb24-7\"><a href=\"#cb24-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   -2.208022            4       elpd</span></span>\n<span id=\"cb24-8\"><a href=\"#cb24-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5   -1.218081            5       elpd</span></span>\n<span id=\"cb24-9\"><a href=\"#cb24-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6          NA            6       elpd</span></span>\n<span id=\"cb24-10\"><a href=\"#cb24-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7          NA            7       elpd</span></span>\n<span id=\"cb24-11\"><a href=\"#cb24-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   -7.113590            8       elpd</span></span>\n<span id=\"cb24-12\"><a href=\"#cb24-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   -8.499192            9       elpd</span></span>\n<span id=\"cb24-13\"><a href=\"#cb24-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10  -7.975085           10       elpd</span></span>\n<span id=\"cb24-14\"><a href=\"#cb24-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 -18.627673           11       elpd</span></span>\n<span id=\"cb24-15\"><a href=\"#cb24-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 -30.187736           12       elpd</span></span>\n<span id=\"cb24-16\"><a href=\"#cb24-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13 -28.528770           13       elpd</span></span>\n<span id=\"cb24-17\"><a href=\"#cb24-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 -27.474431           14       elpd</span></span>\n<span id=\"cb24-18\"><a href=\"#cb24-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 -27.138400           15       elpd</span></span>\n<span id=\"cb24-19\"><a href=\"#cb24-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 -24.018949           16       elpd</span></span>\n<span id=\"cb24-20\"><a href=\"#cb24-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 -28.766709           17       elpd</span></span>\n<span id=\"cb24-21\"><a href=\"#cb24-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18  -9.455606           18       elpd</span></span>\n<span id=\"cb24-22\"><a href=\"#cb24-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 -10.169118           19       elpd</span></span>\n<span id=\"cb24-23\"><a href=\"#cb24-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  -7.741233           20       elpd</span></span>\n<span id=\"cb24-24\"><a href=\"#cb24-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  -6.998068           21       elpd</span></span>\n<span id=\"cb24-25\"><a href=\"#cb24-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  -7.030657           22       elpd</span></span>\n<span id=\"cb24-26\"><a href=\"#cb24-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23  -5.715523           23       elpd</span></span>\n<span id=\"cb24-27\"><a href=\"#cb24-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  -3.015423           24       elpd</span></span>\n<span id=\"cb24-28\"><a href=\"#cb24-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  -6.271717           25       elpd</span></span></code></pre></div>\n<p>Finally, when we have multiple time series it may also make sense to\nuse a multivariate proper scoring rule. <code>mvgam</code> offers two\nsuch options: the Energy score and the Variogram score. The first\npenalizes forecast distributions that are less well calibrated against\nthe truth, while the second penalizes forecasts that do not capture the\nobserved true correlation structure. Which score to use depends on your\ngoals, but both are very easy to compute:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a>energy_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod2, <span class=\"at\">score =</span> <span class=\"st\">&quot;energy&quot;</span>)</span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(energy_mod2)</span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 4</span></span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_1  :&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 1 NA NA 1 1 1 ...</span></span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb25-7\"><a href=\"#cb25-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-8\"><a href=\"#cb25-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_2  :&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-9\"><a href=\"#cb25-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 NA 1 1 1 1 1 1 1 1 ...</span></span>\n<span id=\"cb25-10\"><a href=\"#cb25-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb25-11\"><a href=\"#cb25-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-12\"><a href=\"#cb25-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_3  :&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-13\"><a href=\"#cb25-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ in_interval   : num [1:25] 1 1 1 1 NA 1 1 1 1 NA ...</span></span>\n<span id=\"cb25-14\"><a href=\"#cb25-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ interval_width: num [1:25] 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 ...</span></span>\n<span id=\"cb25-15\"><a href=\"#cb25-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon  : int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-16\"><a href=\"#cb25-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ all_series:&#39;data.frame&#39;:  25 obs. of  3 variables:</span></span>\n<span id=\"cb25-17\"><a href=\"#cb25-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score       : num [1:25] 4.74 NA 5.03 5.36 NA ...</span></span>\n<span id=\"cb25-18\"><a href=\"#cb25-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ eval_horizon: int [1:25] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb25-19\"><a href=\"#cb25-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ score_type  : chr [1:25] &quot;energy&quot; &quot;energy&quot; &quot;energy&quot; &quot;energy&quot; ...</span></span></code></pre></div>\n<p>The returned object still provides information on interval coverage\nfor each individual series, but there is only a single score per horizon\nnow (which is provided in the <code>all_series</code> slot):</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a>energy_mod2<span class=\"sc\">$</span>all_series</span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        score eval_horizon score_type</span></span>\n<span id=\"cb26-3\"><a href=\"#cb26-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1   4.736450            1     energy</span></span>\n<span id=\"cb26-4\"><a href=\"#cb26-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2         NA            2     energy</span></span>\n<span id=\"cb26-5\"><a href=\"#cb26-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3   5.025547            3     energy</span></span>\n<span id=\"cb26-6\"><a href=\"#cb26-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4   5.363993            4     energy</span></span>\n<span id=\"cb26-7\"><a href=\"#cb26-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5         NA            5     energy</span></span>\n<span id=\"cb26-8\"><a href=\"#cb26-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6         NA            6     energy</span></span>\n<span id=\"cb26-9\"><a href=\"#cb26-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7         NA            7     energy</span></span>\n<span id=\"cb26-10\"><a href=\"#cb26-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8   3.918395            8     energy</span></span>\n<span id=\"cb26-11\"><a href=\"#cb26-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9   4.113319            9     energy</span></span>\n<span id=\"cb26-12\"><a href=\"#cb26-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10        NA           10     energy</span></span>\n<span id=\"cb26-13\"><a href=\"#cb26-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 13.149358           11     energy</span></span>\n<span id=\"cb26-14\"><a href=\"#cb26-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 22.547040           12     energy</span></span>\n<span id=\"cb26-15\"><a href=\"#cb26-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 13        NA           13     energy</span></span>\n<span id=\"cb26-16\"><a href=\"#cb26-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 14 21.170257           14     energy</span></span>\n<span id=\"cb26-17\"><a href=\"#cb26-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 15 24.184433           15     energy</span></span>\n<span id=\"cb26-18\"><a href=\"#cb26-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 16 25.110374           16     energy</span></span>\n<span id=\"cb26-19\"><a href=\"#cb26-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 17 27.945911           17     energy</span></span>\n<span id=\"cb26-20\"><a href=\"#cb26-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 18  6.180386           18     energy</span></span>\n<span id=\"cb26-21\"><a href=\"#cb26-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 19 10.674543           19     energy</span></span>\n<span id=\"cb26-22\"><a href=\"#cb26-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 20  4.093666           20     energy</span></span>\n<span id=\"cb26-23\"><a href=\"#cb26-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 21  2.870332           21     energy</span></span>\n<span id=\"cb26-24\"><a href=\"#cb26-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 22  3.443291           22     energy</span></span>\n<span id=\"cb26-25\"><a href=\"#cb26-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 23        NA           23     energy</span></span>\n<span id=\"cb26-26\"><a href=\"#cb26-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 24  8.866093           24     energy</span></span>\n<span id=\"cb26-27\"><a href=\"#cb26-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 25  7.883124           25     energy</span></span></code></pre></div>\n<p>You can use your score(s) of choice to compare different models. For\nexample, we can compute and plot the difference in CRPS scores for each\nseries in data. Here, a negative value means the AR(1) model\n(<code>mod2</code>) is better, while a positive value means the spline\nmodel (<code>mod1</code>) is better.</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>crps_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod1, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a>crps_mod2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod2, <span class=\"at\">score =</span> <span class=\"st\">&quot;crps&quot;</span>)</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a></span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> crps_mod2<span class=\"sc\">$</span>series_1<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>  crps_mod1<span class=\"sc\">$</span>series_1<span class=\"sc\">$</span>score</span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb27-8\"><a href=\"#cb27-8\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb27-9\"><a href=\"#cb27-9\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb27-10\"><a href=\"#cb27-10\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb27-11\"><a href=\"#cb27-11\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb27-12\"><a href=\"#cb27-12\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb27-13\"><a href=\"#cb27-13\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb27-14\"><a href=\"#cb27-14\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(CRPS[AR1] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> CRPS[spline])</span>\n<span id=\"cb27-15\"><a href=\"#cb27-15\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb27-16\"><a href=\"#cb27-16\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb27-17\"><a href=\"#cb27-17\" tabindex=\"-1\"></a>ar1_better <span class=\"ot\">&lt;-</span> <span class=\"fu\">length</span>(<span class=\"fu\">which</span>(diff_scores <span class=\"sc\">&lt;</span> <span class=\"dv\">0</span>))</span>\n<span id=\"cb27-18\"><a href=\"#cb27-18\" tabindex=\"-1\"></a><span class=\"fu\">title</span>(<span class=\"at\">main =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb27-19\"><a href=\"#cb27-19\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;AR(1) better in &quot;</span>,</span>\n<span id=\"cb27-20\"><a href=\"#cb27-20\" tabindex=\"-1\"></a>  ar1_better,</span>\n<span id=\"cb27-21\"><a href=\"#cb27-21\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; of &quot;</span>,</span>\n<span id=\"cb27-22\"><a href=\"#cb27-22\" tabindex=\"-1\"></a>  <span class=\"fu\">length</span>(diff_scores),</span>\n<span id=\"cb27-23\"><a href=\"#cb27-23\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; evaluations&quot;</span>,</span>\n<span id=\"cb27-24\"><a href=\"#cb27-24\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;</span><span class=\"sc\">\\n</span><span class=\"st\">Mean difference = &quot;</span>,</span>\n<span id=\"cb27-25\"><a href=\"#cb27-25\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">mean</span>(diff_scores, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb27-26\"><a href=\"#cb27-26\" tabindex=\"-1\"></a>))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a></span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a></span>\n<span id=\"cb28-3\"><a href=\"#cb28-3\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> crps_mod2<span class=\"sc\">$</span>series_2<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb28-4\"><a href=\"#cb28-4\" tabindex=\"-1\"></a>  crps_mod1<span class=\"sc\">$</span>series_2<span class=\"sc\">$</span>score</span>\n<span id=\"cb28-5\"><a href=\"#cb28-5\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb28-6\"><a href=\"#cb28-6\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb28-7\"><a href=\"#cb28-7\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb28-8\"><a href=\"#cb28-8\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb28-9\"><a href=\"#cb28-9\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb28-10\"><a href=\"#cb28-10\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb28-11\"><a href=\"#cb28-11\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb28-12\"><a href=\"#cb28-12\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb28-13\"><a href=\"#cb28-13\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(CRPS[AR1] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> CRPS[spline])</span>\n<span id=\"cb28-14\"><a href=\"#cb28-14\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb28-15\"><a href=\"#cb28-15\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb28-16\"><a href=\"#cb28-16\" tabindex=\"-1\"></a>ar1_better <span class=\"ot\">&lt;-</span> <span class=\"fu\">length</span>(<span class=\"fu\">which</span>(diff_scores <span class=\"sc\">&lt;</span> <span class=\"dv\">0</span>))</span>\n<span id=\"cb28-17\"><a href=\"#cb28-17\" tabindex=\"-1\"></a><span class=\"fu\">title</span>(<span class=\"at\">main =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb28-18\"><a href=\"#cb28-18\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;AR(1) better in &quot;</span>,</span>\n<span id=\"cb28-19\"><a href=\"#cb28-19\" tabindex=\"-1\"></a>  ar1_better,</span>\n<span id=\"cb28-20\"><a href=\"#cb28-20\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; of &quot;</span>,</span>\n<span id=\"cb28-21\"><a href=\"#cb28-21\" tabindex=\"-1\"></a>  <span class=\"fu\">length</span>(diff_scores),</span>\n<span id=\"cb28-22\"><a href=\"#cb28-22\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; evaluations&quot;</span>,</span>\n<span id=\"cb28-23\"><a href=\"#cb28-23\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;</span><span class=\"sc\">\\n</span><span class=\"st\">Mean difference = &quot;</span>,</span>\n<span id=\"cb28-24\"><a href=\"#cb28-24\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">mean</span>(diff_scores, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb28-25\"><a href=\"#cb28-25\" tabindex=\"-1\"></a>))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAAA1VBMVEUAAAAAADoAAGYAOjoAOmYAOpAAZpAAZrY6AAA6AGY6OgA6Ojo6OmY6OpA6ZmY6ZpA6ZrY6kLY6kNtmAABmADpmAGZmOgBmOjpmZjpmkJBmkLZmkNtmtttmtv+LAACQOgCQZjqQZpCQkDqQkGaQttuQ27aQ29uQ2/+2ZgC2Zjq2Zma2kDq2kGa2ttu225C227a229u22/+2/7a2/9u2///bkDrbkGbbtmbbtpDb25Db29vb2//b/7bb/9vb////tmb/tpD/25D/27b/29v//7b//9v///+OV19eAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAXPUlEQVR4nO2dDZ+jNn6ANZvsjS+ba/bGyd71erNOe+kN99KmaUM2ba9LvbX9/T9S0RsIMBiM/hjw8/x2Z2xehGyekcQfSagTgADq1hmAdYJYIAJigQiIBSIgFoiAWCACYoEIiAUiIBaIgFggAmKBCIgFIiAWiIBYIAJigQiIBSIgFoiAWCACYoEIiAUizFus/Ua9+tG8SpTls7cfzftMvbYvUvPiuFPP5W6J36uR3u/CX+fJkzq/96ff5Mf/6gfz8lulHv6hJQG93cNzc6fMfoLHjmP3y4hFf4gLm9ySeYuV5ifCniIvlrJCHbbqySzP1TML0vAbbhMrtWc17Ty5bSfLefHwYg7arki+v92qtpP/CJHEMh8Csa7DnCNbMpViGaMyd+o+beum2Y3Pft25D4/lr4HkB8gP+bPZN8lfHpPCnsaGrjCt7pR/mGJ5Lzqtue5DTMisxcq/vd+60+dPY6qCk3T86yYwrzxtEmLtf7PxRcTxr28eTWH0dHbDIPlgJy3ZsMMilhh5/favG3v6vFi2PNjbpWlZN+avywIkF+s/8lbQV2aFaQ/97qMv9B4TXyEVK3Ti//xOvbL72/OZL/pjru1n31VzlK8MarmgWffzu7z9FxyluVOe5+dThSBnJtHUpKhTUl++BBl5KTwq1rmjePeKo1fz/dMX+QFsA29y5ixW/rU9+grEfffHv5iTZk9B/uvz733F41wz+HpTf+muPZRvVBOrXOHWuBLPn0/1RdE6KimvJj5VypM/qdpRmjvleX6j1Oc/hIvdPrbwswcuW2VNscp1VbHKo1fynZTfwvTMWSzzN55WWr7KtuadZj+9/Vi0aMKaJt/49Q95Iyg/Xfqr/+H0wZy5SlUYrsi3zF//l925EOuVSyJAN/rsUfJz/HnpXGYO+JfwKI2dkqAd74/jMmA/hPkE9g8p9VmviBWsCz7Ej5WjB/m2qaYtNbY0cxYrdTWI/mJKsZ4qrY9QrKKRlRj7zBK7uz0lFbHCFRV/CrGem5IkhRi6Fn4bNOoeirqrIZbd6fjt5nPjkc9lmAHzSYO61XtUrwqLdRWxwqMH+c5/PNRq8gmZsVj2O3d1oRfr7X+fKhdYhU9hU9c23s2SzPtYnvJKtaLKs1Eetk2sJKzkPpQ2+kz4v4S6jMGC8lqylrOn4pLj+PO3G9Uill8XilU5epBvc03tml7TM2OxXBvEtxfsdbv6/alSOnWIZX71FCtoSrUUFCfblHn8WN2ukgnT9KuJVd3Jtw5P1Qzov5S/2YDJ/p1yrbRmRsp158XKkz6z+UPtmmEaZixWGtZ+9gvLlC/1L4hV1A1hUKAuVtDY7yNWWjbwa3t1lFj1ndKwxHoKF//BrNGRr6/+5T/PVoXBuo4SK8z3pz98UTv+ZMxXLFuSlxdbvg1vq8cBbawyqlRrYwWN/R5i6QLUXYAG0Sm/S0sbq75TEGJrbGc2tLpl9RLLLAjWhWJVjt7I9+HdbS4L5ytW0azYlX+JWpay/DqdqmKFV4WvyqvCvPb8EJyM8pwUK/qIpbd3Z0jn6DsXqrW0XRVWdyqOd2ZBovwthbzi/LQrxUrNgq0Ty6/ruCos8m02P+23lFhViutk8yKIvNtv2zUcDufjWA9f+AiOa6npl9pKW6MEcSy9oo9YYYsvK0NgjiCSVC/lajt9/mNtpRXPVfI2c2Ebq0jiMVznPsS5OFaZb3/BQxsrpIxxm/vM/tzboFBpUSFWZ+TdvfzfXLe3xa9yRR+xihafXm46MLwNC4Kf8yWf/d5ltxCre6cgZ2WB++mdjqImtoozfxnv8r1sw6pc5z5EEXkvjl7J9wf95/Ulkff+6Jh8bVFymxIfWlimWHnNUWuRVno3wO1ZqFi5R9WWQ8M0uC0LFct1HC1JKLDmxVLFgpmDWCACYoEIiAUirESsRIWjLgZHtEyY1UUb3eityiAuMYIhYV2jy4J1Jup5o6DnEFYkVnlLZIxYbvRWZRCXHOWQsK7RZeEgsrR8OWtWJJbtzrS5WqzKy8Mk927L/j9do8vCdaaHQ3j/e66sSSz9Zad6xMIYsUaNERtK2SWja3RZ2E3H3Cjcf/33s68L1yPW321MRfbwWytWObirHDR1blDXMd/uV98XVWGPMWKVRWVyZpCjvRMcHFtTdFBo1GD1IWGto8v8umkK0hisR6xf6+kbDttX/6TcwAnfkyRooTQHdRVdUc6LdWaMWHVRmZxrLr0Nx3VZ2sWqDwlrG11WrMt//OJPRTt+zqxHrCd9VydTj5mXxI2tCgdNNQd1mX50uqXuG++Xxog1Frnk8oR+rTvkmXZ/sYWhXazakLC20WXlOp/U/G+Mrkis1HTbespUbdSXoej69lzvF+p6A54V68wYsdqiYEiMTij96t9OjWO3Uh8S1ja6rFynxXo6/UTjfSr0Kd5vHv6YV4dGrHAITDBoqiFWeA14RqwzY8Sai/xAB+9R9dhnsf35/Q7+ArBtdFmwztaVM55kpmBFYuXnVjfgG2IFg6aaQw2GiGVOf3PRRbGaVWFVLNfRunV0WbBuv3GNO8SaBi2Wm/TIfPdZZTRpMWjqCrHqY8Sai86IVe3Cc1ksvbx9dFmwzh0GsabCVEqpv5CrjPoKB02dG3tzoY1VHyPWXBS2sbIvv2uGwFob7+GQsI7RZcE6uy1V4WSYU6zroOdCEj+2Khw01RwtmPq1bVeF9TFizUV20yKh58ZAr1aCLVtGl2V+CJsXyXyaD/UycYasSSw9C8aLa4aUY6vCQVNNsYphsWfFOjdGrLGodNDVb5VxXZ2UQ8JaRpcZsWpzDbg9Zs6axDr6mfN85N2OrQoGTZ0ZOK8j719+39LGOjtGrL7IbWoj7ybeHo7r6qYYEtYyUMzfGgxq0p829UjELFmJWDA3EAtEQCwQAbFABMQCERALREAsEAGxQIRhYvnw8uzvVMGtGSRWWs74O/t7VXBbhoh13JU9ehfSpR9uxRCxDtti3EhGZQidUGKBCMPaWL6j2n5DGws6GXZV6Ps2UV7BBYhjgQiIBSIQIAURCJCCCJHDDdSsYIkcIEUssFBigQiRA6SIBZbIAVLEAktkExALLHFMUAVRkoPlEzlAilhgiRwgRSywEG4AEQiQggiUWCACAVIQgQApiECAFERALBDhGhM6BhUiFlgQC0QYFscq7wkSx4JOBpmw3xifKLHgIgNNSMzjQxALLjHUBF1oIRZcZLgJiXqDWHCJK0w4bBELLkGAFERALBABsUAExAIREAtEQCwQAbFABMQCERALREAsEAGxQATEAhEQC0RALBABsUAExAIREAtEQCwQAbFABMQCERALREAsEAGxQATEAhEQC0RALBABsUAExAIREAtEQCwQAbFABMQCERALREAsEAGxQATEAhEQC0RALBBhmAnHXeeTdBALPMMe3avc08YzxaN7oRMeNg4iDHus3LN/2fY4HcQCCyUWiDCsjfXwYl/sN7SxoJNhJvhnrLaUV4gFHuJYIEJpwnGnXv/t65dYycF9U5iQt8z3v/qYtVZybiMCpNCLwoTDNz/mYuU/OzYmQAp9qZVYbWEEv4l/SbgBuqm0sTou9zQESKE3BEhBBAKkIEJpQtZ9vWcgQAo9Ka8KywZUjOTgzgnDDSNSKYiRJ1gBpQlJS7MphAAp9CSoCi+3sQiQQl8IN4AI9CAFEZwJh2/+/XJVSIkFvSFACiLQgxRE8FWhM+ZC5L1vcnD30DUZRBhmQpqXaebKMOWqEDqp9cd67NxY67TfPJ4QCy4R9iDNf6ZdZh13urQ6bPOmO2JBN7Wb0J23ol2AVJuFWNBNaYIprHqUWPr3I2JBN/Wb0J0BB6/TftO2FWKBZZgJvlfDcYdY0AlxLBABsUCEoPGeX+spNbLjO2KBpWy8f/2S/9v/knuFEIMwjpWXWYgFcQiqQvXwklEVQhxovIMIiAUiKNtdIVPqYeRkfi45AI0y3dd122p0+8okNz4JWAUq0f3XE32HJunujNUvufFJwCpQuhvWcdfVeW9QcuNzBKtAbZ90zwbTyQ+xIBpGrP1GN6+S7hmT+yU3PkewCpRuWZmBqIctbSyIhsoeXo67vKxq7WI1LLnxScAqUDqElXuVXRig0zs5AA2RdxABsUAEVY5ujpMcgEbpK8LWWYmGJxcpHVg6yg6AjhDCssnFSQYWjwmQts78ODy5OMnA4nFiRekzc0Is8CAWiIBYIAJigQjKzwUyfv5Rk1yELMEaCE34M2JBLEzk3RRVhy0lFkRDd5sxXfxyvyKE3xELLEp3dz9sn1OGf0FMzFXhcfcmTncsxAKHMhPWJjGqQZNcnGRg8TixuAkNcXFixakIEQs8iAUiIBaIwC0dEIHBFCACYoEIyk01E2k8BWKBRZmnxJ3c0+LGJzc+CVgFqoiN2rmMxiY3PglYBXb4lyHGGDDEAouNYxlijAFDLLCosgJkRj+IhyqD7szoB/FQdprIk58vcmxy45OAVaD8U1PTKF2yEAssSvcf1TcK6UEKMeGWDoggLdb79+8v73Vmo+aiXhvBXBgmlq01OzrY1JJ7b+lO9MxGzUW9NrpeUYjNILFSP6dk1tbSv61Y125EcRifIWIdL9/+KToNmnf5uam8Dzaov/enMXhvFlXfh+nV3w88XvP475vHf9+6/92+P/VkiFiH1ts/qoFZXJ5nVd+w/r52XlXtvKqaV16sSnr1993Haxz/ffP416e/2vennsQusSrvfDHTWaec2ai5aOKNOhY1Mt/12e4YZ8Lhmz73CVM/DL+1W+BN21iTi3Xu46GaZZBYeWVoC8bWu4qLbLxfK2TfK4O7ZJhYfZMr6fUtn9mouajHRvHsu7I4RKwCabEm5jpFo4l1rli709pxZWJdy1XF4bX15V2AWH25sli7Xqxl24hY/elRhfYp1nofbNEFHWKN4pr68sxuvVI6v99ccSYc/zHOBFn3JlaTFkGGRsQW31qjP5Y0vQRBrGmTWwN9nGku6rXRnEEsec6XToNDrYgFnSDW7ZNbJ33aWKd+NwjmC2JNT0+x+uw3XxDrFpzRo5cx1+53A3yA1E9FOnL+BsSalvkWYt6EoHdojORgGuYv1unwNQ9pWhwzvlCkjbVkFiTW/427Z4hYk7IAsfYb3W4/7mi8L4rZelX0bsjb7ulj1j5KYlhyMBG9Aqs3IeiPddiq0VOvIdbUnNFqFmVYKFaE60LEujVzFCtCL1LEujGzac4j1rqYnVjc0lkHcxNrpsnBYGbiVc2ElBJr6ZwV6wamBSZkSj2MvS5ErNszjw6CQeT94SUhjrVGbimWvSJErDVym/a8N0FfFj4j1hq5rViahDbWGrm9WCd6N6ySmzbe55kcxOBGYu03j3FCDTY5mCG3iGOZCZAz9Wz+j09ufBKwCuxT7BPdtEoiPFkOscBinmJ/3GmneCY0xMM8bPxgnjiOWBAPI5Z9HDQPG4d4mKfYm0eZHLa0sSAaKnt4Oe7ysmp0bNQmNz4JWAX6KfZ60FcW52njiAUWIu8gAmKBCOqUKhUj5u6TA9AofUXY+lzL4clFSgeWjom8tz6Jd3hycZIBacRvS5sAaf3Z4a0cdxdGHyLWIpigI40Tq1+fmdQ3xjLV75nQME9mJtbgp9jDPJmis/IQsQ7b4uqxre5ErCUwN7EosVbCNGKpgost+NT71xqfQKxFMEUbK3j954uXhn5SmtboBGItgknESl1RddjS0e9+kI9j6eaV7uKX+xUh/I5YYFG6u3t+uZf2Gv5FgBR6Yq4Kj7s3vbpjESCFvigTm0p6VYOEG6A3TqxeN6EJkEJvnFi9+iVTYkFvhohFgBR6M0gsAqTQl0G3dHokFyFLsAYYTAEiDDOBACn0RLmpZnqNpyBACn1Rh61tifvfHbSHG8p2mkAWYYmoIjZq5zLqggAp9EZdDnoWECCF3qjLpVAJAVLoiyorwB4z+hEghZ6oMujOjH4QD2WniTz5+SLHJjc+CVgFysek0j5dsoqZadqqTcQCi/Lh9F49SHOdzIMsEAsuMMSE406XViaSiljQzRATXIBUm4VY0M3wEss8yAKxoJtBJnid9pu2/g2IBZZhJvheDa2TwiMWWOjoByIgFohwhQldIXrEAgtigSPuBDSIBYbYU2YhFhgQCySIPi0pV4WgQSwQAbFAhhm0sSZMDiYDsUCIm8exJkwOFgtigQiIBSIgFoiAWCACYoEIiAUiIBaIgFggAmKBCIgFIiAWiIBYIAJigQiIBSIgFoiAWCACYoEIiAUiIBaIgFggAmKBCIgFIiAWiIBYIAJigQiIBSIMM8E+z0m1PT4AscAz7MkUys3ll7U9gw6xwDLsWTo8bBx6csXTvzRtDyZHLLBQYoEIw9pYDy/2xX5DGws6GWbCYWuvClufd49YYCGOBSIgFohAgBREIEAKrYyZR5lwA7QwbuZ3AqTQwnRiUWLdEyOfrkOAFM4zpVgESO+IScWaOjm4IdO1saZPDm7IlGIRIL0rpopjESCF3sQJN6iCaBmDZUOAFEQgQAoiECAFEQiQggjEsUCE2GLBypEUq+2SUBjR0pDEI6eNWCQukvawOFZZIt7ArcWenuUmPlWJtd8Ynyix7iXx6arCRN8kRKx7SXzCNpYutBDrXhKftPGeqDeIdSeJT3tVeNgi1p0kPnG44UYs9vQsN/Fpxdpvni9vBHcOYoEIiAUiIBaIgFggwoKuCmFJIBaIgFggAmKBCIgFIiAWiIBYIAJigQgLEct2t38USXv/S9MLKBM5gE1cJPupT1Ig5z7t6zO+ELEyP7g/Pq57Waae85exzfKJC2Q/VU95ph9Fcl6mfXXGFyJWKta3MLMjjo47fWZiC+ASl8i+VSlPWCDnRdojMr4QsRKZWtBMb2K+PDvNSetkJ+MSl8i+vWObPrwI5LxIe0TGlyHWcfcmr+qjnvQSJ5b+Lg/b2MdIbXEolf3k1Y9SOddpj8j4MsQyZbMt8+Njzn2mnv1x4iculn3bFhLKeZ72iIwvQyyLUAteXixL/OwXbXeBnGflteBVGV+UWEqkI5h8VWiJnv1U2daVRM7ToAK8KuOIdao03mMfQVCsxJ57kZwnYcNqxWK5yxSZmEMqF26oFIeRs+/nRpfIuU97RMaXIZb58oK5daOSCgZIA2sjZ7+ML8TPeZH2iIwvQyxdNiuZirD4g5S5peMSj5/91E4npQuq6DkP0r4640sRCxYGYoEIiAUiIBaIgFggAmKBCIgFIiAWiIBYIAJigQiIBSIgFoiAWCACYoEIiAUiIBaIgFggAmKBCIgFIiAWiIBYIAJigQiIBSIgFoiAWCACYoEIiAUiIJaZnkC5WWiHkoazZ5xN/PXHqzO2aBBLz7V57a7FdGdS01guF8RCLBEQKxQrdXMEJ7/Y6Ul8/Fv9wk5spqtNXbllpu7cb3wNetzle5g1tTTyqjCzVe1zseq4e0rcxusFsQKxktweM+mYnSkx9W/1CzPRlW4x6cJJz3R33L3+GJRYfvazWhqujaU3LlaVG68YxHKN99wbO5GdmTe/nJY0F8o4oB0qZk7MnIuBWFqg3KJaGl6sQje9qtj4Bh92MhCrLLHsPJ7aHnPSi7fhxLF5aWPrQLOo1sbS9V41DffTTA9brCo2nuwj3gDEahXLTZioArESbZWuFLVfpj7rJdZ+83hCrLujJpYuXYIS6xRMdZ0pVznqN7ql1CZWkYZrlQWPAMtXIdZ9UIgVtI9sOaPf5joUD/4wajhNjG9NsWppmJ+JNTRoYyHWPVC/Knz0J12/NVJpTzK/Ls1rQ2NYqpWri9VIQ4cbnqrJI9Z9cC6OZU968QxTH8fSIanXH1yEy8hVxLEKV6ppJK//Z1fcMiriWIgFcB2IBSIgFoiAWCACYoEIiAUiIBaIgFggAmKBCIgFIiAWiIBYIAJigQiIBSIgFoiAWCACYoEIiAUiIBaIgFggAmKBCIgFIiAWiIBYIML/A5JiCAYrtxV0AAAAAElFTkSuQmCC\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a></span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> crps_mod2<span class=\"sc\">$</span>series_3<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a>  crps_mod1<span class=\"sc\">$</span>series_3<span class=\"sc\">$</span>score</span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb29-5\"><a href=\"#cb29-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb29-6\"><a href=\"#cb29-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb29-7\"><a href=\"#cb29-7\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb29-8\"><a href=\"#cb29-8\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb29-9\"><a href=\"#cb29-9\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb29-10\"><a href=\"#cb29-10\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb29-11\"><a href=\"#cb29-11\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb29-12\"><a href=\"#cb29-12\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(CRPS[AR1] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> CRPS[spline])</span>\n<span id=\"cb29-13\"><a href=\"#cb29-13\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb29-14\"><a href=\"#cb29-14\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb29-15\"><a href=\"#cb29-15\" tabindex=\"-1\"></a>ar1_better <span class=\"ot\">&lt;-</span> <span class=\"fu\">length</span>(<span class=\"fu\">which</span>(diff_scores <span class=\"sc\">&lt;</span> <span class=\"dv\">0</span>))</span>\n<span id=\"cb29-16\"><a href=\"#cb29-16\" tabindex=\"-1\"></a><span class=\"fu\">title</span>(<span class=\"at\">main =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb29-17\"><a href=\"#cb29-17\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;AR(1) better in &quot;</span>,</span>\n<span id=\"cb29-18\"><a href=\"#cb29-18\" tabindex=\"-1\"></a>  ar1_better,</span>\n<span id=\"cb29-19\"><a href=\"#cb29-19\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; of &quot;</span>,</span>\n<span id=\"cb29-20\"><a href=\"#cb29-20\" tabindex=\"-1\"></a>  <span class=\"fu\">length</span>(diff_scores),</span>\n<span id=\"cb29-21\"><a href=\"#cb29-21\" tabindex=\"-1\"></a>  <span class=\"st\">&quot; evaluations&quot;</span>,</span>\n<span id=\"cb29-22\"><a href=\"#cb29-22\" tabindex=\"-1\"></a>  <span class=\"st\">&quot;</span><span class=\"sc\">\\n</span><span class=\"st\">Mean difference = &quot;</span>,</span>\n<span id=\"cb29-23\"><a href=\"#cb29-23\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">mean</span>(diff_scores, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb29-24\"><a href=\"#cb29-24\" tabindex=\"-1\"></a>))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The correlated AR(1) model consistently gives better forecasts, and\nthe difference between scores tends to grow as the forecast horizon\nincreases. This is not unexpected given the way that splines linearly\nextrapolate outside the range of training data</p>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nBayesian forecasting and proper scoring rules:</p>\n<p>Clark N.J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond\nsingle-species models: leveraging multispecies forecasts to navigate the\ndynamics of ecological predictability</a>. <em>PeerJ</em> 13:e18929\n(2025) <a href=\"https://doi.org/10.7717/peerj.18929\" class=\"uri\">https://doi.org/10.7717/peerj.18929</a></p>\n<p>Hyndman, Rob J., and George Athanasopoulos. <a href=\"https://otexts.com/fpp3/distaccuracy.html\">Forecasting: principles\nand practice</a>. <em>OTexts</em>, (2018).</p>\n<p>Gneiting, Tilmann, and Adrian E. Raftery. <a href=\"https://www.tandfonline.com/doi/abs/10.1198/016214506000001437\">Strictly\nproper scoring rules, prediction, and estimation</a> <em>Journal of the\nAmerican statistical Association</em> 102.477 (2007) 359-378.</p>\n<p>Simonis, Juniper L., et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecy.3431\">Evaluating\nprobabilistic ecological forecasts</a> <em>Ecology</em> 102.8 (2021)\ne03431.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "inst/doc/mvgam_overview.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## ----Access time series data-----------------------------------------------------\ndata(\"portal_data\")\n\n\n## ----Inspect data format and structure-------------------------------------------\nhead(portal_data)\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(portal_data)\n\n\n## --------------------------------------------------------------------------------\ndata <- sim_mvgam(n_series = 4, T = 24)\nhead(data$data_train, 12)\n\n\n## ----Wrangle data for modelling--------------------------------------------------\nportal_data %>%\n  # Filter the data to only contain captures of the 'PP'\n  dplyr::filter(series == 'PP') %>%\n  droplevels() %>%\n  dplyr::mutate(count = captures) %>%\n  # Add a 'year' variable\n  dplyr::mutate(year = sort(rep(1:8, 12))[time]) %>%\n  # Select the variables of interest to keep in the model_data\n  dplyr::select(series, year, time, count, mintemp, ndvi_ma12) -> model_data\n\n\n## --------------------------------------------------------------------------------\nhead(model_data)\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(model_data)\n\n\n## ----Summarise variables---------------------------------------------------------\nsummary(model_data)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(data = model_data, series = 1, y = \"count\")\n\n\n## --------------------------------------------------------------------------------\nmodel_data %>%\n  # Create a 'year_fac' factor version of 'year'\n  dplyr::mutate(year_fac = factor(year)) -> model_data\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(model_data)\nlevels(model_data$year_fac)\n\n\n## ----model1, include=FALSE, results='hide'---------------------------------------\nmodel1 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model1 <- mvgam(\n#   count ~ s(year_fac, bs = \"re\") - 1,\n#   family = poisson(),\n#   data = model_data\n# )\n\n## --------------------------------------------------------------------------------\nget_mvgam_priors(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n\n\n## --------------------------------------------------------------------------------\nsummary(model1)\n\n\n## ----Extract coefficient posteriors----------------------------------------------\nbeta_post <- as.data.frame(model1, variable = \"betas\")\ndplyr::glimpse(beta_post)\n\n\n## --------------------------------------------------------------------------------\nstancode(model1)\n\n\n## ----Plot random effect estimates------------------------------------------------\nplot(model1, type = \"re\")\n\n\n## --------------------------------------------------------------------------------\nmcmc_plot(\n  object = model1,\n  variable = \"betas\",\n  type = \"areas\"\n)\n\n\n## --------------------------------------------------------------------------------\npp_check(object = model1)\n\n\n## ----Plot posterior hindcasts----------------------------------------------------\nplot(model1, type = \"forecast\")\n\n\n## ----Extract posterior hindcast--------------------------------------------------\nhc <- hindcast(model1)\nstr(hc)\n\n\n## ----Extract hindcasts on the linear predictor scale-----------------------------\nhc <- hindcast(model1, type = \"link\")\nrange(hc$hindcasts$PP)\n\n\n## ----Plot posterior residuals----------------------------------------------------\nplot(model1, type = \"residuals\")\n\n\n## --------------------------------------------------------------------------------\nmodel_data %>%\n  dplyr::filter(time <= 70) -> data_train\nmodel_data %>%\n  dplyr::filter(time > 70) -> data_test\n\n\n## ----include=FALSE, message=FALSE, warning=FALSE---------------------------------\nmodel1b <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model1b <- mvgam(\n#   count ~ s(year_fac, bs = \"re\") - 1,\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test\n# )\n\n## ----Plotting predictions against test data--------------------------------------\nplot(model1b, type = \"forecast\", newdata = data_test)\n\n\n## ----Extract posterior forecasts-------------------------------------------------\nfc <- forecast(model1b)\nstr(fc)\n\n\n## ----model2, include=FALSE, message=FALSE, warning=FALSE-------------------------\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 -\n    1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model2 <- mvgam(\n#   count ~ s(year_fac, bs = \"re\") +\n#     ndvi_ma12 - 1,\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test\n# )\n\n## ----class.output=\"scroll-300\"---------------------------------------------------\nsummary(model2)\n\n\n## ----Posterior quantiles of model coefficients-----------------------------------\ncoef(model2)\n\n\n## --------------------------------------------------------------------------------\nbeta_post <- as.data.frame(model2, variable = \"betas\")\ndplyr::glimpse(beta_post)\n\n\n## ----Histogram of NDVI effects---------------------------------------------------\nhist(\n  beta_post$ndvi_ma12,\n  xlim = c(\n    -1 * max(abs(beta_post$ndvi_ma12)),\n    max(abs(beta_post$ndvi))\n  ),\n  col = \"darkred\",\n  border = \"white\",\n  xlab = expression(beta[NDVI]),\n  ylab = \"\",\n  yaxt = \"n\",\n  main = \"\",\n  lwd = 2\n)\nabline(v = 0, lwd = 2.5)\n\n\n## ----warning=FALSE---------------------------------------------------------------\nconditional_effects(model2)\n\n\n## ----model3, include=FALSE, message=FALSE, warning=FALSE-------------------------\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model3 <- mvgam(\n#   count ~ s(time, bs = \"bs\", k = 15) +\n#     ndvi_ma12,\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test\n# )\n\n## --------------------------------------------------------------------------------\nsummary(model3)\n\n\n## ----warning=FALSE---------------------------------------------------------------\nconditional_effects(model3, type = \"link\")\n\n\n## ----class.output=\"scroll-300\"---------------------------------------------------\nstancode(model3)\n\n\n## --------------------------------------------------------------------------------\nplot(model3, type = \"forecast\", newdata = data_test)\n\n\n## ----Plot extrapolated temporal functions using newdata--------------------------\nplot_mvgam_smooth(\n  model3,\n  smooth = \"s(time)\",\n  # pass newdata to the plot function to generate\n  # predictions of the temporal smooth to the end of the\n  # testing period\n  newdata = data.frame(\n    time = 1:max(data_test$time),\n    ndvi_ma12 = 0\n  )\n)\nabline(v = max(data_train$time), lty = \"dashed\", lwd = 2)\n\n\n## ----model4, include=FALSE-------------------------------------------------------\nmodel4 <- mvgam(\n  count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR(),\n  parallel = FALSE\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# model4 <- mvgam(\n#   count ~ s(ndvi_ma12, k = 6),\n#   family = poisson(),\n#   data = data_train,\n#   newdata = data_test,\n#   trend_model = AR()\n# )\n\n## ----Summarise the mvgam autocorrelated error model, class.output=\"scroll-300\"----\nsummary(model4)\n\n\n## --------------------------------------------------------------------------------\nplot(model4, type = \"forecast\", newdata = data_test)\n\n\n## --------------------------------------------------------------------------------\nplot(model4, type = \"trend\", newdata = data_test)\n\n\n## --------------------------------------------------------------------------------\nloo_compare(model3, model4)\n\n\n## --------------------------------------------------------------------------------\nfc_mod3 <- forecast(model3)\nfc_mod4 <- forecast(model4)\nscore_mod3 <- score(fc_mod3, score = \"drps\")\nscore_mod4 <- score(fc_mod4, score = \"drps\")\nsum(score_mod4$PP$score, na.rm = TRUE) -\n  sum(score_mod3$PP$score, na.rm = TRUE)\n"
  },
  {
    "path": "inst/doc/mvgam_overview.Rmd",
    "content": "---\ntitle: \"Overview of the mvgam package\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Overview of the mvgam package}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to give a general overview of the `mvgam` package and its primary functions.\n\n## Dynamic GAMs\n`mvgam` is designed to propagate unobserved temporal processes to capture latent dynamics in the observed time series. This works in a state-space format, with the temporal *trend* evolving independently of the observation process. An introduction to the package and some worked examples are also shown in this seminar: [Ecological Forecasting with Dynamic Generalized Additive Models](https://www.youtube.com/watch?v=0zZopLlomsQ){target=\"_blank\"}. Briefly, assume $\\tilde{\\boldsymbol{y}}_{i,t}$ is the conditional expectation of response variable $\\boldsymbol{i}$ at time $\\boldsymbol{t}$. Assuming $\\boldsymbol{y_i}$ is drawn from an exponential distribution with an invertible link function, the linear predictor for a multivariate Dynamic GAM can be written as:\n\n$$for~i~in~1:N_{series}~...$$\n$$for~t~in~1:N_{timepoints}~...$$\n\n$$g^{-1}(\\tilde{\\boldsymbol{y}}_{i,t})=\\alpha_{i}+\\sum\\limits_{j=1}^J\\boldsymbol{s}_{i,j,t}\\boldsymbol{x}_{j,t}+\\boldsymbol{Z}\\boldsymbol{z}_{k,t}\\,,$$\nHere $\\alpha$ are the unknown intercepts, the $\\boldsymbol{s}$'s are unknown smooth functions of covariates ($\\boldsymbol{x}$'s), which can potentially vary among the response series, and $\\boldsymbol{z}$ are dynamic latent processes. Each smooth function $\\boldsymbol{s_j}$ is composed of basis expansions whose coefficients, which must be estimated, control the functional relationship between $\\boldsymbol{x}_{j}$ and $g^{-1}(\\tilde{\\boldsymbol{y}})$. The size of the basis expansion limits the smooth’s potential complexity. A larger set of basis functions allows greater flexibility. For more information on GAMs and how they can smooth through data, see [this blogpost on how to interpret nonlinear effects from Generalized Additive Models](https://ecogambler.netlify.app/blog/interpreting-gams/){target=\"_blank\"}. Latent processes are captured with $\\boldsymbol{Z}\\boldsymbol{z}_{i,t}$, where $\\boldsymbol{Z}$ is an $i~by~k$ matrix of loading coefficients (which can be fixed or a combination of fixed and freely estimated parameters) and $\\boldsymbol{z}_{k,t}$ are a set of $K$ latent factors that can also include their own GAM linear predictors (see the [State-Space models vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html)), the [N-mixtures vignette](https://nicholasjclark.github.io/mvgam/articles/nmixtures.html) and the example in [`jsdgam`](https://nicholasjclark.github.io/mvgam/reference/jsdgam.html) to get an idea of how flexible these processes can be.\n  \nSeveral advantages of GAMs are that they can model a diversity of response families, including discrete distributions (i.e. Poisson, Negative Binomial, Gamma) that accommodate common ecological features such as zero-inflation or overdispersion, and that they can be formulated to include hierarchical smoothing for multivariate responses. `mvgam` supports a number of different observation families, which are summarized below:\n\n## Supported observation families\n\n|Distribution      | Function        | Support                                           | Extra parameter(s)   |\n|:----------------:|:---------------:| :------------------------------------------------:|:--------------------:|\n|Gaussian (identity link)         | `gaussian()`    | Real values in $(-\\infty, \\infty)$                | $\\sigma$             |\n|Student's T (identity link)      | `student-t()`   | Heavy-tailed real values in $(-\\infty, \\infty)$   | $\\sigma$, $\\nu$      |\n|LogNormal (identity link)        | `lognormal()`   | Positive real values in $[0, \\infty)$             | $\\sigma$             |\n|Gamma (log link)             | `Gamma()`       | Positive real values in $[0, \\infty)$             | $\\alpha$             |\n|Beta (logit link)              | `betar()`       | Real values (proportional) in $[0,1]$             | $\\phi$               |\n|Bernoulli (logit link)         | `bernoulli()`   | Binary data in ${0,1}$                          | -                    |\n|Poisson (log link)           | `poisson()`     | Non-negative integers in $(0,1,2,...)$            | -                    |\n|Negative Binomial2 (log link)| `nb()`          | Non-negative integers in $(0,1,2,...)$            | $\\phi$               |\n|Binomial (logit link)           | `binomial()` | Non-negative integers in $(0,1,2,...)$            | -                    |\n|Beta-Binomial (logit link)      | `beta_binomial()` | Non-negative integers in $(0,1,2,...)$       | $\\phi$                   |\n|Poisson Binomial N-mixture (log link)| `nmix()`  | Non-negative integers in $(0,1,2,...)$            | -               |\n\nFor all supported observation families, any extra parameters that need to be estimated (i.e. the $\\sigma$ in a Gaussian model or the $\\phi$ in a Negative Binomial model) are by default estimated independently for each series. However, users can opt to force all series to share extra observation parameters using `share_obs_params = TRUE` in `mvgam()`. Note that default link functions cannot currently be changed.\n\n## Supported temporal dynamic processes\nAs stated above, the latent processes can take a wide variety of forms, some of which can be multivariate to allow the different observational variables to interact or be correlated. When using the `mvgam()` function, the user chooses between different process models with the `trend_model` argument. Available process models are described in detail below.\n\n### Correlated multivariate processes\nIf more than one observational unit (usually referred to as 'series') is included in `data` $(N_{series} > 1)$, use `trend_model = ZMVN()` to set up a model where the outcomes for different observational units may be correlated according to:\n\n\\begin{align*}\nz_{t} & \\sim \\text{MVNormal}(0, \\Sigma) \\end{align*}\n\nThe covariance matrix $\\Sigma$ will capture potentially correlated process errors. It is parameterised using a Cholesky factorization, which requires priors on the series-level variances $\\sigma$ and on the strength of correlations using `Stan`'s `lkj_corr_cholesky` distribution. Note that this `trend_model` does not assume that measurements occur over *time*, as users can specify what variable in the `data` represents the unit of analysis (i.e. outcomes could be counts of different *species* across different *sites* or *regions*, for example; see [`?ZMVN()](https://nicholasjclark.github.io/mvgam/reference/ZMVN.html) for guidelines).\n\n### Independent Random Walks\nUse `trend_model = 'RW'` or `trend_model = RW()` to set up a model where each series in `data` has independent latent temporal dynamics of the form:\n\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(z_{i,t-1}, \\sigma_i) \\end{align*}\n\nProcess error parameters $\\sigma$ are modeled independently for each series. If a moving average process is required, use `trend_model = RW(ma = TRUE)` to set up the following:\n\n\\begin{align*}\nz_{i,t} & = z_{i,t-1} + \\theta_i * error_{i,t-1} + error_{i,t} \\\\\nerror_{i,t} & \\sim \\text{Normal}(0, \\sigma_i) \\end{align*}\n\nMoving average coefficients $\\theta$ are independently estimated for each series and will be forced to be stationary by default $(abs(\\theta)<1)$. Only moving averages of order $q=1$ are currently allowed. \n\n### Multivariate Random Walks\nIf more than one series is included in `data` $(N_{series} > 1)$, a multivariate Random Walk can be set up using `trend_model = RW(cor = TRUE)`, resulting in the following:\n\n\\begin{align*}\nz_{t} & \\sim \\text{MVNormal}(z_{t-1}, \\Sigma) \\end{align*}\n\nWhere the latent process estimate $z_t$ now takes the form of a vector. The covariance matrix $\\Sigma$ will capture contemporaneously correlated process errors. It is parameterised using a Cholesky factorization, which requires priors on the series-level variances $\\sigma$ and on the strength of correlations using `Stan`'s `lkj_corr_cholesky` distribution.\n\nMoving average terms can also be included for multivariate random walks, in which case the moving average coefficients $\\theta$ will be parameterised as an $N_{series} * N_{series}$ matrix\n\n### Autoregressive processes\nAutoregressive models up to $p=3$, in which the autoregressive coefficients are estimated independently for each series, can be used by specifying `trend_model = 'AR1'`, `trend_model = 'AR2'`, `trend_model = 'AR3'`, or `trend_model = AR(p = 1, 2, or 3)`. For example, a univariate AR(1) model takes the form:\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(ar1_i * z_{i,t-1}, \\sigma_i) \\end{align*}\n\n\nAll options are the same as for Random Walks, but additional options will be available for placing priors on the autoregressive coefficients. By default, these coefficients will not be forced into stationarity, but users can impose this restriction by changing the upper and lower bounds on their priors. See `?get_mvgam_priors` for more details.\n\n### Vector Autoregressive processes\nA Vector Autoregression of order $p=1$ can be specified if $N_{series} > 1$ using `trend_model = 'VAR1'` or `trend_model = VAR()`. A VAR(1) model takes the form:\n\n\\begin{align*}\nz_{t} & \\sim \\text{Normal}(A * z_{t-1}, \\Sigma) \\end{align*}\n\nWhere $A$ is an $N_{series} * N_{series}$ matrix of autoregressive coefficients in which the diagonals capture lagged self-dependence (i.e. the effect of a process at time $t$ on its own estimate at time $t+1$), while off-diagonals capture lagged cross-dependence (i.e. the effect of a process at time $t$ on the process for another series at time $t+1$). By default, the covariance matrix $\\Sigma$ will assume no process error covariance by fixing the off-diagonals to $0$. To allow for correlated errors, use `trend_model = 'VAR1cor'` or `trend_model = VAR(cor = TRUE)`. A moving average of order $q=1$ can also be included using `trend_model = VAR(ma = TRUE, cor = TRUE)`.\n\nNote that for all VAR models, stationarity of the process is enforced with a structured prior distribution that is described in detail in [Heaps 2022](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648)\n  \nHeaps, Sarah E. \"[Enforcing stationarity through the prior in vector autoregressions.](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648)\" *Journal of Computational and Graphical Statistics* 32.1 (2023): 74-83.\n\n### Hierarchical processes\nSeveral of the above-mentioned `trend_model` options can be modified to account for grouping structures in `data` by setting up hierarchical latent processes. If an optional grouping variable (`gr`; which must be a `factor` in the supplied `data`) exists, users can model hierarchical residual correlation structures. where the residual correlations for a specific level of `gr` are modelled hierarchically:\n\n\\begin{align*}\n\\Omega_{group} & = \\alpha_{cor}\\Omega_{global} + (1 - \\alpha_{cor})\\Omega_{group, local} \\end{align*}\n\n\nwhere $\\Omega_{global}$ is a *global* correlation matrix, $\\Omega_{group, local}$ is a *local deviation* correlation matrix and $\\alpha_{cor}$ is a weighting parameter controlling how strongly the local correlation matrix $\\Omega_{group}$ (i.e. the derived correlation matrix that will be used for each level of the grouping factor `gr`) is shrunk towards the global correlation matrix $\\Omega_{global}$  (larger values of $\\alpha_{cor}$ indicate a greater degree of shrinkage, i.e. a greater degree of partial pooling). This option is valuable for many types of designs where the same observational units (i.e. *financial assets* or *species*, for example) are measured in different strata (i.e. *regions*, *countries* or *experimental units*, for example). Currently hierarchical correlations can be included for `AR()`, `VAR()` or `ZMVN()` `trend_model` options.\n\n### Gaussian Processes\nThe final option for modelling temporal dynamics is to use a Gaussian Process with squared exponential kernel. These are set up independently for each series (there is currently no multivariate GP option), using `trend_model = 'GP'`. The dynamics for each latent process are modelled as:\n\n\\begin{align*}\nz & \\sim \\text{MVNormal}(0, \\Sigma_{error}) \\\\\n\\Sigma_{error}[t_i, t_j] & = \\alpha^2 * exp(-0.5 * ((|t_i - t_j| / \\rho))^2) \\end{align*}\n\nThe latent dynamic process evolves from a complex, high-dimensional Multivariate Normal distribution which depends on $\\rho$ (often called the length scale parameter) to control how quickly the correlations between the model's errors decay as a function of time. For these models, covariance decays exponentially fast with the squared distance (in time) between the observations. The functions also depend on a parameter $\\alpha$, which controls the marginal variability of the temporal function at all points; in other words it controls how much the GP term contributes to the linear predictor. `mvgam` capitalizes on some advances that allow GPs to be approximated using Hilbert space basis functions, which [considerably speed up computation at little cost to accuracy or prediction performance](https://link.springer.com/article/10.1007/s11222-022-10167-2){target=\"_blank\"}.\n\n### Piecewise logistic and linear trends\nModeling growth for many types of time series is often similar to modeling population growth in natural ecosystems, where there series exhibits nonlinear growth that saturates at some particular carrying capacity. The logistic trend model available in {`mvgam`} allows for a time-varying capacity $C(t)$ as well as a non-constant growth rate. Changes in the base growth rate $k$ are incorporated by explicitly defining changepoints throughout the training period where the growth rate is allowed to vary. The changepoint vector $a$ is represented as a vector of `1`s and `0`s, and the rate of growth at time $t$ is represented as $k+a(t)^T\\delta$. Potential changepoints are selected uniformly across the training period, and the number of changepoints, as well as the flexibility of the potential rate changes at these changepoints, can be controlled using `trend_model = PW()`. The full piecewise logistic growth model is then:\n\n\\begin{align*}\nz_t & = \\frac{C_t}{1 + \\exp(-(k+a(t)^T\\delta)(t-(m+a(t)^T\\gamma)))}  \\end{align*}\n\nFor time series that do not appear to exhibit saturating growth, a piece-wise constant rate of growth can often provide a useful trend model. The piecewise linear trend is defined as:\n\n\\begin{align*}\nz_t & = (k+a(t)^T\\delta)t + (m+a(t)^T\\gamma)  \\end{align*}\n\nIn both trend models, $m$ is an offset parameter that controls the trend intercept. Because of this parameter, it is not recommended that you include an intercept in your observation formula because this will not be identifiable. You can read about the full description of piecewise linear and logistic trends [in this paper by Taylor and Letham](https://www.tandfonline.com/doi/abs/10.1080/00031305.2017.1380080){target=\"_blank\"}. \n\nSean J. Taylor and Benjamin Letham. \"[Forecasting at scale.](https://www.tandfonline.com/doi/full/10.1080/00031305.2017.1380080)\" *The American Statistician* 72.1 (2018): 37-45.\n\n### Continuous time AR(1) processes\nMost trend models in the `mvgam()` function expect time to be measured in regularly-spaced, discrete intervals (i.e. one measurement per week, or one per year for example). But some time series are taken at irregular intervals and we'd like to model autoregressive properties of these. The `trend_model = CAR()` can be useful to set up these models, which currently only support autoregressive processes of order `1`. The evolution of the latent dynamic process follows the form:\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(ar1_i^{distance} * z_{i,t-1}, \\sigma_i) \\end{align*}\n\nWhere $distance$ is a vector of non-negative measurements of the time differences between successive observations. These models are perhaps more widely known as Ornstein–Uhlenbeck processes. See the **Examples** section in `?CAR` for an illustration of how to set these models up. \n\n## Regression formulae\n`mvgam` supports an observation model regression formula, built off the `mgcv` package, as well as an optional process model regression formula. The formulae supplied to `mvgam()` are exactly like those supplied to `glm()` except that smooth terms, `s()`,\n`te()`, `ti()` and `t2()`, time-varying effects using `dynamic()`, monotonically increasing (using `s(x, bs = 'moi')`) or decreasing splines (using `s(x, bs = 'mod')`; see `?smooth.construct.moi.smooth.spec` for details), as well as Gaussian Process functions using `gp()`, can be added to the right hand side (and `.` is not supported in `mvgam` formulae). See `?mvgam_formulae` for more guidance.\n  \nFor setting up State-Space models, the optional process model formula can be used (see [the State-Space model vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html) and [the shared latent states vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html) for guidance on using trend formulae).\n\n## Example time series data\nThe 'portal_data' object contains time series of rodent captures from the Portal Project, [a long-term monitoring study based near the town of Portal, Arizona](https://portal.weecology.org/){target=\"_blank\"}. Researchers have been operating a standardized set of baited traps within 24 experimental plots at this site since the 1970's. Sampling follows the lunar monthly cycle, with observations occurring on average about 28 days apart. However, missing observations do occur due to difficulties accessing the site (weather events, COVID disruptions etc...). You can read about the full sampling protocol [in this preprint by Ernest et al on the Biorxiv](https://www.biorxiv.org/content/10.1101/332783v3.full){target=\"_blank\"}. \n```{r Access time series data}\ndata(\"portal_data\")\n```\n\nAs the data come pre-loaded with the `mvgam` package, you can read a little about it in the help page using `?portal_data`. Before working with data, it is important to inspect how the data are structured, first using `head()`:\n```{r Inspect data format and structure}\nhead(portal_data)\n```\n\nBut the `glimpse()` function in `dplyr` is also useful for understanding how variables are structured\n```{r}\ndplyr::glimpse(portal_data)\n```\n\nWe will focus analyses on the time series of captures for one specific rodent species, the Desert Pocket Mouse *Chaetodipus penicillatus*. This species is interesting in that it goes into a kind of \"hibernation\" during the colder months, leading to very low captures during the winter period\n\n## Manipulating data for modelling\n\nManipulating the data into a 'long' format is necessary for modelling in `mvgam`. By 'long' format, we mean that each `series x time` observation needs to have its own entry in the `dataframe` or `list` object that we wish to use as data for modelling. A simple example can be viewed by simulating data using the `sim_mvgam()` function. See `?sim_mvgam` for more details\n```{r}\ndata <- sim_mvgam(n_series = 4, T = 24)\nhead(data$data_train, 12)\n```\n\nNotice how we have four different time series in these simulated data, but we do not spread the outcome values into different columns. Rather, there is only a single column for the outcome variable, labelled `y` in these simulated data. We also must supply a variable labelled `time` to ensure the modelling software knows how to arrange the time series when building models. This setup still allows us to formulate multivariate time series models, as you can see in the [State-Space vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html). Below are the steps needed to shape our `portal_data` object into the correct form. First, we create a `time` variable, select the column representing counts of our target species (`PP`), and select appropriate variables that we can use as predictors\n```{r Wrangle data for modelling}\nportal_data %>%\n  # Filter the data to only contain captures of the 'PP' \n  dplyr::filter(series == 'PP') %>%\n  droplevels() %>%\n  dplyr::mutate(count = captures) %>%\n  # Add a 'year' variable\n  dplyr::mutate(year = sort(rep(1:8, 12))[time]) %>%\n  # Select the variables of interest to keep in the model_data\n  dplyr::select(series, year, time, count, mintemp, ndvi_ma12) -> model_data\n```\n\nThe data now contain six variables:  \n  `series`, a factor indexing which time series each observation belongs to  \n  `year`, the year of sampling  \n  `time`, the indicator of which time step each observation belongs to  \n  `count`, the response variable representing the number of captures of the species `PP` in each sampling observation  \n  `mintemp`, the monthly average minimum temperature at each time step  \n  `ndvi_ma12`, a 12-month moving average of the monthly Normalized Difference Vegetation Index at each time step  \n\nNow check the data structure again\n```{r}\nhead(model_data)\n```\n\n```{r}\ndplyr::glimpse(model_data)\n```\n\nYou can also summarize multiple variables, which is helpful to search for data ranges and identify missing values\n```{r Summarise variables}\nsummary(model_data)\n```\n\nWe have some `NA`s in our response variable `count`. These observations will generally be thrown out by most modelling packages in \\R. But as you will see when we work through the tutorials, `mvgam` keeps these in the data so that predictions can be automatically returned for the full dataset. The time series and some of its descriptive features can be plotted using `plot_mvgam_series()`:\n```{r}\nplot_mvgam_series(data = model_data, series = 1, y = \"count\")\n```\n\n## GLMs with temporal random effects\nOur first task will be to fit a Generalized Linear Model (GLM) that can adequately capture the features of our `count` observations (integer data, lower bound at zero, missing values) while also attempting to model temporal variation. We are almost ready to fit our first model, which will be a GLM with Poisson observations, a log link function and random (hierarchical) intercepts for `year`. This will allow us to capture our prior belief that, although each year is unique, having been sampled from the same population of effects, all years are connected and thus might contain valuable information about one another. This will be done by capitalizing on the partial pooling properties of hierarchical models. Hierarchical (also known as random) effects offer many advantages when modelling data with grouping structures (i.e. multiple species, locations, years etc...). The ability to incorporate these in time series models is a huge advantage over traditional models such as ARIMA or Exponential Smoothing. But before we fit the model, we will need to convert `year` to a factor so that we can use a random effect basis in `mvgam`. See `?smooth.terms` and\n`?smooth.construct.re.smooth.spec` for details about the `re` basis construction that is used by both `mvgam` and `mgcv`\n```{r}\nmodel_data %>%\n  # Create a 'year_fac' factor version of 'year'\n  dplyr::mutate(year_fac = factor(year)) -> model_data\n```\n\nPreview the dataset to ensure year is now a factor with a unique factor level for each year in the data\n```{r}\ndplyr::glimpse(model_data)\nlevels(model_data$year_fac)\n```\n\nWe are now ready for our first `mvgam` model. The syntax will be familiar to users who have previously built models with `mgcv`. But for a refresher, see `?formula.gam` and the examples in `?gam`. Random effects can be specified using the `s` wrapper with the `re` basis. Note that we can also suppress the primary intercept using the usual `R` formula syntax `- 1`. `mvgam` has a number of possible observation families that can be used, see `?mvgam_families` for more information. We will use `Stan` as the fitting engine, which deploys Hamiltonian Monte Carlo (HMC) for full Bayesian inference. By default, 4 HMC chains will be run using a warmup of 500 iterations and collecting 500 posterior samples from each chain. The package will also aim to use the `Cmdstan` backend when possible, so it is recommended that users have an up-to-date installation of `Cmdstan` and the associated `cmdstanr` interface on their machines (note that you can set the backend yourself using the `backend` argument: see `?mvgam` for details). Interested users should consult the [`Stan` user's guide](https://mc-stan.org/docs/stan-users-guide/index.html){target=\"_blank\"} for more information about the software and the enormous variety of models that can be tackled with HMC.\n```{r model1, include=FALSE, results='hide'}\nmodel1 <- mvgam(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel1 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n```\n\nThe model can be described mathematically for each timepoint $t$ as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = \\beta_{year[year_t]} \\\\\n\\beta_{year} & \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\end{align*}\n\nWhere the $\\beta_{year}$ effects are drawn from a *population* distribution that is parameterized by a common mean $(\\mu_{year})$ and variance $(\\sigma_{year})$. Priors on most of the model parameters can be interrogated and changed using similar functionality to the options available in `brms`. For example, the default priors on $(\\mu_{year})$ and $(\\sigma_{year})$ can be viewed using the following code:\n```{r}\nget_mvgam_priors(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n```\n\nSee examples in `?get_mvgam_priors` to find out different ways that priors can be altered.\nOnce the model has finished, the first step is to inspect the `summary()` to ensure no major diagnostic warnings have been produced and to quickly summarise posterior distributions for key parameters\n```{r}\nsummary(model1)\n```\n\nThe diagnostic messages at the bottom of the summary show that the HMC sampler did not encounter any problems or difficult posterior spaces. This is a good sign. Posterior distributions for model parameters can be extracted in any way that an object of class `brmsfit` can (see `?mvgam::mvgam_draws` for details). For example, we can extract the coefficients related to the GAM linear predictor (i.e. the $\\beta$'s) into a `data.frame` using:\n```{r Extract coefficient posteriors}\nbeta_post <- as.data.frame(model1, variable = \"betas\")\ndplyr::glimpse(beta_post)\n```\n\nWith any model fitted in `mvgam`, the underlying `Stan` code can be viewed using the `stancode()` function:\n```{r}\nstancode(model1)\n```\n\n### Plotting effects and residuals\n\nNow for interrogating the model. We can get some sense of the variation in yearly intercepts from the summary above, but it is easier to understand them using targeted plots. Plot posterior distributions of the temporal random effects using `plot.mvgam()` with `type = 're'`. See `?plot.mvgam` for more details about the types of plots that can be produced from fitted `mvgam` objects\n```{r Plot random effect estimates}\nplot(model1, type = \"re\")\n```\n\n### `bayesplot` support\nWe can also capitalize on most of the useful MCMC plotting functions from the `bayesplot` package to visualize posterior distributions and diagnostics (see `?mvgam::mcmc_plot.mvgam` for details):\n```{r}\nmcmc_plot(\n  object = model1,\n  variable = \"betas\",\n  type = \"areas\"\n)\n```\n\nWe can also use the wide range of posterior checking functions available in `bayesplot` (see `?mvgam::ppc_check.mvgam` for details):\n```{r}\npp_check(object = model1)\n```\n\nThere is clearly some variation in these yearly intercept estimates. But how do these translate into time-varying predictions? To understand this, we can plot posterior hindcasts from this model for the training period using `plot.mvgam()` with `type = 'forecast'`\n```{r Plot posterior hindcasts}\nplot(model1, type = \"forecast\")\n```\n\nIf you wish to extract these hindcasts for other downstream analyses, the `hindcast()` function can be used. This will return a list object of class `mvgam_forecast`. In the `hindcasts` slot, a matrix of posterior retrodictions will be returned for each series in the data (only one series in our example): \n```{r Extract posterior hindcast}\nhc <- hindcast(model1)\nstr(hc)\n```\n\nYou can also extract these hindcasts on the linear predictor scale, which in this case is the log scale (our Poisson GLM used a log link function). Sometimes this can be useful for asking more targeted questions about drivers of variation:\n```{r Extract hindcasts on the linear predictor scale}\nhc <- hindcast(model1, type = \"link\")\nrange(hc$hindcasts$PP)\n```\n\nIn any regression analysis, a key question is whether the residuals show any patterns that can be indicative of un-modelled sources of variation. For GLMs, we can use a modified residual called the [Dunn-Smyth, or randomized quantile, residual](https://www.jstor.org/stable/1390802){target=\"_blank\"}. Inspect Dunn-Smyth residuals from the model using `plot.mvgam()` with `type = 'residuals'`\n```{r Plot posterior residuals}\nplot(model1, type = \"residuals\")\n```\n\n## Automatic forecasting for new data\nThese temporal random effects do not have a sense of \"time\". Because of this, each yearly random intercept is not restricted in some way to be similar to the previous yearly intercept. This drawback becomes evident when we predict for a new year. To do this, we can repeat the exercise above but this time will split the data into training and testing sets before re-running the model. We can then supply the test set as `newdata`. For splitting, we will make use of the `filter()` function from `dplyr`\n```{r}\nmodel_data %>%\n  dplyr::filter(time <= 70) -> data_train\nmodel_data %>%\n  dplyr::filter(time > 70) -> data_test\n```\n\n```{r include=FALSE, message=FALSE, warning=FALSE}\nmodel1b <- mvgam(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel1b <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nWe can view the test data in the forecast plot to see that the predictions do not capture the temporal variation in the test set\n```{r Plotting predictions against test data}\nplot(model1b, type = \"forecast\", newdata = data_test)\n```\n\nAs with the `hindcast()` function, we can use the `forecast()` function to automatically extract the posterior distributions for these predictions. This also returns an object of class `mvgam_forecast`, but now it will contain both the hindcasts and forecasts for each series in the data:\n```{r Extract posterior forecasts}\nfc <- forecast(model1b)\nstr(fc)\n```\n\n## Adding predictors as \"fixed\" effects\nAny users familiar with GLMs will know that we nearly always wish to include predictor variables that may explain some of the variation in our observations. Predictors are easily incorporated into GLMs / GAMs. Here, we will update the model from above by including a parametric (fixed) effect of `ndvi_ma12` as a linear predictor:\n```{r model2, include=FALSE, message=FALSE, warning=FALSE}\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = \\beta_{year[year_t]} + \\beta_{ndvi} * \\boldsymbol{ndvi}_t \\\\\n\\beta_{year} & \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\\\\n\\beta_{ndvi} & \\sim \\text{Normal}(0, 1) \\end{align*}\n\nWhere the $\\beta_{year}$ effects are the same as before but we now have another predictor $(\\beta_{ndvi})$ that applies to the `ndvi_ma12` value at each timepoint $t$. Inspect the summary of this model\n\n```{r, class.output=\"scroll-300\"}\nsummary(model2)\n```\n\nRather than printing the summary each time, we can also quickly look at the posterior empirical quantiles for the fixed effect of `ndvi` (and other linear predictor coefficients) using `coef`: \n```{r Posterior quantiles of model coefficients}\ncoef(model2)\n```\n\nLook at the estimated effect of `ndvi` using using a histogram. This can be done by first extracting the posterior coefficients:\n```{r}\nbeta_post <- as.data.frame(model2, variable = \"betas\")\ndplyr::glimpse(beta_post)\n```\n\nThe posterior distribution for the effect of `ndvi_ma12` is stored in the `ndvi_ma12` column. A quick histogram confirms our inference that `log(counts)` respond positively to increases in `ndvi`:\n```{r Histogram of NDVI effects}\nhist(beta_post$ndvi_ma12,\n  xlim = c(\n    -1 * max(abs(beta_post$ndvi_ma12)),\n    max(abs(beta_post$ndvi))\n  ),\n  col = \"darkred\",\n  border = \"white\",\n  xlab = expression(beta[NDVI]),\n  ylab = \"\",\n  yaxt = \"n\",\n  main = \"\",\n  lwd = 2\n)\nabline(v = 0, lwd = 2.5)\n```\n\n### `marginaleffects` support\nGiven our model used a nonlinear link function (log link in this example), it can still be difficult to fully understand what relationship our model is estimating between a predictor and the response. Fortunately, the `marginaleffects` package makes this relatively straightforward. Objects of class `mvgam` can be used with `marginaleffects` to inspect contrasts, scenario-based predictions, conditional and marginal effects, all on the outcome scale. Like `brms`, `mvgam` has the simple `conditional_effects()` function to make quick and informative plots for main effects, which rely on `marginaleffects` support. This will likely be your go-to function for quickly understanding patterns from fitted `mvgam` models\n```{r warning=FALSE}\nconditional_effects(model2)\n```\n\n## Adding predictors as smooths\n\nSmooth functions, using penalized splines, are a major feature of `mvgam`. Nonlinear splines are commonly viewed as variations of random effects in which the coefficients that control the shape of the spline are drawn from a joint, penalized distribution. This strategy is very often used in ecological time series analysis to capture smooth temporal variation in the processes we seek to study. When we construct smoothing splines, the workhorse package `mgcv` will calculate a set of basis functions that will collectively control the shape and complexity of the resulting spline. It is often helpful to visualize these basis functions to get a better sense of how splines work. We'll create a set of 6 basis functions to represent possible variation in the effect of `time` on our outcome.In addition to constructing the basis functions, `mgcv` also creates a penalty matrix $S$, which contains **known** coefficients that work to constrain the wiggliness of the resulting smooth function. When fitting a GAM to data, we must estimate the smoothing parameters ($\\lambda$) that will penalize these matrices, resulting in constrained basis coefficients and smoother functions that are less likely to overfit the data. This is the key to fitting GAMs in a Bayesian framework, as we can jointly estimate the $\\lambda$'s using informative priors to prevent overfitting and expand the complexity of models we can tackle. To see this in practice, we can now fit a model that replaces the yearly random effects with a smooth function of `time`. We will need a reasonably complex function (large `k`) to try and accommodate the temporal variation in our observations. Following some [useful advice by Gavin Simpson](https://fromthebottomoftheheap.net/2020/06/03/extrapolating-with-gams/){target=\"_blank\"}, we will use a b-spline basis for the temporal smooth. Because we no longer have intercepts for each year, we also retain the primary intercept term in this model (there is no `-1` in the formula now):\n```{r model3, include=FALSE, message=FALSE, warning=FALSE}\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = f(\\boldsymbol{time})_t + \\beta_{ndvi} * \\boldsymbol{ndvi}_t  \\\\\nf(\\boldsymbol{time}) & = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} & \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\\\\n\\beta_{ndvi} & \\sim \\text{Normal}(0, 1) \\end{align*}\n\n\nWhere the smooth function $f_{time}$ is built by summing across a set of weighted basis functions. The basis functions $(b)$ are constructed using a thin plate regression basis in `mgcv`. The weights $(\\beta_{smooth})$ are drawn from a penalized multivariate normal distribution where the precision matrix $(\\Omega$) is multiplied by a smoothing penalty $(\\lambda)$. If $\\lambda$ becomes large, this acts to *squeeze* the covariances among the weights $(\\beta_{smooth})$, leading to a less wiggly spline. Note that sometimes there are multiple smoothing penalties that contribute to the covariance matrix, but I am only showing one here for simplicity. View the summary as before\n```{r}\nsummary(model3)\n```\n\nThe summary above now contains posterior estimates for the smoothing parameters as well as the basis coefficients for the nonlinear effect of `time`. We can visualize `conditional_effects` as before:\n```{r warning=FALSE}\nconditional_effects(model3, type = \"link\")\n```\n\nInspect the underlying `Stan` code to gain some idea of how the spline is being penalized:\n```{r, class.output=\"scroll-300\"}\nstancode(model3)\n```\n\nThe line below `// prior for s(time)...` shows how the spline basis coefficients are drawn from a zero-centred multivariate normal distribution. The precision matrix $S$ is penalized by two different smoothing parameters (the $\\lambda$'s) to enforce smoothness and reduce overfitting\n\n## Latent dynamics in `mvgam`\n\nForecasts from the above model are not ideal:\n```{r}\nplot(model3, type = \"forecast\", newdata = data_test)\n```\n\nWhy is this happening? The forecasts are driven almost entirely by variation in the temporal spline, which is extrapolating linearly *forever* beyond the edge of the training data. Any slight wiggles near the end of the training set will result in wildly different forecasts. To visualize this, we can plot the extrapolated temporal functions into the out-of-sample test set for the two models. Here are the extrapolated functions for the first model, with 15 basis functions:\n```{r Plot extrapolated temporal functions using newdata}\nplot_mvgam_smooth(\n  model3,\n  smooth = \"s(time)\",\n  # pass newdata to the plot function to generate\n  # predictions of the temporal smooth to the end of the\n  # testing period\n  newdata = data.frame(\n    time = 1:max(data_test$time),\n    ndvi_ma12 = 0\n  )\n)\nabline(v = max(data_train$time), lty = \"dashed\", lwd = 2)\n```\n\nThis model is not doing well. Clearly we need to somehow account for the strong temporal autocorrelation when modelling these data without using a smooth function of `time`. Now onto another prominent feature of `mvgam`: the ability to include (possibly latent) autocorrelated residuals in regression models. To do so, we use the `trend_model` argument (see `?mvgam_trends` for details of different dynamic trend models that are supported). This model will use a separate sub-model for latent residuals that evolve as an AR1 process (i.e. the error in the current time point is a function of the error in the previous time point, plus some stochastic noise). We also include a smooth function of `ndvi_ma12` in this model, rather than the parametric term that was used above, to showcase that `mvgam` can include combinations of smooths and dynamic components:\n```{r model4, include=FALSE}\nmodel4 <- mvgam(count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR(),\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel4 <- mvgam(\n  count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR()\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = f(\\boldsymbol{ndvi})_t + z_t \\\\\nz_t & \\sim \\text{Normal}(ar1 * z_{t-1}, \\sigma_{error}) \\\\\nar1 & \\sim \\text{Normal}(0, 1)[-1, 1] \\\\\n\\sigma_{error} & \\sim \\text{Exponential}(2) \\\\\nf(\\boldsymbol{ndvi}) & = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} & \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\end{align*}\n\nHere the term $z_t$ captures autocorrelated latent residuals, which are modelled using an AR1 process. You can also notice that this model is estimating autocorrelated errors for the full time period, even though some of these time points have missing observations. This is useful for getting more realistic estimates of the residual autocorrelation parameters. Summarise the model to see how it now returns posterior summaries for the latent AR1 process:\n```{r Summarise the mvgam autocorrelated error model, class.output=\"scroll-300\"}\nsummary(model4)\n```\n\nView posterior hindcasts / forecasts and compare against the out of sample test data\n```{r}\nplot(model4, type = \"forecast\", newdata = data_test)\n```\n\nThe trend is evolving as an AR1 process, which we can also view:\n```{r}\nplot(model4, type = \"trend\", newdata = data_test)\n```\n\nIn-sample model performance can be interrogated using leave-one-out cross-validation utilities from the `loo` package (a higher value is preferred for this metric):\n```{r}\nloo_compare(model3, model4)\n```\n\nThe higher estimated log predictive density (ELPD) value for the dynamic model suggests it provides a better fit to the in-sample data. \n\nThough it should be obvious that this model provides better forecasts, we can quantify forecast performance for models 3 and 4 using the `forecast` and `score` functions. Here we will compare models based on their Discrete Ranked Probability Scores (a lower value is preferred for this metric)\n```{r}\nfc_mod3 <- forecast(model3)\nfc_mod4 <- forecast(model4)\nscore_mod3 <- score(fc_mod3, score = \"drps\")\nscore_mod4 <- score(fc_mod4, score = \"drps\")\nsum(score_mod4$PP$score, na.rm = TRUE) - \n  sum(score_mod3$PP$score, na.rm = TRUE)\n```\n\nA strongly negative value here suggests the score for the dynamic model (model 4) is much smaller than the score for the model with a smooth function of time (model 3)\n\n## Further reading\nThe following papers and resources offer useful material about Dynamic GAMs and how they can be applied in practice:\n  \nClark, Nicholas J. and Wells, K. [Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series](https://doi.org/10.1111/2041-210X.13974). *Methods in Ecology and Evolution*. (2023): 14, 771-784.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nde Sousa, Heitor C., et al. [Severe fire regimes decrease resilience of ectothermic populations](https://doi.org/10.1111/1365-2656.14188). *Journal of Animal Ecology* (2024): 93(11), 1656-1669.  \n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant.](https://doi.org/10.1016/j.csda.2022.107659) *Computational Statistics & Data Analysis* (2023): 179, 107659.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.\n  \nZhu, L., et al. [Responses of a widespread pest insect to extreme high temperatures are stage-dependent and divergent among seasonal cohorts](https://doi.org/10.1111/1365-2435.14711). *Functional Ecology* (2025): 39, 165–180. https://doi.org/10.1111/1365-2435.14711\n  \n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "inst/doc/mvgam_overview.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Overview of the mvgam package</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Overview of the mvgam package</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#dynamic-gams\" id=\"toc-dynamic-gams\">Dynamic GAMs</a></li>\n<li><a href=\"#supported-observation-families\" id=\"toc-supported-observation-families\">Supported observation\nfamilies</a></li>\n<li><a href=\"#supported-temporal-dynamic-processes\" id=\"toc-supported-temporal-dynamic-processes\">Supported temporal dynamic\nprocesses</a>\n<ul>\n<li><a href=\"#correlated-multivariate-processes\" id=\"toc-correlated-multivariate-processes\">Correlated multivariate\nprocesses</a></li>\n<li><a href=\"#independent-random-walks\" id=\"toc-independent-random-walks\">Independent Random Walks</a></li>\n<li><a href=\"#multivariate-random-walks\" id=\"toc-multivariate-random-walks\">Multivariate Random Walks</a></li>\n<li><a href=\"#autoregressive-processes\" id=\"toc-autoregressive-processes\">Autoregressive processes</a></li>\n<li><a href=\"#vector-autoregressive-processes\" id=\"toc-vector-autoregressive-processes\">Vector Autoregressive\nprocesses</a></li>\n<li><a href=\"#hierarchical-processes\" id=\"toc-hierarchical-processes\">Hierarchical processes</a></li>\n<li><a href=\"#gaussian-processes\" id=\"toc-gaussian-processes\">Gaussian\nProcesses</a></li>\n<li><a href=\"#piecewise-logistic-and-linear-trends\" id=\"toc-piecewise-logistic-and-linear-trends\">Piecewise logistic and\nlinear trends</a></li>\n<li><a href=\"#continuous-time-ar1-processes\" id=\"toc-continuous-time-ar1-processes\">Continuous time AR(1)\nprocesses</a></li>\n</ul></li>\n<li><a href=\"#regression-formulae\" id=\"toc-regression-formulae\">Regression formulae</a></li>\n<li><a href=\"#example-time-series-data\" id=\"toc-example-time-series-data\">Example time series data</a></li>\n<li><a href=\"#manipulating-data-for-modelling\" id=\"toc-manipulating-data-for-modelling\">Manipulating data for\nmodelling</a></li>\n<li><a href=\"#glms-with-temporal-random-effects\" id=\"toc-glms-with-temporal-random-effects\">GLMs with temporal random\neffects</a>\n<ul>\n<li><a href=\"#plotting-effects-and-residuals\" id=\"toc-plotting-effects-and-residuals\">Plotting effects and\nresiduals</a></li>\n<li><a href=\"#bayesplot-support\" id=\"toc-bayesplot-support\"><code>bayesplot</code> support</a></li>\n</ul></li>\n<li><a href=\"#automatic-forecasting-for-new-data\" id=\"toc-automatic-forecasting-for-new-data\">Automatic forecasting for\nnew data</a></li>\n<li><a href=\"#adding-predictors-as-fixed-effects\" id=\"toc-adding-predictors-as-fixed-effects\">Adding predictors as “fixed”\neffects</a>\n<ul>\n<li><a href=\"#marginaleffects-support\" id=\"toc-marginaleffects-support\"><code>marginaleffects</code>\nsupport</a></li>\n</ul></li>\n<li><a href=\"#adding-predictors-as-smooths\" id=\"toc-adding-predictors-as-smooths\">Adding predictors as\nsmooths</a></li>\n<li><a href=\"#latent-dynamics-in-mvgam\" id=\"toc-latent-dynamics-in-mvgam\">Latent dynamics in\n<code>mvgam</code></a></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to give a general overview of the\n<code>mvgam</code> package and its primary functions.</p>\n<div id=\"dynamic-gams\" class=\"section level2\">\n<h2>Dynamic GAMs</h2>\n<p><code>mvgam</code> is designed to propagate unobserved temporal\nprocesses to capture latent dynamics in the observed time series. This\nworks in a state-space format, with the temporal <em>trend</em> evolving\nindependently of the observation process. An introduction to the package\nand some worked examples are also shown in this seminar: <a href=\"https://www.youtube.com/watch?v=0zZopLlomsQ\" target=\"_blank\">Ecological Forecasting with Dynamic Generalized Additive\nModels</a>. Briefly, assume <span class=\"math inline\">\\(\\tilde{\\boldsymbol{y}}_{i,t}\\)</span> is the\nconditional expectation of response variable <span class=\"math inline\">\\(\\boldsymbol{i}\\)</span> at time <span class=\"math inline\">\\(\\boldsymbol{t}\\)</span>. Assuming <span class=\"math inline\">\\(\\boldsymbol{y_i}\\)</span> is drawn from an\nexponential distribution with an invertible link function, the linear\npredictor for a multivariate Dynamic GAM can be written as:</p>\n<p><span class=\"math display\">\\[for~i~in~1:N_{series}~...\\]</span> <span class=\"math display\">\\[for~t~in~1:N_{timepoints}~...\\]</span></p>\n<p><span class=\"math display\">\\[g^{-1}(\\tilde{\\boldsymbol{y}}_{i,t})=\\alpha_{i}+\\sum\\limits_{j=1}^J\\boldsymbol{s}_{i,j,t}\\boldsymbol{x}_{j,t}+\\boldsymbol{Z}\\boldsymbol{z}_{k,t}\\,,\\]</span>\nHere <span class=\"math inline\">\\(\\alpha\\)</span> are the unknown\nintercepts, the <span class=\"math inline\">\\(\\boldsymbol{s}\\)</span>’s\nare unknown smooth functions of covariates (<span class=\"math inline\">\\(\\boldsymbol{x}\\)</span>’s), which can potentially\nvary among the response series, and <span class=\"math inline\">\\(\\boldsymbol{z}\\)</span> are dynamic latent\nprocesses. Each smooth function <span class=\"math inline\">\\(\\boldsymbol{s_j}\\)</span> is composed of basis\nexpansions whose coefficients, which must be estimated, control the\nfunctional relationship between <span class=\"math inline\">\\(\\boldsymbol{x}_{j}\\)</span> and <span class=\"math inline\">\\(g^{-1}(\\tilde{\\boldsymbol{y}})\\)</span>. The size\nof the basis expansion limits the smooth’s potential complexity. A\nlarger set of basis functions allows greater flexibility. For more\ninformation on GAMs and how they can smooth through data, see <a href=\"https://ecogambler.netlify.app/blog/interpreting-gams/\" target=\"_blank\">this blogpost on how to interpret nonlinear effects from\nGeneralized Additive Models</a>. Latent processes are captured with\n<span class=\"math inline\">\\(\\boldsymbol{Z}\\boldsymbol{z}_{i,t}\\)</span>,\nwhere <span class=\"math inline\">\\(\\boldsymbol{Z}\\)</span> is an <span class=\"math inline\">\\(i~by~k\\)</span> matrix of loading coefficients\n(which can be fixed or a combination of fixed and freely estimated\nparameters) and <span class=\"math inline\">\\(\\boldsymbol{z}_{k,t}\\)</span> are a set of <span class=\"math inline\">\\(K\\)</span> latent factors that can also include\ntheir own GAM linear predictors (see the <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space\nmodels vignette</a>), the <a href=\"https://nicholasjclark.github.io/mvgam/articles/nmixtures.html\">N-mixtures\nvignette</a> and the example in <a href=\"https://nicholasjclark.github.io/mvgam/reference/jsdgam.html\"><code>jsdgam</code></a>\nto get an idea of how flexible these processes can be.</p>\n<p>Several advantages of GAMs are that they can model a diversity of\nresponse families, including discrete distributions (i.e. Poisson,\nNegative Binomial, Gamma) that accommodate common ecological features\nsuch as zero-inflation or overdispersion, and that they can be\nformulated to include hierarchical smoothing for multivariate responses.\n<code>mvgam</code> supports a number of different observation families,\nwhich are summarized below:</p>\n</div>\n<div id=\"supported-observation-families\" class=\"section level2\">\n<h2>Supported observation families</h2>\n<table>\n<colgroup>\n<col width=\"16%\" />\n<col width=\"15%\" />\n<col width=\"46%\" />\n<col width=\"20%\" />\n</colgroup>\n<thead>\n<tr class=\"header\">\n<th align=\"center\">Distribution</th>\n<th align=\"center\">Function</th>\n<th align=\"center\">Support</th>\n<th align=\"center\">Extra parameter(s)</th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"odd\">\n<td align=\"center\">Gaussian (identity link)</td>\n<td align=\"center\"><code>gaussian()</code></td>\n<td align=\"center\">Real values in <span class=\"math inline\">\\((-\\infty,\n\\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Student’s T (identity link)</td>\n<td align=\"center\"><code>student-t()</code></td>\n<td align=\"center\">Heavy-tailed real values in <span class=\"math inline\">\\((-\\infty, \\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span>, <span class=\"math inline\">\\(\\nu\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">LogNormal (identity link)</td>\n<td align=\"center\"><code>lognormal()</code></td>\n<td align=\"center\">Positive real values in <span class=\"math inline\">\\([0, \\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\sigma\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Gamma (log link)</td>\n<td align=\"center\"><code>Gamma()</code></td>\n<td align=\"center\">Positive real values in <span class=\"math inline\">\\([0, \\infty)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\alpha\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Beta (logit link)</td>\n<td align=\"center\"><code>betar()</code></td>\n<td align=\"center\">Real values (proportional) in <span class=\"math inline\">\\([0,1]\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Bernoulli (logit link)</td>\n<td align=\"center\"><code>bernoulli()</code></td>\n<td align=\"center\">Binary data in <span class=\"math inline\">\\({0,1}\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Poisson (log link)</td>\n<td align=\"center\"><code>poisson()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Negative Binomial2 (log link)</td>\n<td align=\"center\"><code>nb()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Binomial (logit link)</td>\n<td align=\"center\"><code>binomial()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n<tr class=\"even\">\n<td align=\"center\">Beta-Binomial (logit link)</td>\n<td align=\"center\"><code>beta_binomial()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\"><span class=\"math inline\">\\(\\phi\\)</span></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"center\">Poisson Binomial N-mixture (log link)</td>\n<td align=\"center\"><code>nmix()</code></td>\n<td align=\"center\">Non-negative integers in <span class=\"math inline\">\\((0,1,2,...)\\)</span></td>\n<td align=\"center\">-</td>\n</tr>\n</tbody>\n</table>\n<p>For all supported observation families, any extra parameters that\nneed to be estimated (i.e. the <span class=\"math inline\">\\(\\sigma\\)</span> in a Gaussian model or the <span class=\"math inline\">\\(\\phi\\)</span> in a Negative Binomial model) are by\ndefault estimated independently for each series. However, users can opt\nto force all series to share extra observation parameters using\n<code>share_obs_params = TRUE</code> in <code>mvgam()</code>. Note that\ndefault link functions cannot currently be changed.</p>\n</div>\n<div id=\"supported-temporal-dynamic-processes\" class=\"section level2\">\n<h2>Supported temporal dynamic processes</h2>\n<p>As stated above, the latent processes can take a wide variety of\nforms, some of which can be multivariate to allow the different\nobservational variables to interact or be correlated. When using the\n<code>mvgam()</code> function, the user chooses between different\nprocess models with the <code>trend_model</code> argument. Available\nprocess models are described in detail below.</p>\n<div id=\"correlated-multivariate-processes\" class=\"section level3\">\n<h3>Correlated multivariate processes</h3>\n<p>If more than one observational unit (usually referred to as ‘series’)\nis included in <code>data</code> <span class=\"math inline\">\\((N_{series}\n&gt; 1)\\)</span>, use <code>trend_model = ZMVN()</code> to set up a\nmodel where the outcomes for different observational units may be\ncorrelated according to:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{MVNormal}(0, \\Sigma) \\end{align*}\\]</span></p>\n<p>The covariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span>\nwill capture potentially correlated process errors. It is parameterised\nusing a Cholesky factorization, which requires priors on the\nseries-level variances <span class=\"math inline\">\\(\\sigma\\)</span> and\non the strength of correlations using <code>Stan</code>’s\n<code>lkj_corr_cholesky</code> distribution. Note that this\n<code>trend_model</code> does not assume that measurements occur over\n<em>time</em>, as users can specify what variable in the\n<code>data</code> represents the unit of analysis (i.e. outcomes could\nbe counts of different <em>species</em> across different <em>sites</em>\nor <em>regions</em>, for example; see <a href=\"https://nicholasjclark.github.io/mvgam/reference/ZMVN.html\">`?ZMVN()</a>\nfor guidelines).</p>\n</div>\n<div id=\"independent-random-walks\" class=\"section level3\">\n<h3>Independent Random Walks</h3>\n<p>Use <code>trend_model = &#39;RW&#39;</code> or\n<code>trend_model = RW()</code> to set up a model where each series in\n<code>data</code> has independent latent temporal dynamics of the\nform:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Process error parameters <span class=\"math inline\">\\(\\sigma\\)</span>\nare modeled independently for each series. If a moving average process\nis required, use <code>trend_model = RW(ma = TRUE)</code> to set up the\nfollowing:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; = z_{i,t-1} + \\theta_i * error_{i,t-1} + error_{i,t} \\\\\nerror_{i,t} &amp; \\sim \\text{Normal}(0, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Moving average coefficients <span class=\"math inline\">\\(\\theta\\)</span> are independently estimated for\neach series and will be forced to be stationary by default <span class=\"math inline\">\\((abs(\\theta)&lt;1)\\)</span>. Only moving averages\nof order <span class=\"math inline\">\\(q=1\\)</span> are currently\nallowed.</p>\n</div>\n<div id=\"multivariate-random-walks\" class=\"section level3\">\n<h3>Multivariate Random Walks</h3>\n<p>If more than one series is included in <code>data</code> <span class=\"math inline\">\\((N_{series} &gt; 1)\\)</span>, a multivariate\nRandom Walk can be set up using\n<code>trend_model = RW(cor = TRUE)</code>, resulting in the\nfollowing:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{MVNormal}(z_{t-1}, \\Sigma)\n\\end{align*}\\]</span></p>\n<p>Where the latent process estimate <span class=\"math inline\">\\(z_t\\)</span> now takes the form of a vector. The\ncovariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span> will\ncapture contemporaneously correlated process errors. It is parameterised\nusing a Cholesky factorization, which requires priors on the\nseries-level variances <span class=\"math inline\">\\(\\sigma\\)</span> and\non the strength of correlations using <code>Stan</code>’s\n<code>lkj_corr_cholesky</code> distribution.</p>\n<p>Moving average terms can also be included for multivariate random\nwalks, in which case the moving average coefficients <span class=\"math inline\">\\(\\theta\\)</span> will be parameterised as an <span class=\"math inline\">\\(N_{series} * N_{series}\\)</span> matrix</p>\n</div>\n<div id=\"autoregressive-processes\" class=\"section level3\">\n<h3>Autoregressive processes</h3>\n<p>Autoregressive models up to <span class=\"math inline\">\\(p=3\\)</span>,\nin which the autoregressive coefficients are estimated independently for\neach series, can be used by specifying <code>trend_model = &#39;AR1&#39;</code>,\n<code>trend_model = &#39;AR2&#39;</code>, <code>trend_model = &#39;AR3&#39;</code>, or\n<code>trend_model = AR(p = 1, 2, or 3)</code>. For example, a univariate\nAR(1) model takes the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(ar1_i * z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>All options are the same as for Random Walks, but additional options\nwill be available for placing priors on the autoregressive coefficients.\nBy default, these coefficients will not be forced into stationarity, but\nusers can impose this restriction by changing the upper and lower bounds\non their priors. See <code>?get_mvgam_priors</code> for more\ndetails.</p>\n</div>\n<div id=\"vector-autoregressive-processes\" class=\"section level3\">\n<h3>Vector Autoregressive processes</h3>\n<p>A Vector Autoregression of order <span class=\"math inline\">\\(p=1\\)</span> can be specified if <span class=\"math inline\">\\(N_{series} &gt; 1\\)</span> using\n<code>trend_model = &#39;VAR1&#39;</code> or <code>trend_model = VAR()</code>. A\nVAR(1) model takes the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{t} &amp; \\sim \\text{Normal}(A * z_{t-1}, \\Sigma)\n\\end{align*}\\]</span></p>\n<p>Where <span class=\"math inline\">\\(A\\)</span> is an <span class=\"math inline\">\\(N_{series} * N_{series}\\)</span> matrix of\nautoregressive coefficients in which the diagonals capture lagged\nself-dependence (i.e. the effect of a process at time <span class=\"math inline\">\\(t\\)</span> on its own estimate at time <span class=\"math inline\">\\(t+1\\)</span>), while off-diagonals capture lagged\ncross-dependence (i.e. the effect of a process at time <span class=\"math inline\">\\(t\\)</span> on the process for another series at\ntime <span class=\"math inline\">\\(t+1\\)</span>). By default, the\ncovariance matrix <span class=\"math inline\">\\(\\Sigma\\)</span> will\nassume no process error covariance by fixing the off-diagonals to <span class=\"math inline\">\\(0\\)</span>. To allow for correlated errors, use\n<code>trend_model = &#39;VAR1cor&#39;</code> or\n<code>trend_model = VAR(cor = TRUE)</code>. A moving average of order\n<span class=\"math inline\">\\(q=1\\)</span> can also be included using\n<code>trend_model = VAR(ma = TRUE, cor = TRUE)</code>.</p>\n<p>Note that for all VAR models, stationarity of the process is enforced\nwith a structured prior distribution that is described in detail in <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Heaps\n2022</a></p>\n<p>Heaps, Sarah E. “<a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Enforcing\nstationarity through the prior in vector autoregressions.</a>”\n<em>Journal of Computational and Graphical Statistics</em> 32.1 (2023):\n74-83.</p>\n</div>\n<div id=\"hierarchical-processes\" class=\"section level3\">\n<h3>Hierarchical processes</h3>\n<p>Several of the above-mentioned <code>trend_model</code> options can\nbe modified to account for grouping structures in <code>data</code> by\nsetting up hierarchical latent processes. If an optional grouping\nvariable (<code>gr</code>; which must be a <code>factor</code> in the\nsupplied <code>data</code>) exists, users can model hierarchical\nresidual correlation structures. where the residual correlations for a\nspecific level of <code>gr</code> are modelled hierarchically:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\Omega_{group} &amp; = \\alpha_{cor}\\Omega_{global} + (1 -\n\\alpha_{cor})\\Omega_{group, local} \\end{align*}\\]</span></p>\n<p>where <span class=\"math inline\">\\(\\Omega_{global}\\)</span> is a\n<em>global</em> correlation matrix, <span class=\"math inline\">\\(\\Omega_{group, local}\\)</span> is a <em>local\ndeviation</em> correlation matrix and <span class=\"math inline\">\\(\\alpha_{cor}\\)</span> is a weighting parameter\ncontrolling how strongly the local correlation matrix <span class=\"math inline\">\\(\\Omega_{group}\\)</span> (i.e. the derived\ncorrelation matrix that will be used for each level of the grouping\nfactor <code>gr</code>) is shrunk towards the global correlation matrix\n<span class=\"math inline\">\\(\\Omega_{global}\\)</span> (larger values of\n<span class=\"math inline\">\\(\\alpha_{cor}\\)</span> indicate a greater\ndegree of shrinkage, i.e. a greater degree of partial pooling). This\noption is valuable for many types of designs where the same\nobservational units (i.e. <em>financial assets</em> or <em>species</em>,\nfor example) are measured in different strata (i.e. <em>regions</em>,\n<em>countries</em> or <em>experimental units</em>, for example).\nCurrently hierarchical correlations can be included for\n<code>AR()</code>, <code>VAR()</code> or <code>ZMVN()</code>\n<code>trend_model</code> options.</p>\n</div>\n<div id=\"gaussian-processes\" class=\"section level3\">\n<h3>Gaussian Processes</h3>\n<p>The final option for modelling temporal dynamics is to use a Gaussian\nProcess with squared exponential kernel. These are set up independently\nfor each series (there is currently no multivariate GP option), using\n<code>trend_model = &#39;GP&#39;</code>. The dynamics for each latent process\nare modelled as:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz &amp; \\sim \\text{MVNormal}(0, \\Sigma_{error}) \\\\\n\\Sigma_{error}[t_i, t_j] &amp; = \\alpha^2 * exp(-0.5 * ((|t_i - t_j| /\n\\rho))^2) \\end{align*}\\]</span></p>\n<p>The latent dynamic process evolves from a complex, high-dimensional\nMultivariate Normal distribution which depends on <span class=\"math inline\">\\(\\rho\\)</span> (often called the length scale\nparameter) to control how quickly the correlations between the model’s\nerrors decay as a function of time. For these models, covariance decays\nexponentially fast with the squared distance (in time) between the\nobservations. The functions also depend on a parameter <span class=\"math inline\">\\(\\alpha\\)</span>, which controls the marginal\nvariability of the temporal function at all points; in other words it\ncontrols how much the GP term contributes to the linear predictor.\n<code>mvgam</code> capitalizes on some advances that allow GPs to be\napproximated using Hilbert space basis functions, which <a href=\"https://link.springer.com/article/10.1007/s11222-022-10167-2\" target=\"_blank\">considerably speed up computation at little cost to\naccuracy or prediction performance</a>.</p>\n</div>\n<div id=\"piecewise-logistic-and-linear-trends\" class=\"section level3\">\n<h3>Piecewise logistic and linear trends</h3>\n<p>Modeling growth for many types of time series is often similar to\nmodeling population growth in natural ecosystems, where there series\nexhibits nonlinear growth that saturates at some particular carrying\ncapacity. The logistic trend model available in {<code>mvgam</code>}\nallows for a time-varying capacity <span class=\"math inline\">\\(C(t)\\)</span> as well as a non-constant growth\nrate. Changes in the base growth rate <span class=\"math inline\">\\(k\\)</span> are incorporated by explicitly defining\nchangepoints throughout the training period where the growth rate is\nallowed to vary. The changepoint vector <span class=\"math inline\">\\(a\\)</span> is represented as a vector of\n<code>1</code>s and <code>0</code>s, and the rate of growth at time\n<span class=\"math inline\">\\(t\\)</span> is represented as <span class=\"math inline\">\\(k+a(t)^T\\delta\\)</span>. Potential changepoints\nare selected uniformly across the training period, and the number of\nchangepoints, as well as the flexibility of the potential rate changes\nat these changepoints, can be controlled using\n<code>trend_model = PW()</code>. The full piecewise logistic growth\nmodel is then:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_t &amp; = \\frac{C_t}{1 +\n\\exp(-(k+a(t)^T\\delta)(t-(m+a(t)^T\\gamma)))}  \\end{align*}\\]</span></p>\n<p>For time series that do not appear to exhibit saturating growth, a\npiece-wise constant rate of growth can often provide a useful trend\nmodel. The piecewise linear trend is defined as:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_t &amp; = (k+a(t)^T\\delta)t +\n(m+a(t)^T\\gamma)  \\end{align*}\\]</span></p>\n<p>In both trend models, <span class=\"math inline\">\\(m\\)</span> is an\noffset parameter that controls the trend intercept. Because of this\nparameter, it is not recommended that you include an intercept in your\nobservation formula because this will not be identifiable. You can read\nabout the full description of piecewise linear and logistic trends <a href=\"https://www.tandfonline.com/doi/abs/10.1080/00031305.2017.1380080\" target=\"_blank\">in this paper by Taylor and Letham</a>.</p>\n<p>Sean J. Taylor and Benjamin Letham. “<a href=\"https://www.tandfonline.com/doi/full/10.1080/00031305.2017.1380080\">Forecasting\nat scale.</a>” <em>The American Statistician</em> 72.1 (2018):\n37-45.</p>\n</div>\n<div id=\"continuous-time-ar1-processes\" class=\"section level3\">\n<h3>Continuous time AR(1) processes</h3>\n<p>Most trend models in the <code>mvgam()</code> function expect time to\nbe measured in regularly-spaced, discrete intervals (i.e. one\nmeasurement per week, or one per year for example). But some time series\nare taken at irregular intervals and we’d like to model autoregressive\nproperties of these. The <code>trend_model = CAR()</code> can be useful\nto set up these models, which currently only support autoregressive\nprocesses of order <code>1</code>. The evolution of the latent dynamic\nprocess follows the form:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nz_{i,t} &amp; \\sim \\text{Normal}(ar1_i^{distance} * z_{i,t-1}, \\sigma_i)\n\\end{align*}\\]</span></p>\n<p>Where <span class=\"math inline\">\\(distance\\)</span> is a vector of\nnon-negative measurements of the time differences between successive\nobservations. These models are perhaps more widely known as\nOrnstein–Uhlenbeck processes. See the <strong>Examples</strong> section\nin <code>?CAR</code> for an illustration of how to set these models\nup.</p>\n</div>\n</div>\n<div id=\"regression-formulae\" class=\"section level2\">\n<h2>Regression formulae</h2>\n<p><code>mvgam</code> supports an observation model regression formula,\nbuilt off the <code>mgcv</code> package, as well as an optional process\nmodel regression formula. The formulae supplied to <code>mvgam()</code>\nare exactly like those supplied to <code>glm()</code> except that smooth\nterms, <code>s()</code>, <code>te()</code>, <code>ti()</code> and\n<code>t2()</code>, time-varying effects using <code>dynamic()</code>,\nmonotonically increasing (using <code>s(x, bs = &#39;moi&#39;)</code>) or\ndecreasing splines (using <code>s(x, bs = &#39;mod&#39;)</code>; see\n<code>?smooth.construct.moi.smooth.spec</code> for details), as well as\nGaussian Process functions using <code>gp()</code>, can be added to the\nright hand side (and <code>.</code> is not supported in\n<code>mvgam</code> formulae). See <code>?mvgam_formulae</code> for more\nguidance.</p>\n<p>For setting up State-Space models, the optional process model formula\ncan be used (see <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">the\nState-Space model vignette</a> and <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">the\nshared latent states vignette</a> for guidance on using trend\nformulae).</p>\n</div>\n<div id=\"example-time-series-data\" class=\"section level2\">\n<h2>Example time series data</h2>\n<p>The ‘portal_data’ object contains time series of rodent captures from\nthe Portal Project, <a href=\"https://portal.weecology.org/\" target=\"_blank\">a long-term monitoring study based near the town of\nPortal, Arizona</a>. Researchers have been operating a standardized set\nof baited traps within 24 experimental plots at this site since the\n1970’s. Sampling follows the lunar monthly cycle, with observations\noccurring on average about 28 days apart. However, missing observations\ndo occur due to difficulties accessing the site (weather events, COVID\ndisruptions etc…). You can read about the full sampling protocol <a href=\"https://www.biorxiv.org/content/10.1101/332783v3.full\" target=\"_blank\">in this preprint by Ernest et al on the Biorxiv</a>.</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">data</span>(<span class=\"st\">&quot;portal_data&quot;</span>)</span></code></pre></div>\n<p>As the data come pre-loaded with the <code>mvgam</code> package, you\ncan read a little about it in the help page using\n<code>?portal_data</code>. Before working with data, it is important to\ninspect how the data are structured, first using\n<code>head()</code>:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(portal_data)</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   time series captures  ndvi_ma12    mintemp</span></span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1    1     DM       20 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2    1     DO        2 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3    1     PB        0 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4    1     PP        0 -0.1721441 -0.7963381</span></span>\n<span id=\"cb2-7\"><a href=\"#cb2-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5    2     DM       NA -0.2373635 -1.3347160</span></span>\n<span id=\"cb2-8\"><a href=\"#cb2-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6    2     DO       NA -0.2373635 -1.3347160</span></span></code></pre></div>\n<p>But the <code>glimpse()</code> function in <code>dplyr</code> is also\nuseful for understanding how variables are structured</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(portal_data)</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 320</span></span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 5</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;int&gt; 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, …</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; DM, DO, PB, PP, DM, DO, PB, PP, DM, DO, PB, PP, DM, DO, PB, …</span></span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ captures  &lt;int&gt; 20, 2, 0, 0, NA, NA, NA, NA, 36, 5, 0, 0, 40, 3, 0, 1, 29, 3…</span></span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12 &lt;dbl&gt; -0.172144125, -0.172144125, -0.172144125, -0.172144125, -0.2…</span></span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ mintemp   &lt;dbl&gt; -0.79633807, -0.79633807, -0.79633807, -0.79633807, -1.33471…</span></span></code></pre></div>\n<p>We will focus analyses on the time series of captures for one\nspecific rodent species, the Desert Pocket Mouse <em>Chaetodipus\npenicillatus</em>. This species is interesting in that it goes into a\nkind of “hibernation” during the colder months, leading to very low\ncaptures during the winter period</p>\n</div>\n<div id=\"manipulating-data-for-modelling\" class=\"section level2\">\n<h2>Manipulating data for modelling</h2>\n<p>Manipulating the data into a ‘long’ format is necessary for modelling\nin <code>mvgam</code>. By ‘long’ format, we mean that each\n<code>series x time</code> observation needs to have its own entry in\nthe <code>dataframe</code> or <code>list</code> object that we wish to\nuse as data for modelling. A simple example can be viewed by simulating\ndata using the <code>sim_mvgam()</code> function. See\n<code>?sim_mvgam</code> for more details</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a>data <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(<span class=\"at\">n_series =</span> <span class=\"dv\">4</span>, <span class=\"at\">T =</span> <span class=\"dv\">24</span>)</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(data<span class=\"sc\">$</span>data_train, <span class=\"dv\">12</span>)</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    y season year   series time</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  1      1    1 series_1    1</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  0      1    1 series_2    1</span></span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3  1      1    1 series_3    1</span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4  3      1    1 series_4    1</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  1      2    1 series_1    2</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  1      2    1 series_2    2</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7  0      2    1 series_3    2</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8  5      2    1 series_4    2</span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9  0      3    1 series_1    3</span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 1      3    1 series_2    3</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11 0      3    1 series_3    3</span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12 3      3    1 series_4    3</span></span></code></pre></div>\n<p>Notice how we have four different time series in these simulated\ndata, but we do not spread the outcome values into different columns.\nRather, there is only a single column for the outcome variable, labelled\n<code>y</code> in these simulated data. We also must supply a variable\nlabelled <code>time</code> to ensure the modelling software knows how to\narrange the time series when building models. This setup still allows us\nto formulate multivariate time series models, as you can see in the <a href=\"https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html\">State-Space\nvignette</a>. Below are the steps needed to shape our\n<code>portal_data</code> object into the correct form. First, we create\na <code>time</code> variable, select the column representing counts of\nour target species (<code>PP</code>), and select appropriate variables\nthat we can use as predictors</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>portal_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  <span class=\"co\"># Filter the data to only contain captures of the &#39;PP&#39; </span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&#39;PP&#39;</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"fu\">droplevels</span>() <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">count =</span> captures) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a>  <span class=\"co\"># Add a &#39;year&#39; variable</span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">year =</span> <span class=\"fu\">sort</span>(<span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">8</span>, <span class=\"dv\">12</span>))[time]) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a>  <span class=\"co\"># Select the variables of interest to keep in the model_data</span></span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(series, year, time, count, mintemp, ndvi_ma12) <span class=\"ot\">-&gt;</span> model_data</span></code></pre></div>\n<p>The data now contain six variables:<br />\n<code>series</code>, a factor indexing which time series each\nobservation belongs to<br />\n<code>year</code>, the year of sampling<br />\n<code>time</code>, the indicator of which time step each observation\nbelongs to<br />\n<code>count</code>, the response variable representing the number of\ncaptures of the species <code>PP</code> in each sampling\nobservation<br />\n<code>mintemp</code>, the monthly average minimum temperature at each\ntime step<br />\n<code>ndvi_ma12</code>, a 12-month moving average of the monthly\nNormalized Difference Vegetation Index at each time step</p>\n<p>Now check the data structure again</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(model_data)</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   series year time count     mintemp   ndvi_ma12</span></span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1     PP    1    1     0 -0.79633807 -0.17214413</span></span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2     PP    1    2    NA -1.33471597 -0.23736348</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3     PP    1    3     0 -1.24166462 -0.21212064</span></span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4     PP    1    4     1 -1.08048145 -0.16043812</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5     PP    1    5     7 -0.42447625 -0.08267729</span></span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6     PP    1    6     7  0.06532892 -0.03692877</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(model_data)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 80</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 6</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, …</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year      &lt;int&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, …</span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;int&gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ count     &lt;int&gt; 0, NA, 0, 1, 7, 7, 8, 8, 4, NA, 0, 0, 0, 0, 0, 0, NA, 2, 4, …</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ mintemp   &lt;dbl&gt; -0.79633807, -1.33471597, -1.24166462, -1.08048145, -0.42447…</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12 &lt;dbl&gt; -0.172144125, -0.237363477, -0.212120638, -0.160438125, -0.0…</span></span></code></pre></div>\n<p>You can also summarize multiple variables, which is helpful to search\nfor data ranges and identify missing values</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model_data)</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  series       year           time           count           mintemp       </span></span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  PP:80   Min.   :1.00   Min.   : 1.00   Min.   : 0.000   Min.   :-2.0978  </span></span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          1st Qu.:2.00   1st Qu.:20.75   1st Qu.: 1.000   1st Qu.:-1.0808  </span></span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Median :4.00   Median :40.50   Median : 5.000   Median :-0.4091  </span></span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Mean   :3.85   Mean   :40.50   Mean   : 5.222   Mean   :-0.2151  </span></span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          3rd Qu.:5.25   3rd Qu.:60.25   3rd Qu.: 8.000   3rd Qu.: 0.6133  </span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Max.   :7.00   Max.   :80.00   Max.   :21.000   Max.   : 1.4530  </span></span>\n<span id=\"cb8-9\"><a href=\"#cb8-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                         NA&#39;s   :17                        </span></span>\n<span id=\"cb8-10\"><a href=\"#cb8-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    ndvi_ma12       </span></span>\n<span id=\"cb8-11\"><a href=\"#cb8-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Min.   :-0.66884  </span></span>\n<span id=\"cb8-12\"><a href=\"#cb8-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  1st Qu.:-0.20869  </span></span>\n<span id=\"cb8-13\"><a href=\"#cb8-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Median :-0.16517  </span></span>\n<span id=\"cb8-14\"><a href=\"#cb8-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Mean   :-0.09501  </span></span>\n<span id=\"cb8-15\"><a href=\"#cb8-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  3rd Qu.:-0.03440  </span></span>\n<span id=\"cb8-16\"><a href=\"#cb8-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Max.   : 0.74831  </span></span>\n<span id=\"cb8-17\"><a href=\"#cb8-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span></code></pre></div>\n<p>We have some <code>NA</code>s in our response variable\n<code>count</code>. These observations will generally be thrown out by\nmost modelling packages in . But as you will see when we work through\nthe tutorials, <code>mvgam</code> keeps these in the data so that\npredictions can be automatically returned for the full dataset. The time\nseries and some of its descriptive features can be plotted using\n<code>plot_mvgam_series()</code>:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(<span class=\"at\">data =</span> model_data, <span class=\"at\">series =</span> <span class=\"dv\">1</span>, <span class=\"at\">y =</span> <span class=\"st\">&quot;count&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"glms-with-temporal-random-effects\" class=\"section level2\">\n<h2>GLMs with temporal random effects</h2>\n<p>Our first task will be to fit a Generalized Linear Model (GLM) that\ncan adequately capture the features of our <code>count</code>\nobservations (integer data, lower bound at zero, missing values) while\nalso attempting to model temporal variation. We are almost ready to fit\nour first model, which will be a GLM with Poisson observations, a log\nlink function and random (hierarchical) intercepts for\n<code>year</code>. This will allow us to capture our prior belief that,\nalthough each year is unique, having been sampled from the same\npopulation of effects, all years are connected and thus might contain\nvaluable information about one another. This will be done by\ncapitalizing on the partial pooling properties of hierarchical models.\nHierarchical (also known as random) effects offer many advantages when\nmodelling data with grouping structures (i.e. multiple species,\nlocations, years etc…). The ability to incorporate these in time series\nmodels is a huge advantage over traditional models such as ARIMA or\nExponential Smoothing. But before we fit the model, we will need to\nconvert <code>year</code> to a factor so that we can use a random effect\nbasis in <code>mvgam</code>. See <code>?smooth.terms</code> and\n<code>?smooth.construct.re.smooth.spec</code> for details about the\n<code>re</code> basis construction that is used by both\n<code>mvgam</code> and <code>mgcv</code></p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>model_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  <span class=\"co\"># Create a &#39;year_fac&#39; factor version of &#39;year&#39;</span></span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">year_fac =</span> <span class=\"fu\">factor</span>(year)) <span class=\"ot\">-&gt;</span> model_data</span></code></pre></div>\n<p>Preview the dataset to ensure year is now a factor with a unique\nfactor level for each year in the data</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(model_data)</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 80</span></span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 7</span></span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, PP, …</span></span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year      &lt;int&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, …</span></span>\n<span id=\"cb11-6\"><a href=\"#cb11-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;int&gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…</span></span>\n<span id=\"cb11-7\"><a href=\"#cb11-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ count     &lt;int&gt; 0, NA, 0, 1, 7, 7, 8, 8, 4, NA, 0, 0, 0, 0, 0, 0, NA, 2, 4, …</span></span>\n<span id=\"cb11-8\"><a href=\"#cb11-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ mintemp   &lt;dbl&gt; -0.79633807, -1.33471597, -1.24166462, -1.08048145, -0.42447…</span></span>\n<span id=\"cb11-9\"><a href=\"#cb11-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12 &lt;dbl&gt; -0.172144125, -0.237363477, -0.212120638, -0.160438125, -0.0…</span></span>\n<span id=\"cb11-10\"><a href=\"#cb11-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year_fac  &lt;fct&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, …</span></span>\n<span id=\"cb11-11\"><a href=\"#cb11-11\" tabindex=\"-1\"></a><span class=\"fu\">levels</span>(model_data<span class=\"sc\">$</span>year_fac)</span>\n<span id=\"cb11-12\"><a href=\"#cb11-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] &quot;1&quot; &quot;2&quot; &quot;3&quot; &quot;4&quot; &quot;5&quot; &quot;6&quot; &quot;7&quot;</span></span></code></pre></div>\n<p>We are now ready for our first <code>mvgam</code> model. The syntax\nwill be familiar to users who have previously built models with\n<code>mgcv</code>. But for a refresher, see <code>?formula.gam</code>\nand the examples in <code>?gam</code>. Random effects can be specified\nusing the <code>s</code> wrapper with the <code>re</code> basis. Note\nthat we can also suppress the primary intercept using the usual\n<code>R</code> formula syntax <code>- 1</code>. <code>mvgam</code> has a\nnumber of possible observation families that can be used, see\n<code>?mvgam_families</code> for more information. We will use\n<code>Stan</code> as the fitting engine, which deploys Hamiltonian Monte\nCarlo (HMC) for full Bayesian inference. By default, 4 HMC chains will\nbe run using a warmup of 500 iterations and collecting 500 posterior\nsamples from each chain. The package will also aim to use the\n<code>Cmdstan</code> backend when possible, so it is recommended that\nusers have an up-to-date installation of <code>Cmdstan</code> and the\nassociated <code>cmdstanr</code> interface on their machines (note that\nyou can set the backend yourself using the <code>backend</code>\nargument: see <code>?mvgam</code> for details). Interested users should\nconsult the <a href=\"https://mc-stan.org/docs/stan-users-guide/index.html\" target=\"_blank\"><code>Stan</code> user’s guide</a> for more information\nabout the software and the enormous variety of models that can be\ntackled with HMC.</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a>model1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data</span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically for each timepoint <span class=\"math inline\">\\(t\\)</span> as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = \\beta_{year[year_t]} \\\\\n\\beta_{year} &amp; \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year})\n\\end{align*}\\]</span></p>\n<p>Where the <span class=\"math inline\">\\(\\beta_{year}\\)</span> effects\nare drawn from a <em>population</em> distribution that is parameterized\nby a common mean <span class=\"math inline\">\\((\\mu_{year})\\)</span> and\nvariance <span class=\"math inline\">\\((\\sigma_{year})\\)</span>. Priors on\nmost of the model parameters can be interrogated and changed using\nsimilar functionality to the options available in <code>brms</code>. For\nexample, the default priors on <span class=\"math inline\">\\((\\mu_{year})\\)</span> and <span class=\"math inline\">\\((\\sigma_{year})\\)</span> can be viewed using the\nfollowing code:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">get_mvgam_priors</span>(count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data</span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb13-5\"><a href=\"#cb13-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      param_name param_length           param_info</span></span>\n<span id=\"cb13-6\"><a href=\"#cb13-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             vector[1] mu_raw;            1 s(year_fac) pop mean</span></span>\n<span id=\"cb13-7\"><a href=\"#cb13-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 vector&lt;lower=0&gt;[1] sigma_raw;            1   s(year_fac) pop sd</span></span>\n<span id=\"cb13-8\"><a href=\"#cb13-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                  prior                 example_change</span></span>\n<span id=\"cb13-9\"><a href=\"#cb13-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1               mu_raw ~ std_normal();  mu_raw ~ normal(-0.88, 0.73);</span></span>\n<span id=\"cb13-10\"><a href=\"#cb13-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 sigma_raw ~ inv_gamma(1.418, 0.452); sigma_raw ~ exponential(0.15);</span></span>\n<span id=\"cb13-11\"><a href=\"#cb13-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   new_lowerbound new_upperbound</span></span>\n<span id=\"cb13-12\"><a href=\"#cb13-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1             NA             NA</span></span>\n<span id=\"cb13-13\"><a href=\"#cb13-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2             NA             NA</span></span></code></pre></div>\n<p>See examples in <code>?get_mvgam_priors</code> to find out different\nways that priors can be altered. Once the model has finished, the first\nstep is to inspect the <code>summary()</code> to ensure no major\ndiagnostic warnings have been produced and to quickly summarise\nposterior distributions for key parameters</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model1)</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb14-14\"><a href=\"#cb14-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-15\"><a href=\"#cb14-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb14-16\"><a href=\"#cb14-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb14-17\"><a href=\"#cb14-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-18\"><a href=\"#cb14-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb14-19\"><a href=\"#cb14-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb14-20\"><a href=\"#cb14-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-21\"><a href=\"#cb14-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb14-22\"><a href=\"#cb14-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb14-23\"><a href=\"#cb14-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb14-24\"><a href=\"#cb14-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb14-25\"><a href=\"#cb14-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-26\"><a href=\"#cb14-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb14-27\"><a href=\"#cb14-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb14-28\"><a href=\"#cb14-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).1 0.930 1.3   1.6    1  2517</span></span>\n<span id=\"cb14-29\"><a href=\"#cb14-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).2 0.870 1.2   1.5    1  2716</span></span>\n<span id=\"cb14-30\"><a href=\"#cb14-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).3 0.085 0.6   1.1    1  2154</span></span>\n<span id=\"cb14-31\"><a href=\"#cb14-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).4 2.000 2.3   2.5    1  2367</span></span>\n<span id=\"cb14-32\"><a href=\"#cb14-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).5 1.100 1.5   1.8    1  2517</span></span>\n<span id=\"cb14-33\"><a href=\"#cb14-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).6 1.500 1.8   2.1    1  2511</span></span>\n<span id=\"cb14-34\"><a href=\"#cb14-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).7 1.800 2.1   2.3    1  2228</span></span>\n<span id=\"cb14-35\"><a href=\"#cb14-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-36\"><a href=\"#cb14-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM group-level estimates:</span></span>\n<span id=\"cb14-37\"><a href=\"#cb14-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb14-38\"><a href=\"#cb14-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mean(s(year_fac)) 0.87 1.5   1.9 1.02   368</span></span>\n<span id=\"cb14-39\"><a href=\"#cb14-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sd(s(year_fac))   0.35 0.6   1.2 1.01   345</span></span>\n<span id=\"cb14-40\"><a href=\"#cb14-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-41\"><a href=\"#cb14-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb14-42\"><a href=\"#cb14-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value    </span></span>\n<span id=\"cb14-43\"><a href=\"#cb14-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac) 6.095      7  234.5  &lt;2e-16 ***</span></span>\n<span id=\"cb14-44\"><a href=\"#cb14-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb14-45\"><a href=\"#cb14-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb14-46\"><a href=\"#cb14-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-47\"><a href=\"#cb14-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb14-48\"><a href=\"#cb14-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb14-49\"><a href=\"#cb14-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb14-50\"><a href=\"#cb14-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb14-51\"><a href=\"#cb14-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb14-52\"><a href=\"#cb14-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-53\"><a href=\"#cb14-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb14-54\"><a href=\"#cb14-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb14-55\"><a href=\"#cb14-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb14-56\"><a href=\"#cb14-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb14-57\"><a href=\"#cb14-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The diagnostic messages at the bottom of the summary show that the\nHMC sampler did not encounter any problems or difficult posterior\nspaces. This is a good sign. Posterior distributions for model\nparameters can be extracted in any way that an object of class\n<code>brmsfit</code> can (see <code>?mvgam::mvgam_draws</code> for\ndetails). For example, we can extract the coefficients related to the\nGAM linear predictor (i.e. the <span class=\"math inline\">\\(\\beta\\)</span>’s) into a <code>data.frame</code>\nusing:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a>beta_post <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(model1, <span class=\"at\">variable =</span> <span class=\"st\">&quot;betas&quot;</span>)</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(beta_post)</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 2,000</span></span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 7</span></span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).1` &lt;dbl&gt; 1.42562, 1.13259, 1.60469, 1.05618, 1.30829, 1.36421, …</span></span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).2` &lt;dbl&gt; 1.360710, 1.224610, 1.352340, 1.080130, 1.495370, 1.24…</span></span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).3` &lt;dbl&gt; 0.726486, 0.540769, 0.706619, 0.477383, 0.872224, 0.77…</span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).4` &lt;dbl&gt; 2.30283, 2.09318, 2.36101, 2.18330, 2.24543, 2.51212, …</span></span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).5` &lt;dbl&gt; 1.338800, 0.903048, 1.296670, 1.423650, 1.654660, 1.51…</span></span>\n<span id=\"cb15-10\"><a href=\"#cb15-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).6` &lt;dbl&gt; 1.90255, 1.88174, 1.72255, 1.94652, 2.00091, 1.78989, …</span></span>\n<span id=\"cb15-11\"><a href=\"#cb15-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).7` &lt;dbl&gt; 2.26354, 2.15511, 2.05374, 2.10885, 2.23140, 2.23759, …</span></span></code></pre></div>\n<p>With any model fitted in <code>mvgam</code>, the underlying\n<code>Stan</code> code can be viewed using the <code>stancode()</code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(model1)</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb16-9\"><a href=\"#cb16-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb16-10\"><a href=\"#cb16-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb16-11\"><a href=\"#cb16-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb16-12\"><a href=\"#cb16-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb16-13\"><a href=\"#cb16-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb16-14\"><a href=\"#cb16-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-15\"><a href=\"#cb16-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb16-16\"><a href=\"#cb16-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb16-17\"><a href=\"#cb16-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb16-18\"><a href=\"#cb16-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-19\"><a href=\"#cb16-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect variances</span></span>\n<span id=\"cb16-20\"><a href=\"#cb16-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[1] sigma_raw;</span></span>\n<span id=\"cb16-21\"><a href=\"#cb16-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-22\"><a href=\"#cb16-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // random effect means</span></span>\n<span id=\"cb16-23\"><a href=\"#cb16-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[1] mu_raw;</span></span>\n<span id=\"cb16-24\"><a href=\"#cb16-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-25\"><a href=\"#cb16-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb16-26\"><a href=\"#cb16-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb16-27\"><a href=\"#cb16-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb16-28\"><a href=\"#cb16-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : 7] = mu_raw[1] + b_raw[1 : 7] * sigma_raw[1];</span></span>\n<span id=\"cb16-29\"><a href=\"#cb16-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-30\"><a href=\"#cb16-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb16-31\"><a href=\"#cb16-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population variances</span></span>\n<span id=\"cb16-32\"><a href=\"#cb16-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma_raw ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb16-33\"><a href=\"#cb16-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-34\"><a href=\"#cb16-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for random effect population means</span></span>\n<span id=\"cb16-35\"><a href=\"#cb16-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   mu_raw ~ std_normal();</span></span>\n<span id=\"cb16-36\"><a href=\"#cb16-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-37\"><a href=\"#cb16-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior (non-centred) for s(year_fac)...</span></span>\n<span id=\"cb16-38\"><a href=\"#cb16-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1 : 7] ~ std_normal();</span></span>\n<span id=\"cb16-39\"><a href=\"#cb16-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb16-40\"><a href=\"#cb16-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb16-41\"><a href=\"#cb16-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b);</span></span>\n<span id=\"cb16-42\"><a href=\"#cb16-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb16-43\"><a href=\"#cb16-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb16-44\"><a href=\"#cb16-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb16-45\"><a href=\"#cb16-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb16-46\"><a href=\"#cb16-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb16-47\"><a href=\"#cb16-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb16-48\"><a href=\"#cb16-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb16-49\"><a href=\"#cb16-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb16-50\"><a href=\"#cb16-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb16-51\"><a href=\"#cb16-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb16-52\"><a href=\"#cb16-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span></span>\n<span id=\"cb16-53\"><a href=\"#cb16-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb16-54\"><a href=\"#cb16-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb16-55\"><a href=\"#cb16-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<div id=\"plotting-effects-and-residuals\" class=\"section level3\">\n<h3>Plotting effects and residuals</h3>\n<p>Now for interrogating the model. We can get some sense of the\nvariation in yearly intercepts from the summary above, but it is easier\nto understand them using targeted plots. Plot posterior distributions of\nthe temporal random effects using <code>plot.mvgam()</code> with\n<code>type = &#39;re&#39;</code>. See <code>?plot.mvgam</code> for more details\nabout the types of plots that can be produced from fitted\n<code>mvgam</code> objects</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;re&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"bayesplot-support\" class=\"section level3\">\n<h3><code>bayesplot</code> support</h3>\n<p>We can also capitalize on most of the useful MCMC plotting functions\nfrom the <code>bayesplot</code> package to visualize posterior\ndistributions and diagnostics (see <code>?mvgam::mcmc_plot.mvgam</code>\nfor details):</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"at\">object =</span> model1,</span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&quot;betas&quot;</span>,</span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;areas&quot;</span></span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can also use the wide range of posterior checking functions\navailable in <code>bayesplot</code> (see\n<code>?mvgam::ppc_check.mvgam</code> for details):</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">pp_check</span>(<span class=\"at\">object =</span> model1)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>There is clearly some variation in these yearly intercept estimates.\nBut how do these translate into time-varying predictions? To understand\nthis, we can plot posterior hindcasts from this model for the training\nperiod using <code>plot.mvgam()</code> with\n<code>type = &#39;forecast&#39;</code></p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAAAZlBMVEUAAAAAADoAAGYAOpAAZrY6AAA6ADo6AGY6kNtmAABmADpmtrZmtv+PJyeQOgCQOjqQZgCQ2/+iUFC2ZgC2/7a2//+5fHzHmZnbkDrb/7bb/9vb///cvLz/tmb/25D//7b//9v///+fov9nAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAV+klEQVR4nO2d2WLbuhUAmdi+jVvHt44bSW0o2/r/n6y4igtW4hxumnlIZBo6AsAxCWFjdgFQIFs6A7BPEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQCxQAbFABcQCFWTFyvAUKhALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEEuN7K5rA7G0yLK7NguxtEAsyWh3XJNDEEsy2h3X5Ii79gqxQAfEAhUQC1SIM+HrtWySZt9/W6IhFlREmXDKXqoX5+yHORpiQUWMCV+vrU6nhz/GaIgFFTEmfD6/NC/P5pshYkENVyxQIa6N9e2tevHxRBsLnMSZ8PlcfSs0X68QC1roxwIVZEzIWkTCwfaJM+F0Vaf8ZnjiWyE4iWu8X3X6eHq8IBb4iOtuKK5Wn8/XpjtigZsJHaSFWYgFbuKvWMX/j4gFbqLbWAUfT5b5DYgFNXEmNLMavl4RC5zQQQoqIBaogFigAmLdAwuMtSHWHbDEKC5i3QGIBSogFuhAGwv2AmKBCogFKiAWqIBYoAJigQqIBSogFqiAWKACYoEKiAUqIBaogFigAmKBCogFKiAWqIBYoAJigQqIBSogFqiAWKACYoEKiAUqIBaogFigAmKBCogFKiAWqIBYoAJigQqIBSogFqiAWKACYoEKiAUqIJYCPMIYsTTg4dgXxNIAsS6INYnc/WvEuiDWJDxi0ca6INYU8txnFiDWBBArAMSKJkesAGJM+Hwungh9vrYgzE+EviOxMMtHY8LpqsuLJ20p1umxfGVOew9i5YgVQm3C6dvb5ePphzttIVat1PnhjzEaYkFFZcLXa+HUyWxLSyHWx19vxcuz+WZ4P2JhlofKhLr1ZGs61RSpvv6uxLrbK1aOWEH0xPr25kz7+Vx0KT+26Q3REAsqYsQqE2bXRCdbO3//YuU5ZgURKZYvGmJBhYxYWYtYxtZJnsLSmZ+VRqybGp4WvDsaYmFWBUM6USBWKHFDOr7rGmIhVk3MkM7l69Vzn0QsxKqJGdIpzHp0R0MsxKqIGdK5FFMbnJc1xEKsmpghnYBoiIVYFXSQRoFYoSBWFIgVCmJFgVihIFYUdyNWOTqXMkTHkE4U9yJW+uAvQzpRIFZwBMnsINYWxRpmq/gZsWbmXsSSamNJgVjbM2uYLaFsIlYUiBUKYkWxP7FG2RLKZ2vC16t31kxANMTaoli54+eptCbYVnTFRUOsjYk1ypdURjtXLMTys1OxcuvPk7mZUC+eT4uGWNsSa5QxsZx2boUM6fhBrFD4VhjFzsQa5Uwuq4gVQ6JXdyrWx9P1Rpg2cwaxNiKWfn5vJpyzckGFfxGYK9p9iHVELC+d7oZqZde7f6mOIxpiIVbFqIP0xLdCO7VXx6lmLZ3/lhnF4ooVAGIFQxsrhsYrxPLCt8IYWrE2btYM2aUfK4bWK8Ty0S7/+vxn+lAhYiFWA2LFcBNrollLF6BmNrHK7bEYhPZy8wqxPNz6sbhi+dmJWHNkl8Z7DDevJpo1e46NK7gQa21sTizzmlPEWhsdryaAWNOjIZbbrLkzjFjbYHNi0cbaBtsTy0SwV4g1F4gVzM2EYt7MKctSZs0gFmI13Ex4//774+nR94gATzTEQqyK3kro4vEAzCB1kCzWKsyaV6xianLx4BPEcrALscK9EhPrejcMee6JI9q+xcoRK5hOG+vhv8+PiZvO7F2sy2WaUfX7ViNWqF0Jn9L9Vph9/53Wdt+7WEV34ySv6vetRawiP/OJJcHOxSoHSKZ5Vb5vJWJV+UGs9VCekEM0zfvExAq7j9l16f+BdH7T+WuQE+t6K2QGqZuJYh2a90l1ZCWKlQ+uvEaxjmJivSc/rXD3YuXTvCrNOqxIrLx/R9cViz1I/eT5JK1aViPWoNvEejQhj4gVAWKFM9q7IQnE2rJYRxWxfM8RL/E18BFrk2IdjQfTchu1uW27Y0i1gYgh2s7FOq5CrHSvjGINvRISK4DOVvCWEUXE2oZYY4UWFevzub1Zns3XNcTaplhH48HjXNsYccVKF0vCLB2xxl4JiRWw8dqp0e7jiTYWYjmJ2yqyaeHb0iCWlljdZVwKYh3NM80S6orNbSNYTqzewtNtiZW0uW36s6k3QX78FcHPn4MDCa33bt2mexXyByImFpvb+okVa2TWhsQ6iInF5rZelhPrInwnnFUsL23nvLV/HrG6Xo1uhjIdWTOJdZhPrGs7zNOy37tYB8QKZbRVpPNboW8KBGJ1vUKsgiCxfFMgEKsn1tAsEbHSvQoU6yAgVjMdpoB1hTbyCLEqpe5erAu7JgcQL9bArNWIFeTV1ayEbLL8K5wIsRqhEEuG+xDrctm2WIF3QgmxPp8f/hswg9Qf7R7EKjorA70amCUyvWFGsQ4J2eSKFU4h1s+f1fDKTw83sboHEWtqtH2LdSzsCBKrPTV9sQ7pYqV7VYjlvZdXJOSzY0IxryFkqY4r2u7FOtwWzEdzfXd4I8uWzuHLSsWqekZtc0MDo92DWIeJXt2pWO1EP3b0s9GINZUYsXJbQocuoWZdm1hLiMW3QhuIFYHMDNI2GmLJiJVHi3UMFus4r1jMIPUys1jmlC6xwswKb2IJfSss5/GlbZKFWDJi5VaxnF6tVCwBEEtSLFNSt1hBZiHW2sgPM4nVKOD4ldkrxNok6WL9WpVY5sH07tGEylrJIHS1CEV0XaJ8yLnEujlgKJPTqyCzWq+Mg+m9owmVtY4rVrVsTnTFq0LIVLGub08TqyyNjFi2Mc/B0emVhVjhFGIZV6IHUok1nVaslEwU+fhlH0wXFsu/YjAwGmK5qFrv03GLdQg9eqhmiZXRRrfC3tGU+m9fVcPPp6Sl0PtvYy0qVl7fCc0GxYr1yzxhUbqNxZCOlzzRq3SxaiximcwyHT2M9yuxkFBZDEKHs2qxDuFiGTbCURSLK5aPfC1i2byyiDU6PK9YzSD0Mm2sLbB+sQx3PcPR8Duh5CB0yvVq72Id1yvWYc1iCYBYHrF+LSHW4DBirYy1iGX3anxxMh0Nb2LJ3Qof/vea9AwwxHKS2vVuE+vgEat/eG6xzt/eTg9/WKVjpS9W9WD64WPt3Y+5lxSro8thKFabC7NYwV4JdTf8KFfozLhKp+wVF+1tF47WD9wTq3ow/fCx9r7H3MuJ1fGlN87dy4X5SjazWEUHaSnWbB2kt+HJ6R9oCikWbRi4I1Z3KLLvldMsMbE6whyGYt1ysQqxig7SQiydDlJD/XTESq/sbkjjbxIpA1/vZP1PGn6e/fNLZPobCjXcNphHl28Ua/3DSKmx9tU5e7mKpbRKx1RD8mLl9mgJhaoK1her/qTh53lKM49YlmkLPbECtwVJqbHby7KDVGmfd2MVlSdB0itHtJRSVSXL8q5Y9ScNP89dmpnEskxbWEwsAeLEmhOBwvXFmsJcYrkpmliBOxkl1FanjZW0z0wdDbFcSIh13JpYzbSZJPYtVvJ3Oomu92SvarGCzEqorV4/VjLrFUti4/79iDXq/lIU6/LxV/p+3IjlRKLrXUysELMSaqtzK6y/+6t0kCbWpgDTC9WWYR9i1XfC2cQSAbHcpHe9izWxgsxKqK1dimX6vPTCbU0sy3b0M4t1ut4E0/sb1iGWeSV6cuE2JpZtO/qmiRViVkJt1SYUU93TZsxU0dYglmXELrVsaxLLt8u8e9fwGcWq+hqSZsxU0fYslsDchLKHNJEgrVxiFXfC0KqcTrPEvhDrnLad32UlYlmGghOLVoqVmrNWLL9e1hShE0AdQ9Gzi5U2An1Zi1jmoeDEom1OLMdQNGKJkli2XEasptfb55U1RcSUdatXiCVJYtkQKwrECiV9csOVer+ag88se4J0r+YV6zadc6dDOmsS6xAkljmFiFgzVNkue97NJJZNoBsrrxf6HHxmORIgVo/kMyJBWtnkxDoEimVMMWcTC7HCSCubuFh2sxwJZm1izSVW3cR3tMMQy4NbrGYFczmYMpdYnZMzOk8J1RUt1umxfGUesEYsD4VYt6G4oVe3dabFS6NZ4k2szoj9ePA+obpixaqVOpuHFRHLg0usdgVz5VVhlr5YnYFVwxhrQnXFilVPYB4MK946KyxvNVzUZyXQtOHRbrJSLFf1eE9IJZb1hHdWMLsWM3dmJwjUxmrE+vq7EivyijUsWvIYf0JdOipueLSbLC+6sZz14z0hebHbpP1S0rHJLtZtnp5MZXRsWlCs4pOrNpZ56hZipYjVHTZ2XbBExeqO2C/VxrqUbn17sz+GNVQs/1iZNGaxBjU3PNpL5hfL9dSu5veH1CZSsaOHUmX4//AimKkfa1AyxFpSrGCvNinWzGaF1Nzo8ESxXL93td5Xd8HanFj+QVh5AqpueLSfLEAsx7Ocm18j1rRoWxZrdLR/4BgqlvPX6WKl19zOxVrdvXB0GLEiTv2QJcTyj+4r4K+74dFBshCxLnOIpVUTuxFrXrO8dTc6PPg56Lm7npORezqyVnbB2pdYU8d/fO/bj1hJI2RR47ZRJ7/PAmJZR/ergmfurdKtFeZ7n6fyRoeHP/uGCusw7t9KiDW1htpqukuxvFulOyrM/b7ViJXGYWoNdappR2IF/0l6Nymf9j6HWKGEtN19pIvVTKmZWIjmzfb89ZNPZ21ieTcpn/i+1Yh1SOWYIlbuFmuhGaQB0dLF8m1SPvF9qxErcId1h1jHBK+aGQyODHZJKOr6xNIh/V64HrEEnsfjymFAqgAQK5SViOX6HhKOK4cBqQJArFAkxBJoZIl4hViSZiWeiz2J5c5hQCo/iBUKYkVxR2IlnpA7EesSlMgPYoVyFSu9gvJUsZSbWBfEUhPLNkq7CbECh5g9WUSsGALFso7SbkGswCFmbx7TvZpNrNSx11RCxbKOxIWNQfvQFSt0GNGbx+2ItbRXwas8rXMHxMQqmTg54ejuHpURS4aZxEr7M03HvOGBad6OXSyREzLFrH7i1g6DMYi1XrGOlslOmxAr8NHtAuXwcidi1bsVD7yKmD9+EBYrwqxB4pscAQohlr5Y40vWvYolUAw/axEreTZJvFiHRcUKNmuQtmsHYnnFOoY9/DrJLJNYoWYdlhUrH/w4XlGLWKsRq/3gYLEkaiharGFixOrh90rbrNWJFWiWS6yJZkmUw8sqxOqeaS1+Dc3qfbbXq4XFygc/j6OtzKs1iaVr1lCswWfPJVasWcO0AzkQK8CryWaF9WY4xfKsWp9TrH5WEKuKtoRY9Wb7PvqXrP6ne1atH3TEMprVz8oo7dANIbHsG6lPZQViGU93nFchZjkmWDie+N5hFrEGg+AzieXaon8i239IU9CQvoBYQvcQidKIZKQLYpkIGtK/iuUgZF3/PGIFlUYkI10Qy3YuvGncYoWs659JrJDSiGSkx2bbWGGGaOIxy89cYvkRyYc2iBUslkwVCRRFJiPKINbMYqVXhVA+lLkbsXLEmhXE2ppYQtnQ5n7ESjULsaJArI2JJZQLdZYRa27TqpWiXnfMK7bro5JirXwhhASLiBW32Xg69ed5vTJ2kzZHBcVKKH+nqgd1Ld/HmcQSYiVtKD3lZNSfF+DV2Kz2qJxYKeW/1fRAJIVRmSRmEmuYTLkSBmci7ESak92OymVPoPyIZU6mXQlTxLKM/yLWJBYRS789MLh3BN55zMnEvRIpP22sZeh51T0wmQULs0UQC7FU2LlYowOINRN7FWv8QHnEmpV9izU6gFhzsVuxxs/9Rqw52bVYowOINRtxJny9lv1w2ffflmhrFqsz/tvbzRyxNIgy4ZS9VC/O2Q9zNEu4TuddTD9elbb8t/Oye8DFUIWyo7P8t9NhGj4eHJxrd2lcB/ZETNG+XludTg9/jNHM4TrDDTEjD1XarGV8wMlAheGbW68CzQrMtKc0rgO7IqZkn88vzctz/2boOdfLiOWLFp2fNBDLysauWL5o0flJA7HsnL69VS8+njbQxvJGi85PGqNP2rNXkd8KP5+rv3bz9Wpd3wphUfbbjwWLgligAmKBCogFKiAWqIBYoAJigQrSYsHOQSxQYRmx5vwAAq86MGIRWCUwYhFYJTBiEVglMGIRWCUwYhFYJTBiEVglMGIRWCUwYhFYJTCDe6ACYoEKiAUqIBaogFigAmKBCogFKiAWqIBYoAJigQqIBSogFqiAWKCCtlgf/7BssCwQ9Jxl2aNg2Pcsq3aWOwkHLmKXW4pJ57gb7922aVlS4Mk5Vhbr89m2c3d60PO1Jj+e5M7T+zXqudgX+pT9uL4QNetc7lVXRP98lgvcrYGzdTe8KYGbjE7Psa5YZ/uW8MlBP5+L7SpPYvE/nq5Ofb0+1hUpF/hS7oR4Pe1fr8W5b/fbFIh6q4HqE4RoM1pUx7XCp+RYVayPpx+i56cXdFJxfRQ1WRomeP6LYA//VhCrWwPVJwjRZrTaa9a246wT7TaWvFhN0NP3/zyLN4VuZ/1dMOMff729326FYgJ0aqD5BCGajFZ/Y9WVMZINi1W0tKtrtRTXm2xThSfLszemUGxjXp32j6dMMO6tBm6fIESd0bLJOa2RtWWxilMkfENsrieibfdiU/zytL+XIojVyK0G2k8QosnofYpVKnXOXrzJo0KXUSWvV8VtquoMqNoqk24sRtoaaD9BiDajd3krPKuIVcZ7l/Sq7BW78u2tyqvc3butgfYTpAI3GW0a7xPqeLtiVYU+y3Y3lFeBk7CsBRpXrH4NaFyx1trdcNEUq/y383ifVMpKLM76pG/XPjTaWP0a0GhjrbaDVFWscrhB0oH3Kp70jaWKXZ72IrT0yEtTA6LfCtuMrnVIB+4VxAIVEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQCxQAbFABcQCFRALVEAsUAGxQAXEAhUQC1RALFABsUAFxAIVEAtUQKwIzlnDi+hOCXsEsSKR3pBrryBWJIgVBmJFUov1Xmwp/K/n603xen+st5eU3VRp4yBWJF2xvv++vGcPf8pt0YutAFW2bNsoiBVJV6xmw+rT99+VUyrbzG0TxIqkK9ZLvT/n1adqn85J28DuE8SKxCLWqemHWDp/awGxInFesaAFsSKxiFVvjY1eDYgViUWscgdryWcRbh3EisQmlsZjWbcMYoEKiAUqIBaogFigAmKBCogFKiAWqIBYoAJigQqIBSogFqiAWKACYoEKiAUqIBaogFigAmKBCogFKiAWqIBYoAJigQqIBSogFqiAWKDC/wGhsV9JsJjpjgAAAABJRU5ErkJggg==\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>If you wish to extract these hindcasts for other downstream analyses,\nthe <code>hindcast()</code> function can be used. This will return a\nlist object of class <code>mvgam_forecast</code>. In the\n<code>hindcasts</code> slot, a matrix of posterior retrodictions will be\nreturned for each series in the data (only one series in our\nexample):</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>hc <span class=\"ot\">&lt;-</span> <span class=\"fu\">hindcast</span>(model1)</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(hc)</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 15</span></span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ call              :Class &#39;formula&#39;  language count ~ s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;.Environment&quot;)=&lt;environment: 0x0000018e48f5c728&gt; </span></span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family            : chr &quot;poisson&quot;</span></span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_model       : chr &quot;None&quot;</span></span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span id=\"cb21-11\"><a href=\"#cb21-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ fit_engine        : chr &quot;stan&quot;</span></span>\n<span id=\"cb21-12\"><a href=\"#cb21-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ type              : chr &quot;response&quot;</span></span>\n<span id=\"cb21-13\"><a href=\"#cb21-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_names      : chr &quot;PP&quot;</span></span>\n<span id=\"cb21-14\"><a href=\"#cb21-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_observations:List of 1</span></span>\n<span id=\"cb21-15\"><a href=\"#cb21-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:80] 0 NA 0 1 7 7 8 8 4 NA ...</span></span>\n<span id=\"cb21-16\"><a href=\"#cb21-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_times       :List of 1</span></span>\n<span id=\"cb21-17\"><a href=\"#cb21-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:80] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb21-18\"><a href=\"#cb21-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_observations : NULL</span></span>\n<span id=\"cb21-19\"><a href=\"#cb21-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_times        : NULL</span></span>\n<span id=\"cb21-20\"><a href=\"#cb21-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ hindcasts         :List of 1</span></span>\n<span id=\"cb21-21\"><a href=\"#cb21-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:80] 7 5 6 4 4 8 0 4 5 4 ...</span></span>\n<span id=\"cb21-22\"><a href=\"#cb21-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb21-23\"><a href=\"#cb21-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb21-24\"><a href=\"#cb21-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:80] &quot;ypred[1,1]&quot; &quot;ypred[2,1]&quot; &quot;ypred[3,1]&quot; &quot;ypred[4,1]&quot; ...</span></span>\n<span id=\"cb21-25\"><a href=\"#cb21-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ forecasts         : NULL</span></span>\n<span id=\"cb21-26\"><a href=\"#cb21-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;class&quot;)= chr &quot;mvgam_forecast&quot;</span></span></code></pre></div>\n<p>You can also extract these hindcasts on the linear predictor scale,\nwhich in this case is the log scale (our Poisson GLM used a log link\nfunction). Sometimes this can be useful for asking more targeted\nquestions about drivers of variation:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>hc <span class=\"ot\">&lt;-</span> <span class=\"fu\">hindcast</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a><span class=\"fu\">range</span>(hc<span class=\"sc\">$</span>hindcasts<span class=\"sc\">$</span>PP)</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] -0.306975  2.594950</span></span></code></pre></div>\n<p>In any regression analysis, a key question is whether the residuals\nshow any patterns that can be indicative of un-modelled sources of\nvariation. For GLMs, we can use a modified residual called the <a href=\"https://www.jstor.org/stable/1390802\" target=\"_blank\">Dunn-Smyth,\nor randomized quantile, residual</a>. Inspect Dunn-Smyth residuals from\nthe model using <code>plot.mvgam()</code> with\n<code>type = &#39;residuals&#39;</code></p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1, <span class=\"at\">type =</span> <span class=\"st\">&quot;residuals&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"automatic-forecasting-for-new-data\" class=\"section level2\">\n<h2>Automatic forecasting for new data</h2>\n<p>These temporal random effects do not have a sense of “time”. Because\nof this, each yearly random intercept is not restricted in some way to\nbe similar to the previous yearly intercept. This drawback becomes\nevident when we predict for a new year. To do this, we can repeat the\nexercise above but this time will split the data into training and\ntesting sets before re-running the model. We can then supply the test\nset as <code>newdata</code>. For splitting, we will make use of the\n<code>filter()</code> function from <code>dplyr</code></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a>model_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&lt;=</span> <span class=\"dv\">70</span>) <span class=\"ot\">-&gt;</span> data_train</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a>model_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&gt;</span> <span class=\"dv\">70</span>) <span class=\"ot\">-&gt;</span> data_test</span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a>model1b <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test</span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>We can view the test data in the forecast plot to see that the\npredictions do not capture the temporal variation in the test set</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model1b, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>As with the <code>hindcast()</code> function, we can use the\n<code>forecast()</code> function to automatically extract the posterior\ndistributions for these predictions. This also returns an object of\nclass <code>mvgam_forecast</code>, but now it will contain both the\nhindcasts and forecasts for each series in the data:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>fc <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(model1b)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a><span class=\"fu\">str</span>(fc)</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; List of 16</span></span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ call              :Class &#39;formula&#39;  language count ~ s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;.Environment&quot;)=&lt;environment: 0x0000018e48f5c728&gt; </span></span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_call        : NULL</span></span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family            : chr &quot;poisson&quot;</span></span>\n<span id=\"cb27-8\"><a href=\"#cb27-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ family_pars       : NULL</span></span>\n<span id=\"cb27-9\"><a href=\"#cb27-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ trend_model       : chr &quot;None&quot;</span></span>\n<span id=\"cb27-10\"><a href=\"#cb27-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ drift             : logi FALSE</span></span>\n<span id=\"cb27-11\"><a href=\"#cb27-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ use_lv            : logi FALSE</span></span>\n<span id=\"cb27-12\"><a href=\"#cb27-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ fit_engine        : chr &quot;stan&quot;</span></span>\n<span id=\"cb27-13\"><a href=\"#cb27-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ type              : chr &quot;response&quot;</span></span>\n<span id=\"cb27-14\"><a href=\"#cb27-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ series_names      : Factor w/ 1 level &quot;PP&quot;: 1</span></span>\n<span id=\"cb27-15\"><a href=\"#cb27-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_observations:List of 1</span></span>\n<span id=\"cb27-16\"><a href=\"#cb27-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:70] 0 NA 0 1 7 7 8 8 4 NA ...</span></span>\n<span id=\"cb27-17\"><a href=\"#cb27-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ train_times       :List of 1</span></span>\n<span id=\"cb27-18\"><a href=\"#cb27-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:70] 1 2 3 4 5 6 7 8 9 10 ...</span></span>\n<span id=\"cb27-19\"><a href=\"#cb27-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_observations :List of 1</span></span>\n<span id=\"cb27-20\"><a href=\"#cb27-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:10] NA 4 11 8 5 2 5 8 14 14</span></span>\n<span id=\"cb27-21\"><a href=\"#cb27-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ test_times        :List of 1</span></span>\n<span id=\"cb27-22\"><a href=\"#cb27-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: int [1:10] 71 72 73 74 75 76 77 78 79 80</span></span>\n<span id=\"cb27-23\"><a href=\"#cb27-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ hindcasts         :List of 1</span></span>\n<span id=\"cb27-24\"><a href=\"#cb27-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:70] 3 2 4 2 4 1 1 2 3 4 ...</span></span>\n<span id=\"cb27-25\"><a href=\"#cb27-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb27-26\"><a href=\"#cb27-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb27-27\"><a href=\"#cb27-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:70] &quot;ypred[1,1]&quot; &quot;ypred[2,1]&quot; &quot;ypred[3,1]&quot; &quot;ypred[4,1]&quot; ...</span></span>\n<span id=\"cb27-28\"><a href=\"#cb27-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  $ forecasts         :List of 1</span></span>\n<span id=\"cb27-29\"><a href=\"#cb27-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ..$ PP: num [1:2000, 1:10] 6 7 6 1 5 4 2 5 7 6 ...</span></span>\n<span id=\"cb27-30\"><a href=\"#cb27-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. ..- attr(*, &quot;dimnames&quot;)=List of 2</span></span>\n<span id=\"cb27-31\"><a href=\"#cb27-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : NULL</span></span>\n<span id=\"cb27-32\"><a href=\"#cb27-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   .. .. ..$ : chr [1:10] &quot;ypred[71,1]&quot; &quot;ypred[72,1]&quot; &quot;ypred[73,1]&quot; &quot;ypred[74,1]&quot; ...</span></span>\n<span id=\"cb27-33\"><a href=\"#cb27-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  - attr(*, &quot;class&quot;)= chr &quot;mvgam_forecast&quot;</span></span></code></pre></div>\n</div>\n<div id=\"adding-predictors-as-fixed-effects\" class=\"section level2\">\n<h2>Adding predictors as “fixed” effects</h2>\n<p>Any users familiar with GLMs will know that we nearly always wish to\ninclude predictor variables that may explain some of the variation in\nour observations. Predictors are easily incorporated into GLMs / GAMs.\nHere, we will update the model from above by including a parametric\n(fixed) effect of <code>ndvi_ma12</code> as a linear predictor:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a>model2 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(year_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb28-3\"><a href=\"#cb28-3\" tabindex=\"-1\"></a>    ndvi_ma12 <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb28-4\"><a href=\"#cb28-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb28-5\"><a href=\"#cb28-5\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb28-6\"><a href=\"#cb28-6\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test</span>\n<span id=\"cb28-7\"><a href=\"#cb28-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = \\beta_{year[year_t]} + \\beta_{ndvi} *\n\\boldsymbol{ndvi}_t \\\\\n\\beta_{year} &amp; \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\\\\n\\beta_{ndvi} &amp; \\sim \\text{Normal}(0, 1) \\end{align*}\\]</span></p>\n<p>Where the <span class=\"math inline\">\\(\\beta_{year}\\)</span> effects\nare the same as before but we now have another predictor <span class=\"math inline\">\\((\\beta_{ndvi})\\)</span> that applies to the\n<code>ndvi_ma12</code> value at each timepoint <span class=\"math inline\">\\(t\\)</span>. Inspect the summary of this model</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model2)</span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ ndvi_ma12 + s(year_fac, bs = &quot;re&quot;) - 1</span></span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb29-5\"><a href=\"#cb29-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-6\"><a href=\"#cb29-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb29-7\"><a href=\"#cb29-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb29-8\"><a href=\"#cb29-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-9\"><a href=\"#cb29-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb29-10\"><a href=\"#cb29-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb29-11\"><a href=\"#cb29-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-12\"><a href=\"#cb29-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb29-13\"><a href=\"#cb29-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb29-14\"><a href=\"#cb29-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-15\"><a href=\"#cb29-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb29-16\"><a href=\"#cb29-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb29-17\"><a href=\"#cb29-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-18\"><a href=\"#cb29-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb29-19\"><a href=\"#cb29-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb29-20\"><a href=\"#cb29-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-21\"><a href=\"#cb29-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb29-22\"><a href=\"#cb29-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb29-23\"><a href=\"#cb29-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb29-24\"><a href=\"#cb29-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb29-25\"><a href=\"#cb29-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-26\"><a href=\"#cb29-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb29-27\"><a href=\"#cb29-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb29-28\"><a href=\"#cb29-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ndvi_ma12     -0.390 0.045   0.5    1  1595</span></span>\n<span id=\"cb29-29\"><a href=\"#cb29-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).1  0.900 1.300   1.6    1  2451</span></span>\n<span id=\"cb29-30\"><a href=\"#cb29-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).2  0.870 1.200   1.5    1  2633</span></span>\n<span id=\"cb29-31\"><a href=\"#cb29-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).3  0.083 0.590   1.0    1  2163</span></span>\n<span id=\"cb29-32\"><a href=\"#cb29-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).4  2.000 2.300   2.5    1  1831</span></span>\n<span id=\"cb29-33\"><a href=\"#cb29-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).5  1.100 1.500   1.8    1  2202</span></span>\n<span id=\"cb29-34\"><a href=\"#cb29-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).6  1.600 1.800   2.1    1  3045</span></span>\n<span id=\"cb29-35\"><a href=\"#cb29-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).7 -0.310 1.400   2.8    1  1313</span></span>\n<span id=\"cb29-36\"><a href=\"#cb29-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-37\"><a href=\"#cb29-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM group-level estimates:</span></span>\n<span id=\"cb29-38\"><a href=\"#cb29-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb29-39\"><a href=\"#cb29-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mean(s(year_fac)) 0.72 1.3   1.8 1.01   485</span></span>\n<span id=\"cb29-40\"><a href=\"#cb29-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sd(s(year_fac))   0.33 0.6   1.3 1.00   507</span></span>\n<span id=\"cb29-41\"><a href=\"#cb29-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-42\"><a href=\"#cb29-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb29-43\"><a href=\"#cb29-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value    </span></span>\n<span id=\"cb29-44\"><a href=\"#cb29-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac) 5.261      7  177.6  &lt;2e-16 ***</span></span>\n<span id=\"cb29-45\"><a href=\"#cb29-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb29-46\"><a href=\"#cb29-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb29-47\"><a href=\"#cb29-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-48\"><a href=\"#cb29-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb29-49\"><a href=\"#cb29-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb29-50\"><a href=\"#cb29-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb29-51\"><a href=\"#cb29-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb29-52\"><a href=\"#cb29-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb29-53\"><a href=\"#cb29-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-54\"><a href=\"#cb29-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb29-55\"><a href=\"#cb29-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb29-56\"><a href=\"#cb29-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb29-57\"><a href=\"#cb29-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb29-58\"><a href=\"#cb29-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Rather than printing the summary each time, we can also quickly look\nat the posterior empirical quantiles for the fixed effect of\n<code>ndvi</code> (and other linear predictor coefficients) using\n<code>coef</code>:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a><span class=\"fu\">coef</span>(model2)</span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      2.5%       50%     97.5% Rhat n_eff</span></span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ndvi_ma12     -0.39239295 0.0454631 0.5002432    1  1595</span></span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).1  0.90208663 1.2598350 1.5620722    1  2451</span></span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).2  0.87452045 1.2055800 1.5018923    1  2633</span></span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).3  0.08311501 0.5945600 1.0277267    1  2163</span></span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).4  2.01673475 2.2694600 2.4863652    1  1831</span></span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).5  1.06976925 1.4577300 1.7888065    1  2202</span></span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).6  1.57686075 1.8460300 2.1110565    1  3045</span></span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(year_fac).7 -0.30962118 1.3544650 2.7908662    1  1313</span></span></code></pre></div>\n<p>Look at the estimated effect of <code>ndvi</code> using using a\nhistogram. This can be done by first extracting the posterior\ncoefficients:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb31-1\"><a href=\"#cb31-1\" tabindex=\"-1\"></a>beta_post <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(model2, <span class=\"at\">variable =</span> <span class=\"st\">&quot;betas&quot;</span>)</span>\n<span id=\"cb31-2\"><a href=\"#cb31-2\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(beta_post)</span>\n<span id=\"cb31-3\"><a href=\"#cb31-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 2,000</span></span>\n<span id=\"cb31-4\"><a href=\"#cb31-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 8</span></span>\n<span id=\"cb31-5\"><a href=\"#cb31-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ ndvi_ma12       &lt;dbl&gt; -0.59960500, 0.45922600, 0.55956400, 0.39627800, 0.178…</span></span>\n<span id=\"cb31-6\"><a href=\"#cb31-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).1` &lt;dbl&gt; 1.121480, 1.560650, 1.280340, 1.279720, 1.355980, 1.29…</span></span>\n<span id=\"cb31-7\"><a href=\"#cb31-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).2` &lt;dbl&gt; 1.10624, 1.37323, 1.15708, 1.02976, 1.20075, 1.17569, …</span></span>\n<span id=\"cb31-8\"><a href=\"#cb31-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).3` &lt;dbl&gt; 0.7412040, 0.8188330, 0.6476260, 0.4650750, 0.8031380,…</span></span>\n<span id=\"cb31-9\"><a href=\"#cb31-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).4` &lt;dbl&gt; 2.06531, 2.35775, 2.48328, 2.38348, 2.29324, 2.29980, …</span></span>\n<span id=\"cb31-10\"><a href=\"#cb31-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).5` &lt;dbl&gt; 1.80219, 1.27466, 1.17318, 1.19170, 1.29867, 1.46982, …</span></span>\n<span id=\"cb31-11\"><a href=\"#cb31-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).6` &lt;dbl&gt; 1.81798, 1.93282, 1.71232, 1.74702, 2.08540, 1.70745, …</span></span>\n<span id=\"cb31-12\"><a href=\"#cb31-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ `s(year_fac).7` &lt;dbl&gt; 1.530030, 2.455950, 1.508500, 1.704790, 2.151070, 1.56…</span></span></code></pre></div>\n<p>The posterior distribution for the effect of <code>ndvi_ma12</code>\nis stored in the <code>ndvi_ma12</code> column. A quick histogram\nconfirms our inference that <code>log(counts)</code> respond positively\nto increases in <code>ndvi</code>:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb32-1\"><a href=\"#cb32-1\" tabindex=\"-1\"></a><span class=\"fu\">hist</span>(beta_post<span class=\"sc\">$</span>ndvi_ma12,</span>\n<span id=\"cb32-2\"><a href=\"#cb32-2\" tabindex=\"-1\"></a>  <span class=\"at\">xlim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb32-3\"><a href=\"#cb32-3\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(beta_post<span class=\"sc\">$</span>ndvi_ma12)),</span>\n<span id=\"cb32-4\"><a href=\"#cb32-4\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(beta_post<span class=\"sc\">$</span>ndvi))</span>\n<span id=\"cb32-5\"><a href=\"#cb32-5\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb32-6\"><a href=\"#cb32-6\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb32-7\"><a href=\"#cb32-7\" tabindex=\"-1\"></a>  <span class=\"at\">border =</span> <span class=\"st\">&quot;white&quot;</span>,</span>\n<span id=\"cb32-8\"><a href=\"#cb32-8\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"fu\">expression</span>(beta[NDVI]),</span>\n<span id=\"cb32-9\"><a href=\"#cb32-9\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;&quot;</span>,</span>\n<span id=\"cb32-10\"><a href=\"#cb32-10\" tabindex=\"-1\"></a>  <span class=\"at\">yaxt =</span> <span class=\"st\">&quot;n&quot;</span>,</span>\n<span id=\"cb32-11\"><a href=\"#cb32-11\" tabindex=\"-1\"></a>  <span class=\"at\">main =</span> <span class=\"st\">&quot;&quot;</span>,</span>\n<span id=\"cb32-12\"><a href=\"#cb32-12\" tabindex=\"-1\"></a>  <span class=\"at\">lwd =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb32-13\"><a href=\"#cb32-13\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb32-14\"><a href=\"#cb32-14\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"dv\">0</span>, <span class=\"at\">lwd =</span> <span class=\"fl\">2.5</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"marginaleffects-support\" class=\"section level3\">\n<h3><code>marginaleffects</code> support</h3>\n<p>Given our model used a nonlinear link function (log link in this\nexample), it can still be difficult to fully understand what\nrelationship our model is estimating between a predictor and the\nresponse. Fortunately, the <code>marginaleffects</code> package makes\nthis relatively straightforward. Objects of class <code>mvgam</code> can\nbe used with <code>marginaleffects</code> to inspect contrasts,\nscenario-based predictions, conditional and marginal effects, all on the\noutcome scale. Like <code>brms</code>, <code>mvgam</code> has the simple\n<code>conditional_effects()</code> function to make quick and\ninformative plots for main effects, which rely on\n<code>marginaleffects</code> support. This will likely be your go-to\nfunction for quickly understanding patterns from fitted\n<code>mvgam</code> models</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb33-1\"><a href=\"#cb33-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(model2)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"adding-predictors-as-smooths\" class=\"section level2\">\n<h2>Adding predictors as smooths</h2>\n<p>Smooth functions, using penalized splines, are a major feature of\n<code>mvgam</code>. Nonlinear splines are commonly viewed as variations\nof random effects in which the coefficients that control the shape of\nthe spline are drawn from a joint, penalized distribution. This strategy\nis very often used in ecological time series analysis to capture smooth\ntemporal variation in the processes we seek to study. When we construct\nsmoothing splines, the workhorse package <code>mgcv</code> will\ncalculate a set of basis functions that will collectively control the\nshape and complexity of the resulting spline. It is often helpful to\nvisualize these basis functions to get a better sense of how splines\nwork. We’ll create a set of 6 basis functions to represent possible\nvariation in the effect of <code>time</code> on our outcome.In addition\nto constructing the basis functions, <code>mgcv</code> also creates a\npenalty matrix <span class=\"math inline\">\\(S\\)</span>, which contains\n<strong>known</strong> coefficients that work to constrain the\nwiggliness of the resulting smooth function. When fitting a GAM to data,\nwe must estimate the smoothing parameters (<span class=\"math inline\">\\(\\lambda\\)</span>) that will penalize these\nmatrices, resulting in constrained basis coefficients and smoother\nfunctions that are less likely to overfit the data. This is the key to\nfitting GAMs in a Bayesian framework, as we can jointly estimate the\n<span class=\"math inline\">\\(\\lambda\\)</span>’s using informative priors\nto prevent overfitting and expand the complexity of models we can\ntackle. To see this in practice, we can now fit a model that replaces\nthe yearly random effects with a smooth function of <code>time</code>.\nWe will need a reasonably complex function (large <code>k</code>) to try\nand accommodate the temporal variation in our observations. Following\nsome <a href=\"https://fromthebottomoftheheap.net/2020/06/03/extrapolating-with-gams/\" target=\"_blank\">useful advice by Gavin Simpson</a>, we will use a\nb-spline basis for the temporal smooth. Because we no longer have\nintercepts for each year, we also retain the primary intercept term in\nthis model (there is no <code>-1</code> in the formula now):</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb34-1\"><a href=\"#cb34-1\" tabindex=\"-1\"></a>model3 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb34-2\"><a href=\"#cb34-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(time, <span class=\"at\">bs =</span> <span class=\"st\">&quot;bs&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">15</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb34-3\"><a href=\"#cb34-3\" tabindex=\"-1\"></a>    ndvi_ma12,</span>\n<span id=\"cb34-4\"><a href=\"#cb34-4\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb34-5\"><a href=\"#cb34-5\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb34-6\"><a href=\"#cb34-6\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test</span>\n<span id=\"cb34-7\"><a href=\"#cb34-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = f(\\boldsymbol{time})_t + \\beta_{ndvi} *\n\\boldsymbol{ndvi}_t  \\\\\nf(\\boldsymbol{time}) &amp; = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} &amp; \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\\\\n\\beta_{ndvi} &amp; \\sim \\text{Normal}(0, 1) \\end{align*}\\]</span></p>\n<p>Where the smooth function <span class=\"math inline\">\\(f_{time}\\)</span> is built by summing across a set\nof weighted basis functions. The basis functions <span class=\"math inline\">\\((b)\\)</span> are constructed using a thin plate\nregression basis in <code>mgcv</code>. The weights <span class=\"math inline\">\\((\\beta_{smooth})\\)</span> are drawn from a\npenalized multivariate normal distribution where the precision matrix\n<span class=\"math inline\">\\((\\Omega\\)</span>) is multiplied by a\nsmoothing penalty <span class=\"math inline\">\\((\\lambda)\\)</span>. If\n<span class=\"math inline\">\\(\\lambda\\)</span> becomes large, this acts to\n<em>squeeze</em> the covariances among the weights <span class=\"math inline\">\\((\\beta_{smooth})\\)</span>, leading to a less\nwiggly spline. Note that sometimes there are multiple smoothing\npenalties that contribute to the covariance matrix, but I am only\nshowing one here for simplicity. View the summary as before</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb35-1\"><a href=\"#cb35-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model3)</span>\n<span id=\"cb35-2\"><a href=\"#cb35-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb35-3\"><a href=\"#cb35-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ s(time, bs = &quot;bs&quot;, k = 15) + ndvi_ma12</span></span>\n<span id=\"cb35-4\"><a href=\"#cb35-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb35-5\"><a href=\"#cb35-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-6\"><a href=\"#cb35-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb35-7\"><a href=\"#cb35-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb35-8\"><a href=\"#cb35-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-9\"><a href=\"#cb35-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb35-10\"><a href=\"#cb35-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb35-11\"><a href=\"#cb35-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-12\"><a href=\"#cb35-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb35-13\"><a href=\"#cb35-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb35-14\"><a href=\"#cb35-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-15\"><a href=\"#cb35-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb35-16\"><a href=\"#cb35-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb35-17\"><a href=\"#cb35-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-18\"><a href=\"#cb35-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb35-19\"><a href=\"#cb35-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb35-20\"><a href=\"#cb35-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-21\"><a href=\"#cb35-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb35-22\"><a href=\"#cb35-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb35-23\"><a href=\"#cb35-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb35-24\"><a href=\"#cb35-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb35-25\"><a href=\"#cb35-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-26\"><a href=\"#cb35-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb35-27\"><a href=\"#cb35-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb35-28\"><a href=\"#cb35-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)   0.82  1.10   1.3 1.00   853</span></span>\n<span id=\"cb35-29\"><a href=\"#cb35-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ndvi_ma12     0.37  1.90   3.5 1.00  1085</span></span>\n<span id=\"cb35-30\"><a href=\"#cb35-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).1    -9.80 -5.80  -2.6 1.00   348</span></span>\n<span id=\"cb35-31\"><a href=\"#cb35-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).2     1.20  3.40   6.0 1.00   387</span></span>\n<span id=\"cb35-32\"><a href=\"#cb35-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).3   -10.00 -6.20  -3.1 1.00   318</span></span>\n<span id=\"cb35-33\"><a href=\"#cb35-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).4    -1.60  0.78   3.3 1.00   265</span></span>\n<span id=\"cb35-34\"><a href=\"#cb35-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).5    -3.00 -0.42   2.0 1.00   246</span></span>\n<span id=\"cb35-35\"><a href=\"#cb35-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).6    -6.40 -3.80  -1.1 1.00   380</span></span>\n<span id=\"cb35-36\"><a href=\"#cb35-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).7    -1.90  0.56   3.0 1.00   225</span></span>\n<span id=\"cb35-37\"><a href=\"#cb35-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).8    -2.40 -0.12   2.1 1.01   222</span></span>\n<span id=\"cb35-38\"><a href=\"#cb35-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).9    -0.55  2.10   4.7 1.00   233</span></span>\n<span id=\"cb35-39\"><a href=\"#cb35-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).10   -5.70 -3.30  -1.0 1.00   294</span></span>\n<span id=\"cb35-40\"><a href=\"#cb35-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).11   -2.50  0.57   4.0 1.00   374</span></span>\n<span id=\"cb35-41\"><a href=\"#cb35-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).12   -6.80 -5.00  -3.2 1.00   491</span></span>\n<span id=\"cb35-42\"><a href=\"#cb35-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).13    1.90  5.00   8.5 1.00   235</span></span>\n<span id=\"cb35-43\"><a href=\"#cb35-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time).14  -11.00 -3.10   4.0 1.00   241</span></span>\n<span id=\"cb35-44\"><a href=\"#cb35-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-45\"><a href=\"#cb35-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb35-46\"><a href=\"#cb35-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;           edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb35-47\"><a href=\"#cb35-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time) 11.76     14  102.7 7.98e-05 ***</span></span>\n<span id=\"cb35-48\"><a href=\"#cb35-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb35-49\"><a href=\"#cb35-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb35-50\"><a href=\"#cb35-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-51\"><a href=\"#cb35-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb35-52\"><a href=\"#cb35-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb35-53\"><a href=\"#cb35-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb35-54\"><a href=\"#cb35-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb35-55\"><a href=\"#cb35-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb35-56\"><a href=\"#cb35-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-57\"><a href=\"#cb35-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb35-58\"><a href=\"#cb35-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb35-59\"><a href=\"#cb35-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb35-60\"><a href=\"#cb35-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb35-61\"><a href=\"#cb35-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The summary above now contains posterior estimates for the smoothing\nparameters as well as the basis coefficients for the nonlinear effect of\n<code>time</code>. We can visualize <code>conditional_effects</code> as\nbefore:</p>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb36-1\"><a href=\"#cb36-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(model3, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Inspect the underlying <code>Stan</code> code to gain some idea of\nhow the spline is being penalized:</p>\n<div class=\"sourceCode\" id=\"cb37\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb37-1\"><a href=\"#cb37-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(model3)</span>\n<span id=\"cb37-2\"><a href=\"#cb37-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb37-3\"><a href=\"#cb37-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb37-4\"><a href=\"#cb37-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb37-5\"><a href=\"#cb37-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb37-6\"><a href=\"#cb37-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp; // number of smoothing parameters</span></span>\n<span id=\"cb37-7\"><a href=\"#cb37-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb37-8\"><a href=\"#cb37-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb37-9\"><a href=\"#cb37-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] zero; // prior locations for basis coefficients</span></span>\n<span id=\"cb37-10\"><a href=\"#cb37-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb37-11\"><a href=\"#cb37-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb37-12\"><a href=\"#cb37-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[14, 28] S1; // mgcv smooth penalty matrix S1</span></span>\n<span id=\"cb37-13\"><a href=\"#cb37-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb37-14\"><a href=\"#cb37-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb37-15\"><a href=\"#cb37-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb37-16\"><a href=\"#cb37-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb37-17\"><a href=\"#cb37-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-18\"><a href=\"#cb37-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb37-19\"><a href=\"#cb37-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb37-20\"><a href=\"#cb37-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb37-21\"><a href=\"#cb37-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-22\"><a href=\"#cb37-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb37-23\"><a href=\"#cb37-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp] lambda;</span></span>\n<span id=\"cb37-24\"><a href=\"#cb37-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-25\"><a href=\"#cb37-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb37-26\"><a href=\"#cb37-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb37-27\"><a href=\"#cb37-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb37-28\"><a href=\"#cb37-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span id=\"cb37-29\"><a href=\"#cb37-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-30\"><a href=\"#cb37-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb37-31\"><a href=\"#cb37-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)...</span></span>\n<span id=\"cb37-32\"><a href=\"#cb37-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, 1.4, 2.5);</span></span>\n<span id=\"cb37-33\"><a href=\"#cb37-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-34\"><a href=\"#cb37-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for ndvi_ma12...</span></span>\n<span id=\"cb37-35\"><a href=\"#cb37-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb37-36\"><a href=\"#cb37-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-37\"><a href=\"#cb37-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(time)...</span></span>\n<span id=\"cb37-38\"><a href=\"#cb37-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[3 : 16] ~ multi_normal_prec(zero[3 : 16],</span></span>\n<span id=\"cb37-39\"><a href=\"#cb37-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                     S1[1 : 14, 1 : 14] * lambda[1]</span></span>\n<span id=\"cb37-40\"><a href=\"#cb37-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                     + S1[1 : 14, 15 : 28] * lambda[2]);</span></span>\n<span id=\"cb37-41\"><a href=\"#cb37-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-42\"><a href=\"#cb37-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for smoothing parameters</span></span>\n<span id=\"cb37-43\"><a href=\"#cb37-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda ~ normal(5, 30);</span></span>\n<span id=\"cb37-44\"><a href=\"#cb37-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb37-45\"><a href=\"#cb37-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb37-46\"><a href=\"#cb37-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(flat_xs, 0.0, b);</span></span>\n<span id=\"cb37-47\"><a href=\"#cb37-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb37-48\"><a href=\"#cb37-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb37-49\"><a href=\"#cb37-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb37-50\"><a href=\"#cb37-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb37-51\"><a href=\"#cb37-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb37-52\"><a href=\"#cb37-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp] rho;</span></span>\n<span id=\"cb37-53\"><a href=\"#cb37-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb37-54\"><a href=\"#cb37-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   rho = log(lambda);</span></span>\n<span id=\"cb37-55\"><a href=\"#cb37-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb37-56\"><a href=\"#cb37-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb37-57\"><a href=\"#cb37-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb37-58\"><a href=\"#cb37-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb37-59\"><a href=\"#cb37-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]];</span></span>\n<span id=\"cb37-60\"><a href=\"#cb37-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb37-61\"><a href=\"#cb37-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb37-62\"><a href=\"#cb37-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>The line below <code>// prior for s(time)...</code> shows how the\nspline basis coefficients are drawn from a zero-centred multivariate\nnormal distribution. The precision matrix <span class=\"math inline\">\\(S\\)</span> is penalized by two different smoothing\nparameters (the <span class=\"math inline\">\\(\\lambda\\)</span>’s) to\nenforce smoothness and reduce overfitting</p>\n</div>\n<div id=\"latent-dynamics-in-mvgam\" class=\"section level2\">\n<h2>Latent dynamics in <code>mvgam</code></h2>\n<p>Forecasts from the above model are not ideal:</p>\n<div class=\"sourceCode\" id=\"cb38\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb38-1\"><a href=\"#cb38-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model3, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Why is this happening? The forecasts are driven almost entirely by\nvariation in the temporal spline, which is extrapolating linearly\n<em>forever</em> beyond the edge of the training data. Any slight\nwiggles near the end of the training set will result in wildly different\nforecasts. To visualize this, we can plot the extrapolated temporal\nfunctions into the out-of-sample test set for the two models. Here are\nthe extrapolated functions for the first model, with 15 basis\nfunctions:</p>\n<div class=\"sourceCode\" id=\"cb39\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb39-1\"><a href=\"#cb39-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(</span>\n<span id=\"cb39-2\"><a href=\"#cb39-2\" tabindex=\"-1\"></a>  model3,</span>\n<span id=\"cb39-3\"><a href=\"#cb39-3\" tabindex=\"-1\"></a>  <span class=\"at\">smooth =</span> <span class=\"st\">&quot;s(time)&quot;</span>,</span>\n<span id=\"cb39-4\"><a href=\"#cb39-4\" tabindex=\"-1\"></a>  <span class=\"co\"># pass newdata to the plot function to generate</span></span>\n<span id=\"cb39-5\"><a href=\"#cb39-5\" tabindex=\"-1\"></a>  <span class=\"co\"># predictions of the temporal smooth to the end of the</span></span>\n<span id=\"cb39-6\"><a href=\"#cb39-6\" tabindex=\"-1\"></a>  <span class=\"co\"># testing period</span></span>\n<span id=\"cb39-7\"><a href=\"#cb39-7\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb39-8\"><a href=\"#cb39-8\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">max</span>(data_test<span class=\"sc\">$</span>time),</span>\n<span id=\"cb39-9\"><a href=\"#cb39-9\" tabindex=\"-1\"></a>    <span class=\"at\">ndvi_ma12 =</span> <span class=\"dv\">0</span></span>\n<span id=\"cb39-10\"><a href=\"#cb39-10\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb39-11\"><a href=\"#cb39-11\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb39-12\"><a href=\"#cb39-12\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"fu\">max</span>(data_train<span class=\"sc\">$</span>time), <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This model is not doing well. Clearly we need to somehow account for\nthe strong temporal autocorrelation when modelling these data without\nusing a smooth function of <code>time</code>. Now onto another prominent\nfeature of <code>mvgam</code>: the ability to include (possibly latent)\nautocorrelated residuals in regression models. To do so, we use the\n<code>trend_model</code> argument (see <code>?mvgam_trends</code> for\ndetails of different dynamic trend models that are supported). This\nmodel will use a separate sub-model for latent residuals that evolve as\nan AR1 process (i.e. the error in the current time point is a function\nof the error in the previous time point, plus some stochastic noise). We\nalso include a smooth function of <code>ndvi_ma12</code> in this model,\nrather than the parametric term that was used above, to showcase that\n<code>mvgam</code> can include combinations of smooths and dynamic\ncomponents:</p>\n<div class=\"sourceCode\" id=\"cb40\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb40-1\"><a href=\"#cb40-1\" tabindex=\"-1\"></a>model4 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb40-2\"><a href=\"#cb40-2\" tabindex=\"-1\"></a>  count <span class=\"sc\">~</span> <span class=\"fu\">s</span>(ndvi_ma12, <span class=\"at\">k =</span> <span class=\"dv\">6</span>),</span>\n<span id=\"cb40-3\"><a href=\"#cb40-3\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb40-4\"><a href=\"#cb40-4\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb40-5\"><a href=\"#cb40-5\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> data_test,</span>\n<span id=\"cb40-6\"><a href=\"#cb40-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>()</span>\n<span id=\"cb40-7\"><a href=\"#cb40-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The model can be described mathematically as follows: <span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) &amp; = f(\\boldsymbol{ndvi})_t + z_t \\\\\nz_t &amp; \\sim \\text{Normal}(ar1 * z_{t-1}, \\sigma_{error}) \\\\\nar1 &amp; \\sim \\text{Normal}(0, 1)[-1, 1] \\\\\n\\sigma_{error} &amp; \\sim \\text{Exponential}(2) \\\\\nf(\\boldsymbol{ndvi}) &amp; = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} &amp; \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1})\n\\end{align*}\\]</span></p>\n<p>Here the term <span class=\"math inline\">\\(z_t\\)</span> captures\nautocorrelated latent residuals, which are modelled using an AR1\nprocess. You can also notice that this model is estimating\nautocorrelated errors for the full time period, even though some of\nthese time points have missing observations. This is useful for getting\nmore realistic estimates of the residual autocorrelation parameters.\nSummarise the model to see how it now returns posterior summaries for\nthe latent AR1 process:</p>\n<div class=\"sourceCode\" id=\"cb41\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb41-1\"><a href=\"#cb41-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(model4)</span>\n<span id=\"cb41-2\"><a href=\"#cb41-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb41-3\"><a href=\"#cb41-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; count ~ s(ndvi_ma12, k = 6)</span></span>\n<span id=\"cb41-4\"><a href=\"#cb41-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000018e48f5c728&gt;</span></span>\n<span id=\"cb41-5\"><a href=\"#cb41-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-6\"><a href=\"#cb41-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb41-7\"><a href=\"#cb41-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb41-8\"><a href=\"#cb41-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-9\"><a href=\"#cb41-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb41-10\"><a href=\"#cb41-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb41-11\"><a href=\"#cb41-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-12\"><a href=\"#cb41-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb41-13\"><a href=\"#cb41-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb41-14\"><a href=\"#cb41-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-15\"><a href=\"#cb41-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb41-16\"><a href=\"#cb41-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb41-17\"><a href=\"#cb41-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-18\"><a href=\"#cb41-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb41-19\"><a href=\"#cb41-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 80 </span></span>\n<span id=\"cb41-20\"><a href=\"#cb41-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-21\"><a href=\"#cb41-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb41-22\"><a href=\"#cb41-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb41-23\"><a href=\"#cb41-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb41-24\"><a href=\"#cb41-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb41-25\"><a href=\"#cb41-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-26\"><a href=\"#cb41-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb41-27\"><a href=\"#cb41-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                  2.5%     50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-28\"><a href=\"#cb41-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    -0.910  0.7700 1.700 1.04   121</span></span>\n<span id=\"cb41-29\"><a href=\"#cb41-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).1 -0.140  0.0047 0.190 1.00   830</span></span>\n<span id=\"cb41-30\"><a href=\"#cb41-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).2 -0.210 -0.0049 0.200 1.00   685</span></span>\n<span id=\"cb41-31\"><a href=\"#cb41-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).3 -0.085 -0.0014 0.069 1.00   810</span></span>\n<span id=\"cb41-32\"><a href=\"#cb41-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).4 -0.430  0.0250 0.600 1.00   750</span></span>\n<span id=\"cb41-33\"><a href=\"#cb41-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12).5 -0.260  0.0640 0.490 1.00   921</span></span>\n<span id=\"cb41-34\"><a href=\"#cb41-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-35\"><a href=\"#cb41-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb41-36\"><a href=\"#cb41-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb41-37\"><a href=\"#cb41-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(ndvi_ma12) 1.285      5  0.357   0.999</span></span>\n<span id=\"cb41-38\"><a href=\"#cb41-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-39\"><a href=\"#cb41-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb41-40\"><a href=\"#cb41-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-41\"><a href=\"#cb41-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.58 0.81   1.1 1.01   345</span></span>\n<span id=\"cb41-42\"><a href=\"#cb41-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-43\"><a href=\"#cb41-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; precision parameter:</span></span>\n<span id=\"cb41-44\"><a href=\"#cb41-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-45\"><a href=\"#cb41-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; tau[1] 0.78 1.5     3    1   358</span></span>\n<span id=\"cb41-46\"><a href=\"#cb41-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-47\"><a href=\"#cb41-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb41-48\"><a href=\"#cb41-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb41-49\"><a href=\"#cb41-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.61 0.82  0.97 1.01   436</span></span>\n<span id=\"cb41-50\"><a href=\"#cb41-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-51\"><a href=\"#cb41-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb41-52\"><a href=\"#cb41-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb41-53\"><a href=\"#cb41-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb41-54\"><a href=\"#cb41-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb41-55\"><a href=\"#cb41-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb41-56\"><a href=\"#cb41-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-57\"><a href=\"#cb41-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb41-58\"><a href=\"#cb41-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb41-59\"><a href=\"#cb41-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb41-60\"><a href=\"#cb41-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb41-61\"><a href=\"#cb41-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>View posterior hindcasts / forecasts and compare against the out of\nsample test data</p>\n<div class=\"sourceCode\" id=\"cb42\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb42-1\"><a href=\"#cb42-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model4, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The trend is evolving as an AR1 process, which we can also view:</p>\n<div class=\"sourceCode\" id=\"cb43\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb43-1\"><a href=\"#cb43-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(model4, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">newdata =</span> data_test)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>In-sample model performance can be interrogated using leave-one-out\ncross-validation utilities from the <code>loo</code> package (a higher\nvalue is preferred for this metric):</p>\n<div class=\"sourceCode\" id=\"cb44\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb44-1\"><a href=\"#cb44-1\" tabindex=\"-1\"></a><span class=\"fu\">loo_compare</span>(model3, model4)</span>\n<span id=\"cb44-2\"><a href=\"#cb44-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        elpd_diff se_diff</span></span>\n<span id=\"cb44-3\"><a href=\"#cb44-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model3    0.0       0.0 </span></span>\n<span id=\"cb44-4\"><a href=\"#cb44-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model4 -891.7     153.7</span></span></code></pre></div>\n<p>The higher estimated log predictive density (ELPD) value for the\ndynamic model suggests it provides a better fit to the in-sample\ndata.</p>\n<p>Though it should be obvious that this model provides better\nforecasts, we can quantify forecast performance for models 3 and 4 using\nthe <code>forecast</code> and <code>score</code> functions. Here we will\ncompare models based on their Discrete Ranked Probability Scores (a\nlower value is preferred for this metric)</p>\n<div class=\"sourceCode\" id=\"cb45\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb45-1\"><a href=\"#cb45-1\" tabindex=\"-1\"></a>fc_mod3 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(model3)</span>\n<span id=\"cb45-2\"><a href=\"#cb45-2\" tabindex=\"-1\"></a>fc_mod4 <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(model4)</span>\n<span id=\"cb45-3\"><a href=\"#cb45-3\" tabindex=\"-1\"></a>score_mod3 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod3, <span class=\"at\">score =</span> <span class=\"st\">&quot;drps&quot;</span>)</span>\n<span id=\"cb45-4\"><a href=\"#cb45-4\" tabindex=\"-1\"></a>score_mod4 <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fc_mod4, <span class=\"at\">score =</span> <span class=\"st\">&quot;drps&quot;</span>)</span>\n<span id=\"cb45-5\"><a href=\"#cb45-5\" tabindex=\"-1\"></a><span class=\"fu\">sum</span>(score_mod4<span class=\"sc\">$</span>PP<span class=\"sc\">$</span>score, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">-</span> </span>\n<span id=\"cb45-6\"><a href=\"#cb45-6\" tabindex=\"-1\"></a>  <span class=\"fu\">sum</span>(score_mod3<span class=\"sc\">$</span>PP<span class=\"sc\">$</span>score, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb45-7\"><a href=\"#cb45-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] -619.4987</span></span></code></pre></div>\n<p>A strongly negative value here suggests the score for the dynamic\nmodel (model 4) is much smaller than the score for the model with a\nsmooth function of time (model 3)</p>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nDynamic GAMs and how they can be applied in practice:</p>\n<p>Clark, Nicholas J. and Wells, K. <a href=\"https://doi.org/10.1111/2041-210X.13974\">Dynamic Generalized\nAdditive Models (DGAMs) for forecasting discrete ecological time\nseries</a>. <em>Methods in Ecology and Evolution</em>. (2023): 14,\n771-784.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>de Sousa, Heitor C., et al. <a href=\"https://doi.org/10.1111/1365-2656.14188\">Severe fire regimes\ndecrease resilience of ectothermic populations</a>. <em>Journal of\nAnimal Ecology</em> (2024): 93(11), 1656-1669.</p>\n<p>Hannaford, Naomi E., et al. <a href=\"https://doi.org/10.1016/j.csda.2022.107659\">A sparse Bayesian\nhierarchical vector autoregressive model for microbial dynamics in a\nwastewater treatment plant.</a> <em>Computational Statistics &amp; Data\nAnalysis</em> (2023): 179, 107659.</p>\n<p>Karunarathna, K.A.N.K., et al. <a href=\"https://doi.org/10.1016/j.ecolmodel.2024.110648\">Modelling\nnonlinear responses of a desert rodent species to environmental change\nwith hierarchical dynamic generalized additive models</a>.\n<em>Ecological Modelling</em> (2024): 490, 110648.</p>\n<p>Zhu, L., et al. <a href=\"https://doi.org/10.1111/1365-2435.14711\">Responses of a widespread\npest insect to extreme high temperatures are stage-dependent and\ndivergent among seasonal cohorts</a>. <em>Functional Ecology</em>\n(2025): 39, 165–180. <a href=\"https://doi.org/10.1111/1365-2435.14711\" class=\"uri\">https://doi.org/10.1111/1365-2435.14711</a></p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "inst/doc/nmixtures.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\nlibrary(dplyr)\n# A custom ggplot2 theme\ntheme_set(\n  theme_classic(base_size = 12, base_family = \"serif\") +\n    theme(\n      axis.line.x.bottom = element_line(\n        colour = \"black\",\n        size = 1\n      ),\n      axis.line.y.left = element_line(\n        colour = \"black\",\n        size = 1\n      )\n    )\n)\noptions(\n  ggplot2.discrete.colour = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  ),\n  ggplot2.discrete.fill = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  )\n)\n\n\n## --------------------------------------------------------------------------------\nset.seed(999)\n# Simulate observations for species 1, which shows a declining trend and 0.7 detection probability\ndata.frame(\n  site = 1,\n  # five replicates per year; six years\n  replicate = rep(1:5, 6),\n  time = sort(rep(1:6, 5)),\n  species = \"sp_1\",\n  # true abundance declines nonlinearly\n  truth = c(\n    rep(28, 5),\n    rep(26, 5),\n    rep(23, 5),\n    rep(16, 5),\n    rep(14, 5),\n    rep(14, 5)\n  ),\n  # observations are taken with detection prob = 0.7\n  obs = c(\n    rbinom(5, 28, 0.7),\n    rbinom(5, 26, 0.7),\n    rbinom(5, 23, 0.7),\n    rbinom(5, 15, 0.7),\n    rbinom(5, 14, 0.7),\n    rbinom(5, 14, 0.7)\n  )\n) %>%\n  # add 'series' information, which is an identifier of site, replicate and species\n  dplyr::mutate(\n    series = paste0(\n      \"site_\",\n      site,\n      \"_\",\n      species,\n      \"_rep_\",\n      replicate\n    ),\n    time = as.numeric(time),\n    # add a 'cap' variable that defines the maximum latent N to\n    # marginalize over when estimating latent abundance; in other words\n    # how large do we realistically think the true abundance could be?\n    cap = 100\n  ) %>%\n  dplyr::select(-replicate) -> testdat\n\n# Now add another species that has a different temporal trend and a smaller\n# detection probability (0.45 for this species)\ntestdat <- testdat %>%\n  dplyr::bind_rows(\n    data.frame(\n      site = 1,\n      replicate = rep(1:5, 6),\n      time = sort(rep(1:6, 5)),\n      species = \"sp_2\",\n      truth = c(\n        rep(4, 5),\n        rep(7, 5),\n        rep(15, 5),\n        rep(16, 5),\n        rep(19, 5),\n        rep(18, 5)\n      ),\n      obs = c(\n        rbinom(5, 4, 0.45),\n        rbinom(5, 7, 0.45),\n        rbinom(5, 15, 0.45),\n        rbinom(5, 16, 0.45),\n        rbinom(5, 19, 0.45),\n        rbinom(5, 18, 0.45)\n      )\n    ) %>%\n      dplyr::mutate(\n        series = paste0(\n          \"site_\",\n          site,\n          \"_\",\n          species,\n          \"_rep_\",\n          replicate\n        ),\n        time = as.numeric(time),\n        cap = 50\n      ) %>%\n      dplyr::select(-replicate)\n  )\n\n\n## --------------------------------------------------------------------------------\ntestdat$species <- factor(testdat$species, levels = unique(testdat$species))\ntestdat$series <- factor(testdat$series, levels = unique(testdat$series))\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(testdat)\nhead(testdat, 12)\n\n\n## --------------------------------------------------------------------------------\ntestdat %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\ntrend_map\n\n\n## ----include = FALSE, results='hide'---------------------------------------------\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n\n\n## ----eval = FALSE----------------------------------------------------------------\n# mod <- mvgam(\n#   # the observation formula sets up linear predictors for\n#   # detection probability on the logit scale\n#   formula = obs ~ species - 1,\n#\n#   # the trend_formula sets up the linear predictors for\n#   # the latent abundance processes on the log scale\n#   trend_formula = ~ s(time, by = trend, k = 4) + species,\n#\n#   # the trend_map takes care of the mapping\n#   trend_map = trend_map,\n#\n#   # nmix() family and data\n#   family = nmix(),\n#   data = testdat,\n#\n#   # priors can be set in the usual way\n#   priors = c(\n#     prior(std_normal(), class = b),\n#     prior(normal(1, 1.5), class = Intercept_trend)\n#   ),\n#   samples = 1000\n# )\n\n## --------------------------------------------------------------------------------\ncode(mod)\n\n\n## --------------------------------------------------------------------------------\nsummary(mod)\n\n\n## --------------------------------------------------------------------------------\nloo(mod)\n\n\n## --------------------------------------------------------------------------------\nplot(mod, type = \"smooths\", trend_effects = TRUE)\n\n\n## --------------------------------------------------------------------------------\nmarginaleffects::plot_predictions(\n  mod,\n  condition = \"species\",\n  type = \"detection\"\n) +\n  ylab(\"Pr(detection)\") +\n  ylim(c(0, 1)) +\n  theme_classic() +\n  theme(legend.position = \"none\")\n\n\n## --------------------------------------------------------------------------------\nhc <- hindcast(mod, type = \"latent_N\")\n\n# Function to plot latent abundance estimates vs truth\nplot_latentN <- function(hindcasts, data, species = \"sp_1\") {\n  all_series <- unique(\n    data %>%\n      dplyr::filter(species == !!species) %>%\n      dplyr::pull(series)\n  )\n\n  # Grab the first replicate that represents this series\n  # so we can get the true simulated values\n  series <- as.numeric(all_series[1])\n  truths <- data %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::filter(series == !!levels(data$series)[series]) %>%\n    dplyr::pull(truth)\n\n  # In case some replicates have missing observations,\n  # pull out predictions for ALL replicates and average over them\n  hcs <- do.call(\n    rbind,\n    lapply(all_series, function(x) {\n      ind <- which(names(hindcasts$hindcasts) %in% as.character(x))\n      hindcasts$hindcasts[[ind]]\n    })\n  )\n\n  # Calculate posterior empirical quantiles of predictions\n  pred_quantiles <- data.frame(t(apply(hcs, 2, function(x) {\n    quantile(\n      x,\n      probs = c(\n        0.05,\n        0.2,\n        0.3,\n        0.4,\n        0.5,\n        0.6,\n        0.7,\n        0.8,\n        0.95\n      )\n    )\n  })))\n  pred_quantiles$time <- 1:NROW(pred_quantiles)\n  pred_quantiles$truth <- truths\n\n  # Grab observations\n  data %>%\n    dplyr::filter(series %in% all_series) %>%\n    dplyr::select(time, obs) -> observations\n\n  # Plot\n  ggplot(pred_quantiles, aes(x = time, group = 1)) +\n    geom_ribbon(aes(ymin = X5., ymax = X95.), fill = \"#DCBCBC\") +\n    geom_ribbon(aes(ymin = X30., ymax = X70.), fill = \"#B97C7C\") +\n    geom_line(aes(x = time, y = truth), colour = \"black\", linewidth = 1) +\n    geom_point(\n      aes(x = time, y = truth),\n      shape = 21,\n      colour = \"white\",\n      fill = \"black\",\n      size = 2.5\n    ) +\n    geom_jitter(\n      data = observations,\n      aes(x = time, y = obs),\n      width = 0.06,\n      shape = 21,\n      fill = \"darkred\",\n      colour = \"white\",\n      size = 2.5\n    ) +\n    labs(\n      y = \"Latent abundance (N)\",\n      x = \"Time\",\n      title = species\n    )\n}\n\n\n## --------------------------------------------------------------------------------\nplot_latentN(hc, testdat, species = \"sp_1\")\nplot_latentN(hc, testdat, species = \"sp_2\")\n\n\n## --------------------------------------------------------------------------------\n# Date link\nload(url(\n  \"https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda\"\n))\ndata.one.sp <- dataNMixSim\n\n# Pull out observations for one species\ndata.one.sp$y <- data.one.sp$y[1, , ]\n\n# Abundance covariates that don't change across repeat sampling observations\nabund.cov <- dataNMixSim$abund.covs[, 1]\nabund.factor <- as.factor(dataNMixSim$abund.covs[, 2])\n\n# Detection covariates that can change across repeat sampling observations\n# Note that `NA`s are not allowed for covariates in mvgam, so we randomly\n# impute them here\ndet.cov <- dataNMixSim$det.covs$det.cov.1[,]\ndet.cov[is.na(det.cov)] <- rnorm(length(which(is.na(det.cov))))\ndet.cov2 <- dataNMixSim$det.covs$det.cov.2\ndet.cov2[is.na(det.cov2)] <- rnorm(length(which(is.na(det.cov2))))\n\n\n## --------------------------------------------------------------------------------\nmod_data <- do.call(\n  rbind,\n  lapply(1:NROW(data.one.sp$y), function(x) {\n    data.frame(\n      y = data.one.sp$y[x, ],\n      abund_cov = abund.cov[x],\n      abund_fac = abund.factor[x],\n      det_cov = det.cov[x, ],\n      det_cov2 = det.cov2[x, ],\n      replicate = 1:NCOL(data.one.sp$y),\n      site = paste0(\"site\", x)\n    )\n  })\n) %>%\n  dplyr::mutate(\n    species = \"sp_1\",\n    series = as.factor(paste0(site, \"_\", species, \"_\", replicate))\n  ) %>%\n  dplyr::mutate(\n    site = factor(site, levels = unique(site)),\n    species = factor(species, levels = unique(species)),\n    time = 1,\n    cap = max(data.one.sp$y, na.rm = TRUE) + 20\n  )\n\n\n## --------------------------------------------------------------------------------\nNROW(mod_data)\ndplyr::glimpse(mod_data)\nhead(mod_data)\n\n\n## --------------------------------------------------------------------------------\nmod_data %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\n\ntrend_map %>%\n  dplyr::arrange(trend) %>%\n  head(12)\n\n\n## ----include = FALSE, results='hide'---------------------------------------------\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 3) + s(det_cov2, k = 3),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 3) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(\n#   # effects of covariates on detection probability;\n#   # here we use penalized splines for both continuous covariates\n#   formula = y ~ s(det_cov, k = 4) + s(det_cov2, k = 4),\n#\n#   # effects of the covariates on latent abundance;\n#   # here we use a penalized spline for the continuous covariate and\n#   # hierarchical intercepts for the factor covariate\n#   trend_formula = ~ s(abund_cov, k = 4) +\n#     s(abund_fac, bs = \"re\"),\n#\n#   # link multiple observations to each site\n#   trend_map = trend_map,\n#\n#   # nmix() family and supplied data\n#   family = nmix(),\n#   data = mod_data,\n#\n#   # standard normal priors on key regression parameters\n#   priors = c(\n#     prior(std_normal(), class = \"b\"),\n#     prior(std_normal(), class = \"Intercept\"),\n#     prior(std_normal(), class = \"Intercept_trend\"),\n#     prior(std_normal(), class = \"sigma_raw_trend\")\n#   ),\n#\n#   # use Stan's variational inference for quicker results\n#   algorithm = \"meanfield\",\n#\n#   # no need to compute \"series-level\" residuals\n#   residuals = FALSE,\n#   samples = 1000\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nmarginaleffects::avg_predictions(mod, type = \"detection\")\n\n\n## --------------------------------------------------------------------------------\nabund_plots <- plot(\n  conditional_effects(\n    mod,\n    type = \"link\",\n    effects = c(\n      \"abund_cov\",\n      \"abund_fac\"\n    )\n  ),\n  plot = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\nabund_plots[[1]] +\n  ylab(\"Expected latent abundance\")\n\n\n## --------------------------------------------------------------------------------\nabund_plots[[2]] +\n  ylab(\"Expected latent abundance\")\n\n\n## --------------------------------------------------------------------------------\ndet_plots <- plot(\n  conditional_effects(\n    mod,\n    type = \"detection\",\n    effects = c(\n      \"det_cov\",\n      \"det_cov2\"\n    )\n  ),\n  plot = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\ndet_plots[[1]] +\n  ylab(\"Pr(detection)\")\ndet_plots[[2]] +\n  ylab(\"Pr(detection)\")\n\n\n## --------------------------------------------------------------------------------\nfivenum_round <- function(x) round(fivenum(x, na.rm = TRUE), 2)\n\nmarginaleffects::plot_predictions(\n  mod,\n  newdata = marginaleffects::datagrid(\n    det_cov = unique,\n    det_cov2 = fivenum_round\n  ),\n  by = c(\"det_cov\", \"det_cov2\"),\n  type = \"detection\"\n) +\n  theme_classic() +\n  ylab(\"Pr(detection)\")\n"
  },
  {
    "path": "inst/doc/nmixtures.Rmd",
    "content": "---\ntitle: \"N-mixtures in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n  toc: yes\nvignette: >\n  %\\VignetteIndexEntry{N-mixtures in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\nlibrary(dplyr)\n# A custom ggplot2 theme\ntheme_set(theme_classic(base_size = 12, base_family = \"serif\") +\n  theme(\n    axis.line.x.bottom = element_line(\n      colour = \"black\",\n      size = 1\n    ),\n    axis.line.y.left = element_line(\n      colour = \"black\",\n      size = 1\n    )\n  ))\noptions(\n  ggplot2.discrete.colour = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  ),\n  ggplot2.discrete.fill = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  )\n)\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to fit and interrogate N-mixture models for population abundance counts made with imperfect detection.\n\n## N-mixture models\nAn N-mixture model is a fairly recent addition to the ecological modeller's toolkit that is designed to make inferences about variation in the abundance of species when observations are imperfect ([Royle 2004](https://onlinelibrary.wiley.com/doi/10.1111/j.0006-341X.2004.00142.x){target=\"_blank\"}). Briefly, assume $\\boldsymbol{Y_{i,r}}$ is the number of individuals recorded at site $i$ during replicate sampling observation $r$ (recorded as a non-negative integer). If multiple replicate surveys are done within a short enough period to satisfy the assumption that the population remained closed (i.e. there was no substantial change in true population size between replicate surveys), we can account for the fact that observations aren't perfect. This is done by assuming that these replicate observations are Binomial random variables that are parameterized by the true \"latent\" abundance $N$ and a detection probability $p$:\n\n\\begin{align*}\n\\boldsymbol{Y_{i,r}} & \\sim \\text{Binomial}(N_i, p_r) \\\\\nN_{i} & \\sim \\text{Poisson}(\\lambda_i)  \\end{align*}\n\nUsing a set of linear predictors, we can estimate effects of covariates $\\boldsymbol{X}$ on the expected latent abundance (with a log link for $\\lambda$) and, jointly, effects of possibly different covariates (call them $\\boldsymbol{Q}$) on detection probability (with a logit link for $p$):\n\n\\begin{align*}\nlog(\\lambda) & = \\beta \\boldsymbol{X} \\\\\nlogit(p) & = \\gamma \\boldsymbol{Q}\\end{align*}\n\n`mvgam` can handle this type of model because it is designed to propagate unobserved temporal processes that evolve independently of the observation process in a State-space format. This setup adapts well to N-mixture models because they can be thought of as State-space models in which the latent state is a discrete variable representing the \"true\" but unknown population size. This is very convenient because we can incorporate any of the package's diverse effect types (i.e. multidimensional splines, time-varying effects, monotonic effects, random effects etc...) into the linear predictors. All that is required for this to work is a marginalization trick that allows `Stan`'s sampling algorithms to handle discrete parameters (see more about how this method of \"integrating out\" discrete parameters works in [this nice blog post by Maxwell Joseph](https://mbjoseph.github.io/posts/2020-04-28-a-step-by-step-guide-to-marginalizing-over-discrete-parameters-for-ecologists-using-stan/){target=\"_blank\"}). \n  \nThe family `nmix()` is used to set up N-mixture models in `mvgam`, but we still need to do a little bit of data wrangling to ensure the data are set up in the correct format (this is especially true when we have more than one replicate survey per time period). The most important aspects are: (1) how we set up the observation `series` and `trend_map` arguments to ensure replicate surveys are mapped to the correct latent abundance model and (2) the inclusion of a `cap` variable that defines the maximum possible integer value to use for each observation when estimating latent abundance. The two examples below give a reasonable overview of how this can be done. \n\n## Example 1: a two-species system with nonlinear trends\nFirst we will use a simple simulation in which multiple replicate observations are taken at each timepoint for two different species. The simulation produces observations at a single site over six years, with five replicate surveys per year. Each species is simulated to have different nonlinear temporal trends and different detection probabilities. For now, detection probability is fixed (i.e. it does not change over time or in association with any covariates). Notice that we add the `cap` variable, which does not need to be static, to define the maximum possible value that we think the latent abundance could be for each timepoint. This simply needs to be large enough that we get a reasonable idea of which latent N values are most likely, without adding too much computational cost:\n\n```{r}\nset.seed(999)\n# Simulate observations for species 1, which shows a declining trend and 0.7 detection probability\ndata.frame(\n  site = 1,\n  # five replicates per year; six years\n  replicate = rep(1:5, 6),\n  time = sort(rep(1:6, 5)),\n  species = \"sp_1\",\n  # true abundance declines nonlinearly\n  truth = c(\n    rep(28, 5),\n    rep(26, 5),\n    rep(23, 5),\n    rep(16, 5),\n    rep(14, 5),\n    rep(14, 5)\n  ),\n  # observations are taken with detection prob = 0.7\n  obs = c(\n    rbinom(5, 28, 0.7),\n    rbinom(5, 26, 0.7),\n    rbinom(5, 23, 0.7),\n    rbinom(5, 15, 0.7),\n    rbinom(5, 14, 0.7),\n    rbinom(5, 14, 0.7)\n  )\n) %>%\n  # add 'series' information, which is an identifier of site, replicate and species\n  dplyr::mutate(\n    series = paste0(\n      \"site_\", site,\n      \"_\", species,\n      \"_rep_\", replicate\n    ),\n    time = as.numeric(time),\n    # add a 'cap' variable that defines the maximum latent N to\n    # marginalize over when estimating latent abundance; in other words\n    # how large do we realistically think the true abundance could be?\n    cap = 100\n  ) %>%\n  dplyr::select(-replicate) -> testdat\n\n# Now add another species that has a different temporal trend and a smaller\n# detection probability (0.45 for this species)\ntestdat <- testdat %>%\n  dplyr::bind_rows(data.frame(\n    site = 1,\n    replicate = rep(1:5, 6),\n    time = sort(rep(1:6, 5)),\n    species = \"sp_2\",\n    truth = c(\n      rep(4, 5),\n      rep(7, 5),\n      rep(15, 5),\n      rep(16, 5),\n      rep(19, 5),\n      rep(18, 5)\n    ),\n    obs = c(\n      rbinom(5, 4, 0.45),\n      rbinom(5, 7, 0.45),\n      rbinom(5, 15, 0.45),\n      rbinom(5, 16, 0.45),\n      rbinom(5, 19, 0.45),\n      rbinom(5, 18, 0.45)\n    )\n  ) %>%\n    dplyr::mutate(\n      series = paste0(\n        \"site_\", site,\n        \"_\", species,\n        \"_rep_\", replicate\n      ),\n      time = as.numeric(time),\n      cap = 50\n    ) %>%\n    dplyr::select(-replicate))\n```\n\nThis data format isn't too difficult to set up, but it does differ from the traditional multidimensional array setup that is commonly used for fitting N-mixture models in other software packages. Next we ensure that species and series IDs are included as factor variables, in case we'd like to allow certain effects to vary by species\n```{r}\ntestdat$species <- factor(testdat$species,\n  levels = unique(testdat$species)\n)\ntestdat$series <- factor(testdat$series,\n  levels = unique(testdat$series)\n)\n```\n\nPreview the dataset to get an idea of how it is structured:\n```{r}\ndplyr::glimpse(testdat)\nhead(testdat, 12)\n```\n\n### Setting up the `trend_map`\n\nFinally, we need to set up the `trend_map` object. This is crucial for allowing multiple observations to be linked to the same latent process model (see more information about this argument in the [Shared latent states vignette](https://nicholasjclark.github.io/mvgam/articles/shared_states.html){target=\"_blank\"}). In this case, the mapping operates by species and site to state that each set of replicate observations from the same time point should all share the exact same latent abundance model:\n```{r}\ntestdat %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\ntrend_map\n```\n\nNotice how all of the replicates for species 1 in site 1 share the same process (i.e. the same `trend`). This will ensure that all replicates are Binomial draws of the same latent N.\n\n### Modelling with the `nmix()` family\n\nNow we are ready to fit a model using `mvgam()`. This model will allow each species to have different detection probabilities and different temporal trends. We will use `Cmdstan` as the backend, which by default will use Hamiltonian Monte Carlo for full Bayesian inference\n\n```{r include = FALSE, results='hide'}\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n```\n\n```{r eval = FALSE}\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n```\n\nView the automatically-generated `Stan` code to get a sense of how the marginalization over latent N works\n```{r}\ncode(mod)\n```\n\nThe posterior summary of this model shows that it has converged nicely\n```{r}\nsummary(mod)\n```\n\n`loo()` functionality works just as it does for all `mvgam` models to aid in model comparison / selection (though note that Pareto K values often give warnings for mixture models so these may not be too helpful)\n```{r}\nloo(mod)\n```\n\nPlot the estimated smooths of time from each species' latent abundance process (on the log scale)\n```{r}\nplot(mod, type = \"smooths\", trend_effects = TRUE)\n```\n\n`marginaleffects` support allows for more useful prediction-based interrogations on different scales (though note that at the time of writing this Vignette, you must have the development version of `marginaleffects` installed for `nmix()` models to be supported; use `remotes::install_github('vincentarelbundock/marginaleffects')` to install). Objects that use family `nmix()` have a few additional prediction scales that can be used (i.e. `link`, `response`, `detection` or `latent_N`). For example, here are the estimated detection probabilities per species, which show that the model has done a nice job of estimating these parameters:\n```{r}\nmarginaleffects::plot_predictions(mod,\n  condition = \"species\",\n  type = \"detection\"\n) +\n  ylab(\"Pr(detection)\") +\n  ylim(c(0, 1)) +\n  theme_classic() +\n  theme(legend.position = \"none\")\n```\n\nA common goal in N-mixture modelling is to estimate the true latent abundance. The model has automatically generated predictions for the unknown latent abundance that are conditional on the observations. We can extract these and produce decent plots using a small function\n```{r}\nhc <- hindcast(mod, type = \"latent_N\")\n\n# Function to plot latent abundance estimates vs truth\nplot_latentN <- function(hindcasts, data, species = \"sp_1\") {\n  all_series <- unique(data %>%\n    dplyr::filter(species == !!species) %>%\n    dplyr::pull(series))\n\n  # Grab the first replicate that represents this series\n  # so we can get the true simulated values\n  series <- as.numeric(all_series[1])\n  truths <- data %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::filter(series == !!levels(data$series)[series]) %>%\n    dplyr::pull(truth)\n\n  # In case some replicates have missing observations,\n  # pull out predictions for ALL replicates and average over them\n  hcs <- do.call(rbind, lapply(all_series, function(x) {\n    ind <- which(names(hindcasts$hindcasts) %in% as.character(x))\n    hindcasts$hindcasts[[ind]]\n  }))\n\n  # Calculate posterior empirical quantiles of predictions\n  pred_quantiles <- data.frame(t(apply(hcs, 2, function(x) {\n    quantile(x, probs = c(\n      0.05, 0.2, 0.3, 0.4,\n      0.5, 0.6, 0.7, 0.8, 0.95\n    ))\n  })))\n  pred_quantiles$time <- 1:NROW(pred_quantiles)\n  pred_quantiles$truth <- truths\n\n  # Grab observations\n  data %>%\n    dplyr::filter(series %in% all_series) %>%\n    dplyr::select(time, obs) -> observations\n\n  # Plot\n  ggplot(pred_quantiles, aes(x = time, group = 1)) +\n    geom_ribbon(aes(ymin = X5., ymax = X95.), fill = \"#DCBCBC\") +\n    geom_ribbon(aes(ymin = X30., ymax = X70.), fill = \"#B97C7C\") +\n    geom_line(aes(x = time, y = truth),\n      colour = \"black\", linewidth = 1\n    ) +\n    geom_point(aes(x = time, y = truth),\n      shape = 21, colour = \"white\", fill = \"black\",\n      size = 2.5\n    ) +\n    geom_jitter(\n      data = observations, aes(x = time, y = obs),\n      width = 0.06,\n      shape = 21, fill = \"darkred\", colour = \"white\", size = 2.5\n    ) +\n    labs(\n      y = \"Latent abundance (N)\",\n      x = \"Time\",\n      title = species\n    )\n}\n```\n\nLatent abundance plots vs the simulated truths for each species are shown below. Here, the red points show the imperfect observations, the black line shows the true latent abundance, and the ribbons show credible intervals of our estimates:\n```{r}\nplot_latentN(hc, testdat, species = \"sp_1\")\nplot_latentN(hc, testdat, species = \"sp_2\")\n```\n\nWe can see that estimates for both species have correctly captured the true temporal variation and magnitudes in abundance\n\n## Example 2: a larger survey with possible nonlinear effects\n\nNow for another example with a larger dataset. We will use data from [Jeff Doser's simulation example from the wonderful `spAbundance` package](https://doserlab.com/files/spabundance-web/articles/nmixturemodels){target=\"_blank\"}. The simulated data include one continuous site-level covariate, one factor site-level covariate and two continuous sample-level covariates. This example will allow us to examine how we can include possibly nonlinear effects in the latent process and detection probability models.\n  \nDownload the data and grab observations / covariate measurements for one species\n```{r}\n# Date link\nload(url(\"https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda\"))\ndata.one.sp <- dataNMixSim\n\n# Pull out observations for one species\ndata.one.sp$y <- data.one.sp$y[1, , ]\n\n# Abundance covariates that don't change across repeat sampling observations\nabund.cov <- dataNMixSim$abund.covs[, 1]\nabund.factor <- as.factor(dataNMixSim$abund.covs[, 2])\n\n# Detection covariates that can change across repeat sampling observations\n# Note that `NA`s are not allowed for covariates in mvgam, so we randomly\n# impute them here\ndet.cov <- dataNMixSim$det.covs$det.cov.1[, ]\ndet.cov[is.na(det.cov)] <- rnorm(length(which(is.na(det.cov))))\ndet.cov2 <- dataNMixSim$det.covs$det.cov.2\ndet.cov2[is.na(det.cov2)] <- rnorm(length(which(is.na(det.cov2))))\n```\n\nNext we wrangle into the appropriate 'long' data format, adding indicators of `time` and `series` for working in `mvgam`. We also add the `cap` variable to represent the maximum latent N to marginalize over for each observation\n```{r}\nmod_data <- do.call(\n  rbind,\n  lapply(1:NROW(data.one.sp$y), function(x) {\n    data.frame(\n      y = data.one.sp$y[x, ],\n      abund_cov = abund.cov[x],\n      abund_fac = abund.factor[x],\n      det_cov = det.cov[x, ],\n      det_cov2 = det.cov2[x, ],\n      replicate = 1:NCOL(data.one.sp$y),\n      site = paste0(\"site\", x)\n    )\n  })\n) %>%\n  dplyr::mutate(\n    species = \"sp_1\",\n    series = as.factor(paste0(site, \"_\", species, \"_\", replicate))\n  ) %>%\n  dplyr::mutate(\n    site = factor(site, levels = unique(site)),\n    species = factor(species, levels = unique(species)),\n    time = 1,\n    cap = max(data.one.sp$y, na.rm = TRUE) + 20\n  )\n```\n\nThe data include observations for 225 sites with three replicates per site, though some observations are missing\n```{r}\nNROW(mod_data)\ndplyr::glimpse(mod_data)\nhead(mod_data)\n```\n\nThe final step for data preparation is of course the `trend_map`, which sets up the mapping between observation replicates and the latent abundance models. This is done in the same way as in the example above\n```{r}\nmod_data %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\n\ntrend_map %>%\n  dplyr::arrange(trend) %>%\n  head(12)\n```\n\nNow we are ready to fit a model using `mvgam()`. Here we will use penalized splines for each of the continuous covariate effects to detect possible nonlinear associations. We also showcase how `mvgam` can make use of the different approximation algorithms available in `Stan` by using the meanfield variational Bayes approximator (this reduces computation time from around 90 seconds to around 12 seconds for this example)\n```{r include = FALSE, results='hide'}\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 3) + s(det_cov2, k = 3),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 3) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 4) + s(det_cov2, k = 4),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 4) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n```\n\nInspect the model summary but don't bother looking at estimates for all individual spline coefficients. Notice how we no longer receive information on convergence because we did not use MCMC sampling for this model\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nAgain we can make use of `marginaleffects` support for interrogating the model through targeted predictions. First, we can inspect the estimated average detection probability\n```{r}\nmarginaleffects::avg_predictions(mod, type = \"detection\")\n```\n\nNext investigate estimated effects of covariates on latent abundance using the `conditional_effects()` function and specifying `type = 'link'`; this will return plots on the expectation scale\n```{r}\nabund_plots <- plot(\n  conditional_effects(mod,\n    type = \"link\",\n    effects = c(\n      \"abund_cov\",\n      \"abund_fac\"\n    )\n  ),\n  plot = FALSE\n)\n```\n\nThe effect of the continuous covariate on expected latent abundance\n```{r}\nabund_plots[[1]] +\n  ylab(\"Expected latent abundance\")\n```\n\nThe effect of the factor covariate on expected latent abundance, estimated as a hierarchical random effect\n```{r}\nabund_plots[[2]] +\n  ylab(\"Expected latent abundance\")\n```\n\nNow we can investigate estimated effects of covariates on detection probability using `type = 'detection'`\n```{r}\ndet_plots <- plot(\n  conditional_effects(mod,\n    type = \"detection\",\n    effects = c(\n      \"det_cov\",\n      \"det_cov2\"\n    )\n  ),\n  plot = FALSE\n)\n```\n\nThe covariate smooths were estimated to be somewhat nonlinear on the logit scale according to the model summary (based on their approximate significances). But inspecting conditional effects of each covariate on the probability scale is more intuitive and useful\n```{r}\ndet_plots[[1]] +\n  ylab(\"Pr(detection)\")\ndet_plots[[2]] +\n  ylab(\"Pr(detection)\")\n```\n\nMore targeted predictions are also easy with `marginaleffects` support. For example, we can ask: How does detection probability change as we change *both* detection covariates?\n```{r}\nfivenum_round <- function(x) round(fivenum(x, na.rm = TRUE), 2)\n\nmarginaleffects::plot_predictions(mod,\n  newdata = marginaleffects::datagrid(\n    det_cov = unique,\n    det_cov2 = fivenum_round\n  ),\n  by = c(\"det_cov\", \"det_cov2\"),\n  type = \"detection\"\n) +\n  theme_classic() +\n  ylab(\"Pr(detection)\")\n```\n\nThe model has found support for some important covariate effects, but of course we'd want to interrogate how well the model predicts and think about possible spatial effects to capture unmodelled variation in latent abundance (which can easily be incorporated into both linear predictors using spatial smooths).\n\n## Further reading\nThe following papers and resources offer useful material about N-mixture models for ecological population dynamics investigations:\n  \nGuélat, Jérôme, and Kéry, Marc. “[Effects of Spatial Autocorrelation and Imperfect Detection on Species Distribution Models.](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.12983)” *Methods in Ecology and Evolution* 9 (2018): 1614–25.\n  \nKéry, Marc, and Royle Andrew J. \"[Applied hierarchical modeling in ecology: Analysis of distribution, abundance and species richness in R and BUGS: Volume 2: Dynamic and advanced models](https://shop.elsevier.com/books/applied-hierarchical-modeling-in-ecology-analysis-of-distribution-abundance-and-species-richness-in-r-and-bugs/kery/978-0-12-809585-0)\". London, UK: Academic Press (2020).\n  \nRoyle, Andrew J. \"[N‐mixture models for estimating population size from spatially replicated counts.](https://onlinelibrary.wiley.com/doi/full/10.1111/j.0006-341X.2004.00142.x)\" *Biometrics* 60.1 (2004): 108-115.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "inst/doc/nmixtures.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>N-mixtures in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">N-mixtures in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to fit and interrogate N-mixture models for\npopulation abundance counts made with imperfect detection.</p>\n<div id=\"n-mixture-models\" class=\"section level2\">\n<h2>N-mixture models</h2>\n<p>An N-mixture model is a fairly recent addition to the ecological\nmodeller’s toolkit that is designed to make inferences about variation\nin the abundance of species when observations are imperfect (<a href=\"https://onlinelibrary.wiley.com/doi/10.1111/j.0006-341X.2004.00142.x\" target=\"_blank\">Royle 2004</a>). Briefly, assume <span class=\"math inline\">\\(\\boldsymbol{Y_{i,r}}\\)</span> is the number of\nindividuals recorded at site <span class=\"math inline\">\\(i\\)</span>\nduring replicate sampling observation <span class=\"math inline\">\\(r\\)</span> (recorded as a non-negative integer).\nIf multiple replicate surveys are done within a short enough period to\nsatisfy the assumption that the population remained closed (i.e. there\nwas no substantial change in true population size between replicate\nsurveys), we can account for the fact that observations aren’t perfect.\nThis is done by assuming that these replicate observations are Binomial\nrandom variables that are parameterized by the true “latent” abundance\n<span class=\"math inline\">\\(N\\)</span> and a detection probability <span class=\"math inline\">\\(p\\)</span>:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{Y_{i,r}} &amp; \\sim \\text{Binomial}(N_i, p_r) \\\\\nN_{i} &amp; \\sim \\text{Poisson}(\\lambda_i)  \\end{align*}\\]</span></p>\n<p>Using a set of linear predictors, we can estimate effects of\ncovariates <span class=\"math inline\">\\(\\boldsymbol{X}\\)</span> on the\nexpected latent abundance (with a log link for <span class=\"math inline\">\\(\\lambda\\)</span>) and, jointly, effects of\npossibly different covariates (call them <span class=\"math inline\">\\(\\boldsymbol{Q}\\)</span>) on detection probability\n(with a logit link for <span class=\"math inline\">\\(p\\)</span>):</p>\n<p><span class=\"math display\">\\[\\begin{align*}\nlog(\\lambda) &amp; = \\beta \\boldsymbol{X} \\\\\nlogit(p) &amp; = \\gamma \\boldsymbol{Q}\\end{align*}\\]</span></p>\n<p><code>mvgam</code> can handle this type of model because it is\ndesigned to propagate unobserved temporal processes that evolve\nindependently of the observation process in a State-space format. This\nsetup adapts well to N-mixture models because they can be thought of as\nState-space models in which the latent state is a discrete variable\nrepresenting the “true” but unknown population size. This is very\nconvenient because we can incorporate any of the package’s diverse\neffect types (i.e. multidimensional splines, time-varying effects,\nmonotonic effects, random effects etc…) into the linear predictors. All\nthat is required for this to work is a marginalization trick that allows\n<code>Stan</code>’s sampling algorithms to handle discrete parameters\n(see more about how this method of “integrating out” discrete parameters\nworks in <a href=\"https://mbjoseph.github.io/posts/2020-04-28-a-step-by-step-guide-to-marginalizing-over-discrete-parameters-for-ecologists-using-stan/\" target=\"_blank\">this nice blog post by Maxwell Joseph</a>).</p>\n<p>The family <code>nmix()</code> is used to set up N-mixture models in\n<code>mvgam</code>, but we still need to do a little bit of data\nwrangling to ensure the data are set up in the correct format (this is\nespecially true when we have more than one replicate survey per time\nperiod). The most important aspects are: (1) how we set up the\nobservation <code>series</code> and <code>trend_map</code> arguments to\nensure replicate surveys are mapped to the correct latent abundance\nmodel and (2) the inclusion of a <code>cap</code> variable that defines\nthe maximum possible integer value to use for each observation when\nestimating latent abundance. The two examples below give a reasonable\noverview of how this can be done.</p>\n</div>\n<div id=\"example-1-a-two-species-system-with-nonlinear-trends\" class=\"section level2\">\n<h2>Example 1: a two-species system with nonlinear trends</h2>\n<p>First we will use a simple simulation in which multiple replicate\nobservations are taken at each timepoint for two different species. The\nsimulation produces observations at a single site over six years, with\nfive replicate surveys per year. Each species is simulated to have\ndifferent nonlinear temporal trends and different detection\nprobabilities. For now, detection probability is fixed (i.e. it does not\nchange over time or in association with any covariates). Notice that we\nadd the <code>cap</code> variable, which does not need to be static, to\ndefine the maximum possible value that we think the latent abundance\ncould be for each timepoint. This simply needs to be large enough that\nwe get a reasonable idea of which latent N values are most likely,\nwithout adding too much computational cost:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">999</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a><span class=\"co\"># Simulate observations for species 1, which shows a declining trend and 0.7 detection probability</span></span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a><span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">site =</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"co\"># five replicates per year; six years</span></span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">replicate =</span> <span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">5</span>, <span class=\"dv\">6</span>),</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>  <span class=\"at\">time =</span> <span class=\"fu\">sort</span>(<span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">6</span>, <span class=\"dv\">5</span>)),</span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>  <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>,</span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a>  <span class=\"co\"># true abundance declines nonlinearly</span></span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a>  <span class=\"at\">truth =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">28</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">26</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">23</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">16</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">14</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" tabindex=\"-1\"></a>    <span class=\"fu\">rep</span>(<span class=\"dv\">14</span>, <span class=\"dv\">5</span>)</span>\n<span id=\"cb1-17\"><a href=\"#cb1-17\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb1-18\"><a href=\"#cb1-18\" tabindex=\"-1\"></a>  <span class=\"co\"># observations are taken with detection prob = 0.7</span></span>\n<span id=\"cb1-19\"><a href=\"#cb1-19\" tabindex=\"-1\"></a>  <span class=\"at\">obs =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-20\"><a href=\"#cb1-20\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">28</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-21\"><a href=\"#cb1-21\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">26</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-22\"><a href=\"#cb1-22\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">23</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-23\"><a href=\"#cb1-23\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">15</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-24\"><a href=\"#cb1-24\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">14</span>, <span class=\"fl\">0.7</span>),</span>\n<span id=\"cb1-25\"><a href=\"#cb1-25\" tabindex=\"-1\"></a>    <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">14</span>, <span class=\"fl\">0.7</span>)</span>\n<span id=\"cb1-26\"><a href=\"#cb1-26\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb1-27\"><a href=\"#cb1-27\" tabindex=\"-1\"></a>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-28\"><a href=\"#cb1-28\" tabindex=\"-1\"></a>  <span class=\"co\"># add &#39;series&#39; information, which is an identifier of site, replicate and species</span></span>\n<span id=\"cb1-29\"><a href=\"#cb1-29\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb1-30\"><a href=\"#cb1-30\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb1-31\"><a href=\"#cb1-31\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;site_&quot;</span>, site,</span>\n<span id=\"cb1-32\"><a href=\"#cb1-32\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;_&quot;</span>, species,</span>\n<span id=\"cb1-33\"><a href=\"#cb1-33\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;_rep_&quot;</span>, replicate</span>\n<span id=\"cb1-34\"><a href=\"#cb1-34\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb1-35\"><a href=\"#cb1-35\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"fu\">as.numeric</span>(time),</span>\n<span id=\"cb1-36\"><a href=\"#cb1-36\" tabindex=\"-1\"></a>    <span class=\"co\"># add a &#39;cap&#39; variable that defines the maximum latent N to</span></span>\n<span id=\"cb1-37\"><a href=\"#cb1-37\" tabindex=\"-1\"></a>    <span class=\"co\"># marginalize over when estimating latent abundance; in other words</span></span>\n<span id=\"cb1-38\"><a href=\"#cb1-38\" tabindex=\"-1\"></a>    <span class=\"co\"># how large do we realistically think the true abundance could be?</span></span>\n<span id=\"cb1-39\"><a href=\"#cb1-39\" tabindex=\"-1\"></a>    <span class=\"at\">cap =</span> <span class=\"dv\">100</span></span>\n<span id=\"cb1-40\"><a href=\"#cb1-40\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-41\"><a href=\"#cb1-41\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(<span class=\"sc\">-</span>replicate) <span class=\"ot\">-&gt;</span> testdat</span>\n<span id=\"cb1-42\"><a href=\"#cb1-42\" tabindex=\"-1\"></a></span>\n<span id=\"cb1-43\"><a href=\"#cb1-43\" tabindex=\"-1\"></a><span class=\"co\"># Now add another species that has a different temporal trend and a smaller</span></span>\n<span id=\"cb1-44\"><a href=\"#cb1-44\" tabindex=\"-1\"></a><span class=\"co\"># detection probability (0.45 for this species)</span></span>\n<span id=\"cb1-45\"><a href=\"#cb1-45\" tabindex=\"-1\"></a>testdat <span class=\"ot\">&lt;-</span> testdat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-46\"><a href=\"#cb1-46\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">bind_rows</span>(<span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb1-47\"><a href=\"#cb1-47\" tabindex=\"-1\"></a>    <span class=\"at\">site =</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb1-48\"><a href=\"#cb1-48\" tabindex=\"-1\"></a>    <span class=\"at\">replicate =</span> <span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">5</span>, <span class=\"dv\">6</span>),</span>\n<span id=\"cb1-49\"><a href=\"#cb1-49\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"fu\">sort</span>(<span class=\"fu\">rep</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">6</span>, <span class=\"dv\">5</span>)),</span>\n<span id=\"cb1-50\"><a href=\"#cb1-50\" tabindex=\"-1\"></a>    <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_2&quot;</span>,</span>\n<span id=\"cb1-51\"><a href=\"#cb1-51\" tabindex=\"-1\"></a>    <span class=\"at\">truth =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-52\"><a href=\"#cb1-52\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">4</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-53\"><a href=\"#cb1-53\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">7</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-54\"><a href=\"#cb1-54\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">15</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-55\"><a href=\"#cb1-55\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">16</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-56\"><a href=\"#cb1-56\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">19</span>, <span class=\"dv\">5</span>),</span>\n<span id=\"cb1-57\"><a href=\"#cb1-57\" tabindex=\"-1\"></a>      <span class=\"fu\">rep</span>(<span class=\"dv\">18</span>, <span class=\"dv\">5</span>)</span>\n<span id=\"cb1-58\"><a href=\"#cb1-58\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb1-59\"><a href=\"#cb1-59\" tabindex=\"-1\"></a>    <span class=\"at\">obs =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb1-60\"><a href=\"#cb1-60\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">4</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-61\"><a href=\"#cb1-61\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">7</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-62\"><a href=\"#cb1-62\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">15</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-63\"><a href=\"#cb1-63\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">16</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-64\"><a href=\"#cb1-64\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">19</span>, <span class=\"fl\">0.45</span>),</span>\n<span id=\"cb1-65\"><a href=\"#cb1-65\" tabindex=\"-1\"></a>      <span class=\"fu\">rbinom</span>(<span class=\"dv\">5</span>, <span class=\"dv\">18</span>, <span class=\"fl\">0.45</span>)</span>\n<span id=\"cb1-66\"><a href=\"#cb1-66\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb1-67\"><a href=\"#cb1-67\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-68\"><a href=\"#cb1-68\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb1-69\"><a href=\"#cb1-69\" tabindex=\"-1\"></a>      <span class=\"at\">series =</span> <span class=\"fu\">paste0</span>(</span>\n<span id=\"cb1-70\"><a href=\"#cb1-70\" tabindex=\"-1\"></a>        <span class=\"st\">&quot;site_&quot;</span>, site,</span>\n<span id=\"cb1-71\"><a href=\"#cb1-71\" tabindex=\"-1\"></a>        <span class=\"st\">&quot;_&quot;</span>, species,</span>\n<span id=\"cb1-72\"><a href=\"#cb1-72\" tabindex=\"-1\"></a>        <span class=\"st\">&quot;_rep_&quot;</span>, replicate</span>\n<span id=\"cb1-73\"><a href=\"#cb1-73\" tabindex=\"-1\"></a>      ),</span>\n<span id=\"cb1-74\"><a href=\"#cb1-74\" tabindex=\"-1\"></a>      <span class=\"at\">time =</span> <span class=\"fu\">as.numeric</span>(time),</span>\n<span id=\"cb1-75\"><a href=\"#cb1-75\" tabindex=\"-1\"></a>      <span class=\"at\">cap =</span> <span class=\"dv\">50</span></span>\n<span id=\"cb1-76\"><a href=\"#cb1-76\" tabindex=\"-1\"></a>    ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb1-77\"><a href=\"#cb1-77\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(<span class=\"sc\">-</span>replicate))</span></code></pre></div>\n<p>This data format isn’t too difficult to set up, but it does differ\nfrom the traditional multidimensional array setup that is commonly used\nfor fitting N-mixture models in other software packages. Next we ensure\nthat species and series IDs are included as factor variables, in case\nwe’d like to allow certain effects to vary by species</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a>testdat<span class=\"sc\">$</span>species <span class=\"ot\">&lt;-</span> <span class=\"fu\">factor</span>(testdat<span class=\"sc\">$</span>species,</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a>  <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(testdat<span class=\"sc\">$</span>species)</span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a>testdat<span class=\"sc\">$</span>series <span class=\"ot\">&lt;-</span> <span class=\"fu\">factor</span>(testdat<span class=\"sc\">$</span>series,</span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a>  <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(testdat<span class=\"sc\">$</span>series)</span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Preview the dataset to get an idea of how it is structured:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(testdat)</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 60</span></span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 7</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ site    &lt;dbl&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time    &lt;dbl&gt; 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,…</span></span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ species &lt;fct&gt; sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp…</span></span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ truth   &lt;dbl&gt; 28, 28, 28, 28, 28, 26, 26, 26, 26, 26, 23, 23, 23, 23, 23, 16…</span></span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ obs     &lt;int&gt; 20, 19, 23, 17, 18, 21, 18, 21, 19, 18, 17, 16, 20, 11, 19, 9,…</span></span>\n<span id=\"cb3-9\"><a href=\"#cb3-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series  &lt;fct&gt; site_1_sp_1_rep_1, site_1_sp_1_rep_2, site_1_sp_1_rep_3, site_…</span></span>\n<span id=\"cb3-10\"><a href=\"#cb3-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ cap     &lt;dbl&gt; 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 10…</span></span>\n<span id=\"cb3-11\"><a href=\"#cb3-11\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(testdat, <span class=\"dv\">12</span>)</span>\n<span id=\"cb3-12\"><a href=\"#cb3-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    site time species truth obs            series cap</span></span>\n<span id=\"cb3-13\"><a href=\"#cb3-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1     1    1    sp_1    28  20 site_1_sp_1_rep_1 100</span></span>\n<span id=\"cb3-14\"><a href=\"#cb3-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2     1    1    sp_1    28  19 site_1_sp_1_rep_2 100</span></span>\n<span id=\"cb3-15\"><a href=\"#cb3-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3     1    1    sp_1    28  23 site_1_sp_1_rep_3 100</span></span>\n<span id=\"cb3-16\"><a href=\"#cb3-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4     1    1    sp_1    28  17 site_1_sp_1_rep_4 100</span></span>\n<span id=\"cb3-17\"><a href=\"#cb3-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5     1    1    sp_1    28  18 site_1_sp_1_rep_5 100</span></span>\n<span id=\"cb3-18\"><a href=\"#cb3-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6     1    2    sp_1    26  21 site_1_sp_1_rep_1 100</span></span>\n<span id=\"cb3-19\"><a href=\"#cb3-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7     1    2    sp_1    26  18 site_1_sp_1_rep_2 100</span></span>\n<span id=\"cb3-20\"><a href=\"#cb3-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8     1    2    sp_1    26  21 site_1_sp_1_rep_3 100</span></span>\n<span id=\"cb3-21\"><a href=\"#cb3-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9     1    2    sp_1    26  19 site_1_sp_1_rep_4 100</span></span>\n<span id=\"cb3-22\"><a href=\"#cb3-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10    1    2    sp_1    26  18 site_1_sp_1_rep_5 100</span></span>\n<span id=\"cb3-23\"><a href=\"#cb3-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11    1    3    sp_1    23  17 site_1_sp_1_rep_1 100</span></span>\n<span id=\"cb3-24\"><a href=\"#cb3-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12    1    3    sp_1    23  16 site_1_sp_1_rep_2 100</span></span></code></pre></div>\n<div id=\"setting-up-the-trend_map\" class=\"section level3\">\n<h3>Setting up the <code>trend_map</code></h3>\n<p>Finally, we need to set up the <code>trend_map</code> object. This is\ncrucial for allowing multiple observations to be linked to the same\nlatent process model (see more information about this argument in the <a href=\"https://nicholasjclark.github.io/mvgam/articles/shared_states.html\" target=\"_blank\">Shared latent states vignette</a>). In this case, the\nmapping operates by species and site to state that each set of replicate\nobservations from the same time point should all share the exact same\nlatent abundance model:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a>testdat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  <span class=\"co\"># each unique combination of site*species is a separate process</span></span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">trend =</span> <span class=\"fu\">as.numeric</span>(<span class=\"fu\">factor</span>(<span class=\"fu\">paste0</span>(site, species)))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(trend, series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">distinct</span>() <span class=\"ot\">-&gt;</span> trend_map</span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a>trend_map</span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    trend            series</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1      1 site_1_sp_1_rep_1</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2      1 site_1_sp_1_rep_2</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3      1 site_1_sp_1_rep_3</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4      1 site_1_sp_1_rep_4</span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5      1 site_1_sp_1_rep_5</span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6      2 site_1_sp_2_rep_1</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7      2 site_1_sp_2_rep_2</span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8      2 site_1_sp_2_rep_3</span></span>\n<span id=\"cb4-16\"><a href=\"#cb4-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9      2 site_1_sp_2_rep_4</span></span>\n<span id=\"cb4-17\"><a href=\"#cb4-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10     2 site_1_sp_2_rep_5</span></span></code></pre></div>\n<p>Notice how all of the replicates for species 1 in site 1 share the\nsame process (i.e. the same <code>trend</code>). This will ensure that\nall replicates are Binomial draws of the same latent N.</p>\n</div>\n<div id=\"modelling-with-the-nmix-family\" class=\"section level3\">\n<h3>Modelling with the <code>nmix()</code> family</h3>\n<p>Now we are ready to fit a model using <code>mvgam()</code>. This\nmodel will allow each species to have different detection probabilities\nand different temporal trends. We will use <code>Cmdstan</code> as the\nbackend, which by default will use Hamiltonian Monte Carlo for full\nBayesian inference</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>  <span class=\"co\"># the observation formula sets up linear predictors for</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>  <span class=\"co\"># detection probability on the logit scale</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> obs <span class=\"sc\">~</span> species <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a>  <span class=\"co\"># the trend_formula sets up the linear predictors for</span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a>  <span class=\"co\"># the latent abundance processes on the log scale</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(time, <span class=\"at\">by =</span> trend, <span class=\"at\">k =</span> <span class=\"dv\">4</span>) <span class=\"sc\">+</span> species,</span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-10\"><a href=\"#cb5-10\" tabindex=\"-1\"></a>  <span class=\"co\"># the trend_map takes care of the mapping</span></span>\n<span id=\"cb5-11\"><a href=\"#cb5-11\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb5-12\"><a href=\"#cb5-12\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-13\"><a href=\"#cb5-13\" tabindex=\"-1\"></a>  <span class=\"co\"># nmix() family and data</span></span>\n<span id=\"cb5-14\"><a href=\"#cb5-14\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">nmix</span>(),</span>\n<span id=\"cb5-15\"><a href=\"#cb5-15\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> testdat,</span>\n<span id=\"cb5-16\"><a href=\"#cb5-16\" tabindex=\"-1\"></a></span>\n<span id=\"cb5-17\"><a href=\"#cb5-17\" tabindex=\"-1\"></a>  <span class=\"co\"># priors can be set in the usual way</span></span>\n<span id=\"cb5-18\"><a href=\"#cb5-18\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb5-19\"><a href=\"#cb5-19\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> b),</span>\n<span id=\"cb5-20\"><a href=\"#cb5-20\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"dv\">1</span>, <span class=\"fl\">1.5</span>), <span class=\"at\">class =</span> Intercept_trend)</span>\n<span id=\"cb5-21\"><a href=\"#cb5-21\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb5-22\"><a href=\"#cb5-22\" tabindex=\"-1\"></a>  <span class=\"at\">samples =</span> <span class=\"dv\">1000</span></span>\n<span id=\"cb5-23\"><a href=\"#cb5-23\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>View the automatically-generated <code>Stan</code> code to get a\nsense of how the marginalization over latent N works</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">code</span>(mod)</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp_trend; // number of trend smoothing parameters</span></span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_lv; // number of dynamic factors</span></span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_series, n_lv] Z; // matrix mapping series to latent states</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb6-11\"><a href=\"#cb6-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis_trend; // number of trend basis coefficients</span></span>\n<span id=\"cb6-12\"><a href=\"#cb6-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients</span></span>\n<span id=\"cb6-13\"><a href=\"#cb6-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb6-14\"><a href=\"#cb6-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix</span></span>\n<span id=\"cb6-15\"><a href=\"#cb6-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb6-16\"><a href=\"#cb6-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_lv] int ytimes_trend;</span></span>\n<span id=\"cb6-17\"><a href=\"#cb6-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb6-18\"><a href=\"#cb6-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[total_obs] int&lt;lower=0&gt; cap; // upper limits of latent abundances</span></span>\n<span id=\"cb6-19\"><a href=\"#cb6-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[total_obs] int ytimes_array; // sorted ytimes</span></span>\n<span id=\"cb6-20\"><a href=\"#cb6-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes_pred; // time-ordered matrix for prediction</span></span>\n<span id=\"cb6-21\"><a href=\"#cb6-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; K_groups; // number of unique replicated observations</span></span>\n<span id=\"cb6-22\"><a href=\"#cb6-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; K_reps; // maximum number of replicate observations</span></span>\n<span id=\"cb6-23\"><a href=\"#cb6-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; K_starts; // col of K_inds where each group starts</span></span>\n<span id=\"cb6-24\"><a href=\"#cb6-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; K_stops; // col of K_inds where each group ends</span></span>\n<span id=\"cb6-25\"><a href=\"#cb6-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups, K_reps] int&lt;lower=0&gt; K_inds; // indices of replicated observations</span></span>\n<span id=\"cb6-26\"><a href=\"#cb6-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[3, 6] S_trend1; // mgcv smooth penalty matrix S_trend1</span></span>\n<span id=\"cb6-27\"><a href=\"#cb6-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[3, 6] S_trend2; // mgcv smooth penalty matrix S_trend2</span></span>\n<span id=\"cb6-28\"><a href=\"#cb6-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[total_obs] int&lt;lower=0&gt; flat_ys; // flattened observations</span></span>\n<span id=\"cb6-29\"><a href=\"#cb6-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-30\"><a href=\"#cb6-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed data {</span></span>\n<span id=\"cb6-31\"><a href=\"#cb6-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X_ordered = X[ytimes_array,  : ];</span></span>\n<span id=\"cb6-32\"><a href=\"#cb6-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; Y_max;</span></span>\n<span id=\"cb6-33\"><a href=\"#cb6-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[K_groups] int&lt;lower=0&gt; N_max;</span></span>\n<span id=\"cb6-34\"><a href=\"#cb6-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (k in 1 : K_groups) {</span></span>\n<span id=\"cb6-35\"><a href=\"#cb6-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Y_max[k] = max(flat_ys[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span id=\"cb6-36\"><a href=\"#cb6-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     N_max[k] = max(cap[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span id=\"cb6-37\"><a href=\"#cb6-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-38\"><a href=\"#cb6-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-39\"><a href=\"#cb6-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb6-40\"><a href=\"#cb6-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb6-41\"><a href=\"#cb6-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb6-42\"><a href=\"#cb6-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_raw_trend;</span></span>\n<span id=\"cb6-43\"><a href=\"#cb6-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-44\"><a href=\"#cb6-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb6-45\"><a href=\"#cb6-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp_trend] lambda_trend;</span></span>\n<span id=\"cb6-46\"><a href=\"#cb6-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-47\"><a href=\"#cb6-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb6-48\"><a href=\"#cb6-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // detection probability</span></span>\n<span id=\"cb6-49\"><a href=\"#cb6-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] p;</span></span>\n<span id=\"cb6-50\"><a href=\"#cb6-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-51\"><a href=\"#cb6-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent states</span></span>\n<span id=\"cb6-52\"><a href=\"#cb6-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_lv] LV;</span></span>\n<span id=\"cb6-53\"><a href=\"#cb6-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-54\"><a href=\"#cb6-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent states and loading matrix</span></span>\n<span id=\"cb6-55\"><a href=\"#cb6-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n * n_lv] trend_mus;</span></span>\n<span id=\"cb6-56\"><a href=\"#cb6-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span id=\"cb6-57\"><a href=\"#cb6-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-58\"><a href=\"#cb6-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb6-59\"><a href=\"#cb6-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb6-60\"><a href=\"#cb6-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_trend;</span></span>\n<span id=\"cb6-61\"><a href=\"#cb6-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-62\"><a href=\"#cb6-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // observation model basis coefficients</span></span>\n<span id=\"cb6-63\"><a href=\"#cb6-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span id=\"cb6-64\"><a href=\"#cb6-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-65\"><a href=\"#cb6-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // process model basis coefficients</span></span>\n<span id=\"cb6-66\"><a href=\"#cb6-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend];</span></span>\n<span id=\"cb6-67\"><a href=\"#cb6-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-68\"><a href=\"#cb6-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // detection probability</span></span>\n<span id=\"cb6-69\"><a href=\"#cb6-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   p = X_ordered * b;</span></span>\n<span id=\"cb6-70\"><a href=\"#cb6-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-71\"><a href=\"#cb6-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent process linear predictors</span></span>\n<span id=\"cb6-72\"><a href=\"#cb6-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   trend_mus = X_trend * b_trend;</span></span>\n<span id=\"cb6-73\"><a href=\"#cb6-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (j in 1 : n_lv) {</span></span>\n<span id=\"cb6-74\"><a href=\"#cb6-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     LV[1 : n, j] = trend_mus[ytimes_trend[1 : n, j]];</span></span>\n<span id=\"cb6-75\"><a href=\"#cb6-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-76\"><a href=\"#cb6-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-77\"><a href=\"#cb6-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // derived latent states</span></span>\n<span id=\"cb6-78\"><a href=\"#cb6-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (i in 1 : n) {</span></span>\n<span id=\"cb6-79\"><a href=\"#cb6-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (s in 1 : n_series) {</span></span>\n<span id=\"cb6-80\"><a href=\"#cb6-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);</span></span>\n<span id=\"cb6-81\"><a href=\"#cb6-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb6-82\"><a href=\"#cb6-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-83\"><a href=\"#cb6-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-84\"><a href=\"#cb6-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb6-85\"><a href=\"#cb6-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for speciessp_1...</span></span>\n<span id=\"cb6-86\"><a href=\"#cb6-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ std_normal();</span></span>\n<span id=\"cb6-87\"><a href=\"#cb6-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-88\"><a href=\"#cb6-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for speciessp_2...</span></span>\n<span id=\"cb6-89\"><a href=\"#cb6-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2] ~ std_normal();</span></span>\n<span id=\"cb6-90\"><a href=\"#cb6-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-91\"><a href=\"#cb6-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // dynamic process models</span></span>\n<span id=\"cb6-92\"><a href=\"#cb6-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-93\"><a href=\"#cb6-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)_trend...</span></span>\n<span id=\"cb6-94\"><a href=\"#cb6-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[1] ~ normal(1, 1.5);</span></span>\n<span id=\"cb6-95\"><a href=\"#cb6-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-96\"><a href=\"#cb6-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for speciessp_2_trend...</span></span>\n<span id=\"cb6-97\"><a href=\"#cb6-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[2] ~ std_normal();</span></span>\n<span id=\"cb6-98\"><a href=\"#cb6-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-99\"><a href=\"#cb6-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(time):trendtrend1_trend...</span></span>\n<span id=\"cb6-100\"><a href=\"#cb6-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[3 : 5] ~ multi_normal_prec(zero_trend[3 : 5],</span></span>\n<span id=\"cb6-101\"><a href=\"#cb6-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          S_trend1[1 : 3, 1 : 3]</span></span>\n<span id=\"cb6-102\"><a href=\"#cb6-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          * lambda_trend[1]</span></span>\n<span id=\"cb6-103\"><a href=\"#cb6-103\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          + S_trend1[1 : 3, 4 : 6]</span></span>\n<span id=\"cb6-104\"><a href=\"#cb6-104\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                            * lambda_trend[2]);</span></span>\n<span id=\"cb6-105\"><a href=\"#cb6-105\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb6-106\"><a href=\"#cb6-106\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(time):trendtrend2_trend...</span></span>\n<span id=\"cb6-107\"><a href=\"#cb6-107\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[6 : 8] ~ multi_normal_prec(zero_trend[6 : 8],</span></span>\n<span id=\"cb6-108\"><a href=\"#cb6-108\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          S_trend2[1 : 3, 1 : 3]</span></span>\n<span id=\"cb6-109\"><a href=\"#cb6-109\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          * lambda_trend[3]</span></span>\n<span id=\"cb6-110\"><a href=\"#cb6-110\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          + S_trend2[1 : 3, 4 : 6]</span></span>\n<span id=\"cb6-111\"><a href=\"#cb6-111\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                            * lambda_trend[4]);</span></span>\n<span id=\"cb6-112\"><a href=\"#cb6-112\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda_trend ~ normal(5, 30);</span></span>\n<span id=\"cb6-113\"><a href=\"#cb6-113\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb6-114\"><a href=\"#cb6-114\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb6-115\"><a href=\"#cb6-115\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     array[total_obs] real flat_trends;</span></span>\n<span id=\"cb6-116\"><a href=\"#cb6-116\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     array[total_obs] real flat_ps;</span></span>\n<span id=\"cb6-117\"><a href=\"#cb6-117\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_trends = to_array_1d(trend);</span></span>\n<span id=\"cb6-118\"><a href=\"#cb6-118\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ps = to_array_1d(p);</span></span>\n<span id=\"cb6-119\"><a href=\"#cb6-119\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     </span></span>\n<span id=\"cb6-120\"><a href=\"#cb6-120\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // loop over replicate sampling window (each site*time*species combination)</span></span>\n<span id=\"cb6-121\"><a href=\"#cb6-121\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (k in 1 : K_groups) {</span></span>\n<span id=\"cb6-122\"><a href=\"#cb6-122\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // all log_lambdas are identical because they represent site*time</span></span>\n<span id=\"cb6-123\"><a href=\"#cb6-123\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // covariates; so just use the first measurement</span></span>\n<span id=\"cb6-124\"><a href=\"#cb6-124\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       real log_lambda = flat_trends[K_inds[k, 1]];</span></span>\n<span id=\"cb6-125\"><a href=\"#cb6-125\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-126\"><a href=\"#cb6-126\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // logit-scale detection probilities for the replicate observations</span></span>\n<span id=\"cb6-127\"><a href=\"#cb6-127\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       vector[size(K_inds[k, K_starts[k] : K_stops[k]])] logit_p = to_vector(flat_ps[K_inds[k, K_starts[k] : K_stops[k]]]);</span></span>\n<span id=\"cb6-128\"><a href=\"#cb6-128\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-129\"><a href=\"#cb6-129\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // K values and observed counts for these replicates</span></span>\n<span id=\"cb6-130\"><a href=\"#cb6-130\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       int K_max = N_max[k];</span></span>\n<span id=\"cb6-131\"><a href=\"#cb6-131\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       int K_min = Y_max[k];</span></span>\n<span id=\"cb6-132\"><a href=\"#cb6-132\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       array[size(K_inds[k, K_starts[k] : K_stops[k]])] int N_obs = flat_ys[K_inds[k, K_starts[k] : K_stops[k]]];</span></span>\n<span id=\"cb6-133\"><a href=\"#cb6-133\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       int possible_N = K_max - K_min;</span></span>\n<span id=\"cb6-134\"><a href=\"#cb6-134\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-135\"><a href=\"#cb6-135\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // marginalize over possible latent counts analytically</span></span>\n<span id=\"cb6-136\"><a href=\"#cb6-136\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       real ff = exp(log_lambda) * prod(1 - inv_logit(logit_p));</span></span>\n<span id=\"cb6-137\"><a href=\"#cb6-137\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       real prob_n = 1;</span></span>\n<span id=\"cb6-138\"><a href=\"#cb6-138\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       for (i in 1 : possible_N) {</span></span>\n<span id=\"cb6-139\"><a href=\"#cb6-139\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         real N = K_max - i + 1;</span></span>\n<span id=\"cb6-140\"><a href=\"#cb6-140\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         real k_obs = 1;</span></span>\n<span id=\"cb6-141\"><a href=\"#cb6-141\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         for (j in 1 : size(N_obs)) {</span></span>\n<span id=\"cb6-142\"><a href=\"#cb6-142\" tabindex=\"-1\"></a><span class=\"co\">#&gt;           k_obs *= N / (N - N_obs[j]);</span></span>\n<span id=\"cb6-143\"><a href=\"#cb6-143\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         }</span></span>\n<span id=\"cb6-144\"><a href=\"#cb6-144\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         prob_n = 1 + prob_n * ff * k_obs / N;</span></span>\n<span id=\"cb6-145\"><a href=\"#cb6-145\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       }</span></span>\n<span id=\"cb6-146\"><a href=\"#cb6-146\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       </span></span>\n<span id=\"cb6-147\"><a href=\"#cb6-147\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       // add log(pr_n) to prob(K_min)</span></span>\n<span id=\"cb6-148\"><a href=\"#cb6-148\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       target += poisson_log_lpmf(K_min | log_lambda)</span></span>\n<span id=\"cb6-149\"><a href=\"#cb6-149\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 + binomial_logit_lpmf(N_obs | K_min, logit_p) + log(prob_n);</span></span>\n<span id=\"cb6-150\"><a href=\"#cb6-150\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb6-151\"><a href=\"#cb6-151\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb6-152\"><a href=\"#cb6-152\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb6-153\"><a href=\"#cb6-153\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb6-154\"><a href=\"#cb6-154\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_lv] penalty = rep_vector(1e12, n_lv);</span></span>\n<span id=\"cb6-155\"><a href=\"#cb6-155\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] detprob = inv_logit(p);</span></span>\n<span id=\"cb6-156\"><a href=\"#cb6-156\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp_trend] rho_trend = log(lambda_trend);</span></span>\n<span id=\"cb6-157\"><a href=\"#cb6-157\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>The posterior summary of this model shows that it has converged\nnicely</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; obs ~ species - 1</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(time, by = trend, k = 4) + species</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; nmix</span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-16\"><a href=\"#cb7-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb7-17\"><a href=\"#cb7-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb7-18\"><a href=\"#cb7-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-19\"><a href=\"#cb7-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb7-20\"><a href=\"#cb7-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 </span></span>\n<span id=\"cb7-21\"><a href=\"#cb7-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-22\"><a href=\"#cb7-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb7-23\"><a href=\"#cb7-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 </span></span>\n<span id=\"cb7-24\"><a href=\"#cb7-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-25\"><a href=\"#cb7-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb7-26\"><a href=\"#cb7-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6 </span></span>\n<span id=\"cb7-27\"><a href=\"#cb7-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-28\"><a href=\"#cb7-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb7-29\"><a href=\"#cb7-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb7-30\"><a href=\"#cb7-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1500; warmup = 500; thin = 1 </span></span>\n<span id=\"cb7-31\"><a href=\"#cb7-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 4000</span></span>\n<span id=\"cb7-32\"><a href=\"#cb7-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-33\"><a href=\"#cb7-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-34\"><a href=\"#cb7-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-35\"><a href=\"#cb7-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; speciessp_1 -0.26 0.730  1.40    1  1622</span></span>\n<span id=\"cb7-36\"><a href=\"#cb7-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; speciessp_2 -1.10 0.015  0.89    1  2220</span></span>\n<span id=\"cb7-37\"><a href=\"#cb7-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-38\"><a href=\"#cb7-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-39\"><a href=\"#cb7-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               2.5%     50%  97.5% Rhat n_eff</span></span>\n<span id=\"cb7-40\"><a href=\"#cb7-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)_trend            2.700  3.0000  3.400    1  1451</span></span>\n<span id=\"cb7-41\"><a href=\"#cb7-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; speciessp_2_trend           -1.200 -0.6200  0.130    1  1641</span></span>\n<span id=\"cb7-42\"><a href=\"#cb7-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend1.1_trend -0.077  0.0140  0.190    1   964</span></span>\n<span id=\"cb7-43\"><a href=\"#cb7-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend1.2_trend -0.210  0.0078  0.300    1  1492</span></span>\n<span id=\"cb7-44\"><a href=\"#cb7-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend1.3_trend -0.460 -0.2600 -0.040    1  1941</span></span>\n<span id=\"cb7-45\"><a href=\"#cb7-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend2.1_trend -0.200 -0.0130  0.077    1  1281</span></span>\n<span id=\"cb7-46\"><a href=\"#cb7-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend2.2_trend -0.190  0.0280  0.480    1  1447</span></span>\n<span id=\"cb7-47\"><a href=\"#cb7-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):trendtrend2.3_trend  0.064  0.3300  0.620    1  2858</span></span>\n<span id=\"cb7-48\"><a href=\"#cb7-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-49\"><a href=\"#cb7-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb7-50\"><a href=\"#cb7-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                        edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb7-51\"><a href=\"#cb7-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriestrend1 1.100      3  1.538   0.826</span></span>\n<span id=\"cb7-52\"><a href=\"#cb7-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):seriestrend2 1.092      3  2.701   0.697</span></span>\n<span id=\"cb7-53\"><a href=\"#cb7-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-54\"><a href=\"#cb7-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb7-55\"><a href=\"#cb7-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb7-56\"><a href=\"#cb7-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb7-57\"><a href=\"#cb7-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb7-58\"><a href=\"#cb7-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb7-59\"><a href=\"#cb7-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-60\"><a href=\"#cb7-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb7-61\"><a href=\"#cb7-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb7-62\"><a href=\"#cb7-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb7-63\"><a href=\"#cb7-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-64\"><a href=\"#cb7-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p><code>loo()</code> functionality works just as it does for all\n<code>mvgam</code> models to aid in model comparison / selection (though\nnote that Pareto K values often give warnings for mixture models so\nthese may not be too helpful)</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">loo</span>(mod)</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Computed from 4000 by 60 log-likelihood matrix.</span></span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          Estimate   SE</span></span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; elpd_loo   -222.1 12.7</span></span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; p_loo        75.7 11.5</span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; looic       444.2 25.3</span></span>\n<span id=\"cb8-9\"><a href=\"#cb8-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ------</span></span>\n<span id=\"cb8-10\"><a href=\"#cb8-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; MCSE of elpd_loo is NA.</span></span>\n<span id=\"cb8-11\"><a href=\"#cb8-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; MCSE and ESS estimates assume MCMC draws (r_eff in [0.4, 1.1]).</span></span>\n<span id=\"cb8-12\"><a href=\"#cb8-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb8-13\"><a href=\"#cb8-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Pareto k diagnostic values:</span></span>\n<span id=\"cb8-14\"><a href=\"#cb8-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                          Count Pct.    Min. ESS</span></span>\n<span id=\"cb8-15\"><a href=\"#cb8-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (-Inf, 0.7]   (good)     30    50.0%   444     </span></span>\n<span id=\"cb8-16\"><a href=\"#cb8-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    (0.7, 1]   (bad)       3     5.0%   &lt;NA&gt;    </span></span>\n<span id=\"cb8-17\"><a href=\"#cb8-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    (1, Inf)   (very bad) 27    45.0%   &lt;NA&gt;    </span></span>\n<span id=\"cb8-18\"><a href=\"#cb8-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; See help(&#39;pareto-k-diagnostic&#39;) for details.</span></span></code></pre></div>\n<p>Plot the estimated smooths of time from each species’ latent\nabundance process (on the log scale)</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;smooths&quot;</span>, <span class=\"at\">trend_effects =</span> <span class=\"cn\">TRUE</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p><code>marginaleffects</code> support allows for more useful\nprediction-based interrogations on different scales (though note that at\nthe time of writing this Vignette, you must have the development version\nof <code>marginaleffects</code> installed for <code>nmix()</code> models\nto be supported; use\n<code>remotes::install_github(&#39;vincentarelbundock/marginaleffects&#39;)</code>\nto install). Objects that use family <code>nmix()</code> have a few\nadditional prediction scales that can be used (i.e. <code>link</code>,\n<code>response</code>, <code>detection</code> or <code>latent_N</code>).\nFor example, here are the estimated detection probabilities per species,\nwhich show that the model has done a nice job of estimating these\nparameters:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>marginaleffects<span class=\"sc\">::</span><span class=\"fu\">plot_predictions</span>(mod,</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  <span class=\"at\">condition =</span> <span class=\"st\">&quot;species&quot;</span>,</span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span></span>\n<span id=\"cb10-4\"><a href=\"#cb10-4\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span></span>\n<span id=\"cb10-5\"><a href=\"#cb10-5\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb10-6\"><a href=\"#cb10-6\" tabindex=\"-1\"></a>  <span class=\"fu\">ylim</span>(<span class=\"fu\">c</span>(<span class=\"dv\">0</span>, <span class=\"dv\">1</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb10-7\"><a href=\"#cb10-7\" tabindex=\"-1\"></a>  <span class=\"fu\">theme_classic</span>() <span class=\"sc\">+</span></span>\n<span id=\"cb10-8\"><a href=\"#cb10-8\" tabindex=\"-1\"></a>  <span class=\"fu\">theme</span>(<span class=\"at\">legend.position =</span> <span class=\"st\">&quot;none&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>A common goal in N-mixture modelling is to estimate the true latent\nabundance. The model has automatically generated predictions for the\nunknown latent abundance that are conditional on the observations. We\ncan extract these and produce decent plots using a small function</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a>hc <span class=\"ot\">&lt;-</span> <span class=\"fu\">hindcast</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;latent_N&quot;</span>)</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a><span class=\"co\"># Function to plot latent abundance estimates vs truth</span></span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a>plot_latentN <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(hindcasts, data, <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>) {</span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a>  all_series <span class=\"ot\">&lt;-</span> <span class=\"fu\">unique</span>(data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-6\"><a href=\"#cb11-6\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(species <span class=\"sc\">==</span> <span class=\"sc\">!!</span>species) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-7\"><a href=\"#cb11-7\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">pull</span>(series))</span>\n<span id=\"cb11-8\"><a href=\"#cb11-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-9\"><a href=\"#cb11-9\" tabindex=\"-1\"></a>  <span class=\"co\"># Grab the first replicate that represents this series</span></span>\n<span id=\"cb11-10\"><a href=\"#cb11-10\" tabindex=\"-1\"></a>  <span class=\"co\"># so we can get the true simulated values</span></span>\n<span id=\"cb11-11\"><a href=\"#cb11-11\" tabindex=\"-1\"></a>  series <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.numeric</span>(all_series[<span class=\"dv\">1</span>])</span>\n<span id=\"cb11-12\"><a href=\"#cb11-12\" tabindex=\"-1\"></a>  truths <span class=\"ot\">&lt;-</span> data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-13\"><a href=\"#cb11-13\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(time, series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-14\"><a href=\"#cb11-14\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"sc\">!!</span><span class=\"fu\">levels</span>(data<span class=\"sc\">$</span>series)[series]) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-15\"><a href=\"#cb11-15\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">pull</span>(truth)</span>\n<span id=\"cb11-16\"><a href=\"#cb11-16\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-17\"><a href=\"#cb11-17\" tabindex=\"-1\"></a>  <span class=\"co\"># In case some replicates have missing observations,</span></span>\n<span id=\"cb11-18\"><a href=\"#cb11-18\" tabindex=\"-1\"></a>  <span class=\"co\"># pull out predictions for ALL replicates and average over them</span></span>\n<span id=\"cb11-19\"><a href=\"#cb11-19\" tabindex=\"-1\"></a>  hcs <span class=\"ot\">&lt;-</span> <span class=\"fu\">do.call</span>(rbind, <span class=\"fu\">lapply</span>(all_series, <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb11-20\"><a href=\"#cb11-20\" tabindex=\"-1\"></a>    ind <span class=\"ot\">&lt;-</span> <span class=\"fu\">which</span>(<span class=\"fu\">names</span>(hindcasts<span class=\"sc\">$</span>hindcasts) <span class=\"sc\">%in%</span> <span class=\"fu\">as.character</span>(x))</span>\n<span id=\"cb11-21\"><a href=\"#cb11-21\" tabindex=\"-1\"></a>    hindcasts<span class=\"sc\">$</span>hindcasts[[ind]]</span>\n<span id=\"cb11-22\"><a href=\"#cb11-22\" tabindex=\"-1\"></a>  }))</span>\n<span id=\"cb11-23\"><a href=\"#cb11-23\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-24\"><a href=\"#cb11-24\" tabindex=\"-1\"></a>  <span class=\"co\"># Calculate posterior empirical quantiles of predictions</span></span>\n<span id=\"cb11-25\"><a href=\"#cb11-25\" tabindex=\"-1\"></a>  pred_quantiles <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(<span class=\"fu\">t</span>(<span class=\"fu\">apply</span>(hcs, <span class=\"dv\">2</span>, <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb11-26\"><a href=\"#cb11-26\" tabindex=\"-1\"></a>    <span class=\"fu\">quantile</span>(x, <span class=\"at\">probs =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb11-27\"><a href=\"#cb11-27\" tabindex=\"-1\"></a>      <span class=\"fl\">0.05</span>, <span class=\"fl\">0.2</span>, <span class=\"fl\">0.3</span>, <span class=\"fl\">0.4</span>,</span>\n<span id=\"cb11-28\"><a href=\"#cb11-28\" tabindex=\"-1\"></a>      <span class=\"fl\">0.5</span>, <span class=\"fl\">0.6</span>, <span class=\"fl\">0.7</span>, <span class=\"fl\">0.8</span>, <span class=\"fl\">0.95</span></span>\n<span id=\"cb11-29\"><a href=\"#cb11-29\" tabindex=\"-1\"></a>    ))</span>\n<span id=\"cb11-30\"><a href=\"#cb11-30\" tabindex=\"-1\"></a>  })))</span>\n<span id=\"cb11-31\"><a href=\"#cb11-31\" tabindex=\"-1\"></a>  pred_quantiles<span class=\"sc\">$</span>time <span class=\"ot\">&lt;-</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">NROW</span>(pred_quantiles)</span>\n<span id=\"cb11-32\"><a href=\"#cb11-32\" tabindex=\"-1\"></a>  pred_quantiles<span class=\"sc\">$</span>truth <span class=\"ot\">&lt;-</span> truths</span>\n<span id=\"cb11-33\"><a href=\"#cb11-33\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-34\"><a href=\"#cb11-34\" tabindex=\"-1\"></a>  <span class=\"co\"># Grab observations</span></span>\n<span id=\"cb11-35\"><a href=\"#cb11-35\" tabindex=\"-1\"></a>  data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-36\"><a href=\"#cb11-36\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">%in%</span> all_series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb11-37\"><a href=\"#cb11-37\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(time, obs) <span class=\"ot\">-&gt;</span> observations</span>\n<span id=\"cb11-38\"><a href=\"#cb11-38\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-39\"><a href=\"#cb11-39\" tabindex=\"-1\"></a>  <span class=\"co\"># Plot</span></span>\n<span id=\"cb11-40\"><a href=\"#cb11-40\" tabindex=\"-1\"></a>  <span class=\"fu\">ggplot</span>(pred_quantiles, <span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">group =</span> <span class=\"dv\">1</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb11-41\"><a href=\"#cb11-41\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_ribbon</span>(<span class=\"fu\">aes</span>(<span class=\"at\">ymin =</span> X5., <span class=\"at\">ymax =</span> X95.), <span class=\"at\">fill =</span> <span class=\"st\">&quot;#DCBCBC&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb11-42\"><a href=\"#cb11-42\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_ribbon</span>(<span class=\"fu\">aes</span>(<span class=\"at\">ymin =</span> X30., <span class=\"at\">ymax =</span> X70.), <span class=\"at\">fill =</span> <span class=\"st\">&quot;#B97C7C&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb11-43\"><a href=\"#cb11-43\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> truth),</span>\n<span id=\"cb11-44\"><a href=\"#cb11-44\" tabindex=\"-1\"></a>      <span class=\"at\">colour =</span> <span class=\"st\">&quot;black&quot;</span>, <span class=\"at\">linewidth =</span> <span class=\"dv\">1</span></span>\n<span id=\"cb11-45\"><a href=\"#cb11-45\" tabindex=\"-1\"></a>    ) <span class=\"sc\">+</span></span>\n<span id=\"cb11-46\"><a href=\"#cb11-46\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_point</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> truth),</span>\n<span id=\"cb11-47\"><a href=\"#cb11-47\" tabindex=\"-1\"></a>      <span class=\"at\">shape =</span> <span class=\"dv\">21</span>, <span class=\"at\">colour =</span> <span class=\"st\">&quot;white&quot;</span>, <span class=\"at\">fill =</span> <span class=\"st\">&quot;black&quot;</span>,</span>\n<span id=\"cb11-48\"><a href=\"#cb11-48\" tabindex=\"-1\"></a>      <span class=\"at\">size =</span> <span class=\"fl\">2.5</span></span>\n<span id=\"cb11-49\"><a href=\"#cb11-49\" tabindex=\"-1\"></a>    ) <span class=\"sc\">+</span></span>\n<span id=\"cb11-50\"><a href=\"#cb11-50\" tabindex=\"-1\"></a>    <span class=\"fu\">geom_jitter</span>(</span>\n<span id=\"cb11-51\"><a href=\"#cb11-51\" tabindex=\"-1\"></a>      <span class=\"at\">data =</span> observations, <span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> obs),</span>\n<span id=\"cb11-52\"><a href=\"#cb11-52\" tabindex=\"-1\"></a>      <span class=\"at\">width =</span> <span class=\"fl\">0.06</span>,</span>\n<span id=\"cb11-53\"><a href=\"#cb11-53\" tabindex=\"-1\"></a>      <span class=\"at\">shape =</span> <span class=\"dv\">21</span>, <span class=\"at\">fill =</span> <span class=\"st\">&quot;darkred&quot;</span>, <span class=\"at\">colour =</span> <span class=\"st\">&quot;white&quot;</span>, <span class=\"at\">size =</span> <span class=\"fl\">2.5</span></span>\n<span id=\"cb11-54\"><a href=\"#cb11-54\" tabindex=\"-1\"></a>    ) <span class=\"sc\">+</span></span>\n<span id=\"cb11-55\"><a href=\"#cb11-55\" tabindex=\"-1\"></a>    <span class=\"fu\">labs</span>(</span>\n<span id=\"cb11-56\"><a href=\"#cb11-56\" tabindex=\"-1\"></a>      <span class=\"at\">y =</span> <span class=\"st\">&quot;Latent abundance (N)&quot;</span>,</span>\n<span id=\"cb11-57\"><a href=\"#cb11-57\" tabindex=\"-1\"></a>      <span class=\"at\">x =</span> <span class=\"st\">&quot;Time&quot;</span>,</span>\n<span id=\"cb11-58\"><a href=\"#cb11-58\" tabindex=\"-1\"></a>      <span class=\"at\">title =</span> species</span>\n<span id=\"cb11-59\"><a href=\"#cb11-59\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb11-60\"><a href=\"#cb11-60\" tabindex=\"-1\"></a>}</span></code></pre></div>\n<p>Latent abundance plots vs the simulated truths for each species are\nshown below. Here, the red points show the imperfect observations, the\nblack line shows the true latent abundance, and the ribbons show\ncredible intervals of our estimates:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_latentN</span>(hc, testdat, <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAABIFBMVEUAAAAAADoAAGYAOmYAOpAAZrYzMzM6AAA6ADo6AGY6OgA6OmY6OpA6ZpA6ZrY6kNtNTU1NTW5NTY5NbqtNjo5NjshmAABmADpmAGZmOgBmOpBmZrZmkJBmkNtmtv9uTU1uTW5uTY5ubqtuq+SLAACOTU2OTW6OTY6ObquOjk2Oq+SOyP+QOgCQOjqQOmaQZgCQZjqQZpCQkLaQkNuQttuQ2/+rbk2rjk2rq8ir5P+2ZgC2Zjq2Zma2kGa2kJC22/+2//+5fHzIjk3Ijo7Iq6vIyP/I///bkDrbkGbbkJDbtmbbtpDb25Db27bb/7bb///cvLzkq27kq47k////tmb/tpD/yI7/yKv/25D/27b/5Kv//7b//8j//9v//+T////1nl53AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAWZUlEQVR4nO3dC3vcxnXG8ZUriY2bWFQTqnEVS5WoKInJXGyXikmnjcSkWudWLiOGYXjD9/8WAbDgEgvicmbmnJkzM+//eepQEiouZn4CsCCAnRUICTQL/QJQmgEWEgmwkEiAhUQCLCQSYCGRAAuJBFhIJMBCIjHD+tOvPnrL+zeiOOOFNf94BliointXeABYqAqwkEjGsC4+nX3vL0+Lq//5+Nm3G7NPjjp/DFiozhjWwWfF1cGD4mA2+7ffFn+cPej+MWChKlNYF0+elf95Wh6nz8ovioN7e+t/DliozhTW1e7se7+tvljCOqn/2wqwUJ3xrvAfn85m/7IHWGg8i3eF//hVdbKqgYVdIerNeFf4xdFyO9UcY3UdARaqMz/G+uSo+GO9xbpfvSvs7AmvfvnRXv//I8orY1hf/vnT5hjrR+UX/73+pyezsu4ZCJRj1mfe592NFUKtAAuJZA3rm9lnnK8DJZYlrKvd8mDqUfXV2cbsJmzC0CpcQYpEAiwkEmAhkQALiQRYSCTAQiIBFhLJENYMEBEpwEIiARYSCbCQSICFRAIsJBJgIZEAC4kEWEgkwEIiARYSCbCQSICFRAIsJBJgIZEAC4kEWEgkwEIiARYSiRPWYrFwei0ooZhhgRZaxg4LtlCVBCzQQkKwYCv7xGCBVt4JwgKtnBOFBVv5Jg0LtDJNHhZsZZkXWKCVX55gwVZu+YMFWlnlExZoZZRfWLCVTd5hgVYeBYAFWzkUBhZoJV8oWLCVeAFhgVbKBYUFWukWGBZspVp4WKCVZBpgwVaCKYEFWqmlBhZspdUUrMOdojh//nj/ZnFJWKCVUBOwzp/vFJev989fvG8Wl4UFWsk0Aev3v94pTreK6zc7zeLSsGArkcZhne6Uu8LjrXKPuF3+6mGZB1iglUKjsK6/ro6xjrcbWIWfLRZspdAorL/vB4MFWpE3Cutws2zb9zEWbKUQ4XRD9a7w5Ydmca+wQCvedJ3HAq1k0nTmHbYSKgZYoBVhccCCreiKBhZoxVVEsEArpqKCBVvxFBss0Iqk+GDBVhRFCQu09BcpLNjSXrywQEt1McOCLcVFDgu0tBY9LNjSWQqwQEthacACLXWlAgu2lJUQLNDSVFKwFrClptRggZaS0oO1gC0NJQkLtMKXKKwFbAUuXVigFbSUYYFWwNKGtYCtUCUPC7TClAGsBWwFKA9YoOW9XGAtYMtvGcECLZ9lBWsBW97KDRZoeSo/WAvY8lGWsEBLvkxhgZZ02cJawJZoOcMCLcHyhrWALamyhwVaMgFWldMQor4Aa5nTIKK7AdYqp3FEnQCrldNIorUAay2nsUStAKuT02iiVYB1J6fxRE2AdTenAUXLAKsvpyFFVYDVn9OgIsAazGlUEWAN5zSu2QdYIzmNbOYB1lhOQ5t3gDWe0+DmHGBN5TS8+QZYkzmNb7YBFiGnEc40wCLlNMZZBli0nAY5xwCLmtMw5xdgkXMa5+wCLIOcRjqzAMsop7HOKsAyy2mwcwqwTHMa7nwCLPOcBjyXAMsipxHPpHUoJ7OqZyOLA1Ydz+CnXBvK2caD+n8P7u0NLg5YTUzjn2wtKCf3j5qvrnaHNlqAtYppAlLtFsrZJ63f/mZgmwVYrVgmINVWUK6+OGr99vqvWosDVjumSUixWygXX1EWB6y1nMc/2VqwnlIWB6xOzjOQaC1YT2Y3ffR2cPExWO/qQs+07zhnI6HubLHONmb3+4+v6sWnYeWni2sukqp7jDWfzR6NLU6ElZkupslIqQ6Ug9nwydF6cRNYGelimInEWoNytTtyeLVc3BhWLro4JiOl2lDKw/flz3T+4HLwnq0uphlJpBaU8rC9+UnOb0RgJa+LaUrSiP90Q866OGcm8lqwfrjiJLjFSl0Xz6wkUO+PdGSOsfLgxTIrCXT7Q+gv279t9UNoG1gJ6uKZmNi7hXLSvgbrbzaXzVjDSk0Xy8xEXgtK6xqskwdDi8vBSkkXy9TEXQvK1W5z1v3mEuW+xYVhJaOLa36irXvmvYrhh9DQxTVBsTZ++9fx5uP9ojh/Xv13ubg3WPHrYpujKBuFdf55cbxVXL7eP3/xvlncL6zIdTHOU3RN3bB6ul2cbhXXb3aaxQPAilgX1yxF2ASs66+LaqNVHG6Xv3hYFgpWrLo45yqqxmFd/nhzuzjebmAVAbdY8eLim6uomtoVHv/7e12w4rPFNVVxtQ6lOpV1ttE+3XD5k/cqjrGitsU/bfpbh/LN3rd7pa7W+dHT5bvClx+axZXAig0X/8Rpbw3KxdOihFXMb67HOt7cLA/cA57HSseWyORpbv3M+5c1rAPpC/2ytMU2ZXG0DmX+rIR1MHIDmD5YEdlimrI4unP7l8OD10LBigYXy4xFEuejIkPCisSW01xFVUKworDlNFkxtQ7lbONRcTIbvBpLPax3sKWlzvVY1fvBtfNY3cXVw6oKTWcqrsnTXPc8VtU8ptMNA4W2MxXP7Cmuex6rKgVY79Tb4pk/tXWe816daZjHdh5ruNB4JuKZQp1xnsdSKOudclwcU6gzxtMN1Z+FVtRfaD6juc2f2vhgVds6pbDe6bblOIU664Vi8+yG5XNq9Mp6pxoXx1TqqnuC1PoxRg2sWWg944UGNBzjnKqoc4J0edxu9bSZpatlof2MFVrQYFxTqqP1E6Q/HBR1s/jkwfvq6W2KdYUmNBjDhGqpe2ny1OK00w0R6AptaCDX+VRT52aK5al3ngevqdcVGtFALPMavL6HgnA+g1S5rtCI+mOb3YCtQ/l2uSvkflSkalyhFfXHMrkh83ehn2ZdoRn15TSt4euDMhf7IbTiHWNoR305z27AOnfpzCaevMZxdYNaXaEd9cQ1zf5bP3j/4qh6KPe3wycd2C6bUaorNKS7cU2079ZPkH5VH7hf/KfdFqseCJNp1KgrsKO+2CbbZ3euIL14WpxYnm64HQqTmVSnK5ygwdim21+dK0jLw6uTsY/CNPlMaJPJ1IUrCJ6JmObbW5ynG/rGw2Q+FenyzYaS0zx7TxpWncGMqtkxehRDz2mq/dYH5eyz4cWtYNUZTOqALs9XPvuxYpjzhPvq9kOadm+n0/I81vSwmMxrV1eAi+rlndjEOv9i3UKpzl4tz2DNh2/TcYRVZzK1LV1BLqoXFWId2+wL1ncn9Mj1fhyw6kxmt4YV6qJ6KRyO8cy+YH13Qp99Rx5WnckEh7tbQ4AFRzzzL1bnPFb1OJDqkTODi7PCqqPO7+1F9ZKKeuMVwRaPAKE6UE6qiRt2JQGrjjC7zcF7mHMRbBiYYzEgkpfzWMSmZvfmPWGQE10cDCRymn3BNMGqIk5zCFscqyeSEwCp2O6ELnhg1dEm2r8tthXkzpkBf2x3QheMsOooM+3dFu8qcsYFgiu+O6G5YdVNT7XnnaLAOnLFA4IrxjuhJWDVTU22X1tSa8mRuwe2OO+EFh2zien2aUt0PR1zBsEV553Q4qOmxpb4mjrEwsI9zjuhvYwbwZYPXF7W1T42H9Zx3gnta9R02PK1tvaxALFN2wlSYuNz7smWx/W1z0mHQ/6uIGVPgS3Pa2ydMxPz1k83PBG+gpQ7gi1hXP7X2To2M6Tu3LBa9r+DrrTBWiiwFWStrWNBQ6l3V/jJ8OLqYC3CH3CFWm/rnNUQ6oPi49Jk7gi2BHGFXHPb3O2M1gflJJpjrLWC2gq87ra5AxqU0v5Fc/B+z/JpM6FHKexOMfS6W8dFqSOl/Yvm4H1scd2wFkFthV51l5wh3ZFiuLh6WFUEWzK4Qq+4Y06SulIMF48C1iKcrdDr7Z4Tp5aU9V/OR38EHRGsRaidYui15okb1kF13H7xH/YH78p0BbEVeqXZ4oN18aS+NPnqC8vTDUXx6pUyWmY7RaaHjoReZc5YYF39fLmt+o3lCdLSVSkr9FDcjWiL8Xk2odeYOVdYzQ9zbB9uW7tSKYu2U2R9nk3oFebPElb7+ViWjzHSDKtqwhb3Y0dCr65I5rDGnu5OhKV2V3jbGAT+59mEXluhDGHRFp9Yvjp4L9Qdv681IYv3w4dDr6xI1rBsP0unr9CD0NsQrHr1mE9AhF5XgSxguX2WTlTEBmgtD+RBayxzWI6fpUMs9LisGoDAf9Y09IoyR5plzs/SMS70CA3Z4j8fH3o9WSPNLedn6TgUcJgGZIHWYKQZ5fwsHY7CDJUPWenQIk0k8+kGxjyPVg8tblmp0CJNn15Yt/kasDuyQKs30qTFAGuV/JhBFiHSXEUFq0562KRpxY+LNE3xwaoTHThxWZHbIs1QHxThE6RsCY5dm5aIrJhtkSan7/avs+96OkHKkdTotWThNtf1SPPSB8v2FvtwyQygB1lR2iJNSQvKfHWhX8ATpA4JDKEXWtHZIs3GGpSRJ67dLK4YVh33IHqRFZkt0kRE866wuYSQFO84NrRkZcWEizQHnJ+lI9krE1h1jCP5zsdGKx5bpOHn/CwdwSpWxrQ4cXmSFYUt0tBzfpaOYCWqV+YbrWVMw+lldxiFLdKoc36WjmjNrWW2cQyor42WdlykAef8LB3RHGHVuY6oT1mKbZHGmvOzdGRzd7XMaUz90lJqizTMnJ+lIxyPq2XWg+pZlkpbpBHm/Cyd2LIb1lIW9ZOrE8VFGtxRKNdvNh/vF8X58+q/y8VTglVnPq7VRov8qegp2iKNa+cYa/fe3tnG6n7Vv+4Xh9//cPl6//zF+2bx5GDVmQ3sUpZvWnpskYa0+66w3Ble7T64/Z2S1OlWuenaaRanPbshygyeR9jQ8m5LBy7SaK6fx3paH2XNWwfv5y8/HG8VxeF2+fXDsnFYXO/cAkV/HuGNLP+0FNgijWX3htUK1kEL1ul2cbzdwCqIz8eKNaOHMN3ICkArtC3SYHYeCvKshHXQuh7r8qcfsoF18+KJw7vaaGVnizSaHSgHnQf6/a48aDc4xorZ1fICCoOn87ZkhaAVDhdpNMehHO8U559X7wpffmgWT/jgvfWTbuIIt2TlZIs0mKN36RxublYnshSdxxKGe7svpw3xLDytALZIQxnXXTrSu9rWQSJtjNdlZWKLNJRR3aUj/+ag/ffTRlkHLa+4SCMZ1V06Ht51tv962jB3ZQWj5c0WaSDjukvH97tO2kB3ZaVuizR03HfpeNygeIk00nc2WgFpebBFGjjmx3FHfSKrN9JQ98gKaUuYGGnceB/HHfep94FIg62T1k2hYTk/jjtJWDRavbIU2WoKA8v9cdxJuqJvtPp+OzSloXzCYngcd5KuCqeNllpaTR5gOTyO2weooGhdZKm31SQHa3rxgeV97AJD72ZzoHWTBKyzjeEN1hAsHwftCt4YOMmKzVYTH6zi4onxMVYmsKgbrcE/C63EKWdYxdUvjA/ec9gV1tFkJUqriTRQvVAsPsU++YP3m1xlJYCLNE6xPHhNUTRa4wuEtuEUaZRuoTQXY1VlCctge+i+0YraFmmMWrCerr602BU2qdhbWWV0BMciK1pcpCFqwXqyutDP+sy7iuNrq0zfc3LRitEWaYBYt1gazghYZv7SuWTFZ4s0PKzHWBHDstjYTouhyorMFml0eK8gjdeVzEOZyRutqHCRxob50uR4XVnFKysWW6ShieaTKZTGTSsGW6SBASzXuGXpt0UaFsBybhKKsSzluEijAlgMEWSZ09JrizQmgNXN5v2HjCyttkhDAlidLM+YEGjZyFJpizQggLWe/TneaVkzg8fnasZFGg7AWs/hhwfTspbjZ0NLlS3SaABWJ5cfHkzRKqrNlvXHrYT2tIo0FoDVzemHB6MyiuW1Iy4fExXaVB1pJACLNwosy8N4NbZIAwFY3E3Jani56AKsLBuB1Ry8r66otNcFWDk2Rmv1pbsuwMovqg1XXYCVWyY63HQBVmYZ+nDRBVhZZQ7ERRdgZZQFLRddgJVPdrTauhTaIq05YMlmLctaF2BlkhMtlYddpNUGLPkcabnpEiBGWmnA8pC7LA5dbMRI6wxYXuKhxaWrDrCSiAPVKj5dVYAVdxwG2g3ocvlGjK4Ay2OOkvrq6nK4qn6tMVY0A4DlMfcJ762ly+2q+r7uwKq/w3SA5TXOKV+vhrW6+Fmsm+8wGWD5TU5WFWBlnqwsUb3YFapPZNqZDt6nvsN0gOWt3hsWBSae/a+88x0oAZavRm6xlqbAHGl1ActTkw+FCM2FHml9ActTtKeNhDZDirS+gOUrg6eNhJYzEWkdAMtbhk8bCc1nONLLByzVhTbUG+mVA5b+QkPqRnrRgBVJoTW1Ir1ewIqp0KSWkV4qYMUXYCG5AAvJBVioSuZD9wAr9yQ/JhSw8k3+g40BK8s8fWI2YGXWK++fmA1YOVSZCvaJ2YCVbr43VwMBVnIpkbUKsFJJl6vbAAsJB1hIOMBCwgEWKmSP4wDLOq2H1+QUvfMErNsUTYtdnn5oRAqwVmmaFrs0rQFgrdI0LZYpWgHAuk3RtNimZwUAq5WeaYk/wEIiTUA53ir/c/788f7N4oCFSI1DOd4sYV2+3j9/8b5ZHLAQ6ZiBsMU63Squ3+w0iwOW9rwcKE5/EwKs6v8Ot8tfPCwDLOX5eGtbXw07sQwF1nYDq8AWS30+TsbV3wGw8soDLNq3wDFWYvnZYLHAqt4VvvzQLA5Y2vNxiOX8rvB0szrfgPNYfCVxcp+yEjjz7rUkfhxJWgPA8lkiF1Bgi6Wq5b3QgNW/OGDZtjz748OV7LcgrgJgear5l+7FlbQsylKA5Slvh1dKjuMAy1e+phuwcsvXbKtwBVgJpsEVYCGZAAuJBFipJbkjNPi7ASuxJA/dTf5uwEoryZMNRn83YKUVYCGZsCtEMuHgHaUcYCGRAAuJBFhIJMBCIgEWEgmwkEiAlWThL8kCrBRTcBEpYCWYhsveASvBAAvJFN4VYKVZcFeAhWQCLCQSYCGRAAuJBFhIJMBCIgEWEgmwkEiAhUQCLCQSYCGRAAuJBFhIJMBCIhnDQmgkW1hhZT0M+t1ZSmAVRtfBGlbQHoZ+Ae4lsAq0dQAsvyWwCoClsQRWIUFYKJ4AC4kEWEgkwEIiARYSKR5Y1282H++HfhHOHe6EfgXOlRNBWIl4YP11vzj8/ofQr8Kx8+fRw7r88RZlsXhglZ2/eB/6JTj2+1/HDuv6zTZpubhgvYx8i3W6E/2u8PzFzzYpm6yoYJ3S/rGo7frr+I+xjn/wf6T9eUywLn8a+Qbr7/sJwCr/cR8S/oHHBOt3sR9hHW6WRb7VPd5KDtbxTnH+eegX4Vr0W6zz/9q/fE047RMPrOqfe/wnsqKHVZxuUk5jRQQLRRVgIZEAC4kEWEgkwEIiARYSCbCQSIBl19nGs9AvQXeAZdK8ud/3EWBNBVgmzZ8VJ/f2ipNHoV+I/gDLpD+8rWFdfBX6hegPsAyrYBXNMdbB/f9/MntQHMzq3yv3kx+9Dfzq9ARYhi1hncxmz652K0kn9z4uv3pQKntUXO3ePwr9+rQEWIatb7GOiosn5Rfz+0dn33lbecMhfRNgGdaGNW/BOrl5v4jqAMuwQVjYC64FWIYNwTr7173QL01VgGXYEKzioHpLOMcxVhNgmTVfHkedbZRvC8uv7/+5+uKg/KKUhUOsVoCFRAIsJBJgIZEAC4kEWEgkwEIiARYSCbCQSICFRAIsJBJgIZEAC4n0T0IHAi67HhDLAAAAAElFTkSuQmCC\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_latentN</span>(hc, testdat, <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_2&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can see that estimates for both species have correctly captured\nthe true temporal variation and magnitudes in abundance</p>\n</div>\n</div>\n<div id=\"example-2-a-larger-survey-with-possible-nonlinear-effects\" class=\"section level2\">\n<h2>Example 2: a larger survey with possible nonlinear effects</h2>\n<p>Now for another example with a larger dataset. We will use data from\n<a href=\"https://doserlab.com/files/spabundance-web/articles/nmixturemodels\" target=\"_blank\">Jeff Doser’s simulation example from the wonderful\n<code>spAbundance</code> package</a>. The simulated data include one\ncontinuous site-level covariate, one factor site-level covariate and two\ncontinuous sample-level covariates. This example will allow us to\nexamine how we can include possibly nonlinear effects in the latent\nprocess and detection probability models.</p>\n<p>Download the data and grab observations / covariate measurements for\none species</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"co\"># Date link</span></span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a><span class=\"fu\">load</span>(<span class=\"fu\">url</span>(<span class=\"st\">&quot;https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda&quot;</span>))</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a>data.one.sp <span class=\"ot\">&lt;-</span> dataNMixSim</span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\"># Pull out observations for one species</span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a>data.one.sp<span class=\"sc\">$</span>y <span class=\"ot\">&lt;-</span> data.one.sp<span class=\"sc\">$</span>y[<span class=\"dv\">1</span>, , ]</span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-8\"><a href=\"#cb14-8\" tabindex=\"-1\"></a><span class=\"co\"># Abundance covariates that don&#39;t change across repeat sampling observations</span></span>\n<span id=\"cb14-9\"><a href=\"#cb14-9\" tabindex=\"-1\"></a>abund.cov <span class=\"ot\">&lt;-</span> dataNMixSim<span class=\"sc\">$</span>abund.covs[, <span class=\"dv\">1</span>]</span>\n<span id=\"cb14-10\"><a href=\"#cb14-10\" tabindex=\"-1\"></a>abund.factor <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.factor</span>(dataNMixSim<span class=\"sc\">$</span>abund.covs[, <span class=\"dv\">2</span>])</span>\n<span id=\"cb14-11\"><a href=\"#cb14-11\" tabindex=\"-1\"></a></span>\n<span id=\"cb14-12\"><a href=\"#cb14-12\" tabindex=\"-1\"></a><span class=\"co\"># Detection covariates that can change across repeat sampling observations</span></span>\n<span id=\"cb14-13\"><a href=\"#cb14-13\" tabindex=\"-1\"></a><span class=\"co\"># Note that `NA`s are not allowed for covariates in mvgam, so we randomly</span></span>\n<span id=\"cb14-14\"><a href=\"#cb14-14\" tabindex=\"-1\"></a><span class=\"co\"># impute them here</span></span>\n<span id=\"cb14-15\"><a href=\"#cb14-15\" tabindex=\"-1\"></a>det.cov <span class=\"ot\">&lt;-</span> dataNMixSim<span class=\"sc\">$</span>det.covs<span class=\"sc\">$</span>det.cov<span class=\"fl\">.1</span>[, ]</span>\n<span id=\"cb14-16\"><a href=\"#cb14-16\" tabindex=\"-1\"></a>det.cov[<span class=\"fu\">is.na</span>(det.cov)] <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(<span class=\"fu\">length</span>(<span class=\"fu\">which</span>(<span class=\"fu\">is.na</span>(det.cov))))</span>\n<span id=\"cb14-17\"><a href=\"#cb14-17\" tabindex=\"-1\"></a>det.cov2 <span class=\"ot\">&lt;-</span> dataNMixSim<span class=\"sc\">$</span>det.covs<span class=\"sc\">$</span>det.cov<span class=\"fl\">.2</span></span>\n<span id=\"cb14-18\"><a href=\"#cb14-18\" tabindex=\"-1\"></a>det.cov2[<span class=\"fu\">is.na</span>(det.cov2)] <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(<span class=\"fu\">length</span>(<span class=\"fu\">which</span>(<span class=\"fu\">is.na</span>(det.cov2))))</span></code></pre></div>\n<p>Next we wrangle into the appropriate ‘long’ data format, adding\nindicators of <code>time</code> and <code>series</code> for working in\n<code>mvgam</code>. We also add the <code>cap</code> variable to\nrepresent the maximum latent N to marginalize over for each\nobservation</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a>mod_data <span class=\"ot\">&lt;-</span> <span class=\"fu\">do.call</span>(</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  rbind,</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  <span class=\"fu\">lapply</span>(<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">NROW</span>(data.one.sp<span class=\"sc\">$</span>y), <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>    <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a>      <span class=\"at\">y =</span> data.one.sp<span class=\"sc\">$</span>y[x, ],</span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a>      <span class=\"at\">abund_cov =</span> abund.cov[x],</span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a>      <span class=\"at\">abund_fac =</span> abund.factor[x],</span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a>      <span class=\"at\">det_cov =</span> det.cov[x, ],</span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a>      <span class=\"at\">det_cov2 =</span> det.cov2[x, ],</span>\n<span id=\"cb15-10\"><a href=\"#cb15-10\" tabindex=\"-1\"></a>      <span class=\"at\">replicate =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">NCOL</span>(data.one.sp<span class=\"sc\">$</span>y),</span>\n<span id=\"cb15-11\"><a href=\"#cb15-11\" tabindex=\"-1\"></a>      <span class=\"at\">site =</span> <span class=\"fu\">paste0</span>(<span class=\"st\">&quot;site&quot;</span>, x)</span>\n<span id=\"cb15-12\"><a href=\"#cb15-12\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb15-13\"><a href=\"#cb15-13\" tabindex=\"-1\"></a>  })</span>\n<span id=\"cb15-14\"><a href=\"#cb15-14\" tabindex=\"-1\"></a>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-15\"><a href=\"#cb15-15\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb15-16\"><a href=\"#cb15-16\" tabindex=\"-1\"></a>    <span class=\"at\">species =</span> <span class=\"st\">&quot;sp_1&quot;</span>,</span>\n<span id=\"cb15-17\"><a href=\"#cb15-17\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> <span class=\"fu\">as.factor</span>(<span class=\"fu\">paste0</span>(site, <span class=\"st\">&quot;_&quot;</span>, species, <span class=\"st\">&quot;_&quot;</span>, replicate))</span>\n<span id=\"cb15-18\"><a href=\"#cb15-18\" tabindex=\"-1\"></a>  ) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-19\"><a href=\"#cb15-19\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(</span>\n<span id=\"cb15-20\"><a href=\"#cb15-20\" tabindex=\"-1\"></a>    <span class=\"at\">site =</span> <span class=\"fu\">factor</span>(site, <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(site)),</span>\n<span id=\"cb15-21\"><a href=\"#cb15-21\" tabindex=\"-1\"></a>    <span class=\"at\">species =</span> <span class=\"fu\">factor</span>(species, <span class=\"at\">levels =</span> <span class=\"fu\">unique</span>(species)),</span>\n<span id=\"cb15-22\"><a href=\"#cb15-22\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb15-23\"><a href=\"#cb15-23\" tabindex=\"-1\"></a>    <span class=\"at\">cap =</span> <span class=\"fu\">max</span>(data.one.sp<span class=\"sc\">$</span>y, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">+</span> <span class=\"dv\">20</span></span>\n<span id=\"cb15-24\"><a href=\"#cb15-24\" tabindex=\"-1\"></a>  )</span></code></pre></div>\n<p>The data include observations for 225 sites with three replicates per\nsite, though some observations are missing</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">NROW</span>(mod_data)</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] 675</span></span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(mod_data)</span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 675</span></span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 11</span></span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ y         &lt;int&gt; 1, NA, NA, NA, 2, 2, NA, 1, NA, NA, 0, 1, 0, 0, 0, 0, NA, NA…</span></span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ abund_cov &lt;dbl&gt; -0.3734384, -0.3734384, -0.3734384, 0.7064305, 0.7064305, 0.…</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ abund_fac &lt;fct&gt; 3, 3, 3, 4, 4, 4, 9, 9, 9, 2, 2, 2, 3, 3, 3, 2, 2, 2, 1, 1, …</span></span>\n<span id=\"cb16-9\"><a href=\"#cb16-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ det_cov   &lt;dbl&gt; -1.28279990, 1.11996398, -1.26741746, -1.29426683, 0.1954808…</span></span>\n<span id=\"cb16-10\"><a href=\"#cb16-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ det_cov2  &lt;dbl&gt; 2.03047314, 1.61128100, 0.06661865, -0.94290689, 1.04555361,…</span></span>\n<span id=\"cb16-11\"><a href=\"#cb16-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ replicate &lt;int&gt; 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, …</span></span>\n<span id=\"cb16-12\"><a href=\"#cb16-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ site      &lt;fct&gt; site1, site1, site1, site2, site2, site2, site3, site3, site…</span></span>\n<span id=\"cb16-13\"><a href=\"#cb16-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ species   &lt;fct&gt; sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, sp_1, …</span></span>\n<span id=\"cb16-14\"><a href=\"#cb16-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series    &lt;fct&gt; site1_sp_1_1, site1_sp_1_2, site1_sp_1_3, site2_sp_1_1, site…</span></span>\n<span id=\"cb16-15\"><a href=\"#cb16-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time      &lt;dbl&gt; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …</span></span>\n<span id=\"cb16-16\"><a href=\"#cb16-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ cap       &lt;dbl&gt; 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, …</span></span>\n<span id=\"cb16-17\"><a href=\"#cb16-17\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(mod_data)</span>\n<span id=\"cb16-18\"><a href=\"#cb16-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    y  abund_cov abund_fac    det_cov    det_cov2 replicate  site species</span></span>\n<span id=\"cb16-19\"><a href=\"#cb16-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  1 -0.3734384         3 -1.2827999  2.03047314         1 site1    sp_1</span></span>\n<span id=\"cb16-20\"><a href=\"#cb16-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 NA -0.3734384         3  1.1199640  1.61128100         2 site1    sp_1</span></span>\n<span id=\"cb16-21\"><a href=\"#cb16-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 NA -0.3734384         3 -1.2674175  0.06661865         3 site1    sp_1</span></span>\n<span id=\"cb16-22\"><a href=\"#cb16-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 NA  0.7064305         4 -1.2942668 -0.94290689         1 site2    sp_1</span></span>\n<span id=\"cb16-23\"><a href=\"#cb16-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  2  0.7064305         4  0.1954809  1.04555361         2 site2    sp_1</span></span>\n<span id=\"cb16-24\"><a href=\"#cb16-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  2  0.7064305         4  0.9673034  1.91971178         3 site2    sp_1</span></span>\n<span id=\"cb16-25\"><a href=\"#cb16-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         series time cap</span></span>\n<span id=\"cb16-26\"><a href=\"#cb16-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 site1_sp_1_1    1  33</span></span>\n<span id=\"cb16-27\"><a href=\"#cb16-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 site1_sp_1_2    1  33</span></span>\n<span id=\"cb16-28\"><a href=\"#cb16-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 site1_sp_1_3    1  33</span></span>\n<span id=\"cb16-29\"><a href=\"#cb16-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 site2_sp_1_1    1  33</span></span>\n<span id=\"cb16-30\"><a href=\"#cb16-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5 site2_sp_1_2    1  33</span></span>\n<span id=\"cb16-31\"><a href=\"#cb16-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6 site2_sp_1_3    1  33</span></span></code></pre></div>\n<p>The final step for data preparation is of course the\n<code>trend_map</code>, which sets up the mapping between observation\nreplicates and the latent abundance models. This is done in the same way\nas in the example above</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a>mod_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a>  <span class=\"co\"># each unique combination of site*species is a separate process</span></span>\n<span id=\"cb17-3\"><a href=\"#cb17-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">trend =</span> <span class=\"fu\">as.numeric</span>(<span class=\"fu\">factor</span>(<span class=\"fu\">paste0</span>(site, species)))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-4\"><a href=\"#cb17-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">select</span>(trend, series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-5\"><a href=\"#cb17-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">distinct</span>() <span class=\"ot\">-&gt;</span> trend_map</span>\n<span id=\"cb17-6\"><a href=\"#cb17-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb17-7\"><a href=\"#cb17-7\" tabindex=\"-1\"></a>trend_map <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-8\"><a href=\"#cb17-8\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(trend) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-9\"><a href=\"#cb17-9\" tabindex=\"-1\"></a>  <span class=\"fu\">head</span>(<span class=\"dv\">12</span>)</span>\n<span id=\"cb17-10\"><a href=\"#cb17-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    trend         series</span></span>\n<span id=\"cb17-11\"><a href=\"#cb17-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1      1 site100_sp_1_1</span></span>\n<span id=\"cb17-12\"><a href=\"#cb17-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2      1 site100_sp_1_2</span></span>\n<span id=\"cb17-13\"><a href=\"#cb17-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3      1 site100_sp_1_3</span></span>\n<span id=\"cb17-14\"><a href=\"#cb17-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4      2 site101_sp_1_1</span></span>\n<span id=\"cb17-15\"><a href=\"#cb17-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5      2 site101_sp_1_2</span></span>\n<span id=\"cb17-16\"><a href=\"#cb17-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6      2 site101_sp_1_3</span></span>\n<span id=\"cb17-17\"><a href=\"#cb17-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 7      3 site102_sp_1_1</span></span>\n<span id=\"cb17-18\"><a href=\"#cb17-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 8      3 site102_sp_1_2</span></span>\n<span id=\"cb17-19\"><a href=\"#cb17-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 9      3 site102_sp_1_3</span></span>\n<span id=\"cb17-20\"><a href=\"#cb17-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10     4 site103_sp_1_1</span></span>\n<span id=\"cb17-21\"><a href=\"#cb17-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 11     4 site103_sp_1_2</span></span>\n<span id=\"cb17-22\"><a href=\"#cb17-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 12     4 site103_sp_1_3</span></span></code></pre></div>\n<p>Now we are ready to fit a model using <code>mvgam()</code>. Here we\nwill use penalized splines for each of the continuous covariate effects\nto detect possible nonlinear associations. We also showcase how\n<code>mvgam</code> can make use of the different approximation\nalgorithms available in <code>Stan</code> by using the meanfield\nvariational Bayes approximator (this reduces computation time from\naround 90 seconds to around 12 seconds for this example)</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"co\"># effects of covariates on detection probability;</span></span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"co\"># here we use penalized splines for both continuous covariates</span></span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> y <span class=\"sc\">~</span> <span class=\"fu\">s</span>(det_cov, <span class=\"at\">k =</span> <span class=\"dv\">4</span>) <span class=\"sc\">+</span> <span class=\"fu\">s</span>(det_cov2, <span class=\"at\">k =</span> <span class=\"dv\">4</span>),</span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a>  <span class=\"co\"># effects of the covariates on latent abundance;</span></span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a>  <span class=\"co\"># here we use a penalized spline for the continuous covariate and</span></span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a>  <span class=\"co\"># hierarchical intercepts for the factor covariate</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(abund_cov, <span class=\"at\">k =</span> <span class=\"dv\">4</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb18-10\"><a href=\"#cb18-10\" tabindex=\"-1\"></a>    <span class=\"fu\">s</span>(abund_fac, <span class=\"at\">bs =</span> <span class=\"st\">&quot;re&quot;</span>),</span>\n<span id=\"cb18-11\"><a href=\"#cb18-11\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-12\"><a href=\"#cb18-12\" tabindex=\"-1\"></a>  <span class=\"co\"># link multiple observations to each site</span></span>\n<span id=\"cb18-13\"><a href=\"#cb18-13\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb18-14\"><a href=\"#cb18-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-15\"><a href=\"#cb18-15\" tabindex=\"-1\"></a>  <span class=\"co\"># nmix() family and supplied data</span></span>\n<span id=\"cb18-16\"><a href=\"#cb18-16\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">nmix</span>(),</span>\n<span id=\"cb18-17\"><a href=\"#cb18-17\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> mod_data,</span>\n<span id=\"cb18-18\"><a href=\"#cb18-18\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-19\"><a href=\"#cb18-19\" tabindex=\"-1\"></a>  <span class=\"co\"># standard normal priors on key regression parameters</span></span>\n<span id=\"cb18-20\"><a href=\"#cb18-20\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb18-21\"><a href=\"#cb18-21\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;b&quot;</span>),</span>\n<span id=\"cb18-22\"><a href=\"#cb18-22\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;Intercept&quot;</span>),</span>\n<span id=\"cb18-23\"><a href=\"#cb18-23\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;Intercept_trend&quot;</span>),</span>\n<span id=\"cb18-24\"><a href=\"#cb18-24\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">std_normal</span>(), <span class=\"at\">class =</span> <span class=\"st\">&quot;sigma_raw_trend&quot;</span>)</span>\n<span id=\"cb18-25\"><a href=\"#cb18-25\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb18-26\"><a href=\"#cb18-26\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-27\"><a href=\"#cb18-27\" tabindex=\"-1\"></a>  <span class=\"co\"># use Stan&#39;s variational inference for quicker results</span></span>\n<span id=\"cb18-28\"><a href=\"#cb18-28\" tabindex=\"-1\"></a>  <span class=\"at\">algorithm =</span> <span class=\"st\">&quot;meanfield&quot;</span>,</span>\n<span id=\"cb18-29\"><a href=\"#cb18-29\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-30\"><a href=\"#cb18-30\" tabindex=\"-1\"></a>  <span class=\"co\"># no need to compute &quot;series-level&quot; residuals</span></span>\n<span id=\"cb18-31\"><a href=\"#cb18-31\" tabindex=\"-1\"></a>  <span class=\"at\">residuals =</span> <span class=\"cn\">FALSE</span>,</span>\n<span id=\"cb18-32\"><a href=\"#cb18-32\" tabindex=\"-1\"></a>  <span class=\"at\">samples =</span> <span class=\"dv\">1000</span></span>\n<span id=\"cb18-33\"><a href=\"#cb18-33\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Inspect the model summary but don’t bother looking at estimates for\nall individual spline coefficients. Notice how we no longer receive\ninformation on convergence because we did not use MCMC sampling for this\nmodel</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ s(det_cov, k = 3) + s(det_cov2, k = 3)</span></span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(abund_cov, k = 3) + s(abund_fac, bs = &quot;re&quot;)</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000001a57291b728&gt;</span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; nmix</span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 225 </span></span>\n<span id=\"cb19-21\"><a href=\"#cb19-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-22\"><a href=\"#cb19-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb19-23\"><a href=\"#cb19-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 675 </span></span>\n<span id=\"cb19-24\"><a href=\"#cb19-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-25\"><a href=\"#cb19-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb19-26\"><a href=\"#cb19-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb19-27\"><a href=\"#cb19-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-28\"><a href=\"#cb19-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb19-29\"><a href=\"#cb19-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb19-30\"><a href=\"#cb19-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 chains, each with iter = 1000; warmup = ; thin = 1 </span></span>\n<span id=\"cb19-31\"><a href=\"#cb19-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 1000</span></span>\n<span id=\"cb19-32\"><a href=\"#cb19-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-33\"><a href=\"#cb19-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb19-34\"><a href=\"#cb19-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n.eff</span></span>\n<span id=\"cb19-35\"><a href=\"#cb19-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept) 0.076 0.37  0.67  NaN   NaN</span></span>\n<span id=\"cb19-36\"><a href=\"#cb19-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-37\"><a href=\"#cb19-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM observation smooths:</span></span>\n<span id=\"cb19-38\"><a href=\"#cb19-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb19-39\"><a href=\"#cb19-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(det_cov)  1.041      2  176.9 0.000177 ***</span></span>\n<span id=\"cb19-40\"><a href=\"#cb19-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(det_cov2) 1.011      2  548.1  &lt; 2e-16 ***</span></span>\n<span id=\"cb19-41\"><a href=\"#cb19-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb19-42\"><a href=\"#cb19-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb19-43\"><a href=\"#cb19-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-44\"><a href=\"#cb19-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span id=\"cb19-45\"><a href=\"#cb19-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      2.5%  50% 97.5% Rhat n.eff</span></span>\n<span id=\"cb19-46\"><a href=\"#cb19-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)_trend -0.0083 0.14  0.29  NaN   NaN</span></span>\n<span id=\"cb19-47\"><a href=\"#cb19-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-48\"><a href=\"#cb19-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model group-level estimates:</span></span>\n<span id=\"cb19-49\"><a href=\"#cb19-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                           2.5%   50%  97.5% Rhat n.eff</span></span>\n<span id=\"cb19-50\"><a href=\"#cb19-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mean(s(abund_fac))_trend -0.44 -0.26 -0.076  NaN   NaN</span></span>\n<span id=\"cb19-51\"><a href=\"#cb19-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sd(s(abund_fac))_trend    0.29  0.42  0.620  NaN   NaN</span></span>\n<span id=\"cb19-52\"><a href=\"#cb19-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-53\"><a href=\"#cb19-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb19-54\"><a href=\"#cb19-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;               edf Ref.df Chi.sq p-value  </span></span>\n<span id=\"cb19-55\"><a href=\"#cb19-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(abund_cov) 1.42      2  1.622  0.2656  </span></span>\n<span id=\"cb19-56\"><a href=\"#cb19-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(abund_fac) 8.85     10 14.771  0.0918 .</span></span>\n<span id=\"cb19-57\"><a href=\"#cb19-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb19-58\"><a href=\"#cb19-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb19-59\"><a href=\"#cb19-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-60\"><a href=\"#cb19-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Posterior approximation used: no diagnostics to compute</span></span>\n<span id=\"cb19-61\"><a href=\"#cb19-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-62\"><a href=\"#cb19-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Again we can make use of <code>marginaleffects</code> support for\ninterrogating the model through targeted predictions. First, we can\ninspect the estimated average detection probability</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a>marginaleffects<span class=\"sc\">::</span><span class=\"fu\">avg_predictions</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span>)</span>\n<span id=\"cb20-2\"><a href=\"#cb20-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb20-3\"><a href=\"#cb20-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  Estimate 2.5 % 97.5 %</span></span>\n<span id=\"cb20-4\"><a href=\"#cb20-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     0.575 0.515  0.636</span></span>\n<span id=\"cb20-5\"><a href=\"#cb20-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb20-6\"><a href=\"#cb20-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Type: detection</span></span></code></pre></div>\n<p>Next investigate estimated effects of covariates on latent abundance\nusing the <code>conditional_effects()</code> function and specifying\n<code>type = &#39;link&#39;</code>; this will return plots on the expectation\nscale</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>abund_plots <span class=\"ot\">&lt;-</span> <span class=\"fu\">plot</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  <span class=\"fu\">conditional_effects</span>(mod,</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>    <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>,</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>    <span class=\"at\">effects =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;abund_cov&quot;</span>,</span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;abund_fac&quot;</span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a>  <span class=\"at\">plot =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The effect of the continuous covariate on expected latent\nabundance</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>abund_plots[[<span class=\"dv\">1</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Expected latent abundance&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The effect of the factor covariate on expected latent abundance,\nestimated as a hierarchical random effect</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a>abund_plots[[<span class=\"dv\">2</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Expected latent abundance&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Now we can investigate estimated effects of covariates on detection\nprobability using <code>type = &#39;detection&#39;</code></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a>det_plots <span class=\"ot\">&lt;-</span> <span class=\"fu\">plot</span>(</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a>  <span class=\"fu\">conditional_effects</span>(mod,</span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a>    <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span>,</span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a>    <span class=\"at\">effects =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;det_cov&quot;</span>,</span>\n<span id=\"cb24-6\"><a href=\"#cb24-6\" tabindex=\"-1\"></a>      <span class=\"st\">&quot;det_cov2&quot;</span></span>\n<span id=\"cb24-7\"><a href=\"#cb24-7\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb24-8\"><a href=\"#cb24-8\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb24-9\"><a href=\"#cb24-9\" tabindex=\"-1\"></a>  <span class=\"at\">plot =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb24-10\"><a href=\"#cb24-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The covariate smooths were estimated to be somewhat nonlinear on the\nlogit scale according to the model summary (based on their approximate\nsignificances). But inspecting conditional effects of each covariate on\nthe probability scale is more intuitive and useful</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a>det_plots[[<span class=\"dv\">1</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a>det_plots[[<span class=\"dv\">2</span>]] <span class=\"sc\">+</span></span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>More targeted predictions are also easy with\n<code>marginaleffects</code> support. For example, we can ask: How does\ndetection probability change as we change <em>both</em> detection\ncovariates?</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a>fivenum_round <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(x) <span class=\"fu\">round</span>(<span class=\"fu\">fivenum</span>(x, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a></span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a>marginaleffects<span class=\"sc\">::</span><span class=\"fu\">plot_predictions</span>(mod,</span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> marginaleffects<span class=\"sc\">::</span><span class=\"fu\">datagrid</span>(</span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>    <span class=\"at\">det_cov =</span> unique,</span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a>    <span class=\"at\">det_cov2 =</span> fivenum_round</span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb27-8\"><a href=\"#cb27-8\" tabindex=\"-1\"></a>  <span class=\"at\">by =</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;det_cov&quot;</span>, <span class=\"st\">&quot;det_cov2&quot;</span>),</span>\n<span id=\"cb27-9\"><a href=\"#cb27-9\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;detection&quot;</span></span>\n<span id=\"cb27-10\"><a href=\"#cb27-10\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span></span>\n<span id=\"cb27-11\"><a href=\"#cb27-11\" tabindex=\"-1\"></a>  <span class=\"fu\">theme_classic</span>() <span class=\"sc\">+</span></span>\n<span id=\"cb27-12\"><a href=\"#cb27-12\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;Pr(detection)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The model has found support for some important covariate effects, but\nof course we’d want to interrogate how well the model predicts and think\nabout possible spatial effects to capture unmodelled variation in latent\nabundance (which can easily be incorporated into both linear predictors\nusing spatial smooths).</p>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer useful material about\nN-mixture models for ecological population dynamics investigations:</p>\n<p>Guélat, Jérôme, and Kéry, Marc. “<a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.12983\">Effects\nof Spatial Autocorrelation and Imperfect Detection on Species\nDistribution Models.</a>” <em>Methods in Ecology and Evolution</em> 9\n(2018): 1614–25.</p>\n<p>Kéry, Marc, and Royle Andrew J. “<a href=\"https://shop.elsevier.com/books/applied-hierarchical-modeling-in-ecology-analysis-of-distribution-abundance-and-species-richness-in-r-and-bugs/kery/978-0-12-809585-0\">Applied\nhierarchical modeling in ecology: Analysis of distribution, abundance\nand species richness in R and BUGS: Volume 2: Dynamic and advanced\nmodels</a>”. London, UK: Academic Press (2020).</p>\n<p>Royle, Andrew J. “<a href=\"https://onlinelibrary.wiley.com/doi/full/10.1111/j.0006-341X.2004.00142.x\">N‐mixture\nmodels for estimating population size from spatially replicated\ncounts.</a>” <em>Biometrics</em> 60.1 (2004): 108-115.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "inst/doc/shared_states.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nset.seed(122)\nsimdat <- sim_mvgam(\n  trend_model = AR(),\n  prop_trend = 0.6,\n  mu = c(0, 1, 2),\n  family = poisson()\n)\ntrend_map <- data.frame(\n  series = unique(simdat$data_train$series),\n  trend = c(1, 1, 2)\n)\ntrend_map\n\n\n## --------------------------------------------------------------------------------\nall.equal(levels(trend_map$series), levels(simdat$data_train$series))\n\n\n## --------------------------------------------------------------------------------\nfake_mod <- mvgam(\n  y ~\n    # observation model formula, which has a\n    # different intercept per series\n    series - 1,\n\n  # process model formula, which has a shared seasonal smooth\n  # (each latent process model shares the SAME smooth)\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n\n  # AR1 dynamics (each latent process model has DIFFERENT)\n  # dynamics; processes are estimated using the noncentred\n  # parameterisation for improved efficiency\n  trend_model = AR(),\n  noncentred = TRUE,\n\n  # supplied trend_map\n  trend_map = trend_map,\n\n  # data and observation family\n  family = poisson(),\n  data = simdat$data_train,\n  run_model = FALSE\n)\n\n\n## --------------------------------------------------------------------------------\nstancode(fake_mod)\n\n\n## --------------------------------------------------------------------------------\nfake_mod$model_data$Z\n\n\n## ----full_mod, include = FALSE, results='hide'-----------------------------------\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# full_mod <- mvgam(\n#   y ~ series - 1,\n#   trend_formula = ~ s(season, bs = \"cc\", k = 6),\n#   trend_model = AR(),\n#   noncentred = TRUE,\n#   trend_map = trend_map,\n#   family = poisson(),\n#   data = simdat$data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(full_mod)\n\n\n## --------------------------------------------------------------------------------\nplot(full_mod, type = \"trend\", series = 1)\nplot(full_mod, type = \"trend\", series = 2)\nplot(full_mod, type = \"trend\", series = 3)\n\n\n## --------------------------------------------------------------------------------\nset.seed(123)\n# simulate a nonlinear relationship using the mgcv function gamSim\nsignal_dat <- mgcv::gamSim(n = 100, eg = 1, scale = 1)\n\n# productivity is one of the variables in the simulated data\nproductivity <- signal_dat$x2\n\n# simulate the true signal, which already has a nonlinear relationship\n# with productivity; we will add in a fairly strong AR1 process to\n# contribute to the signal\ntrue_signal <- as.vector(\n  scale(signal_dat$y) +\n    arima.sim(100, model = list(ar = 0.8, sd = 0.1))\n)\n\n\n## --------------------------------------------------------------------------------\nplot(\n  true_signal,\n  type = \"l\",\n  bty = \"l\",\n  lwd = 2,\n  ylab = \"True signal\",\n  xlab = \"Time\"\n)\n\n\n## --------------------------------------------------------------------------------\n# Function to simulate a monotonic response to a covariate\nsim_monotonic <- function(x, a = 2.2, b = 2) {\n  out <- exp(a * x) / (6 + exp(b * x)) * -1\n  return(2.5 * as.vector(scale(out)))\n}\n\n# Simulated temperature covariate\ntemperature <- runif(100, -2, 2)\n\n# Simulate the three series\nsim_series <- function(n_series = 3, true_signal) {\n  temp_effects <- mgcv::gamSim(n = 100, eg = 7, scale = 0.05)\n  alphas <- rnorm(n_series, sd = 2)\n\n  do.call(\n    rbind,\n    lapply(seq_len(n_series), function(series) {\n      data.frame(\n        observed = rnorm(\n          length(true_signal),\n          mean = alphas[series] +\n            sim_monotonic(temperature, runif(1, 2.2, 3), runif(1, 2.2, 3)) +\n            true_signal,\n          sd = runif(1, 1, 2)\n        ),\n        series = paste0(\"sensor_\", series),\n        time = 1:length(true_signal),\n        temperature = temperature,\n        productivity = productivity,\n        true_signal = true_signal\n      )\n    })\n  )\n}\nmodel_dat <- sim_series(true_signal = true_signal) %>%\n  dplyr::mutate(series = factor(series))\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(\n  data = model_dat,\n  y = \"observed\",\n  series = \"all\"\n)\n\n\n## --------------------------------------------------------------------------------\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_1\"),\n  pch = 16,\n  bty = \"l\",\n  ylab = \"Sensor 1\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_2\"),\n  pch = 16,\n  bty = \"l\",\n  ylab = \"Sensor 2\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_3\"),\n  pch = 16,\n  bty = \"l\",\n  ylab = \"Sensor 3\",\n  xlab = \"Temperature\"\n)\n\n\n## ----sensor_mod, include = FALSE, results='hide'---------------------------------\nmod <- mvgam(\n  # formula for observations, allowing for different\n  # intercepts and smooth effects of temperature\n  formula = observed ~ series +\n    s(temperature, k = 10) +\n    s(series, temperature, bs = \"sz\", k = 8),\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n  trend_formula = ~ s(productivity, k = 8) - 1,\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n  trend_model = AR(),\n  noncentred = TRUE,\n  # trend_map forces all sensors to track the same\n  # latent signal\n  trend_map = data.frame(\n    series = unique(model_dat$series),\n    trend = c(1, 1, 1)\n  ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  burnin = 600,\n  control = list(adapt_delta = 0.95),\n  data = model_dat,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(\n#   formula =\n#   # formula for observations, allowing for different\n#   # intercepts and hierarchical smooth effects of temperature\n#     observed ~ series +\n#       s(temperature, k = 10) +\n#       s(series, temperature, bs = \"sz\", k = 8),\n#   trend_formula =\n#   # formula for the latent signal, which can depend\n#   # nonlinearly on productivity\n#     ~ s(productivity, k = 8) - 1,\n#   trend_model =\n#   # in addition to productivity effects, the signal is\n#   # assumed to exhibit temporal autocorrelation\n#     AR(),\n#   noncentred = TRUE,\n#   trend_map =\n#   # trend_map forces all sensors to track the same\n#   # latent signal\n#     data.frame(\n#       series = unique(model_dat$series),\n#       trend = c(1, 1, 1)\n#     ),\n#\n#   # informative priors on process error\n#   # and observation error will help with convergence\n#   priors = c(\n#     prior(normal(2, 0.5), class = sigma),\n#     prior(normal(1, 0.5), class = sigma_obs)\n#   ),\n#\n#   # Gaussian observations\n#   family = gaussian(),\n#   data = model_dat,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nconditional_effects(mod, type = \"link\")\n\n\n## --------------------------------------------------------------------------------\nplot_predictions(\n  mod,\n  condition = c(\"temperature\", \"series\", \"series\"),\n  points = 0.5\n) +\n  theme(legend.position = \"none\")\n\n\n## --------------------------------------------------------------------------------\nplot(mod, type = \"trend\") +\n  ggplot2::geom_point(\n    data = data.frame(time = 1:100, y = true_signal),\n    mapping = ggplot2::aes(x = time, y = y)\n  )\n"
  },
  {
    "path": "inst/doc/shared_states.Rmd",
    "content": "---\ntitle: \"Shared latent states in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Shared latent states in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThis vignette gives an example of how `mvgam` can be used to estimate models where multiple observed time series share the same latent process model. For full details on the basic `mvgam` functionality, please see [the introductory vignette](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html).\n\n## The `trend_map` argument\nThe `trend_map` argument in the `mvgam()` function is an optional `data.frame` that can be used to specify which series should depend on which latent process models (called \"trends\" in `mvgam`). This can be particularly useful if we wish to force multiple observed time series to depend on the same latent trend process, but with different observation processes. If this argument is supplied, a latent factor model is set up by setting `use_lv = TRUE` and using the supplied `trend_map` to set up the shared trends. Users familiar with the `MARSS` family of packages will recognize this as a way of specifying the $Z$ matrix. This `data.frame` needs to have column names `series` and `trend`, with integer values in the `trend` column to state which trend each series should depend on. The `series` column should have a single unique entry for each time series in the data, with names that perfectly match the factor levels of the `series` variable in `data`). For example, if we were to simulate a collection of three integer-valued time series (using `sim_mvgam`), the following `trend_map` would force the first two series to share the same latent trend process:\n```{r}\nset.seed(122)\nsimdat <- sim_mvgam(\n  trend_model = AR(),\n  prop_trend = 0.6,\n  mu = c(0, 1, 2),\n  family = poisson()\n)\ntrend_map <- data.frame(\n  series = unique(simdat$data_train$series),\n  trend = c(1, 1, 2)\n)\ntrend_map\n```\n\nWe can see that the factor levels in `trend_map` match those in the data:\n```{r}\nall.equal(levels(trend_map$series), \n          levels(simdat$data_train$series))\n```\n\n### Checking `trend_map` with `run_model = FALSE`\nSupplying this `trend_map` to the `mvgam` function for a simple model, but setting `run_model = FALSE`, allows us to inspect the constructed `Stan` code and the data objects that would be used to condition the model. Here we will set up a model in which each series has a different observation process (with only a different intercept per series in this case), and the two latent dynamic process models evolve as independent AR1 processes that also contain a shared nonlinear smooth function to capture repeated seasonality. This model is not too complicated but it does show how we can learn shared and independent effects for collections of time series in the `mvgam` framework:\n```{r}\nfake_mod <- mvgam(\n  y ~\n    # observation model formula, which has a\n    # different intercept per series\n    series - 1,\n\n  # process model formula, which has a shared seasonal smooth\n  # (each latent process model shares the SAME smooth)\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n\n  # AR1 dynamics (each latent process model has DIFFERENT)\n  # dynamics; processes are estimated using the noncentred\n  # parameterisation for improved efficiency\n  trend_model = AR(),\n  noncentred = TRUE,\n\n  # supplied trend_map\n  trend_map = trend_map,\n\n  # data and observation family\n  family = poisson(),\n  data = simdat$data_train,\n  run_model = FALSE\n)\n```\n\nInspecting the `Stan` code shows how this model is a dynamic factor model in which the loadings are constructed to reflect the supplied `trend_map`:\n```{r}\nstancode(fake_mod)\n```\n\nNotice the line that states \"lv_coefs = Z;\". This uses the supplied $Z$ matrix to construct the loading coefficients. The supplied matrix now looks exactly like what you'd use if you were to create a similar model in the `MARSS` package:\n```{r}\nfake_mod$model_data$Z\n```\n\n### Fitting and inspecting the model\nThough this model doesn't perfectly match the data-generating process (which allowed each series to have different underlying dynamics), we can still fit it to show what the resulting inferences look like:\n```{r full_mod, include = FALSE, results='hide'}\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\nThe summary of this model is informative as it shows that only two latent process models have been estimated, even though we have three observed time series. The model converges well\n```{r}\nsummary(full_mod)\n```\n\nBoth series 1 and 2 share the exact same latent process estimates, while the estimates for series 3 are different:\n```{r}\nplot(full_mod, type = \"trend\", series = 1)\nplot(full_mod, type = \"trend\", series = 2)\nplot(full_mod, type = \"trend\", series = 3)\n```\n\nHowever, forecasts for series' 1 and 2 will differ because they have different intercepts in the observation model\n\n## Example: signal detection\nNow we will explore a more complicated example. Here we simulate a true hidden signal that we are trying to track. This signal depends nonlinearly on some covariate (called `productivity`, which represents a measure of how productive the landscape is). The signal also demonstrates a fairly large amount of temporal autocorrelation:\n```{r}\nset.seed(123)\n# simulate a nonlinear relationship using the mgcv function gamSim\nsignal_dat <- mgcv::gamSim(n = 100, eg = 1, scale = 1)\n\n# productivity is one of the variables in the simulated data\nproductivity <- signal_dat$x2\n\n# simulate the true signal, which already has a nonlinear relationship\n# with productivity; we will add in a fairly strong AR1 process to\n# contribute to the signal\ntrue_signal <- as.vector(scale(signal_dat$y) +\n  arima.sim(100, model = list(ar = 0.8, sd = 0.1)))\n```\n\nPlot the signal to inspect it's evolution over time\n```{r}\nplot(\n  true_signal,\n  type = \"l\",\n  bty = \"l\", lwd = 2,\n  ylab = \"True signal\",\n  xlab = \"Time\"\n)\n```\n\nNext we simulate three sensors that are trying to track the same hidden signal. All of these sensors have different observation errors that can depend nonlinearly on a second external covariate, called `temperature` in this example. Again this makes use of `gamSim`\n```{r}\n# Function to simulate a monotonic response to a covariate\nsim_monotonic <- function(x, a = 2.2, b = 2) {\n  out <- exp(a * x) / (6 + exp(b * x)) * -1\n  return(2.5 * as.vector(scale(out)))\n}\n\n# Simulated temperature covariate\ntemperature <- runif(100, -2, 2)\n\n# Simulate the three series\nsim_series <- function(n_series = 3, true_signal) {\n  temp_effects <- mgcv::gamSim(n = 100, eg = 7, scale = 0.05)\n  alphas <- rnorm(n_series, sd = 2)\n\n  do.call(rbind, lapply(seq_len(n_series), function(series) {\n    data.frame(\n      observed = rnorm(length(true_signal),\n        mean = alphas[series] +\n          sim_monotonic(temperature, \n                            runif(1, 2.2, 3),\n                            runif(1, 2.2, 3)) +\n          true_signal,\n        sd = runif(1, 1, 2)\n      ),\n      series = paste0(\"sensor_\", series),\n      time = 1:length(true_signal),\n      temperature = temperature,\n      productivity = productivity,\n      true_signal = true_signal\n    )\n  }))\n}\nmodel_dat <- sim_series(true_signal = true_signal) %>%\n  dplyr::mutate(series = factor(series))\n```\n\nPlot the sensor observations\n```{r}\nplot_mvgam_series(\n  data = model_dat, y = \"observed\",\n  series = \"all\"\n)\n```\n\nAnd now plot the observed relationships between the three sensors and the `temperature` covariate\n```{r}\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_1\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 1\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_2\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 2\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_3\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 3\",\n  xlab = \"Temperature\"\n)\n```\n\n### The shared signal model\nNow we can formulate and fit a model that allows each sensor's observation error to depend nonlinearly on `temperature` while allowing the true signal to depend nonlinearly on `productivity`. By fixing all of the values in the `trend` column to `1` in the `trend_map`, we are assuming that all observation sensors are tracking the same latent signal. We use informative priors on the two variance components (process error and observation error), which reflect our prior belief that the observation error is smaller overall than the true process error\n```{r sensor_mod, include = FALSE, results='hide'}\nmod <- mvgam(\n  formula =\n  # formula for observations, allowing for different\n  # intercepts and smooth effects of temperature\n    observed ~ series +\n      s(temperature, k = 10) +\n      s(series, temperature, bs = \"sz\", k = 8),\n  trend_formula =\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n    ~ s(productivity, k = 8) - 1,\n  trend_model =\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n    AR(),\n  noncentred = TRUE,\n  trend_map =\n  # trend_map forces all sensors to track the same\n  # latent signal\n    data.frame(\n      series = unique(model_dat$series),\n      trend = c(1, 1, 1)\n    ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  burnin = 600,\n  control = list(adapt_delta = 0.95),\n  data = model_dat,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(\n  formula =\n  # formula for observations, allowing for different\n  # intercepts and hierarchical smooth effects of temperature\n    observed ~ series +\n      s(temperature, k = 10) +\n      s(series, temperature, bs = \"sz\", k = 8),\n  trend_formula =\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n    ~ s(productivity, k = 8) - 1,\n  trend_model =\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n    AR(),\n  noncentred = TRUE,\n  trend_map =\n  # trend_map forces all sensors to track the same\n  # latent signal\n    data.frame(\n      series = unique(model_dat$series),\n      trend = c(1, 1, 1)\n    ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  data = model_dat,\n  silent = 2\n)\n```\n\nView a reduced version of the model summary because there will be many spline coefficients in this model\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\n### Inspecting effects on both process and observation models\nDon't pay much attention to the approximate *p*-values of the smooth terms. The calculation for these values is incredibly sensitive to the estimates for the smoothing parameters so I don't tend to find them to be very meaningful. What are meaningful, however, are prediction-based plots of the smooth functions. All main effects can be quickly plotted with `conditional_effects`:\n```{r}\nconditional_effects(mod, type = \"link\")\n```\n\n`conditional_effects` is simply a wrapper to the more flexible `plot_predictions` function from the `marginaleffects` package. We can get more useful plots of these effects using this function for further customisation:\n```{r}\nplot_predictions(\n  mod,\n  condition = c(\"temperature\", \"series\", \"series\"),\n  points = 0.5\n) +\n  theme(legend.position = \"none\")\n```\n\nWe have successfully estimated effects, some of them nonlinear, that impact the hidden process AND the observations. All in a single joint model. But there can always be challenges with these models, particularly when estimating both process and observation error at the same time.\n\n### Recovering the hidden signal\nA final but very key question is whether we can successfully recover the true hidden signal. The `trend` slot in the returned model parameters has the estimates for this signal, which we can easily plot using the `mvgam` S3 method for `plot`. We can also overlay the true values for the hidden signal, which shows that our model has done a good job of recovering it:\n```{r}\nplot(mod, \n     type = \"trend\") +\n  ggplot2::geom_point(data = data.frame(time = 1:100,\n                                        y = true_signal),\n                      mapping = ggplot2::aes(x = time,\n                                             y = y))\n```\n\n## Further reading\nThe following papers and resources offer a lot of useful material about other types of State-Space models and how they can be applied in practice:\n  \nAuger‐Méthé, Marie, et al. [\"A guide to state–space modeling of ecological time series.](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470)\" *Ecological Monographs* 91.4 (2021): e01470.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929  \n  \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. \"[MARSS: multivariate autoregressive state-space models for analyzing time-series data.](https://journal.r-project.org/articles/RJ-2012-002/)\" *R Journal*. 4.1 (2012): 11.\n  \nWard, Eric J., et al. \"[Inferring spatial structure from time‐series data: using multivariate state‐space models to detect metapopulation structure of California sea lions in the Gulf of California, Mexico.](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x)\" *Journal of Applied Ecology* 47.1 (2010): 47-56.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "inst/doc/shared_states.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Shared latent states in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Shared latent states in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#the-trend_map-argument\" id=\"toc-the-trend_map-argument\">The <code>trend_map</code> argument</a>\n<ul>\n<li><a href=\"#checking-trend_map-with-run_model-false\" id=\"toc-checking-trend_map-with-run_model-false\">Checking\n<code>trend_map</code> with <code>run_model = FALSE</code></a></li>\n<li><a href=\"#fitting-and-inspecting-the-model\" id=\"toc-fitting-and-inspecting-the-model\">Fitting and inspecting the\nmodel</a></li>\n</ul></li>\n<li><a href=\"#example-signal-detection\" id=\"toc-example-signal-detection\">Example: signal detection</a>\n<ul>\n<li><a href=\"#the-shared-signal-model\" id=\"toc-the-shared-signal-model\">The shared signal model</a></li>\n<li><a href=\"#inspecting-effects-on-both-process-and-observation-models\" id=\"toc-inspecting-effects-on-both-process-and-observation-models\">Inspecting\neffects on both process and observation models</a></li>\n<li><a href=\"#recovering-the-hidden-signal\" id=\"toc-recovering-the-hidden-signal\">Recovering the hidden\nsignal</a></li>\n</ul></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>This vignette gives an example of how <code>mvgam</code> can be used\nto estimate models where multiple observed time series share the same\nlatent process model. For full details on the basic <code>mvgam</code>\nfunctionality, please see <a href=\"https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\">the\nintroductory vignette</a>.</p>\n<div id=\"the-trend_map-argument\" class=\"section level2\">\n<h2>The <code>trend_map</code> argument</h2>\n<p>The <code>trend_map</code> argument in the <code>mvgam()</code>\nfunction is an optional <code>data.frame</code> that can be used to\nspecify which series should depend on which latent process models\n(called “trends” in <code>mvgam</code>). This can be particularly useful\nif we wish to force multiple observed time series to depend on the same\nlatent trend process, but with different observation processes. If this\nargument is supplied, a latent factor model is set up by setting\n<code>use_lv = TRUE</code> and using the supplied <code>trend_map</code>\nto set up the shared trends. Users familiar with the <code>MARSS</code>\nfamily of packages will recognize this as a way of specifying the <span class=\"math inline\">\\(Z\\)</span> matrix. This <code>data.frame</code>\nneeds to have column names <code>series</code> and <code>trend</code>,\nwith integer values in the <code>trend</code> column to state which\ntrend each series should depend on. The <code>series</code> column\nshould have a single unique entry for each time series in the data, with\nnames that perfectly match the factor levels of the <code>series</code>\nvariable in <code>data</code>). For example, if we were to simulate a\ncollection of three integer-valued time series (using\n<code>sim_mvgam</code>), the following <code>trend_map</code> would\nforce the first two series to share the same latent trend process:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">122</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>simdat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_mvgam</span>(</span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">prop_trend =</span> <span class=\"fl\">0.6</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"at\">mu =</span> <span class=\"fu\">c</span>(<span class=\"dv\">0</span>, <span class=\"dv\">1</span>, <span class=\"dv\">2</span>),</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>()</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>trend_map <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb1-9\"><a href=\"#cb1-9\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"fu\">unique</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series),</span>\n<span id=\"cb1-10\"><a href=\"#cb1-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend =</span> <span class=\"fu\">c</span>(<span class=\"dv\">1</span>, <span class=\"dv\">1</span>, <span class=\"dv\">2</span>)</span>\n<span id=\"cb1-11\"><a href=\"#cb1-11\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb1-12\"><a href=\"#cb1-12\" tabindex=\"-1\"></a>trend_map</span>\n<span id=\"cb1-13\"><a href=\"#cb1-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     series trend</span></span>\n<span id=\"cb1-14\"><a href=\"#cb1-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 series_1     1</span></span>\n<span id=\"cb1-15\"><a href=\"#cb1-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 series_2     1</span></span>\n<span id=\"cb1-16\"><a href=\"#cb1-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 series_3     2</span></span></code></pre></div>\n<p>We can see that the factor levels in <code>trend_map</code> match\nthose in the data:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">all.equal</span>(<span class=\"fu\">levels</span>(trend_map<span class=\"sc\">$</span>series), </span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a>          <span class=\"fu\">levels</span>(simdat<span class=\"sc\">$</span>data_train<span class=\"sc\">$</span>series))</span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] TRUE</span></span></code></pre></div>\n<div id=\"checking-trend_map-with-run_model-false\" class=\"section level3\">\n<h3>Checking <code>trend_map</code> with\n<code>run_model = FALSE</code></h3>\n<p>Supplying this <code>trend_map</code> to the <code>mvgam</code>\nfunction for a simple model, but setting <code>run_model = FALSE</code>,\nallows us to inspect the constructed <code>Stan</code> code and the data\nobjects that would be used to condition the model. Here we will set up a\nmodel in which each series has a different observation process (with\nonly a different intercept per series in this case), and the two latent\ndynamic process models evolve as independent AR1 processes that also\ncontain a shared nonlinear smooth function to capture repeated\nseasonality. This model is not too complicated but it does show how we\ncan learn shared and independent effects for collections of time series\nin the <code>mvgam</code> framework:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>fake_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span></span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a>    <span class=\"co\"># observation model formula, which has a</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a>    <span class=\"co\"># different intercept per series</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a>    series <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which has a shared seasonal smooth</span></span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a>  <span class=\"co\"># (each latent process model shares the SAME smooth)</span></span>\n<span id=\"cb3-9\"><a href=\"#cb3-9\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">6</span>),</span>\n<span id=\"cb3-10\"><a href=\"#cb3-10\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-11\"><a href=\"#cb3-11\" tabindex=\"-1\"></a>  <span class=\"co\"># AR1 dynamics (each latent process model has DIFFERENT)</span></span>\n<span id=\"cb3-12\"><a href=\"#cb3-12\" tabindex=\"-1\"></a>  <span class=\"co\"># dynamics; processes are estimated using the noncentred</span></span>\n<span id=\"cb3-13\"><a href=\"#cb3-13\" tabindex=\"-1\"></a>  <span class=\"co\"># parameterisation for improved efficiency</span></span>\n<span id=\"cb3-14\"><a href=\"#cb3-14\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb3-15\"><a href=\"#cb3-15\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb3-16\"><a href=\"#cb3-16\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-17\"><a href=\"#cb3-17\" tabindex=\"-1\"></a>  <span class=\"co\"># supplied trend_map</span></span>\n<span id=\"cb3-18\"><a href=\"#cb3-18\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb3-19\"><a href=\"#cb3-19\" tabindex=\"-1\"></a></span>\n<span id=\"cb3-20\"><a href=\"#cb3-20\" tabindex=\"-1\"></a>  <span class=\"co\"># data and observation family</span></span>\n<span id=\"cb3-21\"><a href=\"#cb3-21\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb3-22\"><a href=\"#cb3-22\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb3-23\"><a href=\"#cb3-23\" tabindex=\"-1\"></a>  <span class=\"at\">run_model =</span> <span class=\"cn\">FALSE</span></span>\n<span id=\"cb3-24\"><a href=\"#cb3-24\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Inspecting the <code>Stan</code> code shows how this model is a\ndynamic factor model in which the loadings are constructed to reflect\nthe supplied <code>trend_map</code>:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">stancode</span>(fake_mod)</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; // Stan model code generated by package mvgam</span></span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; data {</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; total_obs; // total number of observations</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n; // number of timepoints per series</span></span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_sp_trend; // number of trend smoothing parameters</span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_lv; // number of dynamic factors</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_series; // number of series</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_series, n_lv] Z; // matrix mapping series to latent states</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis; // total number of basis coefficients</span></span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; num_basis_trend; // number of trend basis coefficients</span></span>\n<span id=\"cb4-12\"><a href=\"#cb4-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] zero_trend; // prior locations for trend basis coefficients</span></span>\n<span id=\"cb4-13\"><a href=\"#cb4-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[total_obs, num_basis] X; // mgcv GAM design matrix</span></span>\n<span id=\"cb4-14\"><a href=\"#cb4-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n * n_lv, num_basis_trend] X_trend; // trend model design matrix</span></span>\n<span id=\"cb4-15\"><a href=\"#cb4-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int&lt;lower=0&gt; ytimes; // time-ordered matrix (which col in X belongs to each [time, series] observation?)</span></span>\n<span id=\"cb4-16\"><a href=\"#cb4-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_lv] int ytimes_trend;</span></span>\n<span id=\"cb4-17\"><a href=\"#cb4-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   int&lt;lower=0&gt; n_nonmissing; // number of nonmissing observations</span></span>\n<span id=\"cb4-18\"><a href=\"#cb4-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[4, 4] S_trend1; // mgcv smooth penalty matrix S_trend1</span></span>\n<span id=\"cb4-19\"><a href=\"#cb4-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; flat_ys; // flattened nonmissing observations</span></span>\n<span id=\"cb4-20\"><a href=\"#cb4-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_nonmissing, num_basis] flat_xs; // X values for nonmissing observations</span></span>\n<span id=\"cb4-21\"><a href=\"#cb4-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n_nonmissing] int&lt;lower=0&gt; obs_ind; // indices of nonmissing observations</span></span>\n<span id=\"cb4-22\"><a href=\"#cb4-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-23\"><a href=\"#cb4-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed data {</span></span>\n<span id=\"cb4-24\"><a href=\"#cb4-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-25\"><a href=\"#cb4-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-26\"><a href=\"#cb4-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; parameters {</span></span>\n<span id=\"cb4-27\"><a href=\"#cb4-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw basis coefficients</span></span>\n<span id=\"cb4-28\"><a href=\"#cb4-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b_raw;</span></span>\n<span id=\"cb4-29\"><a href=\"#cb4-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_raw_trend;</span></span>\n<span id=\"cb4-30\"><a href=\"#cb4-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-31\"><a href=\"#cb4-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent state SD terms</span></span>\n<span id=\"cb4-32\"><a href=\"#cb4-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_lv] sigma;</span></span>\n<span id=\"cb4-33\"><a href=\"#cb4-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-34\"><a href=\"#cb4-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent state AR1 terms</span></span>\n<span id=\"cb4-35\"><a href=\"#cb4-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=-1, upper=1&gt;[n_lv] ar1;</span></span>\n<span id=\"cb4-36\"><a href=\"#cb4-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-37\"><a href=\"#cb4-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw latent states</span></span>\n<span id=\"cb4-38\"><a href=\"#cb4-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_lv] LV_raw;</span></span>\n<span id=\"cb4-39\"><a href=\"#cb4-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-40\"><a href=\"#cb4-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // smoothing parameters</span></span>\n<span id=\"cb4-41\"><a href=\"#cb4-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector&lt;lower=0&gt;[n_sp_trend] lambda_trend;</span></span>\n<span id=\"cb4-42\"><a href=\"#cb4-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-43\"><a href=\"#cb4-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; transformed parameters {</span></span>\n<span id=\"cb4-44\"><a href=\"#cb4-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // raw latent states</span></span>\n<span id=\"cb4-45\"><a href=\"#cb4-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n * n_lv] trend_mus;</span></span>\n<span id=\"cb4-46\"><a href=\"#cb4-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] trend;</span></span>\n<span id=\"cb4-47\"><a href=\"#cb4-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-48\"><a href=\"#cb4-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // basis coefficients</span></span>\n<span id=\"cb4-49\"><a href=\"#cb4-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis] b;</span></span>\n<span id=\"cb4-50\"><a href=\"#cb4-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-51\"><a href=\"#cb4-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent states</span></span>\n<span id=\"cb4-52\"><a href=\"#cb4-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_lv] LV;</span></span>\n<span id=\"cb4-53\"><a href=\"#cb4-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[num_basis_trend] b_trend;</span></span>\n<span id=\"cb4-54\"><a href=\"#cb4-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-55\"><a href=\"#cb4-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // observation model basis coefficients</span></span>\n<span id=\"cb4-56\"><a href=\"#cb4-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b[1 : num_basis] = b_raw[1 : num_basis];</span></span>\n<span id=\"cb4-57\"><a href=\"#cb4-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-58\"><a href=\"#cb4-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // process model basis coefficients</span></span>\n<span id=\"cb4-59\"><a href=\"#cb4-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_trend[1 : num_basis_trend] = b_raw_trend[1 : num_basis_trend];</span></span>\n<span id=\"cb4-60\"><a href=\"#cb4-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-61\"><a href=\"#cb4-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // latent process linear predictors</span></span>\n<span id=\"cb4-62\"><a href=\"#cb4-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   trend_mus = X_trend * b_trend;</span></span>\n<span id=\"cb4-63\"><a href=\"#cb4-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   LV = LV_raw .* rep_matrix(sigma&#39;, rows(LV_raw));</span></span>\n<span id=\"cb4-64\"><a href=\"#cb4-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (j in 1 : n_lv) {</span></span>\n<span id=\"cb4-65\"><a href=\"#cb4-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     LV[1, j] += trend_mus[ytimes_trend[1, j]];</span></span>\n<span id=\"cb4-66\"><a href=\"#cb4-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (i in 2 : n) {</span></span>\n<span id=\"cb4-67\"><a href=\"#cb4-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       LV[i, j] += trend_mus[ytimes_trend[i, j]]</span></span>\n<span id=\"cb4-68\"><a href=\"#cb4-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   + ar1[j] * (LV[i - 1, j] - trend_mus[ytimes_trend[i - 1, j]]);</span></span>\n<span id=\"cb4-69\"><a href=\"#cb4-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb4-70\"><a href=\"#cb4-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-71\"><a href=\"#cb4-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-72\"><a href=\"#cb4-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // derived latent states</span></span>\n<span id=\"cb4-73\"><a href=\"#cb4-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (i in 1 : n) {</span></span>\n<span id=\"cb4-74\"><a href=\"#cb4-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     for (s in 1 : n_series) {</span></span>\n<span id=\"cb4-75\"><a href=\"#cb4-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt;       trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);</span></span>\n<span id=\"cb4-76\"><a href=\"#cb4-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     }</span></span>\n<span id=\"cb4-77\"><a href=\"#cb4-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-78\"><a href=\"#cb4-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-79\"><a href=\"#cb4-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt; model {</span></span>\n<span id=\"cb4-80\"><a href=\"#cb4-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for seriesseries_1...</span></span>\n<span id=\"cb4-81\"><a href=\"#cb4-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[1] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-82\"><a href=\"#cb4-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-83\"><a href=\"#cb4-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for seriesseries_2...</span></span>\n<span id=\"cb4-84\"><a href=\"#cb4-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[2] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-85\"><a href=\"#cb4-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-86\"><a href=\"#cb4-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for seriesseries_3...</span></span>\n<span id=\"cb4-87\"><a href=\"#cb4-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw[3] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-88\"><a href=\"#cb4-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-89\"><a href=\"#cb4-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for AR parameters</span></span>\n<span id=\"cb4-90\"><a href=\"#cb4-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   ar1 ~ std_normal();</span></span>\n<span id=\"cb4-91\"><a href=\"#cb4-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-92\"><a href=\"#cb4-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // priors for latent state SD parameters</span></span>\n<span id=\"cb4-93\"><a href=\"#cb4-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   sigma ~ inv_gamma(1.418, 0.452);</span></span>\n<span id=\"cb4-94\"><a href=\"#cb4-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   to_vector(LV_raw) ~ std_normal();</span></span>\n<span id=\"cb4-95\"><a href=\"#cb4-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-96\"><a href=\"#cb4-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // dynamic process models</span></span>\n<span id=\"cb4-97\"><a href=\"#cb4-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-98\"><a href=\"#cb4-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for (Intercept)_trend...</span></span>\n<span id=\"cb4-99\"><a href=\"#cb4-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[1] ~ student_t(3, 0, 2);</span></span>\n<span id=\"cb4-100\"><a href=\"#cb4-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-101\"><a href=\"#cb4-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // prior for s(season)_trend...</span></span>\n<span id=\"cb4-102\"><a href=\"#cb4-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   b_raw_trend[2 : 5] ~ multi_normal_prec(zero_trend[2 : 5],</span></span>\n<span id=\"cb4-103\"><a href=\"#cb4-103\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          S_trend1[1 : 4, 1 : 4]</span></span>\n<span id=\"cb4-104\"><a href=\"#cb4-104\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                                          * lambda_trend[1]);</span></span>\n<span id=\"cb4-105\"><a href=\"#cb4-105\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   lambda_trend ~ normal(5, 30);</span></span>\n<span id=\"cb4-106\"><a href=\"#cb4-106\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   {</span></span>\n<span id=\"cb4-107\"><a href=\"#cb4-107\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     // likelihood functions</span></span>\n<span id=\"cb4-108\"><a href=\"#cb4-108\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     vector[n_nonmissing] flat_trends;</span></span>\n<span id=\"cb4-109\"><a href=\"#cb4-109\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_trends = to_vector(trend)[obs_ind];</span></span>\n<span id=\"cb4-110\"><a href=\"#cb4-110\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     flat_ys ~ poisson_log_glm(append_col(flat_xs, flat_trends), 0.0,</span></span>\n<span id=\"cb4-111\"><a href=\"#cb4-111\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               append_row(b, 1.0));</span></span>\n<span id=\"cb4-112\"><a href=\"#cb4-112\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-113\"><a href=\"#cb4-113\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span>\n<span id=\"cb4-114\"><a href=\"#cb4-114\" tabindex=\"-1\"></a><span class=\"co\">#&gt; generated quantities {</span></span>\n<span id=\"cb4-115\"><a href=\"#cb4-115\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[total_obs] eta;</span></span>\n<span id=\"cb4-116\"><a href=\"#cb4-116\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n, n_series] mus;</span></span>\n<span id=\"cb4-117\"><a href=\"#cb4-117\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_sp_trend] rho_trend;</span></span>\n<span id=\"cb4-118\"><a href=\"#cb4-118\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   vector[n_lv] penalty;</span></span>\n<span id=\"cb4-119\"><a href=\"#cb4-119\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   array[n, n_series] int ypred;</span></span>\n<span id=\"cb4-120\"><a href=\"#cb4-120\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   penalty = 1.0 / (sigma .* sigma);</span></span>\n<span id=\"cb4-121\"><a href=\"#cb4-121\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   rho_trend = log(lambda_trend);</span></span>\n<span id=\"cb4-122\"><a href=\"#cb4-122\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   </span></span>\n<span id=\"cb4-123\"><a href=\"#cb4-123\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   matrix[n_series, n_lv] lv_coefs = Z;</span></span>\n<span id=\"cb4-124\"><a href=\"#cb4-124\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   // posterior predictions</span></span>\n<span id=\"cb4-125\"><a href=\"#cb4-125\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   eta = X * b;</span></span>\n<span id=\"cb4-126\"><a href=\"#cb4-126\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   for (s in 1 : n_series) {</span></span>\n<span id=\"cb4-127\"><a href=\"#cb4-127\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     mus[1 : n, s] = eta[ytimes[1 : n, s]] + trend[1 : n, s];</span></span>\n<span id=\"cb4-128\"><a href=\"#cb4-128\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     ypred[1 : n, s] = poisson_log_rng(mus[1 : n, s]);</span></span>\n<span id=\"cb4-129\"><a href=\"#cb4-129\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   }</span></span>\n<span id=\"cb4-130\"><a href=\"#cb4-130\" tabindex=\"-1\"></a><span class=\"co\">#&gt; }</span></span></code></pre></div>\n<p>Notice the line that states “lv_coefs = Z;”. This uses the supplied\n<span class=\"math inline\">\\(Z\\)</span> matrix to construct the loading\ncoefficients. The supplied matrix now looks exactly like what you’d use\nif you were to create a similar model in the <code>MARSS</code>\npackage:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>fake_mod<span class=\"sc\">$</span>model_data<span class=\"sc\">$</span>Z</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;      [,1] [,2]</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1,]    1    0</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [2,]    1    0</span></span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [3,]    0    1</span></span></code></pre></div>\n</div>\n<div id=\"fitting-and-inspecting-the-model\" class=\"section level3\">\n<h3>Fitting and inspecting the model</h3>\n<p>Though this model doesn’t perfectly match the data-generating process\n(which allowed each series to have different underlying dynamics), we\ncan still fit it to show what the resulting inferences look like:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a>full_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> series <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">s</span>(season, <span class=\"at\">bs =</span> <span class=\"st\">&quot;cc&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">6</span>),</span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb6-6\"><a href=\"#cb6-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span> trend_map,</span>\n<span id=\"cb6-7\"><a href=\"#cb6-7\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">poisson</span>(),</span>\n<span id=\"cb6-8\"><a href=\"#cb6-8\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> simdat<span class=\"sc\">$</span>data_train,</span>\n<span id=\"cb6-9\"><a href=\"#cb6-9\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb6-10\"><a href=\"#cb6-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary of this model is informative as it shows that only two\nlatent process models have been estimated, even though we have three\nobserved time series. The model converges well</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(full_mod)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ series - 1</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(season, bs = &quot;cc&quot;, k = 6)</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; poisson</span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; log</span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-16\"><a href=\"#cb7-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb7-17\"><a href=\"#cb7-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb7-18\"><a href=\"#cb7-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-19\"><a href=\"#cb7-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb7-20\"><a href=\"#cb7-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2 </span></span>\n<span id=\"cb7-21\"><a href=\"#cb7-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-22\"><a href=\"#cb7-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb7-23\"><a href=\"#cb7-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb7-24\"><a href=\"#cb7-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-25\"><a href=\"#cb7-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb7-26\"><a href=\"#cb7-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 75 </span></span>\n<span id=\"cb7-27\"><a href=\"#cb7-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-28\"><a href=\"#cb7-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb7-29\"><a href=\"#cb7-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb7-30\"><a href=\"#cb7-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb7-31\"><a href=\"#cb7-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb7-32\"><a href=\"#cb7-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-33\"><a href=\"#cb7-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-34\"><a href=\"#cb7-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-35\"><a href=\"#cb7-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_1 -2.70 -0.63   1.4 1.01   700</span></span>\n<span id=\"cb7-36\"><a href=\"#cb7-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_2 -1.70  0.31   2.3 1.01   702</span></span>\n<span id=\"cb7-37\"><a href=\"#cb7-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriesseries_3 -0.76  1.30   3.3 1.01   703</span></span>\n<span id=\"cb7-38\"><a href=\"#cb7-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-39\"><a href=\"#cb7-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb7-40\"><a href=\"#cb7-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-41\"><a href=\"#cb7-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.37 0.53  0.71    1   701</span></span>\n<span id=\"cb7-42\"><a href=\"#cb7-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[2] 0.49 0.61  0.78    1   693</span></span>\n<span id=\"cb7-43\"><a href=\"#cb7-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-44\"><a href=\"#cb7-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb7-45\"><a href=\"#cb7-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         2.5%    50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-46\"><a href=\"#cb7-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] -0.59 -0.240  0.17 1.00   462</span></span>\n<span id=\"cb7-47\"><a href=\"#cb7-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[2] -0.25  0.048  0.35 1.01   349</span></span>\n<span id=\"cb7-48\"><a href=\"#cb7-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-49\"><a href=\"#cb7-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model coefficient (beta) estimates:</span></span>\n<span id=\"cb7-50\"><a href=\"#cb7-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                     2.5%    50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-51\"><a href=\"#cb7-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)_trend -1.300  0.730 2.800 1.01   694</span></span>\n<span id=\"cb7-52\"><a href=\"#cb7-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).1_trend -0.310 -0.061 0.190 1.00   947</span></span>\n<span id=\"cb7-53\"><a href=\"#cb7-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).2_trend -0.062  0.230 0.510 1.00   753</span></span>\n<span id=\"cb7-54\"><a href=\"#cb7-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).3_trend -0.480 -0.200 0.097 1.00   620</span></span>\n<span id=\"cb7-55\"><a href=\"#cb7-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season).4_trend  0.350  0.690 0.960 1.00   584</span></span>\n<span id=\"cb7-56\"><a href=\"#cb7-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-57\"><a href=\"#cb7-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb7-58\"><a href=\"#cb7-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             edf Ref.df Chi.sq  p-value    </span></span>\n<span id=\"cb7-59\"><a href=\"#cb7-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(season) 2.324      4   24.2 8.27e-05 ***</span></span>\n<span id=\"cb7-60\"><a href=\"#cb7-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb7-61\"><a href=\"#cb7-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb7-62\"><a href=\"#cb7-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-63\"><a href=\"#cb7-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb7-64\"><a href=\"#cb7-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb7-65\"><a href=\"#cb7-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb7-66\"><a href=\"#cb7-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb7-67\"><a href=\"#cb7-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb7-68\"><a href=\"#cb7-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-69\"><a href=\"#cb7-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb7-70\"><a href=\"#cb7-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb7-71\"><a href=\"#cb7-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb7-72\"><a href=\"#cb7-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-73\"><a href=\"#cb7-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Both series 1 and 2 share the exact same latent process estimates,\nwhile the estimates for series 3 are different:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(full_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(full_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(full_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>However, forecasts for series’ 1 and 2 will differ because they have\ndifferent intercepts in the observation model</p>\n</div>\n</div>\n<div id=\"example-signal-detection\" class=\"section level2\">\n<h2>Example: signal detection</h2>\n<p>Now we will explore a more complicated example. Here we simulate a\ntrue hidden signal that we are trying to track. This signal depends\nnonlinearly on some covariate (called <code>productivity</code>, which\nrepresents a measure of how productive the landscape is). The signal\nalso demonstrates a fairly large amount of temporal autocorrelation:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">123</span>)</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a><span class=\"co\"># simulate a nonlinear relationship using the mgcv function gamSim</span></span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a>signal_dat <span class=\"ot\">&lt;-</span> mgcv<span class=\"sc\">::</span><span class=\"fu\">gamSim</span>(<span class=\"at\">n =</span> <span class=\"dv\">100</span>, <span class=\"at\">eg =</span> <span class=\"dv\">1</span>, <span class=\"at\">scale =</span> <span class=\"dv\">1</span>)</span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Gu &amp; Wahba 4 term additive model</span></span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-6\"><a href=\"#cb11-6\" tabindex=\"-1\"></a><span class=\"co\"># productivity is one of the variables in the simulated data</span></span>\n<span id=\"cb11-7\"><a href=\"#cb11-7\" tabindex=\"-1\"></a>productivity <span class=\"ot\">&lt;-</span> signal_dat<span class=\"sc\">$</span>x2</span>\n<span id=\"cb11-8\"><a href=\"#cb11-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb11-9\"><a href=\"#cb11-9\" tabindex=\"-1\"></a><span class=\"co\"># simulate the true signal, which already has a nonlinear relationship</span></span>\n<span id=\"cb11-10\"><a href=\"#cb11-10\" tabindex=\"-1\"></a><span class=\"co\"># with productivity; we will add in a fairly strong AR1 process to</span></span>\n<span id=\"cb11-11\"><a href=\"#cb11-11\" tabindex=\"-1\"></a><span class=\"co\"># contribute to the signal</span></span>\n<span id=\"cb11-12\"><a href=\"#cb11-12\" tabindex=\"-1\"></a>true_signal <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(signal_dat<span class=\"sc\">$</span>y) <span class=\"sc\">+</span></span>\n<span id=\"cb11-13\"><a href=\"#cb11-13\" tabindex=\"-1\"></a>  <span class=\"fu\">arima.sim</span>(<span class=\"dv\">100</span>, <span class=\"at\">model =</span> <span class=\"fu\">list</span>(<span class=\"at\">ar =</span> <span class=\"fl\">0.8</span>, <span class=\"at\">sd =</span> <span class=\"fl\">0.1</span>)))</span></code></pre></div>\n<p>Plot the signal to inspect it’s evolution over time</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a>  true_signal,</span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>,</span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;True signal&quot;</span>,</span>\n<span id=\"cb12-6\"><a href=\"#cb12-6\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Time&quot;</span></span>\n<span id=\"cb12-7\"><a href=\"#cb12-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Next we simulate three sensors that are trying to track the same\nhidden signal. All of these sensors have different observation errors\nthat can depend nonlinearly on a second external covariate, called\n<code>temperature</code> in this example. Again this makes use of\n<code>gamSim</code></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"co\"># Function to simulate a monotonic response to a covariate</span></span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a>sim_monotonic <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(x, <span class=\"at\">a =</span> <span class=\"fl\">2.2</span>, <span class=\"at\">b =</span> <span class=\"dv\">2</span>) {</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a>  out <span class=\"ot\">&lt;-</span> <span class=\"fu\">exp</span>(a <span class=\"sc\">*</span> x) <span class=\"sc\">/</span> (<span class=\"dv\">6</span> <span class=\"sc\">+</span> <span class=\"fu\">exp</span>(b <span class=\"sc\">*</span> x)) <span class=\"sc\">*</span> <span class=\"sc\">-</span><span class=\"dv\">1</span></span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a>  <span class=\"fu\">return</span>(<span class=\"fl\">2.5</span> <span class=\"sc\">*</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(out)))</span>\n<span id=\"cb13-5\"><a href=\"#cb13-5\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb13-6\"><a href=\"#cb13-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb13-7\"><a href=\"#cb13-7\" tabindex=\"-1\"></a><span class=\"co\"># Simulated temperature covariate</span></span>\n<span id=\"cb13-8\"><a href=\"#cb13-8\" tabindex=\"-1\"></a>temperature <span class=\"ot\">&lt;-</span> <span class=\"fu\">runif</span>(<span class=\"dv\">100</span>, <span class=\"sc\">-</span><span class=\"dv\">2</span>, <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-9\"><a href=\"#cb13-9\" tabindex=\"-1\"></a></span>\n<span id=\"cb13-10\"><a href=\"#cb13-10\" tabindex=\"-1\"></a><span class=\"co\"># Simulate the three series</span></span>\n<span id=\"cb13-11\"><a href=\"#cb13-11\" tabindex=\"-1\"></a>sim_series <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(<span class=\"at\">n_series =</span> <span class=\"dv\">3</span>, true_signal) {</span>\n<span id=\"cb13-12\"><a href=\"#cb13-12\" tabindex=\"-1\"></a>  temp_effects <span class=\"ot\">&lt;-</span> mgcv<span class=\"sc\">::</span><span class=\"fu\">gamSim</span>(<span class=\"at\">n =</span> <span class=\"dv\">100</span>, <span class=\"at\">eg =</span> <span class=\"dv\">7</span>, <span class=\"at\">scale =</span> <span class=\"fl\">0.05</span>)</span>\n<span id=\"cb13-13\"><a href=\"#cb13-13\" tabindex=\"-1\"></a>  alphas <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(n_series, <span class=\"at\">sd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-14\"><a href=\"#cb13-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb13-15\"><a href=\"#cb13-15\" tabindex=\"-1\"></a>  <span class=\"fu\">do.call</span>(rbind, <span class=\"fu\">lapply</span>(<span class=\"fu\">seq_len</span>(n_series), <span class=\"cf\">function</span>(series) {</span>\n<span id=\"cb13-16\"><a href=\"#cb13-16\" tabindex=\"-1\"></a>    <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb13-17\"><a href=\"#cb13-17\" tabindex=\"-1\"></a>      <span class=\"at\">observed =</span> <span class=\"fu\">rnorm</span>(<span class=\"fu\">length</span>(true_signal),</span>\n<span id=\"cb13-18\"><a href=\"#cb13-18\" tabindex=\"-1\"></a>        <span class=\"at\">mean =</span> alphas[series] <span class=\"sc\">+</span></span>\n<span id=\"cb13-19\"><a href=\"#cb13-19\" tabindex=\"-1\"></a>          <span class=\"fu\">sim_monotonic</span>(temperature, </span>\n<span id=\"cb13-20\"><a href=\"#cb13-20\" tabindex=\"-1\"></a>                            <span class=\"fu\">runif</span>(<span class=\"dv\">1</span>, <span class=\"fl\">2.2</span>, <span class=\"dv\">3</span>),</span>\n<span id=\"cb13-21\"><a href=\"#cb13-21\" tabindex=\"-1\"></a>                            <span class=\"fu\">runif</span>(<span class=\"dv\">1</span>, <span class=\"fl\">2.2</span>, <span class=\"dv\">3</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb13-22\"><a href=\"#cb13-22\" tabindex=\"-1\"></a>          true_signal,</span>\n<span id=\"cb13-23\"><a href=\"#cb13-23\" tabindex=\"-1\"></a>        <span class=\"at\">sd =</span> <span class=\"fu\">runif</span>(<span class=\"dv\">1</span>, <span class=\"dv\">1</span>, <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-24\"><a href=\"#cb13-24\" tabindex=\"-1\"></a>      ),</span>\n<span id=\"cb13-25\"><a href=\"#cb13-25\" tabindex=\"-1\"></a>      <span class=\"at\">series =</span> <span class=\"fu\">paste0</span>(<span class=\"st\">&quot;sensor_&quot;</span>, series),</span>\n<span id=\"cb13-26\"><a href=\"#cb13-26\" tabindex=\"-1\"></a>      <span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">length</span>(true_signal),</span>\n<span id=\"cb13-27\"><a href=\"#cb13-27\" tabindex=\"-1\"></a>      <span class=\"at\">temperature =</span> temperature,</span>\n<span id=\"cb13-28\"><a href=\"#cb13-28\" tabindex=\"-1\"></a>      <span class=\"at\">productivity =</span> productivity,</span>\n<span id=\"cb13-29\"><a href=\"#cb13-29\" tabindex=\"-1\"></a>      <span class=\"at\">true_signal =</span> true_signal</span>\n<span id=\"cb13-30\"><a href=\"#cb13-30\" tabindex=\"-1\"></a>    )</span>\n<span id=\"cb13-31\"><a href=\"#cb13-31\" tabindex=\"-1\"></a>  }))</span>\n<span id=\"cb13-32\"><a href=\"#cb13-32\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb13-33\"><a href=\"#cb13-33\" tabindex=\"-1\"></a>model_dat <span class=\"ot\">&lt;-</span> <span class=\"fu\">sim_series</span>(<span class=\"at\">true_signal =</span> true_signal) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb13-34\"><a href=\"#cb13-34\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">factor</span>(series))</span>\n<span id=\"cb13-35\"><a href=\"#cb13-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Gu &amp; Wahba 4 term additive model, correlated predictors</span></span></code></pre></div>\n<p>Plot the sensor observations</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat, <span class=\"at\">y =</span> <span class=\"st\">&quot;observed&quot;</span>,</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a>  <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>And now plot the observed relationships between the three sensors and\nthe <code>temperature</code> covariate</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  observed <span class=\"sc\">~</span> temperature,</span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;sensor_1&quot;</span>),</span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Sensor 1&quot;</span>,</span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Temperature&quot;</span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a>  observed <span class=\"sc\">~</span> temperature,</span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;sensor_2&quot;</span>),</span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Sensor 2&quot;</span>,</span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Temperature&quot;</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb17-2\"><a href=\"#cb17-2\" tabindex=\"-1\"></a>  observed <span class=\"sc\">~</span> temperature,</span>\n<span id=\"cb17-3\"><a href=\"#cb17-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb17-4\"><a href=\"#cb17-4\" tabindex=\"-1\"></a>    dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;sensor_3&quot;</span>),</span>\n<span id=\"cb17-5\"><a href=\"#cb17-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb17-6\"><a href=\"#cb17-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Sensor 3&quot;</span>,</span>\n<span id=\"cb17-7\"><a href=\"#cb17-7\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Temperature&quot;</span></span>\n<span id=\"cb17-8\"><a href=\"#cb17-8\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"the-shared-signal-model\" class=\"section level3\">\n<h3>The shared signal model</h3>\n<p>Now we can formulate and fit a model that allows each sensor’s\nobservation error to depend nonlinearly on <code>temperature</code>\nwhile allowing the true signal to depend nonlinearly on\n<code>productivity</code>. By fixing all of the values in the\n<code>trend</code> column to <code>1</code> in the\n<code>trend_map</code>, we are assuming that all observation sensors are\ntracking the same latent signal. We use informative priors on the two\nvariance components (process error and observation error), which reflect\nour prior belief that the observation error is smaller overall than the\ntrue process error</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span></span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"co\"># formula for observations, allowing for different</span></span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"co\"># intercepts and hierarchical smooth effects of temperature</span></span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>    observed <span class=\"sc\">~</span> series <span class=\"sc\">+</span></span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a>      <span class=\"fu\">s</span>(temperature, <span class=\"at\">k =</span> <span class=\"dv\">10</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a>      <span class=\"fu\">s</span>(series, temperature, <span class=\"at\">bs =</span> <span class=\"st\">&quot;sz&quot;</span>, <span class=\"at\">k =</span> <span class=\"dv\">8</span>),</span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a>  <span class=\"co\"># formula for the latent signal, which can depend</span></span>\n<span id=\"cb18-10\"><a href=\"#cb18-10\" tabindex=\"-1\"></a>  <span class=\"co\"># nonlinearly on productivity</span></span>\n<span id=\"cb18-11\"><a href=\"#cb18-11\" tabindex=\"-1\"></a>    <span class=\"sc\">~</span> <span class=\"fu\">s</span>(productivity, <span class=\"at\">k =</span> <span class=\"dv\">8</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb18-12\"><a href=\"#cb18-12\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span></span>\n<span id=\"cb18-13\"><a href=\"#cb18-13\" tabindex=\"-1\"></a>  <span class=\"co\"># in addition to productivity effects, the signal is</span></span>\n<span id=\"cb18-14\"><a href=\"#cb18-14\" tabindex=\"-1\"></a>  <span class=\"co\"># assumed to exhibit temporal autocorrelation</span></span>\n<span id=\"cb18-15\"><a href=\"#cb18-15\" tabindex=\"-1\"></a>    <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb18-16\"><a href=\"#cb18-16\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb18-17\"><a href=\"#cb18-17\" tabindex=\"-1\"></a>  <span class=\"at\">trend_map =</span></span>\n<span id=\"cb18-18\"><a href=\"#cb18-18\" tabindex=\"-1\"></a>  <span class=\"co\"># trend_map forces all sensors to track the same</span></span>\n<span id=\"cb18-19\"><a href=\"#cb18-19\" tabindex=\"-1\"></a>  <span class=\"co\"># latent signal</span></span>\n<span id=\"cb18-20\"><a href=\"#cb18-20\" tabindex=\"-1\"></a>    <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb18-21\"><a href=\"#cb18-21\" tabindex=\"-1\"></a>      <span class=\"at\">series =</span> <span class=\"fu\">unique</span>(model_dat<span class=\"sc\">$</span>series),</span>\n<span id=\"cb18-22\"><a href=\"#cb18-22\" tabindex=\"-1\"></a>      <span class=\"at\">trend =</span> <span class=\"fu\">c</span>(<span class=\"dv\">1</span>, <span class=\"dv\">1</span>, <span class=\"dv\">1</span>)</span>\n<span id=\"cb18-23\"><a href=\"#cb18-23\" tabindex=\"-1\"></a>    ),</span>\n<span id=\"cb18-24\"><a href=\"#cb18-24\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-25\"><a href=\"#cb18-25\" tabindex=\"-1\"></a>  <span class=\"co\"># informative priors on process error</span></span>\n<span id=\"cb18-26\"><a href=\"#cb18-26\" tabindex=\"-1\"></a>  <span class=\"co\"># and observation error will help with convergence</span></span>\n<span id=\"cb18-27\"><a href=\"#cb18-27\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb18-28\"><a href=\"#cb18-28\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"dv\">2</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> sigma),</span>\n<span id=\"cb18-29\"><a href=\"#cb18-29\" tabindex=\"-1\"></a>    <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"dv\">1</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> sigma_obs)</span>\n<span id=\"cb18-30\"><a href=\"#cb18-30\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb18-31\"><a href=\"#cb18-31\" tabindex=\"-1\"></a></span>\n<span id=\"cb18-32\"><a href=\"#cb18-32\" tabindex=\"-1\"></a>  <span class=\"co\"># Gaussian observations</span></span>\n<span id=\"cb18-33\"><a href=\"#cb18-33\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb18-34\"><a href=\"#cb18-34\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_dat,</span>\n<span id=\"cb18-35\"><a href=\"#cb18-35\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb18-36\"><a href=\"#cb18-36\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>View a reduced version of the model summary because there will be\nmany spline coefficients in this model</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; observed ~ series + s(temperature, k = 10) + s(series, temperature, </span></span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     bs = &quot;sz&quot;, k = 8)</span></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~s(productivity, k = 8) - 1</span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x000002063451d728&gt;</span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb19-21\"><a href=\"#cb19-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb19-22\"><a href=\"#cb19-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-23\"><a href=\"#cb19-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb19-24\"><a href=\"#cb19-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3 </span></span>\n<span id=\"cb19-25\"><a href=\"#cb19-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-26\"><a href=\"#cb19-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb19-27\"><a href=\"#cb19-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 100 </span></span>\n<span id=\"cb19-28\"><a href=\"#cb19-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-29\"><a href=\"#cb19-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb19-30\"><a href=\"#cb19-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb19-31\"><a href=\"#cb19-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1100; warmup = 600; thin = 1 </span></span>\n<span id=\"cb19-32\"><a href=\"#cb19-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb19-33\"><a href=\"#cb19-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-34\"><a href=\"#cb19-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb19-35\"><a href=\"#cb19-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-36\"><a href=\"#cb19-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1]  1.3 1.5   1.8    1  1791</span></span>\n<span id=\"cb19-37\"><a href=\"#cb19-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[2]  1.2 1.4   1.6    1  2040</span></span>\n<span id=\"cb19-38\"><a href=\"#cb19-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[3]  1.3 1.5   1.8    1  1607</span></span>\n<span id=\"cb19-39\"><a href=\"#cb19-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-40\"><a href=\"#cb19-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb19-41\"><a href=\"#cb19-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                 2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-42\"><a href=\"#cb19-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)     0.11  1.20  4.10 1.01   464</span></span>\n<span id=\"cb19-43\"><a href=\"#cb19-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriessensor_2 -2.40 -1.60 -0.65 1.00   831</span></span>\n<span id=\"cb19-44\"><a href=\"#cb19-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; seriessensor_3 -0.59  0.49  1.60 1.00  1316</span></span>\n<span id=\"cb19-45\"><a href=\"#cb19-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-46\"><a href=\"#cb19-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM observation smooths:</span></span>\n<span id=\"cb19-47\"><a href=\"#cb19-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                         edf Ref.df   Chi.sq p-value    </span></span>\n<span id=\"cb19-48\"><a href=\"#cb19-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(temperature)        5.335      9 1446.722  &lt;2e-16 ***</span></span>\n<span id=\"cb19-49\"><a href=\"#cb19-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(series,temperature) 2.545     16    1.042       1    </span></span>\n<span id=\"cb19-50\"><a href=\"#cb19-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb19-51\"><a href=\"#cb19-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb19-52\"><a href=\"#cb19-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-53\"><a href=\"#cb19-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb19-54\"><a href=\"#cb19-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-55\"><a href=\"#cb19-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.89 1.2   1.5    1   576</span></span>\n<span id=\"cb19-56\"><a href=\"#cb19-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-57\"><a href=\"#cb19-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb19-58\"><a href=\"#cb19-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-59\"><a href=\"#cb19-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.56 0.77  0.97 1.01   378</span></span>\n<span id=\"cb19-60\"><a href=\"#cb19-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-61\"><a href=\"#cb19-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb19-62\"><a href=\"#cb19-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                   edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb19-63\"><a href=\"#cb19-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(productivity) 1.865      7  41.97   0.228</span></span>\n<span id=\"cb19-64\"><a href=\"#cb19-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-65\"><a href=\"#cb19-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb19-66\"><a href=\"#cb19-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb19-67\"><a href=\"#cb19-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb19-68\"><a href=\"#cb19-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb19-69\"><a href=\"#cb19-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb19-70\"><a href=\"#cb19-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-71\"><a href=\"#cb19-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb19-72\"><a href=\"#cb19-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb19-73\"><a href=\"#cb19-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb19-74\"><a href=\"#cb19-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-75\"><a href=\"#cb19-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n</div>\n<div id=\"inspecting-effects-on-both-process-and-observation-models\" class=\"section level3\">\n<h3>Inspecting effects on both process and observation models</h3>\n<p>Don’t pay much attention to the approximate <em>p</em>-values of the\nsmooth terms. The calculation for these values is incredibly sensitive\nto the estimates for the smoothing parameters so I don’t tend to find\nthem to be very meaningful. What are meaningful, however, are\nprediction-based plots of the smooth functions. All main effects can be\nquickly plotted with <code>conditional_effects</code>:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">conditional_effects</span>(mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p><code>conditional_effects</code> is simply a wrapper to the more\nflexible <code>plot_predictions</code> function from the\n<code>marginaleffects</code> package. We can get more useful plots of\nthese effects using this function for further customisation:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_predictions</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  mod,</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>  <span class=\"at\">condition =</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;temperature&quot;</span>, <span class=\"st\">&quot;series&quot;</span>, <span class=\"st\">&quot;series&quot;</span>),</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>  <span class=\"at\">points =</span> <span class=\"fl\">0.5</span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span></span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>  <span class=\"fu\">theme</span>(<span class=\"at\">legend.position =</span> <span class=\"st\">&quot;none&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We have successfully estimated effects, some of them nonlinear, that\nimpact the hidden process AND the observations. All in a single joint\nmodel. But there can always be challenges with these models,\nparticularly when estimating both process and observation error at the\nsame time.</p>\n</div>\n<div id=\"recovering-the-hidden-signal\" class=\"section level3\">\n<h3>Recovering the hidden signal</h3>\n<p>A final but very key question is whether we can successfully recover\nthe true hidden signal. The <code>trend</code> slot in the returned\nmodel parameters has the estimates for this signal, which we can easily\nplot using the <code>mvgam</code> S3 method for <code>plot</code>. We\ncan also overlay the true values for the hidden signal, which shows that\nour model has done a good job of recovering it:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod, </span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>     <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a>  ggplot2<span class=\"sc\">::</span><span class=\"fu\">geom_point</span>(<span class=\"at\">data =</span> <span class=\"fu\">data.frame</span>(<span class=\"at\">time =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">100</span>,</span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a>                                        <span class=\"at\">y =</span> true_signal),</span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a>                      <span class=\"at\">mapping =</span> ggplot2<span class=\"sc\">::</span><span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time,</span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a>                                             <span class=\"at\">y =</span> y))</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer a lot of useful material\nabout other types of State-Space models and how they can be applied in\npractice:</p>\n<p>Auger‐Méthé, Marie, et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470\">“A\nguide to state–space modeling of ecological time series.</a>”\n<em>Ecological Monographs</em> 91.4 (2021): e01470.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. “<a href=\"https://journal.r-project.org/articles/RJ-2012-002/\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata.</a>” <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Ward, Eric J., et al. “<a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x\">Inferring\nspatial structure from time‐series data: using multivariate state‐space\nmodels to detect metapopulation structure of California sea lions in the\nGulf of California, Mexico.</a>” <em>Journal of Applied Ecology</em>\n47.1 (2010): 47-56.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please reach out if you are\ninterested (n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "inst/doc/time_varying_effects.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nset.seed(1111)\nN <- 200\nbeta_temp <- mvgam:::sim_gp(rnorm(1), alpha_gp = 0.75, rho_gp = 10, h = N) + 0.5\n\n\n## ----fig.alt = \"Simulating time-varying effects in mvgam and R\"------------------\nplot(\n  beta_temp,\n  type = \"l\",\n  lwd = 3,\n  bty = \"l\",\n  xlab = \"Time\",\n  ylab = \"Coefficient\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n\n\n## --------------------------------------------------------------------------------\ntemp <- rnorm(N, sd = 1)\n\n\n## ----fig.alt = \"Simulating time-varying effects in mvgam and R\"------------------\nout <- rnorm(N, mean = 4 + beta_temp * temp, sd = 0.25)\ntime <- seq_along(temp)\nplot(\n  out,\n  type = \"l\",\n  lwd = 3,\n  bty = \"l\",\n  xlab = \"Time\",\n  ylab = \"Outcome\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n\n\n## --------------------------------------------------------------------------------\ndata <- data.frame(out, temp, time)\ndata_train <- data[1:190, ]\ndata_test <- data[191:200, ]\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod <- mvgam(\n  out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n#   family = gaussian(),\n#   data = data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n\n\n## --------------------------------------------------------------------------------\nrequire(marginaleffects)\nrange_round <- function(x) {\n  round(range(x, na.rm = TRUE), 2)\n}\nplot_predictions(\n  mod,\n  newdata = datagrid(\n    time = unique,\n    temp = range_round\n  ),\n  by = c(\"time\", \"temp\", \"temp\"),\n  type = \"link\"\n)\n\n\n## --------------------------------------------------------------------------------\nfc <- forecast(mod, newdata = data_test)\nplot(fc)\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod <- mvgam(\n  out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod <- mvgam(out ~ dynamic(temp, k = 40),\n#   family = gaussian(),\n#   data = data_train,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n\n\n## --------------------------------------------------------------------------------\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda\"))\ndplyr::glimpse(SalmonSurvCUI)\n\n\n## --------------------------------------------------------------------------------\nSalmonSurvCUI %>%\n  # create a time variable\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  # create a series variable\n  dplyr::mutate(series = as.factor(\"salmon\")) %>%\n  # z-score the covariate CUI.apr\n  dplyr::mutate(CUI.apr = as.vector(scale(CUI.apr))) %>%\n  # convert logit-transformed survival back to proportional\n  dplyr::mutate(survival = plogis(logit.s)) -> model_data\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(model_data)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(data = model_data, y = \"survival\")\n\n\n## ----include = FALSE-------------------------------------------------------------\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n\n\n## ----eval = FALSE----------------------------------------------------------------\n# mod0 <- mvgam(\n#   formula = survival ~ 1,\n#   trend_model = AR(),\n#   noncentred = TRUE,\n#   priors = prior(normal(-3.5, 0.5), class = Intercept),\n#   family = betar(),\n#   data = model_data,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod0)\n\n\n## --------------------------------------------------------------------------------\nplot(mod0, type = \"trend\")\n\n\n## ----include=FALSE---------------------------------------------------------------\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  control = list(adapt_delta = 0.99),\n  silent = 2\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# mod1 <- mvgam(\n#   formula = survival ~ 1,\n#   trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n#   trend_model = AR(),\n#   noncentred = TRUE,\n#   priors = prior(normal(-3.5, 0.5), class = Intercept),\n#   family = betar(),\n#   data = model_data,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(mod1, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot(mod1, type = \"trend\")\n\n\n## --------------------------------------------------------------------------------\nplot(mod1, type = \"forecast\")\n\n\n## --------------------------------------------------------------------------------\n# Extract estimates of the process error 'sigma' for each model\nmod0_sigma <- as.data.frame(mod0, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod0\")\nmod1_sigma <- as.data.frame(mod1, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod1\")\nsigmas <- rbind(mod0_sigma, mod1_sigma)\n\n# Plot using ggplot2\nrequire(ggplot2)\nggplot(sigmas, aes(y = `sigma[1]`, fill = model)) +\n  geom_density(alpha = 0.3, colour = NA) +\n  coord_flip()\n\n\n## --------------------------------------------------------------------------------\nplot(mod1, type = \"smooths\", trend_effects = TRUE)\n\n\n## --------------------------------------------------------------------------------\nloo_compare(mod0, mod1)\n\n\n## ----include=FALSE---------------------------------------------------------------\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# lfo_mod0 <- lfo_cv(mod0, min_t = 30)\n# lfo_mod1 <- lfo_cv(mod1, min_t = 30)\n\n## --------------------------------------------------------------------------------\nsum(lfo_mod0$elpds)\nsum(lfo_mod1$elpds)\n\n\n## ----fig.alt = \"Comparing forecast skill for dynamic beta regression models in mvgam and R\"----\nplot(\n  x = 1:length(lfo_mod0$elpds) + 30,\n  y = lfo_mod0$elpds - lfo_mod1$elpds,\n  ylab = \"ELPDmod0 - ELPDmod1\",\n  xlab = \"Evaluation time point\",\n  pch = 16,\n  col = \"darkred\",\n  bty = \"l\"\n)\nabline(h = 0, lty = \"dashed\")\n"
  },
  {
    "path": "inst/doc/time_varying_effects.Rmd",
    "content": "---\ntitle: \"Time-varying effects in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Time-varying effects in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to estimate and forecast regression coefficients that vary through time.\n\n## Time-varying effects\nDynamic fixed-effect coefficients (often referred to as dynamic linear models) can be readily incorporated into GAMs / DGAMs. In `mvgam`, the `dynamic()` formula wrapper offers a convenient interface to set these up. The plan is to incorporate a range of dynamic options (such as random walk, AR1 etc...) but for the moment only low-rank Gaussian Process (GP) smooths are allowed (making use either of the `gp` basis in `mgcv` of of Hilbert space approximate GPs). These are advantageous over splines or random walk effects for several reasons. First, GPs will force the time-varying effect to be smooth. This often makes sense in reality, where we would not expect a regression coefficient to change rapidly from one time point to the next. Second, GPs provide information on the 'global' dynamics of a time-varying effect through their length-scale parameters. This means we can use them to provide accurate forecasts of how an effect is expected to change in the future, something that we couldn't do well if we used splines to estimate the effect. An example below illustrates.\n\n### Simulating time-varying effects\nSimulate a time-varying coefficient using a squared exponential Gaussian Process function with length scale $\\rho$=10. We will do this using an internal function from `mvgam` (the `sim_gp` function):\n```{r}\nset.seed(1111)\nN <- 200\nbeta_temp <- mvgam:::sim_gp(rnorm(1),\n  alpha_gp = 0.75,\n  rho_gp = 10,\n  h = N\n) + 0.5\n```\n\nA plot of the time-varying coefficient shows that it changes smoothly through time:\n```{r, fig.alt = \"Simulating time-varying effects in mvgam and R\"}\nplot(beta_temp,\n  type = \"l\", lwd = 3,\n  bty = \"l\", xlab = \"Time\", ylab = \"Coefficient\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n```\n\nNext we need to simulate the values of the covariate, which we will call `temp` (to represent $temperature$). In this case we just use a standard normal distribution to simulate this covariate:\n```{r}\ntemp <- rnorm(N, sd = 1)\n```\n\nFinally, simulate the outcome variable, which is a Gaussian observation process (with observation error) over the time-varying effect of $temperature$\n```{r, fig.alt = \"Simulating time-varying effects in mvgam and R\"}\nout <- rnorm(N,\n  mean = 4 + beta_temp * temp,\n  sd = 0.25\n)\ntime <- seq_along(temp)\nplot(out,\n  type = \"l\", lwd = 3,\n  bty = \"l\", xlab = \"Time\", ylab = \"Outcome\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n```\n\nGather the data into a `data.frame` for fitting models, and split the data into training and testing folds.\n```{r}\ndata <- data.frame(out, temp, time)\ndata_train <- data[1:190, ]\ndata_test <- data[191:200, ]\n```\n\n### The `dynamic()` function\nTime-varying coefficients can be fairly easily set up using the `s()` or `gp()` wrapper functions in `mvgam` formulae by fitting a nonlinear effect of `time` and using the covariate of interest as the numeric `by` variable (see `?mgcv::s` or `?brms::gp` for more details). The `dynamic()` formula wrapper offers a way to automate this process, and will eventually allow for a broader variety of time-varying effects (such as random walk or AR processes). Depending on the arguments that are specified to `dynamic`, it will either set up a low-rank GP smooth function using `s()` with `bs = 'gp'` and a fixed value of the length scale parameter $\\rho$, or it will set up a Hilbert space approximate GP using the `gp()` function with `c=5/4` so that $\\rho$ is estimated (see `?dynamic` for more details). In this first example we will use the `s()` option, and will mis-specify the $\\rho$ parameter here as, in practice, it is never known. This call to `dynamic()` will set up the following smooth: `s(time, by = temp, bs = \"gp\", m = c(-2, 8, 2), k = 40)`\n```{r, include=FALSE}\nmod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\n```{r, eval=FALSE}\nmod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\nInspect the model summary, which shows how the `dynamic()` wrapper was used to construct a low-rank Gaussian Process smooth function:\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nBecause this model used a spline with a `gp` basis, it's smooths can be visualised just like any other `gam`. We can plot the estimates for the in-sample and out-of-sample periods to see how the Gaussian Process function produces sensible smooth forecasts. Here we supply the full dataset to the `newdata` argument in `plot_mvgam_smooth()` to inspect posterior forecasts of the time-varying smooth function. Overlay the true simulated function to see that the model has adequately estimated it's dynamics in both the training and testing data partitions\n```{r}\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n```\n\nWe can also use `plot_predictions()` from the `marginaleffects` package to visualise the time-varying coefficient for what the effect would be estimated to be at different values of $temperature$:\n```{r}\nrequire(marginaleffects)\nrange_round <- function(x) {\n  round(range(x, na.rm = TRUE), 2)\n}\nplot_predictions(mod,\n  newdata = datagrid(\n    time = unique,\n    temp = range_round\n  ),\n  by = c(\"time\", \"temp\", \"temp\"),\n  type = \"link\"\n)\n```\n\nThis results in sensible forecasts of the observations as well\n```{r}\nfc <- forecast(mod, newdata = data_test)\nplot(fc)\n```\n\nThe syntax is very similar if we wish to estimate the parameters of the underlying Gaussian Process, this time using a Hilbert space approximation. We simply omit the `rho` argument in `dynamic()` to make this happen. This will set up a call similar to `gp(time, by = 'temp', c = 5/4, k = 40)`.\n```{r include=FALSE}\nmod <- mvgam(out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\nThis model summary now contains estimates for the marginal deviation and length scale parameters of the underlying Gaussian Process function:\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nEffects for `gp()` terms can also be plotted as smooths:\n```{r}\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n```\n\n## Salmon survival example\nHere we will use openly available data on marine survival of Chinook salmon to illustrate how time-varying effects can be used to improve ecological time series models. [Scheuerell and Williams (2005)](https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1365-2419.2005.00346.x) used a dynamic linear model to examine the relationship between marine survival of Chinook salmon and an index of ocean upwelling strength along the west coast of the USA. The authors hypothesized that stronger upwelling in April should create better growing conditions for phytoplankton, which would then translate into more zooplankton and provide better foraging opportunities for juvenile salmon entering the ocean. The data on survival is measured as a proportional variable over 42 years (1964–2005) and is available in the `MARSS` package:\n```{r}\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda\"))\ndplyr::glimpse(SalmonSurvCUI)\n```\n\nFirst we need to prepare the data for modelling. The variable `CUI.apr` will be standardized to make it easier for the sampler to estimate underlying GP parameters for the time-varying effect. We also need to convert the survival back to a proportion, as in its current form it has been logit-transformed (this is because most time series packages cannot handle proportional data). As usual, we also need to create a `time` indicator and a `series` indicator for working in `mvgam`:\n```{r}\nSalmonSurvCUI %>%\n  # create a time variable\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  # create a series variable\n  dplyr::mutate(series = as.factor(\"salmon\")) %>%\n  # z-score the covariate CUI.apr\n  dplyr::mutate(CUI.apr = as.vector(scale(CUI.apr))) %>%\n  # convert logit-transformed survival back to proportional\n  dplyr::mutate(survival = plogis(logit.s)) -> model_data\n```\n\nInspect the data\n```{r}\ndplyr::glimpse(model_data)\n```\n\nPlot features of the outcome variable, which shows that it is a proportional variable with particular restrictions that we want to model:\n```{r}\nplot_mvgam_series(data = model_data, y = \"survival\")\n```\n\n\n### A State-Space Beta regression\n`mvgam` can easily handle data that are bounded at 0 and 1 with a Beta observation model (using the `mgcv` function `betar()`, see `?mgcv::betar` for details).  First we will fit a simple State-Space model that uses an AR1 dynamic process model with no predictors and a Beta observation model:\n```{r include = FALSE}\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\n```{r eval = FALSE}\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\nThe summary of this model shows good behaviour of the Hamiltonian Monte Carlo sampler and provides useful summaries on the Beta observation model parameters:\n```{r}\nsummary(mod0)\n```\n\nA plot of the underlying dynamic component shows how it has easily handled the temporal evolution of the time series:\n```{r}\nplot(mod0, type = \"trend\")\n```\n\n### Including time-varying upwelling effects\nNow we can increase the complexity of our model by constructing and fitting a State-Space model with a time-varying effect of the coastal upwelling index in addition to the autoregressive dynamics. We again use a Beta observation model to capture the restrictions of our proportional observations, but this time will include a `dynamic()` effect of `CUI.apr` in the latent process model. We do not specify the $\\rho$ parameter, instead opting to estimate it using a Hilbert space approximate GP:\n```{r include=FALSE}\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  control = list(adapt_delta = 0.99),\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\nThe summary for this model now includes estimates for the time-varying GP parameters:\n```{r}\nsummary(mod1, include_betas = FALSE)\n```\n\nThe estimates for the underlying dynamic process, and for the hindcasts, haven't changed much:\n```{r}\nplot(mod1, type = \"trend\")\n```\n\n```{r}\nplot(mod1, type = \"forecast\")\n```\n\nBut the process error parameter $\\sigma$ is slightly smaller for this model than for the first model:\n```{r}\n# Extract estimates of the process error 'sigma' for each model\nmod0_sigma <- as.data.frame(mod0, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod0\")\nmod1_sigma <- as.data.frame(mod1, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod1\")\nsigmas <- rbind(mod0_sigma, mod1_sigma)\n\n# Plot using ggplot2\nrequire(ggplot2)\nggplot(sigmas, aes(y = `sigma[1]`, fill = model)) +\n  geom_density(alpha = 0.3, colour = NA) +\n  coord_flip()\n```\n\nWhy does the process error not need to be as flexible in the second model? Because the estimates of this dynamic process are now informed partly by the time-varying effect of upwelling, which we can visualise on the link scale using `plot()`:\n```{r}\nplot(mod1, type = \"smooths\", trend_effects = TRUE)\n```\n\n### Comparing model predictive performances\nA key question when fitting multiple time series models is whether one of them provides better predictions than the other. There are several options in `mvgam` for exploring this quantitatively. First, we can compare models based on in-sample approximate leave-one-out cross-validation as implemented in the popular `loo` package:\n```{r}\nloo_compare(mod0, mod1)\n```\n\nThe second model has the larger Expected Log Predictive Density (ELPD), meaning that it is slightly favoured over the simpler model that did not include the time-varying upwelling effect. However, the two models certainly do not differ by much. But this metric only compares in-sample performance, and we are hoping to use our models to produce reasonable forecasts. Luckily, `mvgam` also has routines for comparing models using approximate leave-future-out cross-validation. Here we refit both models to a reduced training set (starting at time point 30) and produce approximate 1-step ahead forecasts. These forecasts are used to estimate forecast ELPD before expanding the training set one time point at a time. We use Pareto-smoothed importance sampling to reweight posterior predictions, acting as a kind of particle filter so that we don't need to refit the model too often (you can read more about how this process works in Bürkner et al. 2020).\n```{r include=FALSE}\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n```\n\n```{r eval=FALSE}\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n```\n\nThe model with the time-varying upwelling effect tends to provides better 1-step ahead forecasts, with a higher total forecast ELPD\n```{r}\nsum(lfo_mod0$elpds)\nsum(lfo_mod1$elpds)\n```\n\nWe can also plot the ELPDs for each model as a contrast. Here, values less than zero suggest the time-varying predictor model (Mod1) gives better 1-step ahead forecasts:\n```{r, fig.alt = \"Comparing forecast skill for dynamic beta regression models in mvgam and R\"}\nplot(\n  x = 1:length(lfo_mod0$elpds) + 30,\n  y = lfo_mod0$elpds - lfo_mod1$elpds,\n  ylab = \"ELPDmod0 - ELPDmod1\",\n  xlab = \"Evaluation time point\",\n  pch = 16,\n  col = \"darkred\",\n  bty = \"l\"\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nA useful exercise to further expand this model would be to think about what kinds of predictors might impact measurement error, which could easily be implemented into the observation formula in `mvgam()`. But for now, we will leave the model as-is.\n\n## Further reading\nThe following papers and resources offer a lot of useful material about dynamic linear models and how they can be applied / evaluated in practice:\n\nBürkner, PC, Gabry, J and Vehtari, A [Approximate leave-future-out cross-validation for Bayesian time series models](https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262). *Journal of Statistical Computation and Simulation*. 90:14 (2020) 2499-2523.\n  \nHerrero, Asier, et al. [From the individual to the landscape and back: time‐varying effects of climate and herbivory on tree sapling growth at distribution limits](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/1365-2745.12527). *Journal of Ecology* 104.2 (2016): 430-442.\n    \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. \"[MARSS: multivariate autoregressive state-space models for analyzing time-series data.](https://journal.r-project.org/articles/RJ-2012-002/)\" *R Journal*. 4.1 (2012): 11.\n  \nScheuerell, Mark D., and John G. Williams. [Forecasting climate induced changes in the survival of Snake River Spring/Summer Chinook Salmon (*Oncorhynchus Tshawytscha*)](https://onlinelibrary.wiley.com/doi/10.1111/j.1365-2419.2005.00346.x) *Fisheries Oceanography*  14 (2005): 448–57.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "inst/doc/time_varying_effects.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>Time-varying effects in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">Time-varying effects in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#time-varying-effects\" id=\"toc-time-varying-effects\">Time-varying effects</a>\n<ul>\n<li><a href=\"#simulating-time-varying-effects\" id=\"toc-simulating-time-varying-effects\">Simulating time-varying\neffects</a></li>\n<li><a href=\"#the-dynamic-function\" id=\"toc-the-dynamic-function\">The\n<code>dynamic()</code> function</a></li>\n</ul></li>\n<li><a href=\"#salmon-survival-example\" id=\"toc-salmon-survival-example\">Salmon survival example</a>\n<ul>\n<li><a href=\"#a-state-space-beta-regression\" id=\"toc-a-state-space-beta-regression\">A State-Space Beta\nregression</a></li>\n<li><a href=\"#including-time-varying-upwelling-effects\" id=\"toc-including-time-varying-upwelling-effects\">Including time-varying\nupwelling effects</a></li>\n<li><a href=\"#comparing-model-predictive-performances\" id=\"toc-comparing-model-predictive-performances\">Comparing model\npredictive performances</a></li>\n</ul></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to estimate and forecast regression coefficients\nthat vary through time.</p>\n<div id=\"time-varying-effects\" class=\"section level2\">\n<h2>Time-varying effects</h2>\n<p>Dynamic fixed-effect coefficients (often referred to as dynamic\nlinear models) can be readily incorporated into GAMs / DGAMs. In\n<code>mvgam</code>, the <code>dynamic()</code> formula wrapper offers a\nconvenient interface to set these up. The plan is to incorporate a range\nof dynamic options (such as random walk, AR1 etc…) but for the moment\nonly low-rank Gaussian Process (GP) smooths are allowed (making use\neither of the <code>gp</code> basis in <code>mgcv</code> of of Hilbert\nspace approximate GPs). These are advantageous over splines or random\nwalk effects for several reasons. First, GPs will force the time-varying\neffect to be smooth. This often makes sense in reality, where we would\nnot expect a regression coefficient to change rapidly from one time\npoint to the next. Second, GPs provide information on the ‘global’\ndynamics of a time-varying effect through their length-scale parameters.\nThis means we can use them to provide accurate forecasts of how an\neffect is expected to change in the future, something that we couldn’t\ndo well if we used splines to estimate the effect. An example below\nillustrates.</p>\n<div id=\"simulating-time-varying-effects\" class=\"section level3\">\n<h3>Simulating time-varying effects</h3>\n<p>Simulate a time-varying coefficient using a squared exponential\nGaussian Process function with length scale <span class=\"math inline\">\\(\\rho\\)</span>=10. We will do this using an\ninternal function from <code>mvgam</code> (the <code>sim_gp</code>\nfunction):</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">set.seed</span>(<span class=\"dv\">1111</span>)</span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>N <span class=\"ot\">&lt;-</span> <span class=\"dv\">200</span></span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a>beta_temp <span class=\"ot\">&lt;-</span> mvgam<span class=\"sc\">:::</span><span class=\"fu\">sim_gp</span>(<span class=\"fu\">rnorm</span>(<span class=\"dv\">1</span>),</span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a>  <span class=\"at\">alpha_gp =</span> <span class=\"fl\">0.75</span>,</span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>  <span class=\"at\">rho_gp =</span> <span class=\"dv\">10</span>,</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a>  <span class=\"at\">h =</span> N</span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a>) <span class=\"sc\">+</span> <span class=\"fl\">0.5</span></span></code></pre></div>\n<p>A plot of the time-varying coefficient shows that it changes smoothly\nthrough time:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(beta_temp,</span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">3</span>,</span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Time&quot;</span>, <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Coefficient&quot;</span>,</span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span></span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" tabindex=\"-1\"></a><span class=\"fu\">box</span>(<span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Simulating time-varying effects in mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Simulating time-varying effects in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Next we need to simulate the values of the covariate, which we will\ncall <code>temp</code> (to represent <span class=\"math inline\">\\(temperature\\)</span>). In this case we just use a\nstandard normal distribution to simulate this covariate:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a>temp <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(N, <span class=\"at\">sd =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p>Finally, simulate the outcome variable, which is a Gaussian\nobservation process (with observation error) over the time-varying\neffect of <span class=\"math inline\">\\(temperature\\)</span></p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a>out <span class=\"ot\">&lt;-</span> <span class=\"fu\">rnorm</span>(N,</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a>  <span class=\"at\">mean =</span> <span class=\"dv\">4</span> <span class=\"sc\">+</span> beta_temp <span class=\"sc\">*</span> temp,</span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a>  <span class=\"at\">sd =</span> <span class=\"fl\">0.25</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a>time <span class=\"ot\">&lt;-</span> <span class=\"fu\">seq_along</span>(temp)</span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(out,</span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">3</span>,</span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Time&quot;</span>, <span class=\"at\">ylab =</span> <span class=\"st\">&quot;Outcome&quot;</span>,</span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb4-11\"><a href=\"#cb4-11\" tabindex=\"-1\"></a><span class=\"fu\">box</span>(<span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Simulating time-varying effects in mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Simulating time-varying effects in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Gather the data into a <code>data.frame</code> for fitting models,\nand split the data into training and testing folds.</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>data <span class=\"ot\">&lt;-</span> <span class=\"fu\">data.frame</span>(out, temp, time)</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a>data_train <span class=\"ot\">&lt;-</span> data[<span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"dv\">190</span>, ]</span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a>data_test <span class=\"ot\">&lt;-</span> data[<span class=\"dv\">191</span><span class=\"sc\">:</span><span class=\"dv\">200</span>, ]</span></code></pre></div>\n</div>\n<div id=\"the-dynamic-function\" class=\"section level3\">\n<h3>The <code>dynamic()</code> function</h3>\n<p>Time-varying coefficients can be fairly easily set up using the\n<code>s()</code> or <code>gp()</code> wrapper functions in\n<code>mvgam</code> formulae by fitting a nonlinear effect of\n<code>time</code> and using the covariate of interest as the numeric\n<code>by</code> variable (see <code>?mgcv::s</code> or\n<code>?brms::gp</code> for more details). The <code>dynamic()</code>\nformula wrapper offers a way to automate this process, and will\neventually allow for a broader variety of time-varying effects (such as\nrandom walk or AR processes). Depending on the arguments that are\nspecified to <code>dynamic</code>, it will either set up a low-rank GP\nsmooth function using <code>s()</code> with <code>bs = &#39;gp&#39;</code> and a\nfixed value of the length scale parameter <span class=\"math inline\">\\(\\rho\\)</span>, or it will set up a Hilbert space\napproximate GP using the <code>gp()</code> function with\n<code>c=5/4</code> so that <span class=\"math inline\">\\(\\rho\\)</span> is\nestimated (see <code>?dynamic</code> for more details). In this first\nexample we will use the <code>s()</code> option, and will mis-specify\nthe <span class=\"math inline\">\\(\\rho\\)</span> parameter here as, in\npractice, it is never known. This call to <code>dynamic()</code> will\nset up the following smooth:\n<code>s(time, by = temp, bs = &quot;gp&quot;, m = c(-2, 8, 2), k = 40)</code></p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(out <span class=\"sc\">~</span> <span class=\"fu\">dynamic</span>(temp, <span class=\"at\">rho =</span> <span class=\"dv\">8</span>, <span class=\"at\">stationary =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">k =</span> <span class=\"dv\">40</span>),</span>\n<span id=\"cb6-2\"><a href=\"#cb6-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb6-3\"><a href=\"#cb6-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb6-4\"><a href=\"#cb6-4\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb6-5\"><a href=\"#cb6-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Inspect the model summary, which shows how the <code>dynamic()</code>\nwrapper was used to construct a low-rank Gaussian Process smooth\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; out ~ s(time, by = temp, bs = &quot;gp&quot;, m = c(-2, 8, 2), k = 40)</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb7-16\"><a href=\"#cb7-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb7-17\"><a href=\"#cb7-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-18\"><a href=\"#cb7-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb7-19\"><a href=\"#cb7-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 190 </span></span>\n<span id=\"cb7-20\"><a href=\"#cb7-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-21\"><a href=\"#cb7-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb7-22\"><a href=\"#cb7-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb7-23\"><a href=\"#cb7-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb7-24\"><a href=\"#cb7-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb7-25\"><a href=\"#cb7-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-26\"><a href=\"#cb7-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb7-27\"><a href=\"#cb7-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-28\"><a href=\"#cb7-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1] 0.23 0.25  0.28    1  2113</span></span>\n<span id=\"cb7-29\"><a href=\"#cb7-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-30\"><a href=\"#cb7-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb7-31\"><a href=\"#cb7-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb7-32\"><a href=\"#cb7-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    4   4   4.1    1  3264</span></span>\n<span id=\"cb7-33\"><a href=\"#cb7-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-34\"><a href=\"#cb7-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM smooths:</span></span>\n<span id=\"cb7-35\"><a href=\"#cb7-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                edf Ref.df Chi.sq p-value    </span></span>\n<span id=\"cb7-36\"><a href=\"#cb7-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; s(time):temp 16.35     40  168.2  &lt;2e-16 ***</span></span>\n<span id=\"cb7-37\"><a href=\"#cb7-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ---</span></span>\n<span id=\"cb7-38\"><a href=\"#cb7-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Signif. codes:  0 &#39;***&#39; 0.001 &#39;**&#39; 0.01 &#39;*&#39; 0.05 &#39;.&#39; 0.1 &#39; &#39; 1</span></span>\n<span id=\"cb7-39\"><a href=\"#cb7-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-40\"><a href=\"#cb7-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb7-41\"><a href=\"#cb7-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb7-42\"><a href=\"#cb7-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb7-43\"><a href=\"#cb7-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb7-44\"><a href=\"#cb7-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb7-45\"><a href=\"#cb7-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-46\"><a href=\"#cb7-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb7-47\"><a href=\"#cb7-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb7-48\"><a href=\"#cb7-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb7-49\"><a href=\"#cb7-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb7-50\"><a href=\"#cb7-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Because this model used a spline with a <code>gp</code> basis, it’s\nsmooths can be visualised just like any other <code>gam</code>. We can\nplot the estimates for the in-sample and out-of-sample periods to see\nhow the Gaussian Process function produces sensible smooth forecasts.\nHere we supply the full dataset to the <code>newdata</code> argument in\n<code>plot_mvgam_smooth()</code> to inspect posterior forecasts of the\ntime-varying smooth function. Overlay the true simulated function to see\nthat the model has adequately estimated it’s dynamics in both the\ntraining and testing data partitions</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(mod, <span class=\"at\">smooth =</span> <span class=\"dv\">1</span>, <span class=\"at\">newdata =</span> data)</span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"dv\">190</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"fl\">2.5</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>)</span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We can also use <code>plot_predictions()</code> from the\n<code>marginaleffects</code> package to visualise the time-varying\ncoefficient for what the effect would be estimated to be at different\nvalues of <span class=\"math inline\">\\(temperature\\)</span>:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a><span class=\"fu\">require</span>(marginaleffects)</span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a>range_round <span class=\"ot\">&lt;-</span> <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a>  <span class=\"fu\">round</span>(<span class=\"fu\">range</span>(x, <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>), <span class=\"dv\">2</span>)</span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a>}</span>\n<span id=\"cb9-5\"><a href=\"#cb9-5\" tabindex=\"-1\"></a><span class=\"fu\">plot_predictions</span>(mod,</span>\n<span id=\"cb9-6\"><a href=\"#cb9-6\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> <span class=\"fu\">datagrid</span>(</span>\n<span id=\"cb9-7\"><a href=\"#cb9-7\" tabindex=\"-1\"></a>    <span class=\"at\">time =</span> unique,</span>\n<span id=\"cb9-8\"><a href=\"#cb9-8\" tabindex=\"-1\"></a>    <span class=\"at\">temp =</span> range_round</span>\n<span id=\"cb9-9\"><a href=\"#cb9-9\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb9-10\"><a href=\"#cb9-10\" tabindex=\"-1\"></a>  <span class=\"at\">by =</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;time&quot;</span>, <span class=\"st\">&quot;temp&quot;</span>, <span class=\"st\">&quot;temp&quot;</span>),</span>\n<span id=\"cb9-11\"><a href=\"#cb9-11\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&quot;link&quot;</span></span>\n<span id=\"cb9-12\"><a href=\"#cb9-12\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This results in sensible forecasts of the observations as well</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>fc <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(mod, <span class=\"at\">newdata =</span> data_test)</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fc)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The syntax is very similar if we wish to estimate the parameters of\nthe underlying Gaussian Process, this time using a Hilbert space\napproximation. We simply omit the <code>rho</code> argument in\n<code>dynamic()</code> to make this happen. This will set up a call\nsimilar to <code>gp(time, by = &#39;temp&#39;, c = 5/4, k = 40)</code>.</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a>mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(out <span class=\"sc\">~</span> <span class=\"fu\">dynamic</span>(temp, <span class=\"at\">k =</span> <span class=\"dv\">40</span>),</span>\n<span id=\"cb11-2\"><a href=\"#cb11-2\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb11-3\"><a href=\"#cb11-3\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> data_train,</span>\n<span id=\"cb11-4\"><a href=\"#cb11-4\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb11-5\"><a href=\"#cb11-5\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>This model summary now contains estimates for the marginal deviation\nand length scale parameters of the underlying Gaussian Process\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb12-2\"><a href=\"#cb12-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb12-3\"><a href=\"#cb12-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; out ~ gp(time, by = temp, c = 5/4, k = 40, scale = TRUE)</span></span>\n<span id=\"cb12-4\"><a href=\"#cb12-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb12-5\"><a href=\"#cb12-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-6\"><a href=\"#cb12-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb12-7\"><a href=\"#cb12-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb12-8\"><a href=\"#cb12-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-9\"><a href=\"#cb12-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb12-10\"><a href=\"#cb12-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb12-11\"><a href=\"#cb12-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-12\"><a href=\"#cb12-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb12-13\"><a href=\"#cb12-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; None</span></span>\n<span id=\"cb12-14\"><a href=\"#cb12-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-15\"><a href=\"#cb12-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb12-16\"><a href=\"#cb12-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb12-17\"><a href=\"#cb12-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-18\"><a href=\"#cb12-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb12-19\"><a href=\"#cb12-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 190 </span></span>\n<span id=\"cb12-20\"><a href=\"#cb12-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-21\"><a href=\"#cb12-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb12-22\"><a href=\"#cb12-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb12-23\"><a href=\"#cb12-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb12-24\"><a href=\"#cb12-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb12-25\"><a href=\"#cb12-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-26\"><a href=\"#cb12-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb12-27\"><a href=\"#cb12-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb12-28\"><a href=\"#cb12-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1] 0.24 0.26  0.29    1  2547</span></span>\n<span id=\"cb12-29\"><a href=\"#cb12-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-30\"><a href=\"#cb12-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb12-31\"><a href=\"#cb12-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb12-32\"><a href=\"#cb12-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    4   4   4.1    1  2704</span></span>\n<span id=\"cb12-33\"><a href=\"#cb12-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-34\"><a href=\"#cb12-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM gp term marginal deviation (alpha) and length scale (rho) estimates:</span></span>\n<span id=\"cb12-35\"><a href=\"#cb12-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                      2.5%   50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb12-36\"><a href=\"#cb12-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; alpha_gp(time):temp 0.630 0.880 1.400    1   734</span></span>\n<span id=\"cb12-37\"><a href=\"#cb12-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; rho_gp(time):temp   0.024 0.051 0.068    1   611</span></span>\n<span id=\"cb12-38\"><a href=\"#cb12-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-39\"><a href=\"#cb12-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb12-40\"><a href=\"#cb12-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb12-41\"><a href=\"#cb12-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb12-42\"><a href=\"#cb12-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb12-43\"><a href=\"#cb12-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb12-44\"><a href=\"#cb12-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-45\"><a href=\"#cb12-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb12-46\"><a href=\"#cb12-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb12-47\"><a href=\"#cb12-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb12-48\"><a href=\"#cb12-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb12-49\"><a href=\"#cb12-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>Effects for <code>gp()</code> terms can also be plotted as\nsmooths:</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(mod, <span class=\"at\">smooth =</span> <span class=\"dv\">1</span>, <span class=\"at\">newdata =</span> data)</span>\n<span id=\"cb13-2\"><a href=\"#cb13-2\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">v =</span> <span class=\"dv\">190</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span>\n<span id=\"cb13-3\"><a href=\"#cb13-3\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"fl\">2.5</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>)</span>\n<span id=\"cb13-4\"><a href=\"#cb13-4\" tabindex=\"-1\"></a><span class=\"fu\">lines</span>(beta_temp, <span class=\"at\">lwd =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n</div>\n<div id=\"salmon-survival-example\" class=\"section level2\">\n<h2>Salmon survival example</h2>\n<p>Here we will use openly available data on marine survival of Chinook\nsalmon to illustrate how time-varying effects can be used to improve\necological time series models. <a href=\"https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1365-2419.2005.00346.x\">Scheuerell\nand Williams (2005)</a> used a dynamic linear model to examine the\nrelationship between marine survival of Chinook salmon and an index of\nocean upwelling strength along the west coast of the USA. The authors\nhypothesized that stronger upwelling in April should create better\ngrowing conditions for phytoplankton, which would then translate into\nmore zooplankton and provide better foraging opportunities for juvenile\nsalmon entering the ocean. The data on survival is measured as a\nproportional variable over 42 years (1964–2005) and is available in the\n<code>MARSS</code> package:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">load</span>(<span class=\"fu\">url</span>(<span class=\"st\">&quot;https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda&quot;</span>))</span>\n<span id=\"cb14-2\"><a href=\"#cb14-2\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(SalmonSurvCUI)</span>\n<span id=\"cb14-3\"><a href=\"#cb14-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 42</span></span>\n<span id=\"cb14-4\"><a href=\"#cb14-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 3</span></span>\n<span id=\"cb14-5\"><a href=\"#cb14-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year    &lt;int&gt; 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 19…</span></span>\n<span id=\"cb14-6\"><a href=\"#cb14-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ logit.s &lt;dbl&gt; -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82,…</span></span>\n<span id=\"cb14-7\"><a href=\"#cb14-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ CUI.apr &lt;int&gt; 57, 5, 43, 11, 47, -21, 25, -2, -1, 43, 2, 35, 0, 1, -1, 6, -7…</span></span></code></pre></div>\n<p>First we need to prepare the data for modelling. The variable\n<code>CUI.apr</code> will be standardized to make it easier for the\nsampler to estimate underlying GP parameters for the time-varying\neffect. We also need to convert the survival back to a proportion, as in\nits current form it has been logit-transformed (this is because most\ntime series packages cannot handle proportional data). As usual, we also\nneed to create a <code>time</code> indicator and a <code>series</code>\nindicator for working in <code>mvgam</code>:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a>SalmonSurvCUI <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-2\"><a href=\"#cb15-2\" tabindex=\"-1\"></a>  <span class=\"co\"># create a time variable</span></span>\n<span id=\"cb15-3\"><a href=\"#cb15-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">time =</span> dplyr<span class=\"sc\">::</span><span class=\"fu\">row_number</span>()) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-4\"><a href=\"#cb15-4\" tabindex=\"-1\"></a>  <span class=\"co\"># create a series variable</span></span>\n<span id=\"cb15-5\"><a href=\"#cb15-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">as.factor</span>(<span class=\"st\">&quot;salmon&quot;</span>)) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-6\"><a href=\"#cb15-6\" tabindex=\"-1\"></a>  <span class=\"co\"># z-score the covariate CUI.apr</span></span>\n<span id=\"cb15-7\"><a href=\"#cb15-7\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">CUI.apr =</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(CUI.apr))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb15-8\"><a href=\"#cb15-8\" tabindex=\"-1\"></a>  <span class=\"co\"># convert logit-transformed survival back to proportional</span></span>\n<span id=\"cb15-9\"><a href=\"#cb15-9\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">survival =</span> <span class=\"fu\">plogis</span>(logit.s)) <span class=\"ot\">-&gt;</span> model_data</span></code></pre></div>\n<p>Inspect the data</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(model_data)</span>\n<span id=\"cb16-2\"><a href=\"#cb16-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 42</span></span>\n<span id=\"cb16-3\"><a href=\"#cb16-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 6</span></span>\n<span id=\"cb16-4\"><a href=\"#cb16-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year     &lt;int&gt; 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1…</span></span>\n<span id=\"cb16-5\"><a href=\"#cb16-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ logit.s  &lt;dbl&gt; -3.46, -3.32, -3.58, -3.03, -3.61, -3.35, -3.93, -4.19, -4.82…</span></span>\n<span id=\"cb16-6\"><a href=\"#cb16-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ CUI.apr  &lt;dbl&gt; 2.37949804, 0.03330223, 1.74782994, 0.30401713, 1.92830654, -…</span></span>\n<span id=\"cb16-7\"><a href=\"#cb16-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time     &lt;int&gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18…</span></span>\n<span id=\"cb16-8\"><a href=\"#cb16-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series   &lt;fct&gt; salmon, salmon, salmon, salmon, salmon, salmon, salmon, salmo…</span></span>\n<span id=\"cb16-9\"><a href=\"#cb16-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ survival &lt;dbl&gt; 0.030472033, 0.034891409, 0.027119717, 0.046088827, 0.0263393…</span></span></code></pre></div>\n<p>Plot features of the outcome variable, which shows that it is a\nproportional variable with particular restrictions that we want to\nmodel:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(<span class=\"at\">data =</span> model_data, <span class=\"at\">y =</span> <span class=\"st\">&quot;survival&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div id=\"a-state-space-beta-regression\" class=\"section level3\">\n<h3>A State-Space Beta regression</h3>\n<p><code>mvgam</code> can easily handle data that are bounded at 0 and 1\nwith a Beta observation model (using the <code>mgcv</code> function\n<code>betar()</code>, see <code>?mgcv::betar</code> for details). First\nwe will fit a simple State-Space model that uses an AR1 dynamic process\nmodel with no predictors and a Beta observation model:</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a>mod0 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb18-2\"><a href=\"#cb18-2\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> survival <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb18-3\"><a href=\"#cb18-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb18-4\"><a href=\"#cb18-4\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb18-5\"><a href=\"#cb18-5\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"sc\">-</span><span class=\"fl\">3.5</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> Intercept),</span>\n<span id=\"cb18-6\"><a href=\"#cb18-6\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb18-7\"><a href=\"#cb18-7\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data,</span>\n<span id=\"cb18-8\"><a href=\"#cb18-8\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb18-9\"><a href=\"#cb18-9\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary of this model shows good behaviour of the Hamiltonian\nMonte Carlo sampler and provides useful summaries on the Beta\nobservation model parameters:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod0)</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM formula:</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; survival ~ 1</span></span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; beta</span></span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; logit</span></span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb19-14\"><a href=\"#cb19-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-15\"><a href=\"#cb19-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb19-16\"><a href=\"#cb19-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb19-17\"><a href=\"#cb19-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-18\"><a href=\"#cb19-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb19-19\"><a href=\"#cb19-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 42 </span></span>\n<span id=\"cb19-20\"><a href=\"#cb19-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-21\"><a href=\"#cb19-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb19-22\"><a href=\"#cb19-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb19-23\"><a href=\"#cb19-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb19-24\"><a href=\"#cb19-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb19-25\"><a href=\"#cb19-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-26\"><a href=\"#cb19-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation precision parameter estimates:</span></span>\n<span id=\"cb19-27\"><a href=\"#cb19-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-28\"><a href=\"#cb19-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; phi[1]   82 220   560 1.01   173</span></span>\n<span id=\"cb19-29\"><a href=\"#cb19-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-30\"><a href=\"#cb19-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM coefficient (beta) estimates:</span></span>\n<span id=\"cb19-31\"><a href=\"#cb19-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-32\"><a href=\"#cb19-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept) -4.6 -4.3    -4    1   524</span></span>\n<span id=\"cb19-33\"><a href=\"#cb19-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-34\"><a href=\"#cb19-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb19-35\"><a href=\"#cb19-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-36\"><a href=\"#cb19-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.11 0.4  0.65 1.01   160</span></span>\n<span id=\"cb19-37\"><a href=\"#cb19-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-38\"><a href=\"#cb19-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; precision parameter:</span></span>\n<span id=\"cb19-39\"><a href=\"#cb19-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-40\"><a href=\"#cb19-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; tau[1]  2.4 6.4    77 1.01   273</span></span>\n<span id=\"cb19-41\"><a href=\"#cb19-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-42\"><a href=\"#cb19-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb19-43\"><a href=\"#cb19-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;         2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb19-44\"><a href=\"#cb19-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] -0.32 0.68  0.98 1.01   310</span></span>\n<span id=\"cb19-45\"><a href=\"#cb19-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-46\"><a href=\"#cb19-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb19-47\"><a href=\"#cb19-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb19-48\"><a href=\"#cb19-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb19-49\"><a href=\"#cb19-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb19-50\"><a href=\"#cb19-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb19-51\"><a href=\"#cb19-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-52\"><a href=\"#cb19-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb19-53\"><a href=\"#cb19-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb19-54\"><a href=\"#cb19-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb19-55\"><a href=\"#cb19-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb19-56\"><a href=\"#cb19-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>A plot of the underlying dynamic component shows how it has easily\nhandled the temporal evolution of the time series:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod0, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"including-time-varying-upwelling-effects\" class=\"section level3\">\n<h3>Including time-varying upwelling effects</h3>\n<p>Now we can increase the complexity of our model by constructing and\nfitting a State-Space model with a time-varying effect of the coastal\nupwelling index in addition to the autoregressive dynamics. We again use\na Beta observation model to capture the restrictions of our proportional\nobservations, but this time will include a <code>dynamic()</code> effect\nof <code>CUI.apr</code> in the latent process model. We do not specify\nthe <span class=\"math inline\">\\(\\rho\\)</span> parameter, instead opting\nto estimate it using a Hilbert space approximate GP:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> survival <span class=\"sc\">~</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">dynamic</span>(CUI.apr, <span class=\"at\">k =</span> <span class=\"dv\">25</span>, <span class=\"at\">scale =</span> <span class=\"cn\">FALSE</span>) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">AR</span>(),</span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a>  <span class=\"at\">noncentred =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"sc\">-</span><span class=\"fl\">3.5</span>, <span class=\"fl\">0.5</span>), <span class=\"at\">class =</span> Intercept),</span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">betar</span>(),</span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> model_data,</span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The summary for this model now includes estimates for the\ntime-varying GP parameters:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(mod1, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; survival ~ 1</span></span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb22-5\"><a href=\"#cb22-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-6\"><a href=\"#cb22-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb22-7\"><a href=\"#cb22-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~dynamic(CUI.apr, k = 25, scale = FALSE) - 1</span></span>\n<span id=\"cb22-8\"><a href=\"#cb22-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017caa517728&gt;</span></span>\n<span id=\"cb22-9\"><a href=\"#cb22-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-10\"><a href=\"#cb22-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb22-11\"><a href=\"#cb22-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; beta</span></span>\n<span id=\"cb22-12\"><a href=\"#cb22-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-13\"><a href=\"#cb22-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb22-14\"><a href=\"#cb22-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; logit</span></span>\n<span id=\"cb22-15\"><a href=\"#cb22-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-16\"><a href=\"#cb22-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb22-17\"><a href=\"#cb22-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; AR()</span></span>\n<span id=\"cb22-18\"><a href=\"#cb22-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-19\"><a href=\"#cb22-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb22-20\"><a href=\"#cb22-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb22-21\"><a href=\"#cb22-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-22\"><a href=\"#cb22-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb22-23\"><a href=\"#cb22-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1 </span></span>\n<span id=\"cb22-24\"><a href=\"#cb22-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-25\"><a href=\"#cb22-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb22-26\"><a href=\"#cb22-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 42 </span></span>\n<span id=\"cb22-27\"><a href=\"#cb22-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-28\"><a href=\"#cb22-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb22-29\"><a href=\"#cb22-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb22-30\"><a href=\"#cb22-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1000; warmup = 500; thin = 1 </span></span>\n<span id=\"cb22-31\"><a href=\"#cb22-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb22-32\"><a href=\"#cb22-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-33\"><a href=\"#cb22-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation precision parameter estimates:</span></span>\n<span id=\"cb22-34\"><a href=\"#cb22-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-35\"><a href=\"#cb22-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt; phi[1]  170 340   650 1.01   794</span></span>\n<span id=\"cb22-36\"><a href=\"#cb22-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-37\"><a href=\"#cb22-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb22-38\"><a href=\"#cb22-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-39\"><a href=\"#cb22-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept) -4.4 -3.8  -2.9    1   682</span></span>\n<span id=\"cb22-40\"><a href=\"#cb22-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-41\"><a href=\"#cb22-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb22-42\"><a href=\"#cb22-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-43\"><a href=\"#cb22-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.17 0.32  0.51    1   661</span></span>\n<span id=\"cb22-44\"><a href=\"#cb22-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-45\"><a href=\"#cb22-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; autoregressive coef 1:</span></span>\n<span id=\"cb22-46\"><a href=\"#cb22-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt;        2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-47\"><a href=\"#cb22-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ar1[1] 0.57 0.93     1    1   498</span></span>\n<span id=\"cb22-48\"><a href=\"#cb22-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-49\"><a href=\"#cb22-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process model gp term marginal deviation (alpha) and length scale (rho) estimates:</span></span>\n<span id=\"cb22-50\"><a href=\"#cb22-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                         2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb22-51\"><a href=\"#cb22-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; alpha_gp(time):CUI.apr 0.036 0.32   1.5 1.00   999</span></span>\n<span id=\"cb22-52\"><a href=\"#cb22-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; rho_gp(time):CUI.apr   1.300 5.80  43.0 1.01   607</span></span>\n<span id=\"cb22-53\"><a href=\"#cb22-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-54\"><a href=\"#cb22-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb22-55\"><a href=\"#cb22-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb22-56\"><a href=\"#cb22-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ Rhat looks good for all parameters</span></span>\n<span id=\"cb22-57\"><a href=\"#cb22-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb22-58\"><a href=\"#cb22-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb22-59\"><a href=\"#cb22-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-60\"><a href=\"#cb22-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb22-61\"><a href=\"#cb22-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb22-62\"><a href=\"#cb22-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb22-63\"><a href=\"#cb22-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb22-64\"><a href=\"#cb22-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The estimates for the underlying dynamic process, and for the\nhindcasts, haven’t changed much:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;trend&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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6TWBLp185VtewYm1hR9DdOdYlOWrQ4o14FlGqZS5ljIt4Ss9NS3Fetfr4LUdb3ibBvQGXV9L29mDitX4Cmuu5XQR1JhlGcT5CqtJPNTVWsVlW4zXaRyrNCKHE2vMKq0jOdey5RDmghrAGPvtZImxGsayfn77qn9oz+s43FBc8uHEGu+8tC50rqXEN99oVtpdc7wuQxevbccwyB4eYpHK54Kb0EAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIgFRIBYQASIBUSAWEAEiAVEgFhABIiVwfvLwneZlbROBMTKRGTt6xMCsTKBWGlArExmsR5N4ceX//r2aBTf52V+3qTWEzomECsTKtbvf91fXz79/evHsJTUw672q8QfF4iVCRXr6/zPt9//mpwSWhjziECsTKhY3+fVJR8+TatMiixiekwgViYesd6WcYit67cXIFYmwYwFFBArE49YUx8LeikgViYescY3sUi9iueIQKxMfGKVv4v0nEAsIALEAiJALCACxAIiQCwgAsQCIkAsIALEAiJALCACxAIiQCwgAsQCIkAsIALEAiJALCACxAIiQCwgAsQCIkAsIALEAiJALCACxAIiQCwgAsQCIvw/4Iu7mHR3epIAAAAASUVORK5CYII=\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>But the process error parameter <span class=\"math inline\">\\(\\sigma\\)</span> is slightly smaller for this model\nthan for the first model:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a><span class=\"co\"># Extract estimates of the process error &#39;sigma&#39; for each model</span></span>\n<span id=\"cb25-2\"><a href=\"#cb25-2\" tabindex=\"-1\"></a>mod0_sigma <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(mod0, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb25-3\"><a href=\"#cb25-3\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">model =</span> <span class=\"st\">&quot;Mod0&quot;</span>)</span>\n<span id=\"cb25-4\"><a href=\"#cb25-4\" tabindex=\"-1\"></a>mod1_sigma <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.data.frame</span>(mod1, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb25-5\"><a href=\"#cb25-5\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">model =</span> <span class=\"st\">&quot;Mod1&quot;</span>)</span>\n<span id=\"cb25-6\"><a href=\"#cb25-6\" tabindex=\"-1\"></a>sigmas <span class=\"ot\">&lt;-</span> <span class=\"fu\">rbind</span>(mod0_sigma, mod1_sigma)</span>\n<span id=\"cb25-7\"><a href=\"#cb25-7\" tabindex=\"-1\"></a></span>\n<span id=\"cb25-8\"><a href=\"#cb25-8\" tabindex=\"-1\"></a><span class=\"co\"># Plot using ggplot2</span></span>\n<span id=\"cb25-9\"><a href=\"#cb25-9\" tabindex=\"-1\"></a><span class=\"fu\">require</span>(ggplot2)</span>\n<span id=\"cb25-10\"><a href=\"#cb25-10\" tabindex=\"-1\"></a><span class=\"fu\">ggplot</span>(sigmas, <span class=\"fu\">aes</span>(<span class=\"at\">y =</span> <span class=\"st\">`</span><span class=\"at\">sigma[1]</span><span class=\"st\">`</span>, <span class=\"at\">fill =</span> model)) <span class=\"sc\">+</span></span>\n<span id=\"cb25-11\"><a href=\"#cb25-11\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_density</span>(<span class=\"at\">alpha =</span> <span class=\"fl\">0.3</span>, <span class=\"at\">colour =</span> <span class=\"cn\">NA</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb25-12\"><a href=\"#cb25-12\" tabindex=\"-1\"></a>  <span class=\"fu\">coord_flip</span>()</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>Why does the process error not need to be as flexible in the second\nmodel? Because the estimates of this dynamic process are now informed\npartly by the time-varying effect of upwelling, which we can visualise\non the link scale using <code>plot()</code>:</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(mod1, <span class=\"at\">type =</span> <span class=\"st\">&quot;smooths&quot;</span>, <span class=\"at\">trend_effects =</span> <span class=\"cn\">TRUE</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"comparing-model-predictive-performances\" class=\"section level3\">\n<h3>Comparing model predictive performances</h3>\n<p>A key question when fitting multiple time series models is whether\none of them provides better predictions than the other. There are\nseveral options in <code>mvgam</code> for exploring this quantitatively.\nFirst, we can compare models based on in-sample approximate\nleave-one-out cross-validation as implemented in the popular\n<code>loo</code> package:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a><span class=\"fu\">loo_compare</span>(mod0, mod1)</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;      elpd_diff se_diff</span></span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mod0     0.0       0.0</span></span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; mod1 -1308.3     135.3</span></span></code></pre></div>\n<p>The second model has the larger Expected Log Predictive Density\n(ELPD), meaning that it is slightly favoured over the simpler model that\ndid not include the time-varying upwelling effect. However, the two\nmodels certainly do not differ by much. But this metric only compares\nin-sample performance, and we are hoping to use our models to produce\nreasonable forecasts. Luckily, <code>mvgam</code> also has routines for\ncomparing models using approximate leave-future-out cross-validation.\nHere we refit both models to a reduced training set (starting at time\npoint 30) and produce approximate 1-step ahead forecasts. These\nforecasts are used to estimate forecast ELPD before expanding the\ntraining set one time point at a time. We use Pareto-smoothed importance\nsampling to reweight posterior predictions, acting as a kind of particle\nfilter so that we don’t need to refit the model too often (you can read\nmore about how this process works in Bürkner et al. 2020).</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a>lfo_mod0 <span class=\"ot\">&lt;-</span> <span class=\"fu\">lfo_cv</span>(mod0, <span class=\"at\">min_t =</span> <span class=\"dv\">30</span>)</span>\n<span id=\"cb28-2\"><a href=\"#cb28-2\" tabindex=\"-1\"></a>lfo_mod1 <span class=\"ot\">&lt;-</span> <span class=\"fu\">lfo_cv</span>(mod1, <span class=\"at\">min_t =</span> <span class=\"dv\">30</span>)</span></code></pre></div>\n<p>The model with the time-varying upwelling effect tends to provides\nbetter 1-step ahead forecasts, with a higher total forecast ELPD</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a><span class=\"fu\">sum</span>(lfo_mod0<span class=\"sc\">$</span>elpds)</span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] 35.92439</span></span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a><span class=\"fu\">sum</span>(lfo_mod1<span class=\"sc\">$</span>elpds)</span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [1] 37.0323</span></span></code></pre></div>\n<p>We can also plot the ELPDs for each model as a contrast. Here, values\nless than zero suggest the time-varying predictor model (Mod1) gives\nbetter 1-step ahead forecasts:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(</span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a>  <span class=\"at\">x =</span> <span class=\"dv\">1</span><span class=\"sc\">:</span><span class=\"fu\">length</span>(lfo_mod0<span class=\"sc\">$</span>elpds) <span class=\"sc\">+</span> <span class=\"dv\">30</span>,</span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a>  <span class=\"at\">y =</span> lfo_mod0<span class=\"sc\">$</span>elpds <span class=\"sc\">-</span> lfo_mod1<span class=\"sc\">$</span>elpds,</span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"st\">&quot;ELPDmod0 - ELPDmod1&quot;</span>,</span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Evaluation time point&quot;</span>,</span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>,</span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a>  <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span></span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" aria-label=\"Comparing forecast skill for dynamic beta regression models in mvgam and R\" src=\"data:image/png;base64,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\" alt=\"Comparing forecast skill for dynamic beta regression models in mvgam and R\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>A useful exercise to further expand this model would be to think\nabout what kinds of predictors might impact measurement error, which\ncould easily be implemented into the observation formula in\n<code>mvgam()</code>. But for now, we will leave the model as-is.</p>\n</div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer a lot of useful material\nabout dynamic linear models and how they can be applied / evaluated in\npractice:</p>\n<p>Bürkner, PC, Gabry, J and Vehtari, A <a href=\"https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262\">Approximate\nleave-future-out cross-validation for Bayesian time series models</a>.\n<em>Journal of Statistical Computation and Simulation</em>. 90:14 (2020)\n2499-2523.</p>\n<p>Herrero, Asier, et al. <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/1365-2745.12527\">From\nthe individual to the landscape and back: time‐varying effects of\nclimate and herbivory on tree sapling growth at distribution limits</a>.\n<em>Journal of Ecology</em> 104.2 (2016): 430-442.</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. “<a href=\"https://journal.r-project.org/articles/RJ-2012-002/\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata.</a>” <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Scheuerell, Mark D., and John G. Williams. <a href=\"https://onlinelibrary.wiley.com/doi/10.1111/j.1365-2419.2005.00346.x\">Forecasting\nclimate induced changes in the survival of Snake River Spring/Summer\nChinook Salmon (<em>Oncorhynchus Tshawytscha</em>)</a> <em>Fisheries\nOceanography</em> 14 (2005): 448–57.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "inst/doc/trend_formulas.R",
    "content": "params <-\n  list(EVAL = TRUE)\n\n## ----echo = FALSE----------------------------------------------------------------\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n\n\n## ----setup, include=FALSE--------------------------------------------------------\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n\n\n## --------------------------------------------------------------------------------\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda\"))\n\n\n## --------------------------------------------------------------------------------\noutcomes <- c(\"Greens\", \"Bluegreens\", \"Diatoms\", \"Unicells\", \"Other.algae\")\n\n\n## --------------------------------------------------------------------------------\n# loop across each plankton group to create the long datframe\nplankton_data <- do.call(\n  rbind,\n  lapply(outcomes, function(x) {\n    # create a group-specific dataframe with counts labelled 'y'\n    # and the group name in the 'series' variable\n    data.frame(\n      year = lakeWAplanktonTrans[, \"Year\"],\n      month = lakeWAplanktonTrans[, \"Month\"],\n      y = lakeWAplanktonTrans[, x],\n      series = x,\n      temp = lakeWAplanktonTrans[, \"Temp\"]\n    )\n  })\n) %>%\n  # change the 'series' label to a factor\n  dplyr::mutate(series = factor(series)) %>%\n  # filter to only include some years in the data\n  dplyr::filter(year >= 1965 & year < 1975) %>%\n  dplyr::arrange(year, month) %>%\n  dplyr::group_by(series) %>%\n  # z-score the counts so they are approximately standard normal\n  dplyr::mutate(y = as.vector(scale(y))) %>%\n  # add the time indicator\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  dplyr::ungroup()\n\n\n## --------------------------------------------------------------------------------\nhead(plankton_data)\n\n\n## --------------------------------------------------------------------------------\ndplyr::glimpse(plankton_data)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_series(data = plankton_data, series = \"all\")\n\n\n## --------------------------------------------------------------------------------\nplankton_data %>%\n  dplyr::filter(series == \"Other.algae\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y), col = \"white\", size = 1.3) +\n  geom_line(aes(y = y), col = \"darkred\", size = 1.1) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Other algae (red)\")\n\n\n## --------------------------------------------------------------------------------\nplankton_data %>%\n  dplyr::filter(series == \"Diatoms\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y), col = \"white\", size = 1.3) +\n  geom_line(aes(y = y), col = \"darkred\", size = 1.1) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Diatoms (red)\")\n\n\n## --------------------------------------------------------------------------------\nplankton_train <- plankton_data %>%\n  dplyr::filter(time <= 112)\nplankton_test <- plankton_data %>%\n  dplyr::filter(time > 112)\n\n\n## ----notrend_mod, include = FALSE, results='hide'--------------------------------\nnotrend_mod <- mvgam(\n  y ~\n    te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = series) -\n    1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# notrend_mod <- mvgam(\n#   y ~\n#     # tensor of temp and month to capture\n#     # \"global\" seasonality\n#     te(temp, month, k = c(4, 4)) +\n#\n#     # series-specific deviation tensor products\n#     te(temp, month, k = c(4, 4), by = series) - 1,\n#   family = gaussian(),\n#   data = plankton_train,\n#   newdata = plankton_test,\n#   trend_model = \"None\"\n# )\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(notrend_mod, smooth = 1)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(notrend_mod, smooth = 2)\n\n\n## --------------------------------------------------------------------------------\nplot_mvgam_smooth(notrend_mod, smooth = 3)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"forecast\", series = 1)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"forecast\", series = 2)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"forecast\", series = 3)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"residuals\", series = 1)\n\n\n## --------------------------------------------------------------------------------\nplot(notrend_mod, type = \"residuals\", series = 3)\n\n\n## --------------------------------------------------------------------------------\npriors <- get_mvgam_priors(\n  # observation formula, which has no terms in it\n  y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) -\n    1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train\n)\n\n\n## --------------------------------------------------------------------------------\npriors[, 3]\n\n\n## --------------------------------------------------------------------------------\npriors[, 4]\n\n\n## --------------------------------------------------------------------------------\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n\n\n## ----var_mod, include = FALSE, results='hide'------------------------------------\nvar_mod <- mvgam(\n  y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) -\n      1\n  ,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(),\n  priors = priors,\n  adapt_delta = 0.99,\n  burnin = 1000\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# var_mod <- mvgam(\n#   # observation formula, which is empty\n#   forumla = y ~ -1,\n#\n#   # process model formula, which includes the smooth functions\n#   trend_formula = ~ te(temp, month, k = c(4, 4)) +\n#     te(temp, month, k = c(4, 4), by = trend) - 1,\n#\n#   # VAR1 model with uncorrelated process errors\n#   trend_model = VAR(),\n#   family = gaussian(),\n#   data = plankton_train,\n#   newdata = plankton_test,\n#\n#   # include the updated priors\n#   priors = priors,\n#   silent = 2\n# )\n\n## --------------------------------------------------------------------------------\nsummary(var_mod, include_betas = FALSE)\n\n\n## --------------------------------------------------------------------------------\nplot(var_mod, \"smooths\", trend_effects = TRUE)\n\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(\n  var_mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(\n  var_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(var_mod, variable = \"sigma_obs\", regex = TRUE, type = \"hist\")\n\n\n## --------------------------------------------------------------------------------\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n\n\n## ----varcor_mod, include = FALSE, results='hide'---------------------------------\nvarcor_mod <- mvgam(\n  y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) -\n      1\n  ,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(cor = TRUE),\n  burnin = 1000,\n  adapt_delta = 0.99,\n  priors = priors\n)\n\n\n## ----eval=FALSE------------------------------------------------------------------\n# varcor_mod <- mvgam(\n#   # observation formula, which remains empty\n#   formula = y ~ -1,\n#\n#   # process model formula, which includes the smooth functions\n#   trend_formula = ~ te(temp, month, k = c(4, 4)) +\n#     te(temp, month, k = c(4, 4), by = trend) - 1,\n#\n#   # VAR1 model with correlated process errors\n#   trend_model = VAR(cor = TRUE),\n#   family = gaussian(),\n#   data = plankton_train,\n#   newdata = plankton_test,\n#\n#   # include the updated priors\n#   priors = priors,\n#   silent = 2\n# )\n\n## ----warning=FALSE, message=FALSE------------------------------------------------\nmcmc_plot(\n  varcor_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n\n## --------------------------------------------------------------------------------\nSigma_post <- as.matrix(\n  varcor_mod,\n  variable = \"Sigma\",\n  regex = TRUE\n)\nmedian_correlations <- cov2cor(\n  matrix(apply(Sigma_post, 2, median), nrow = 5, ncol = 5)\n)\nrownames(median_correlations) <-\n  colnames(median_correlations) <-\n    levels(plankton_train$series)\n\nround(median_correlations, 2)\n\n\n## --------------------------------------------------------------------------------\nirfs <- irf(varcor_mod, h = 12)\n\n\n## --------------------------------------------------------------------------------\nsummary(irfs)\n\n\n## --------------------------------------------------------------------------------\nplot(irfs, series = 3)\n\n\n## --------------------------------------------------------------------------------\nfevds <- fevd(varcor_mod, h = 12)\nplot(fevds)\n\n\n## --------------------------------------------------------------------------------\n# create forecast objects for each model\nfcvar <- forecast(var_mod)\nfcvarcor <- forecast(varcor_mod)\n\n# plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"variogram\")$all_series$score -\n  score(fcvar, score = \"variogram\")$all_series$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(variogram[VAR1cor] ~ -~ variogram[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n\n\n## --------------------------------------------------------------------------------\n# plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"energy\")$all_series$score -\n  score(fcvar, score = \"energy\")$all_series$score\nplot(\n  diff_scores,\n  pch = 16,\n  cex = 1.25,\n  col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(energy[VAR1cor] ~ -~ energy[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n\n\n## --------------------------------------------------------------------------------\ndescription <- how_to_cite(varcor_mod)\n\n\n## ----eval = FALSE----------------------------------------------------------------\n# description\n\n## ----echo=FALSE------------------------------------------------------------------\ncat(\"Methods text skeleton\\n\")\ncat(insight::format_message(description$methods_text))\n\n\n## ----echo=FALSE------------------------------------------------------------------\ncat(\"\\nPrimary references\\n\")\nfor (i in seq_along(description$citations)) {\n  cat(insight::format_message(description$citations[[i]]))\n  cat('\\n')\n}\ncat(\"\\nOther useful references\\n\")\nfor (i in seq_along(description$other_citations)) {\n  cat(insight::format_message(description$other_citations[[i]]))\n  cat('\\n')\n}\n"
  },
  {
    "path": "inst/doc/trend_formulas.Rmd",
    "content": "---\ntitle: \"State-Space models in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{State-Space models in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to fit and interrogate State-Space models with nonlinear effects.\n\n## State-Space Models\n\n![Illustration of a basic State-Space model, which assumes that  a latent dynamic *process* (X) can evolve independently from the way we take *observations* (Y) of that process](SS_model.svg){width=85%}\n\n<br>\n\nState-Space models allow us to separately make inferences about the underlying dynamic *process model* that we are interested in (i.e. the evolution of a time series or a collection of time series) and the *observation model* (i.e. the way that we survey / measure this underlying process). This is extremely useful in ecology because our observations are always imperfect / noisy measurements of the thing we are interested in measuring. It is also helpful because we often know that some covariates will impact our ability to measure accurately (i.e. we cannot take accurate counts of rodents if there is a thunderstorm happening) while other covariates might impact the underlying process (it is highly unlikely that rodent abundance responds to one storm, but instead probably responds to longer-term weather and climate variation). A State-Space model allows us to model both components in a single unified modelling framework. A major advantage of `mvgam` is that it can include nonlinear effects and random effects in BOTH model components while also capturing dynamic processes.\n\n### Lake Washington plankton data\nThe data we will use to illustrate how we can fit State-Space models in `mvgam` are from a long-term monitoring study of plankton counts (cells per mL) taken from Lake Washington in Washington, USA. The data are available as part of the `MARSS` package and can be downloaded using the following: \n```{r}\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda\"))\n```\n\nWe will work with five different groups of plankton:\n```{r}\noutcomes <- c(\"Greens\", \"Bluegreens\", \"Diatoms\", \"Unicells\", \"Other.algae\")\n```\n\nAs usual, preparing the data into the correct format for `mvgam` modelling takes a little bit of wrangling in `dplyr`:\n```{r}\n# loop across each plankton group to create the long datframe\nplankton_data <- do.call(rbind, lapply(outcomes, function(x) {\n  # create a group-specific dataframe with counts labelled 'y'\n  # and the group name in the 'series' variable\n  data.frame(\n    year = lakeWAplanktonTrans[, \"Year\"],\n    month = lakeWAplanktonTrans[, \"Month\"],\n    y = lakeWAplanktonTrans[, x],\n    series = x,\n    temp = lakeWAplanktonTrans[, \"Temp\"]\n  )\n})) %>%\n  # change the 'series' label to a factor\n  dplyr::mutate(series = factor(series)) %>%\n  # filter to only include some years in the data\n  dplyr::filter(year >= 1965 & year < 1975) %>%\n  dplyr::arrange(year, month) %>%\n  dplyr::group_by(series) %>%\n  # z-score the counts so they are approximately standard normal\n  dplyr::mutate(y = as.vector(scale(y))) %>%\n  # add the time indicator\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  dplyr::ungroup()\n```\n\nInspect the data structure\n```{r}\nhead(plankton_data)\n```\n\n```{r}\ndplyr::glimpse(plankton_data)\n```\n\nNote that we have z-scored the counts in this example as that will make it easier to specify priors (though this is not completely necessary; it is often better to build a model that respects the properties of the actual outcome variables)\n```{r}\nplot_mvgam_series(data = plankton_data, series = \"all\")\n```\n\nWe have some missing observations, but this isn't an issue for modelling in `mvgam`. A useful property to understand about these counts is that they tend to be highly seasonal. Below are some plots of z-scored counts against the z-scored temperature measurements in the lake for each month:\n```{r}\nplankton_data %>%\n  dplyr::filter(series == \"Other.algae\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y),\n    col = \"white\",\n    size = 1.3\n  ) +\n  geom_line(aes(y = y),\n    col = \"darkred\",\n    size = 1.1\n  ) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Other algae (red)\")\n```\n\n\n```{r}\nplankton_data %>%\n  dplyr::filter(series == \"Diatoms\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y),\n    col = \"white\",\n    size = 1.3\n  ) +\n  geom_line(aes(y = y),\n    col = \"darkred\",\n    size = 1.1\n  ) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Diatoms (red)\")\n```\n\nWe will have to try and capture this seasonality in our process model, which should be easy to do given the flexibility of GAMs. Next we will split the data into training and testing splits:\n```{r}\nplankton_train <- plankton_data %>%\n  dplyr::filter(time <= 112)\nplankton_test <- plankton_data %>%\n  dplyr::filter(time > 112)\n```\n\nNow time to fit some models. This requires a bit of thinking about how we can best tackle the seasonal variation and the likely dependence structure in the data. These algae are interacting as part of a complex system within the same lake, so we certainly expect there to be some lagged cross-dependencies underling their dynamics. But if we do not capture the seasonal variation, our multivariate dynamic model will be forced to try and capture it, which could lead to poor convergence and unstable results (we could feasibly capture cyclic dynamics with a more complex multi-species Lotka-Volterra model, but ordinary differential equation approaches are beyond the scope of `mvgam`). \n\n### Capturing seasonality\n\nFirst we will fit a model that does not include a dynamic component, just to see if it can reproduce the seasonal variation in the observations. This model introduces hierarchical multidimensional smooths, where all time series share a \"global\" tensor product of the `month` and `temp` variables, capturing our expectation that algal seasonality responds to temperature variation. But this response should depend on when in the year these temperatures are recorded (i.e. a response to warm temperatures in Spring should be different to a response to warm temperatures in Autumn). The model also fits series-specific deviation smooths (i.e. one tensor product per series) to capture how each algal group's seasonality differs from the overall \"global\" seasonality. Note that we do not include series-specific intercepts in this model because each series was z-scored to have a mean of 0.\n```{r notrend_mod, include = FALSE, results='hide'}\nnotrend_mod <- mvgam(\n  y ~\n    te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = series) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n```\n\n```{r eval=FALSE}\nnotrend_mod <- mvgam(\n  y ~\n    # tensor of temp and month to capture\n    # \"global\" seasonality\n    te(temp, month, k = c(4, 4)) +\n\n    # series-specific deviation tensor products\n    te(temp, month, k = c(4, 4), by = series) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n```\n\nThe \"global\" tensor product smooth function can be quickly visualized:\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 1)\n```\n\nOn this plot, red indicates below-average linear predictors and white indicates above-average. We can then plot the deviation smooths for a few algal groups to see how they vary from the \"global\" pattern:\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 2)\n```\n\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 3)\n```\n\nThese multidimensional smooths have done a good job of capturing the seasonal variation in our observations:\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 1)\n```\n\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 2)\n```\n\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 3)\n```\n\nThis basic model gives us confidence that we can capture the seasonal variation in the observations. But the model has not captured the remaining temporal dynamics, which is obvious when we inspect Dunn-Smyth residuals for a few series:\n```{r}\nplot(notrend_mod, type = \"residuals\", series = 1)\n```\n\n```{r}\nplot(notrend_mod, type = \"residuals\", series = 3)\n```\n\n\n### Multiseries dynamics\nNow it is time to get into multivariate State-Space models. We will fit two models that can both incorporate lagged cross-dependencies in the latent process models. The first model assumes that the process errors operate independently from one another, while the second assumes that there may be contemporaneous correlations in the process errors. Both models include a Vector Autoregressive component for the process means, and so both can model complex community dynamics. The models can be described mathematically as follows:\n\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Normal}(\\mu_{obs[t]}, \\sigma_{obs}) \\\\\n\\mu_{obs[t]} & = process_t \\\\\nprocess_t & \\sim \\text{MVNormal}(\\mu_{process[t]}, \\Sigma_{process}) \\\\\n\\mu_{process[t]} & = A * process_{t-1} + f_{global}(\\boldsymbol{month},\\boldsymbol{temp})_t + f_{series}(\\boldsymbol{month},\\boldsymbol{temp})_t \\\\\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp}) & = \\sum_{k=1}^{K}b_{global} * \\beta_{global} \\\\\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp}) & = \\sum_{k=1}^{K}b_{series} * \\beta_{series} \\end{align*}\n\nHere you can see that there are no terms in the observation model apart from the underlying process model. But we could easily add covariates into the observation model if we felt that they could explain some of the systematic observation errors. We also assume independent observation processes (there is no covariance structure in the observation errors $\\sigma_{obs}$).  At present, `mvgam` does not support multivariate observation models. But this feature will be added in future versions. However the underlying process model is multivariate, and there is a lot going on here. This component has a Vector Autoregressive part, where the process mean at time $t$ $(\\mu_{process[t]})$ is a vector that evolves as a function of where the vector-valued process model was at time $t-1$. The $A$ matrix captures these dynamics with self-dependencies on the diagonal and possibly asymmetric cross-dependencies on the off-diagonals, while also incorporating the nonlinear smooth functions that capture seasonality for each series. The contemporaneous process errors are modeled by $\\Sigma_{process}$, which can be constrained so that process errors are independent (i.e. setting the off-diagonals to 0) or can be fully parameterized using a Cholesky decomposition (using `Stan`'s $LKJcorr$ distribution to place a prior on the strength of inter-species correlations). For those that are interested in the inner-workings, `mvgam` makes use of a recent breakthrough by [Sarah Heaps to enforce stationarity of Bayesian VAR processes](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648). This is advantageous as we often don't expect forecast variance to increase without bound forever into the future, but many estimated VARs tend to behave this way. \n\n<br>\nOk that was a lot to take in. Let's fit some models to try and inspect what is going on and what they assume. But first, we need to update `mvgam`'s default priors for the observation and process errors. By default, `mvgam` uses a fairly wide Student-T prior on these parameters to avoid being overly informative. But our observations are z-scored and so we do not expect very large process or observation errors. However, we also do not expect very small observation errors either as we know these measurements are not perfect. So let's update the priors for these parameters. In doing so, you will get to see how the formula for the latent process (i.e. trend) model is used in `mvgam`:\n```{r}\npriors <- get_mvgam_priors(\n  # observation formula, which has no terms in it\n  y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train\n)\n```\n\nGet names of all parameters whose priors can be modified:\n```{r}\npriors[, 3]\n```\n\nAnd their default prior distributions:\n```{r}\npriors[, 4]\n```\n\nSetting priors is easy in `mvgam` as you can use `brms` routines. Here we use more informative Normal priors for both error components, but we impose a lower bound of 0.2 for the observation errors:\n```{r}\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n```\n\nYou may have noticed something else unique about this model: there is no intercept term in the observation formula. This is because a shared intercept parameter can sometimes be unidentifiable with respect to the latent VAR process, particularly if our series have similar long-run averages (which they do in this case because they were z-scored). We will often get better convergence in these State-Space models if we drop this parameter. `mvgam` accomplishes this by fixing the coefficient for the intercept to zero. Now we can fit the first model, which assumes that process errors are contemporaneously uncorrelated\n```{r var_mod, include = FALSE, results='hide'}\nvar_mod <- mvgam(y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(),\n  priors = priors,\n  adapt_delta = 0.99,\n  burnin = 1000\n)\n```\n\n```{r eval=FALSE}\nvar_mod <- mvgam(\n  # observation formula, which is empty\n  forumla = y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n\n  # include the updated priors\n  priors = priors,\n  silent = 2\n)\n```\n\n### Inspecting SS models\nThis model's summary is a bit different to other `mvgam` summaries. It separates parameters based on whether they belong to the observation model or to the latent process model. This is because we may often have covariates that impact the observations but not the latent process, so we can have fairly complex models for each component. You will notice that some parameters have not fully converged, particularly for the VAR coefficients (called `A` in the output) and for the process errors (`Sigma`). Note that we set `include_betas = FALSE` to stop the summary from printing output for all of the spline coefficients, which can be dense and hard to interpret:\n```{r}\nsummary(var_mod, include_betas = FALSE)\n```\n\nThe convergence of this model isn't fabulous (more on this in a moment). But we can again plot the smooth functions, which this time operate on the process model. We can see the same plot using `trend_effects = TRUE` in the plotting functions:\n```{r}\nplot(var_mod, \"smooths\", trend_effects = TRUE)\n```\n\nThe autoregressive coefficient matrix is of particular interest here, as it captures lagged dependencies and cross-dependencies in the latent process model. Unfortunately `bayesplot` doesn't know this is a matrix of parameters so what we see is actually the transpose of the VAR matrix. Using `dir = 'v'` in the `facet_args` argument will accomplish this:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  var_mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThere is a lot happening in this matrix. Each cell captures the lagged effect of the process in the column on the process in the row in the next timestep. So for example, the effect in cell [1,3] shows how an *increase* in the process for series 3 (Greens) at time $t$ is expected to impact the process for series 1 (Bluegreens) at time $t+1$. The latent process model is now capturing these effects and the smooth seasonal effects.\n  \nThe process error $(\\Sigma)$ captures unmodelled variation in the process models. Again, we fixed the off-diagonals to 0, so the histograms for these will look like flat boxes:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  var_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThe observation error estimates $(\\sigma_{obs})$ represent how much the model thinks we might miss the true count when we take our imperfect measurements: \n```{r warning=FALSE, message=FALSE}\nmcmc_plot(var_mod, variable = \"sigma_obs\", regex = TRUE, type = \"hist\")\n```\n\nThese are still a bit hard to identify overall, especially when trying to estimate both process and observation error. Often we need to make some strong assumptions about which of these is more important for determining unexplained variation in our observations. \n\n### Correlated process errors\n\nLet's see if these estimates improve when we allow the process errors to be correlated. Once again, we need to first update the priors for the observation errors:\n```{r}\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n```\n\nAnd now we can fit the correlated process error model\n```{r varcor_mod, include = FALSE, results='hide'}\nvarcor_mod <- mvgam(y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(cor = TRUE),\n  burnin = 1000,\n  adapt_delta = 0.99,\n  priors = priors\n)\n```\n\n```{r eval=FALSE}\nvarcor_mod <- mvgam(\n  # observation formula, which remains empty\n  formula = y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with correlated process errors\n  trend_model = VAR(cor = TRUE),\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n\n  # include the updated priors\n  priors = priors,\n  silent = 2\n)\n```\n\nThe $(\\Sigma)$ matrix now captures any evidence of contemporaneously correlated process error:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  varcor_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThis symmetric matrix tells us there is support for correlated process errors, as several of the off-diagonal entries are strongly non-zero. But it is easier to interpret these estimates if we convert the covariance matrix to a correlation matrix. Here we compute the posterior median process error correlations:\n```{r}\nSigma_post <- as.matrix(\n  varcor_mod, \n  variable = \"Sigma\", \n  regex = TRUE\n)\nmedian_correlations <- cov2cor(\n  matrix(apply(Sigma_post, 2, median),\n         nrow = 5, \n         ncol = 5\n  )\n)\nrownames(median_correlations) <- \n  colnames(median_correlations) <- \n  levels(plankton_train$series)\n\nround(median_correlations, 2)\n```\n\n### Impulse response functions\nBecause Vector Autoregressions can capture complex lagged dependencies, it is often difficult to understand how the member time series are thought to interact with one another. A method that is commonly used to directly test for possible interactions is to compute an [Impulse Response Function](https://en.wikipedia.org/wiki/Impulse_response) (IRF). If $h$ represents the simulated forecast horizon, an IRF asks how each of the remaining series might respond over times $(t+1):h$ if a focal series is given an innovation \"shock\" at time $t = 0$. `mvgam` can compute Generalized and Orthogonalized IRFs from models that included latent VAR dynamics. We simply feed the fitted model to the `irf()` function and then use the S3 `plot()` function to view the estimated responses. By default, `irf()` will compute IRFs by separately imposing positive shocks of one standard deviation to each series in the VAR process. Here we compute Generalized IRFs over a horizon of 12 timesteps:\n```{r}\nirfs <- irf(varcor_mod, h = 12)\n```\n\nA summary of the IRFs can be computed using the `summary()` function:\n```{r}\nsummary(irfs)\n```\n\nBut it is easier to understand these responses using plots. For example, we can plot the expected responses of the remaining series to a positive shock for series 3 (Greens) using the `plot()` function:\n```{r}\nplot(irfs, series = 3)\n```\n\nThis series of plots makes it clear that some of the other series would be expected to show both instantaneous responses to a shock for the Greens (due to their correlated process errors) as well as delayed and nonlinear responses over time (due to the complex lagged dependence structure captured by the $A$ matrix). This hopefully makes it clear why IRFs are an important tool in the analysis of multivariate autoregressive models. You can also use these IRFs to calculate a relative contribution from each shock to the forecast error variance for a focal series. This method, known as a [Forecast Error Variance Decomposition](https://en.wikipedia.org/wiki/Variance_decomposition_of_forecast_errors) (FEVD), is useful to get an idea about the amount of information that each series contributes to the evolution of all other series in a Vector Autoregression:\n```{r}\nfevds <- fevd(varcor_mod, h = 12)\nplot(fevds)\n```\n\nThe plot above shows the median contribution to forecast error variance for each series.\n\n### Comparing forecast scores\n\nBut which model is better? We can compute the variogram score for out of sample forecasts to get a sense of which model does a better job of capturing the dependence structure in the true evaluation set:\n```{r}\n# create forecast objects for each model\nfcvar <- forecast(var_mod)\nfcvarcor <- forecast(varcor_mod)\n\n# plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"variogram\")$all_series$score -\n  score(fcvar, score = \"variogram\")$all_series$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(variogram[VAR1cor] ~ -~ variogram[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nAnd we can also compute the energy score for out of sample forecasts to get a sense of which model provides forecasts that are better calibrated:\n```{r}\n# plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"energy\")$all_series$score -\n  score(fcvar, score = \"energy\")$all_series$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(energy[VAR1cor] ~ -~ energy[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nThe models tend to provide similar forecasts, though the correlated error model does slightly better overall. We would probably need to use a more extensive rolling forecast evaluation exercise if we felt like we needed to only choose one for production. `mvgam` offers some utilities for doing this (i.e. see `?lfo_cv` for guidance). Alternatively, we could use forecasts from *both* models by creating an evenly-weighted ensemble forecast distribution. This capability is available using the `ensemble()` function in `mvgam` (see `?ensemble` for guidance). \n\nUsing `how_to_cite()` for models with VAR dynamics will give you information on how they are restricted to remain stationary:\n```{r}\ndescription <- how_to_cite(varcor_mod)\n```\n\n```{r, eval = FALSE}\ndescription\n```\n\n```{r, echo=FALSE}\ncat(\"Methods text skeleton\\n\")\ncat(insight::format_message(description$methods_text))\n```\n\n```{r echo=FALSE}\ncat(\"\\nPrimary references\\n\")\nfor (i in seq_along(description$citations)) {\n  cat(insight::format_message(description$citations[[i]]))\n  cat('\\n')\n}\ncat(\"\\nOther useful references\\n\")\nfor (i in seq_along(description$other_citations)) {\n  cat(insight::format_message(description$other_citations[[i]]))\n  cat('\\n')\n}\n```\n\nMore advanced hierarchical panel VAR models can also be handled by using the `gr` and `subgr` arguments in `VAR()`. These models are useful if you have a data for the same set of series (`subgr`) that are measured in different regions (`gr`), such as species measured in different sampling regions or financial series measured in different countries.\n\n## Further reading\nThe following papers and resources offer a lot of useful material about multivariate State-Space models and how they can be applied in practice:\n  \nAuger‐Méthé, Marie, et al. [A guide to state–space modeling of ecological time series](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470). *Ecological Monographs* 91.4 (2021): e01470.\n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nHeaps, Sarah E. [Enforcing stationarity through the prior in vector autoregressions](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648). *Journal of Computational and Graphical Statistics* 32.1 (2023): 74-83.\n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant](https://doi.org/10.1016/j.csda.2022.107659). *Computational Statistics & Data Analysis* 179 (2023): 107659.\n  \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. [MARSS: multivariate autoregressive state-space models for analyzing time-series data](https://journal.r-project.org/articles/RJ-2012-002/). *R Journal*. 4.1 (2012): 11.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.  \n  \nWard, Eric J., et al. [Inferring spatial structure from time‐series data: using multivariate state‐space models to detect metapopulation structure of California sea lions in the Gulf of California, Mexico](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x). *Journal of Applied Ecology* 47.1 (2010): 47-56.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "inst/doc/trend_formulas.html",
    "content": "<!DOCTYPE html>\n\n<html>\n\n<head>\n\n<meta charset=\"utf-8\" />\n<meta name=\"generator\" content=\"pandoc\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\" />\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"author\" content=\"Nicholas J Clark\" />\n\n<meta name=\"date\" content=\"2026-01-19\" />\n\n<title>State-Space models in mvgam</title>\n\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script>\n\n<style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n\n\n\n<style type=\"text/css\">\ncode {\nwhite-space: pre;\n}\n.sourceCode {\noverflow: visible;\n}\n</style>\n<style type=\"text/css\" data-origin=\"pandoc\">\nhtml { -webkit-text-size-adjust: 100%; }\npre > code.sourceCode { white-space: pre; position: relative; }\npre > code.sourceCode > span { display: inline-block; line-height: 1.25; }\npre > code.sourceCode > span:empty { height: 1.2em; }\n.sourceCode { overflow: visible; }\ncode.sourceCode > span { color: inherit; text-decoration: inherit; }\ndiv.sourceCode { margin: 1em 0; }\npre.sourceCode { margin: 0; }\n@media screen {\ndiv.sourceCode { overflow: auto; }\n}\n@media print {\npre > code.sourceCode { white-space: pre-wrap; }\npre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }\n}\npre.numberSource code\n{ counter-reset: source-line 0; }\npre.numberSource code > span\n{ position: relative; left: -4em; counter-increment: source-line; }\npre.numberSource code > span > a:first-child::before\n{ content: counter(source-line);\nposition: relative; left: -1em; text-align: right; vertical-align: baseline;\nborder: none; display: inline-block;\n-webkit-touch-callout: none; -webkit-user-select: none;\n-khtml-user-select: none; -moz-user-select: none;\n-ms-user-select: none; user-select: none;\npadding: 0 4px; width: 4em;\ncolor: #aaaaaa;\n}\npre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }\ndiv.sourceCode\n{ }\n@media screen {\npre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }\n}\ncode span.al { color: #ff0000; font-weight: bold; } \ncode span.an { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.at { color: #7d9029; } \ncode span.bn { color: #40a070; } \ncode span.bu { color: #008000; } \ncode span.cf { color: #007020; font-weight: bold; } \ncode span.ch { color: #4070a0; } \ncode span.cn { color: #880000; } \ncode span.co { color: #60a0b0; font-style: italic; } \ncode span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.do { color: #ba2121; font-style: italic; } \ncode span.dt { color: #902000; } \ncode span.dv { color: #40a070; } \ncode span.er { color: #ff0000; font-weight: bold; } \ncode span.ex { } \ncode span.fl { color: #40a070; } \ncode span.fu { color: #06287e; } \ncode span.im { color: #008000; font-weight: bold; } \ncode span.in { color: #60a0b0; font-weight: bold; font-style: italic; } \ncode span.kw { color: #007020; font-weight: bold; } \ncode span.op { color: #666666; } \ncode span.ot { color: #007020; } \ncode span.pp { color: #bc7a00; } \ncode span.sc { color: #4070a0; } \ncode span.ss { color: #bb6688; } \ncode span.st { color: #4070a0; } \ncode span.va { color: #19177c; } \ncode span.vs { color: #4070a0; } \ncode span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } \n</style>\n<script>\n// apply pandoc div.sourceCode style to pre.sourceCode instead\n(function() {\n  var sheets = document.styleSheets;\n  for (var i = 0; i < sheets.length; i++) {\n    if (sheets[i].ownerNode.dataset[\"origin\"] !== \"pandoc\") continue;\n    try { var rules = sheets[i].cssRules; } catch (e) { continue; }\n    var j = 0;\n    while (j < rules.length) {\n      var rule = rules[j];\n      // check if there is a div.sourceCode rule\n      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== \"div.sourceCode\") {\n        j++;\n        continue;\n      }\n      var style = rule.style.cssText;\n      // check if color or background-color is set\n      if (rule.style.color === '' && rule.style.backgroundColor === '') {\n        j++;\n        continue;\n      }\n      // replace div.sourceCode by a pre.sourceCode rule\n      sheets[i].deleteRule(j);\n      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);\n    }\n  }\n})();\n</script>\n\n\n\n\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n\n\n\n\n</head>\n\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">State-Space models in mvgam</h1>\n<h4 class=\"author\">Nicholas J Clark</h4>\n<h4 class=\"date\">2026-01-19</h4>\n\n\n<div id=\"TOC\">\n<ul>\n<li><a href=\"#state-space-models\" id=\"toc-state-space-models\">State-Space Models</a>\n<ul>\n<li><a href=\"#lake-washington-plankton-data\" id=\"toc-lake-washington-plankton-data\">Lake Washington plankton\ndata</a></li>\n<li><a href=\"#capturing-seasonality\" id=\"toc-capturing-seasonality\">Capturing seasonality</a></li>\n<li><a href=\"#multiseries-dynamics\" id=\"toc-multiseries-dynamics\">Multiseries dynamics</a></li>\n<li><a href=\"#inspecting-ss-models\" id=\"toc-inspecting-ss-models\">Inspecting SS models</a></li>\n<li><a href=\"#correlated-process-errors\" id=\"toc-correlated-process-errors\">Correlated process errors</a></li>\n<li><a href=\"#impulse-response-functions\" id=\"toc-impulse-response-functions\">Impulse response functions</a></li>\n<li><a href=\"#comparing-forecast-scores\" id=\"toc-comparing-forecast-scores\">Comparing forecast scores</a></li>\n</ul></li>\n<li><a href=\"#further-reading\" id=\"toc-further-reading\">Further\nreading</a></li>\n<li><a href=\"#interested-in-contributing\" id=\"toc-interested-in-contributing\">Interested in contributing?</a></li>\n</ul>\n</div>\n\n<p>The purpose of this vignette is to show how the <code>mvgam</code>\npackage can be used to fit and interrogate State-Space models with\nnonlinear effects.</p>\n<div id=\"state-space-models\" class=\"section level2\">\n<h2>State-Space Models</h2>\n<div class=\"float\">\n<img role=\"img\" aria-label=\"Illustration of a basic State-Space model, which assumes that a latent dynamic process (X) can evolve independently from the way we take observations (Y) of that process\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgc3R5bGU9Im92ZXJmbG93OmhpZGRlbiIKICAgaWQ9InN2ZzgxIgogICB2ZXJzaW9uPSIxLjEiCiAgIG92ZXJmbG93PSJoaWRkZW4iCiAgIGhlaWdodD0iMzI0LjUwNzA1IgogICB3aWR0aD0iOTQ1LjM1MjExIgogICBzb2RpcG9kaTpkb2NuYW1lPSJTU19tb2RlbC5zdmciCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuNCAoNWRhNjg5YzMxMywgMjAxOS0wMS0xNCkiPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDE3IgogICAgIGlkPSJuYW1lZHZpZXc0MiIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMS42OTk0MTYxIgogICAgIGlua3NjYXBlOmN4PSI0NzkuMzkzNjYiCiAgICAgaW5rc2NhcGU6Y3k9IjE1Ny4yMTc4MyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnODEiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhODUiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM1Ij4KICAgIDxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXAwIj4KICAgICAgPHJlY3QKICAgICAgICAgaWQ9InJlY3QyIgogICAgICAgICBoZWlnaHQ9IjcyMCIKICAgICAgICAgd2lkdGg9IjEyODAiCiAgICAgICAgIHk9IjAiCiAgICAgICAgIHg9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogIDwvZGVmcz4KICA8cGF0aAogICAgIGQ9Im0gMzE4LjAxNDA4LDEyMS40OTUgMC4xNzUsNTMuNDAxIC0zLDAuMDEgLTAuMTc1LC01My40MDEgeiBtIDMuMTcsNTEuODkxIC00LjQ3LDkuMDE1IC00LjUyOSwtOC45ODYgeiIKICAgICBpZD0icGF0aDkiIC8+CiAgPHBhdGgKICAgICBkPSJtIDYwNi4wMTQwOCwxMjEuNDk1IDAuMTc1LDUzLjQwMSAtMywwLjAxIC0wLjE3NSwtNTMuNDAxIHogbSAzLjE3LDUxLjg5MSAtNC40Nyw5LjAxNSAtNC41MjksLTguOTg2IHoiCiAgICAgaWQ9InBhdGgxMSIgLz4KICA8cGF0aAogICAgIGQ9Im0gODUwLjAxNDA4LDEyMC40OTUgMC4xNzUsNTMuNDAxIC0zLDAuMDEgLTAuMTc1LC01My40MDEgeiBtIDMuMTcsNTEuODkxIC00LjQ3LDkuMDE1IC00LjUyOSwtOC45ODYgeiIKICAgICBpZD0icGF0aDEzIiAvPgogIDxwYXRoCiAgICAgZD0ibSA3NTMuNTE0MDgsNzEgMzQuMSw5ZS01IHYgMyBsIC0zNC4xLC05ZS01IHogbSAzMi42LC0yLjk5OTkyIDksNC41MDAwMjUgLTksNC40OTk5NzUgeiIKICAgICBpZD0icGF0aDE1IgogICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgPHBhdGgKICAgICBkPSJtIDM2Ny41MTQwOCw3MSBoIDI2LjkgdiAzIGggLTI2LjkgeiBtIDI1LjQsLTMgOSw0LjUgLTksNC41IHoiCiAgICAgaWQ9InBhdGgxNyIgLz4KICA8cGF0aAogICAgIGQ9Im0gNTExLjUxNDA4LDcxIGggMjYuOSB2IDMgaCAtMjYuOSB6IG0gMjUuNCwtMyA5LDQuNSAtOSw0LjUgeiIKICAgICBpZD0icGF0aDE5IiAvPgogIDxwYXRoCiAgICAgZD0ibSA2NTIuNTE0MDgsNzIgaCAyNi45IHYgMyBoIC0yNi45IHogbSAyNS40LC0zIDksNC41IC05LDQuNSB6IgogICAgIGlkPSJwYXRoMjEiIC8+CiAgPHBhdGgKICAgICBkPSJtIDcyMi4wMTQwOCwxMjIuNDk1IDAuMDM5LDEyIC0zLDAuMDEgLTAuMDM5LC0xMiB6IG0gMC4wNjksMjEgMC4wMzksMTIgLTMsMC4wMSAtMC4wMzksLTEyIHogbSAwLjA2OSwyMSAwLjAzNywxMS40MDEgLTMsMC4wMSAtMC4wMzcsLTExLjQwMSB6IG0gMy4wMzIsOS44OTEgLTQuNDcsOS4wMTUgLTQuNTI5LC04Ljk4NiB6IgogICAgIGlkPSJwYXRoMjMiIC8+CiAgPHBhdGgKICAgICBkPSJtIDI2NS4wMTQwOCw3MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDI1IgogICAgIHN0eWxlPSJmaWxsOiNlN2U2ZTY7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSI4MyIKICAgICB4PSIzMDIuMjE0MDgiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0MjciCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlg8L3RleHQ+CiAgPHRleHQKICAgICB5PSI5MSIKICAgICB4PSIzMjUuMDQ3MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0MjkiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPjE8L3RleHQ+CiAgPHBhdGgKICAgICBkPSJtIDQwOS4wMTQwOCw3MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDMxIgogICAgIHN0eWxlPSJmaWxsOiNlN2U2ZTY7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSI4MyIKICAgICB4PSI0NDUuODE0MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0MzMiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlg8L3RleHQ+CiAgPHRleHQKICAgICB5PSI5MSIKICAgICB4PSI0NjguNjQ3MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0MzUiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPjI8L3RleHQ+CiAgPHBhdGgKICAgICBkPSJtIDc5Ny4wMTQwOCw3MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDM3IgogICAgIHN0eWxlPSJmaWxsOiNlN2U2ZTY7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSI4MyIKICAgICB4PSI4MzQuNjE0MDciCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0MzkiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlg8L3RleHQ+CiAgPHRleHQKICAgICB5PSI5MSIKICAgICB4PSI4NTcuNDQ3MDgiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NDEiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPlQ8L3RleHQ+CiAgPHRleHQKICAgICB5PSI3NCIKICAgICB4PSI3MDguMzE0MDkiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjM1IgogICAgIGlkPSJ0ZXh0NDMiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MzVweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWYiPuKApjwvdGV4dD4KICA8cGF0aAogICAgIGQ9Im0gNTUzLjAxNDA4LDcyIGMgMCwtMjguMTY3IDIyLjgzMywtNTEgNTEsLTUxIDI4LjE2NywwIDUxLDIyLjgzMyA1MSw1MSAwLDI4LjE2NyAtMjIuODMzLDUxIC01MSw1MSAtMjguMTY3LDAgLTUxLC0yMi44MzMgLTUxLC01MSB6IgogICAgIGlkPSJwYXRoNDUiCiAgICAgc3R5bGU9ImZpbGw6I2U3ZTZlNjtmaWxsLXJ1bGU6ZXZlbm9kZCIgLz4KICA8dGV4dAogICAgIHk9Ijg1IgogICAgIHg9IjU5MC4xMTQwNyIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMzUiCiAgICAgaWQ9InRleHQ0NyIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZTozNXB4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+WDwvdGV4dD4KICA8dGV4dAogICAgIHk9IjkzIgogICAgIHg9IjYxMi45NDcwOCIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMjMiCiAgICAgaWQ9InRleHQ0OSIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToyM3B4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+MzwvdGV4dD4KICA8cGF0aAogICAgIGQ9Im0gMjY1LjAxNDA4LDI0MSBjIDAsLTI4LjE2NyAyMi44MzMsLTUxIDUxLC01MSAyOC4xNjcsMCA1MSwyMi44MzMgNTEsNTEgMCwyOC4xNjcgLTIyLjgzMyw1MSAtNTEsNTEgLTI4LjE2NywwIC01MSwtMjIuODMzIC01MSwtNTEgeiIKICAgICBpZD0icGF0aDUxIgogICAgIHN0eWxlPSJmaWxsOiNjMDAwMDA7ZmlsbC1ydWxlOmV2ZW5vZGQiIC8+CiAgPHRleHQKICAgICB5PSIyNTQiCiAgICAgeD0iMzAyLjIxNDA4IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIzNSIKICAgICBpZD0idGV4dDUzIgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjM1cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmO2ZpbGw6I2ZmZmZmZiI+WTwvdGV4dD4KICA8dGV4dAogICAgIHk9IjI2MiIKICAgICB4PSIzMjIuNzE0MDgiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NTUiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWY7ZmlsbDojZmZmZmZmIj4xPC90ZXh0PgogIDxwYXRoCiAgICAgZD0ibSA1NTMuMDE0MDgsMjQxIGMgMCwtMjguMTY3IDIyLjgzMywtNTEgNTEsLTUxIDI4LjE2NywwIDUxLDIyLjgzMyA1MSw1MSAwLDI4LjE2NyAtMjIuODMzLDUxIC01MSw1MSAtMjguMTY3LDAgLTUxLC0yMi44MzMgLTUxLC01MSB6IgogICAgIGlkPSJwYXRoNTciCiAgICAgc3R5bGU9ImZpbGw6I2MwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZCIgLz4KICA8cmVjdAogICAgIHg9IjU4MC4wMTQxIgogICAgIHk9IjIxNyIKICAgICB3aWR0aD0iNTgiCiAgICAgaGVpZ2h0PSI1MSIKICAgICBpZD0icmVjdDU5IgogICAgIHN0eWxlPSJmaWxsOiNjMDAwMDAiIC8+CiAgPHRleHQKICAgICB5PSIyNTQiCiAgICAgeD0iNTkwLjExNDA3IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIzNSIKICAgICBpZD0idGV4dDYxIgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjM1cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmO2ZpbGw6I2ZmZmZmZiI+WTwvdGV4dD4KICA8dGV4dAogICAgIHk9IjI2MiIKICAgICB4PSI2MTAuNjE0MDciCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NjMiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWY7ZmlsbDojZmZmZmZmIj4zPC90ZXh0PgogIDxwYXRoCiAgICAgZD0ibSA3OTcuMDE0MDgsMjQxIGMgMCwtMjguMTY3IDIyLjgzMywtNTEgNTEsLTUxIDI4LjE2NywwIDUxLDIyLjgzMyA1MSw1MSAwLDI4LjE2NyAtMjIuODMzLDUxIC01MSw1MSAtMjguMTY3LDAgLTUxLC0yMi44MzMgLTUxLC01MSB6IgogICAgIGlkPSJwYXRoNjUiCiAgICAgc3R5bGU9ImZpbGw6I2MwMDAwMDtmaWxsLXJ1bGU6ZXZlbm9kZCIgLz4KICA8cmVjdAogICAgIHg9IjgyNS4wMTQxIgogICAgIHk9IjIxNyIKICAgICB3aWR0aD0iNTgiCiAgICAgaGVpZ2h0PSI1MSIKICAgICBpZD0icmVjdDY3IgogICAgIHN0eWxlPSJmaWxsOiNjMDAwMDAiIC8+CiAgPHRleHQKICAgICB5PSIyNTQiCiAgICAgeD0iODM0LjYxNDA3IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIzNSIKICAgICBpZD0idGV4dDY5IgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjM1cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmO2ZpbGw6I2ZmZmZmZiI+WTwvdGV4dD4KICA8dGV4dAogICAgIHk9IjI2MiIKICAgICB4PSI4NTUuOTYxMDYiCiAgICAgZm9udC13ZWlnaHQ9IjQwMCIKICAgICBmb250LXNpemU9IjIzIgogICAgIGlkPSJ0ZXh0NzEiCiAgICAgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MjNweDtmb250LWZhbWlseTpDb25zdGFudGlhLCBDb25zdGFudGlhX01TRm9udFNlcnZpY2UsIHNhbnMtc2VyaWY7ZmlsbDojZmZmZmZmIj5UPC90ZXh0PgogIDx0ZXh0CiAgICAgeT0iMjUwIgogICAgIHg9IjcwOC4zMTQwOSIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMzUiCiAgICAgaWQ9InRleHQ3MyIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZTozNXB4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+4oCmPC90ZXh0PgogIDx0ZXh0CiAgICAgeT0iNzciCiAgICAgeD0iOTMuNDE0MDg1IgogICAgIGZvbnQtd2VpZ2h0PSI0MDAiCiAgICAgZm9udC1zaXplPSIyNCIKICAgICBpZD0idGV4dDc1IgogICAgIHN0eWxlPSJmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjI0cHg7Zm9udC1mYW1pbHk6Q29uc3RhbnRpYSwgQ29uc3RhbnRpYV9NU0ZvbnRTZXJ2aWNlLCBzYW5zLXNlcmlmIj5Qcm9jZXNzIG1vZGVsPC90ZXh0PgogIDx0ZXh0CiAgICAgeT0iMjUwIgogICAgIHg9IjQ2LjYxNDA4MiIKICAgICBmb250LXdlaWdodD0iNDAwIgogICAgIGZvbnQtc2l6ZT0iMjQiCiAgICAgaWQ9InRleHQ3NyIKICAgICBzdHlsZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtZmFtaWx5OkNvbnN0YW50aWEsIENvbnN0YW50aWFfTVNGb250U2VydmljZSwgc2Fucy1zZXJpZiI+T2JzZXJ2YXRpb24gbW9kZWw8L3RleHQ+Cjwvc3ZnPgo=\" style=\"width:85.0%\" alt=\"Illustration of a basic State-Space model, which assumes that a latent dynamic process (X) can evolve independently from the way we take observations (Y) of that process\" />\n<div class=\"figcaption\">Illustration of a basic State-Space model, which\nassumes that a latent dynamic <em>process</em> (X) can evolve\nindependently from the way we take <em>observations</em> (Y) of that\nprocess</div>\n</div>\n<p><br></p>\n<p>State-Space models allow us to separately make inferences about the\nunderlying dynamic <em>process model</em> that we are interested in\n(i.e. the evolution of a time series or a collection of time series) and\nthe <em>observation model</em> (i.e. the way that we survey / measure\nthis underlying process). This is extremely useful in ecology because\nour observations are always imperfect / noisy measurements of the thing\nwe are interested in measuring. It is also helpful because we often know\nthat some covariates will impact our ability to measure accurately\n(i.e. we cannot take accurate counts of rodents if there is a\nthunderstorm happening) while other covariates might impact the\nunderlying process (it is highly unlikely that rodent abundance responds\nto one storm, but instead probably responds to longer-term weather and\nclimate variation). A State-Space model allows us to model both\ncomponents in a single unified modelling framework. A major advantage of\n<code>mvgam</code> is that it can include nonlinear effects and random\neffects in BOTH model components while also capturing dynamic\nprocesses.</p>\n<div id=\"lake-washington-plankton-data\" class=\"section level3\">\n<h3>Lake Washington plankton data</h3>\n<p>The data we will use to illustrate how we can fit State-Space models\nin <code>mvgam</code> are from a long-term monitoring study of plankton\ncounts (cells per mL) taken from Lake Washington in Washington, USA. The\ndata are available as part of the <code>MARSS</code> package and can be\ndownloaded using the following:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"fu\">load</span>(<span class=\"fu\">url</span>(<span class=\"st\">&quot;https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda&quot;</span>))</span></code></pre></div>\n<p>We will work with five different groups of plankton:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb2-1\"><a href=\"#cb2-1\" tabindex=\"-1\"></a>outcomes <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(<span class=\"st\">&quot;Greens&quot;</span>, <span class=\"st\">&quot;Bluegreens&quot;</span>, <span class=\"st\">&quot;Diatoms&quot;</span>, <span class=\"st\">&quot;Unicells&quot;</span>, <span class=\"st\">&quot;Other.algae&quot;</span>)</span></code></pre></div>\n<p>As usual, preparing the data into the correct format for\n<code>mvgam</code> modelling takes a little bit of wrangling in\n<code>dplyr</code>:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb3-1\"><a href=\"#cb3-1\" tabindex=\"-1\"></a><span class=\"co\"># loop across each plankton group to create the long datframe</span></span>\n<span id=\"cb3-2\"><a href=\"#cb3-2\" tabindex=\"-1\"></a>plankton_data <span class=\"ot\">&lt;-</span> <span class=\"fu\">do.call</span>(rbind, <span class=\"fu\">lapply</span>(outcomes, <span class=\"cf\">function</span>(x) {</span>\n<span id=\"cb3-3\"><a href=\"#cb3-3\" tabindex=\"-1\"></a>  <span class=\"co\"># create a group-specific dataframe with counts labelled &#39;y&#39;</span></span>\n<span id=\"cb3-4\"><a href=\"#cb3-4\" tabindex=\"-1\"></a>  <span class=\"co\"># and the group name in the &#39;series&#39; variable</span></span>\n<span id=\"cb3-5\"><a href=\"#cb3-5\" tabindex=\"-1\"></a>  <span class=\"fu\">data.frame</span>(</span>\n<span id=\"cb3-6\"><a href=\"#cb3-6\" tabindex=\"-1\"></a>    <span class=\"at\">year =</span> lakeWAplanktonTrans[, <span class=\"st\">&quot;Year&quot;</span>],</span>\n<span id=\"cb3-7\"><a href=\"#cb3-7\" tabindex=\"-1\"></a>    <span class=\"at\">month =</span> lakeWAplanktonTrans[, <span class=\"st\">&quot;Month&quot;</span>],</span>\n<span id=\"cb3-8\"><a href=\"#cb3-8\" tabindex=\"-1\"></a>    <span class=\"at\">y =</span> lakeWAplanktonTrans[, x],</span>\n<span id=\"cb3-9\"><a href=\"#cb3-9\" tabindex=\"-1\"></a>    <span class=\"at\">series =</span> x,</span>\n<span id=\"cb3-10\"><a href=\"#cb3-10\" tabindex=\"-1\"></a>    <span class=\"at\">temp =</span> lakeWAplanktonTrans[, <span class=\"st\">&quot;Temp&quot;</span>]</span>\n<span id=\"cb3-11\"><a href=\"#cb3-11\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb3-12\"><a href=\"#cb3-12\" tabindex=\"-1\"></a>})) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-13\"><a href=\"#cb3-13\" tabindex=\"-1\"></a>  <span class=\"co\"># change the &#39;series&#39; label to a factor</span></span>\n<span id=\"cb3-14\"><a href=\"#cb3-14\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">series =</span> <span class=\"fu\">factor</span>(series)) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-15\"><a href=\"#cb3-15\" tabindex=\"-1\"></a>  <span class=\"co\"># filter to only include some years in the data</span></span>\n<span id=\"cb3-16\"><a href=\"#cb3-16\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(year <span class=\"sc\">&gt;=</span> <span class=\"dv\">1965</span> <span class=\"sc\">&amp;</span> year <span class=\"sc\">&lt;</span> <span class=\"dv\">1975</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-17\"><a href=\"#cb3-17\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">arrange</span>(year, month) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-18\"><a href=\"#cb3-18\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">group_by</span>(series) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-19\"><a href=\"#cb3-19\" tabindex=\"-1\"></a>  <span class=\"co\"># z-score the counts so they are approximately standard normal</span></span>\n<span id=\"cb3-20\"><a href=\"#cb3-20\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">y =</span> <span class=\"fu\">as.vector</span>(<span class=\"fu\">scale</span>(y))) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-21\"><a href=\"#cb3-21\" tabindex=\"-1\"></a>  <span class=\"co\"># add the time indicator</span></span>\n<span id=\"cb3-22\"><a href=\"#cb3-22\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">mutate</span>(<span class=\"at\">time =</span> dplyr<span class=\"sc\">::</span><span class=\"fu\">row_number</span>()) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb3-23\"><a href=\"#cb3-23\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">ungroup</span>()</span></code></pre></div>\n<p>Inspect the data structure</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb4-1\"><a href=\"#cb4-1\" tabindex=\"-1\"></a><span class=\"fu\">head</span>(plankton_data)</span>\n<span id=\"cb4-2\"><a href=\"#cb4-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; # A tibble: 6 × 6</span></span>\n<span id=\"cb4-3\"><a href=\"#cb4-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    year month       y series       temp  time</span></span>\n<span id=\"cb4-4\"><a href=\"#cb4-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt; &lt;fct&gt;       &lt;dbl&gt; &lt;int&gt;</span></span>\n<span id=\"cb4-5\"><a href=\"#cb4-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 1  1965     1 -0.542  Greens      -1.23     1</span></span>\n<span id=\"cb4-6\"><a href=\"#cb4-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 2  1965     1 -0.344  Bluegreens  -1.23     1</span></span>\n<span id=\"cb4-7\"><a href=\"#cb4-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 3  1965     1 -0.0768 Diatoms     -1.23     1</span></span>\n<span id=\"cb4-8\"><a href=\"#cb4-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4  1965     1 -1.52   Unicells    -1.23     1</span></span>\n<span id=\"cb4-9\"><a href=\"#cb4-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5  1965     1 -0.491  Other.algae -1.23     1</span></span>\n<span id=\"cb4-10\"><a href=\"#cb4-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 6  1965     2 NA      Greens      -1.32     2</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb5-1\"><a href=\"#cb5-1\" tabindex=\"-1\"></a>dplyr<span class=\"sc\">::</span><span class=\"fu\">glimpse</span>(plankton_data)</span>\n<span id=\"cb5-2\"><a href=\"#cb5-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Rows: 600</span></span>\n<span id=\"cb5-3\"><a href=\"#cb5-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Columns: 6</span></span>\n<span id=\"cb5-4\"><a href=\"#cb5-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ year   &lt;dbl&gt; 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 196…</span></span>\n<span id=\"cb5-5\"><a href=\"#cb5-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ month  &lt;dbl&gt; 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, …</span></span>\n<span id=\"cb5-6\"><a href=\"#cb5-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ y      &lt;dbl&gt; -0.54241769, -0.34410776, -0.07684901, -1.52243490, -0.49055442…</span></span>\n<span id=\"cb5-7\"><a href=\"#cb5-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ series &lt;fct&gt; Greens, Bluegreens, Diatoms, Unicells, Other.algae, Greens, Blu…</span></span>\n<span id=\"cb5-8\"><a href=\"#cb5-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ temp   &lt;dbl&gt; -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.2306562, -1.…</span></span>\n<span id=\"cb5-9\"><a href=\"#cb5-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; $ time   &lt;int&gt; 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, …</span></span></code></pre></div>\n<p>Note that we have z-scored the counts in this example as that will\nmake it easier to specify priors (though this is not completely\nnecessary; it is often better to build a model that respects the\nproperties of the actual outcome variables)</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb6-1\"><a href=\"#cb6-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_series</span>(<span class=\"at\">data =</span> plankton_data, <span class=\"at\">series =</span> <span class=\"st\">&quot;all&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We have some missing observations, but this isn’t an issue for\nmodelling in <code>mvgam</code>. A useful property to understand about\nthese counts is that they tend to be highly seasonal. Below are some\nplots of z-scored counts against the z-scored temperature measurements\nin the lake for each month:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb7-1\"><a href=\"#cb7-1\" tabindex=\"-1\"></a>plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb7-2\"><a href=\"#cb7-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;Other.algae&quot;</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb7-3\"><a href=\"#cb7-3\" tabindex=\"-1\"></a>  <span class=\"fu\">ggplot</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> temp)) <span class=\"sc\">+</span></span>\n<span id=\"cb7-4\"><a href=\"#cb7-4\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"at\">size =</span> <span class=\"fl\">1.1</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb7-5\"><a href=\"#cb7-5\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb7-6\"><a href=\"#cb7-6\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>,</span>\n<span id=\"cb7-7\"><a href=\"#cb7-7\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.3</span></span>\n<span id=\"cb7-8\"><a href=\"#cb7-8\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb7-9\"><a href=\"#cb7-9\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb7-10\"><a href=\"#cb7-10\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb7-11\"><a href=\"#cb7-11\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.1</span></span>\n<span id=\"cb7-12\"><a href=\"#cb7-12\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb7-13\"><a href=\"#cb7-13\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;z-score&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb7-14\"><a href=\"#cb7-14\" tabindex=\"-1\"></a>  <span class=\"fu\">xlab</span>(<span class=\"st\">&quot;Time&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb7-15\"><a href=\"#cb7-15\" tabindex=\"-1\"></a>  <span class=\"fu\">ggtitle</span>(<span class=\"st\">&quot;Temperature (black) vs Other algae (red)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb8-1\"><a href=\"#cb8-1\" tabindex=\"-1\"></a>plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb8-2\"><a href=\"#cb8-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(series <span class=\"sc\">==</span> <span class=\"st\">&quot;Diatoms&quot;</span>) <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb8-3\"><a href=\"#cb8-3\" tabindex=\"-1\"></a>  <span class=\"fu\">ggplot</span>(<span class=\"fu\">aes</span>(<span class=\"at\">x =</span> time, <span class=\"at\">y =</span> temp)) <span class=\"sc\">+</span></span>\n<span id=\"cb8-4\"><a href=\"#cb8-4\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"at\">size =</span> <span class=\"fl\">1.1</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb8-5\"><a href=\"#cb8-5\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb8-6\"><a href=\"#cb8-6\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;white&quot;</span>,</span>\n<span id=\"cb8-7\"><a href=\"#cb8-7\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.3</span></span>\n<span id=\"cb8-8\"><a href=\"#cb8-8\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb8-9\"><a href=\"#cb8-9\" tabindex=\"-1\"></a>  <span class=\"fu\">geom_line</span>(<span class=\"fu\">aes</span>(<span class=\"at\">y =</span> y),</span>\n<span id=\"cb8-10\"><a href=\"#cb8-10\" tabindex=\"-1\"></a>    <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb8-11\"><a href=\"#cb8-11\" tabindex=\"-1\"></a>    <span class=\"at\">size =</span> <span class=\"fl\">1.1</span></span>\n<span id=\"cb8-12\"><a href=\"#cb8-12\" tabindex=\"-1\"></a>  ) <span class=\"sc\">+</span></span>\n<span id=\"cb8-13\"><a href=\"#cb8-13\" tabindex=\"-1\"></a>  <span class=\"fu\">ylab</span>(<span class=\"st\">&quot;z-score&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb8-14\"><a href=\"#cb8-14\" tabindex=\"-1\"></a>  <span class=\"fu\">xlab</span>(<span class=\"st\">&quot;Time&quot;</span>) <span class=\"sc\">+</span></span>\n<span id=\"cb8-15\"><a href=\"#cb8-15\" tabindex=\"-1\"></a>  <span class=\"fu\">ggtitle</span>(<span class=\"st\">&quot;Temperature (black) vs Diatoms (red)&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>We will have to try and capture this seasonality in our process\nmodel, which should be easy to do given the flexibility of GAMs. Next we\nwill split the data into training and testing splits:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb9-1\"><a href=\"#cb9-1\" tabindex=\"-1\"></a>plankton_train <span class=\"ot\">&lt;-</span> plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-2\"><a href=\"#cb9-2\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&lt;=</span> <span class=\"dv\">112</span>)</span>\n<span id=\"cb9-3\"><a href=\"#cb9-3\" tabindex=\"-1\"></a>plankton_test <span class=\"ot\">&lt;-</span> plankton_data <span class=\"sc\">%&gt;%</span></span>\n<span id=\"cb9-4\"><a href=\"#cb9-4\" tabindex=\"-1\"></a>  dplyr<span class=\"sc\">::</span><span class=\"fu\">filter</span>(time <span class=\"sc\">&gt;</span> <span class=\"dv\">112</span>)</span></code></pre></div>\n<p>Now time to fit some models. This requires a bit of thinking about\nhow we can best tackle the seasonal variation and the likely dependence\nstructure in the data. These algae are interacting as part of a complex\nsystem within the same lake, so we certainly expect there to be some\nlagged cross-dependencies underling their dynamics. But if we do not\ncapture the seasonal variation, our multivariate dynamic model will be\nforced to try and capture it, which could lead to poor convergence and\nunstable results (we could feasibly capture cyclic dynamics with a more\ncomplex multi-species Lotka-Volterra model, but ordinary differential\nequation approaches are beyond the scope of <code>mvgam</code>).</p>\n</div>\n<div id=\"capturing-seasonality\" class=\"section level3\">\n<h3>Capturing seasonality</h3>\n<p>First we will fit a model that does not include a dynamic component,\njust to see if it can reproduce the seasonal variation in the\nobservations. This model introduces hierarchical multidimensional\nsmooths, where all time series share a “global” tensor product of the\n<code>month</code> and <code>temp</code> variables, capturing our\nexpectation that algal seasonality responds to temperature variation.\nBut this response should depend on when in the year these temperatures\nare recorded (i.e. a response to warm temperatures in Spring should be\ndifferent to a response to warm temperatures in Autumn). The model also\nfits series-specific deviation smooths (i.e. one tensor product per\nseries) to capture how each algal group’s seasonality differs from the\noverall “global” seasonality. Note that we do not include\nseries-specific intercepts in this model because each series was\nz-scored to have a mean of 0.</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb10-1\"><a href=\"#cb10-1\" tabindex=\"-1\"></a>notrend_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb10-2\"><a href=\"#cb10-2\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span></span>\n<span id=\"cb10-3\"><a href=\"#cb10-3\" tabindex=\"-1\"></a>    <span class=\"co\"># tensor of temp and month to capture</span></span>\n<span id=\"cb10-4\"><a href=\"#cb10-4\" tabindex=\"-1\"></a>    <span class=\"co\"># &quot;global&quot; seasonality</span></span>\n<span id=\"cb10-5\"><a href=\"#cb10-5\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb10-6\"><a href=\"#cb10-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb10-7\"><a href=\"#cb10-7\" tabindex=\"-1\"></a>    <span class=\"co\"># series-specific deviation tensor products</span></span>\n<span id=\"cb10-8\"><a href=\"#cb10-8\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> series) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb10-9\"><a href=\"#cb10-9\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb10-10\"><a href=\"#cb10-10\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train,</span>\n<span id=\"cb10-11\"><a href=\"#cb10-11\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> plankton_test,</span>\n<span id=\"cb10-12\"><a href=\"#cb10-12\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"st\">&quot;None&quot;</span></span>\n<span id=\"cb10-13\"><a href=\"#cb10-13\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The “global” tensor product smooth function can be quickly\nvisualized:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb11-1\"><a href=\"#cb11-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(notrend_mod, <span class=\"at\">smooth =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>On this plot, red indicates below-average linear predictors and white\nindicates above-average. We can then plot the deviation smooths for a\nfew algal groups to see how they vary from the “global” pattern:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb12-1\"><a href=\"#cb12-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(notrend_mod, <span class=\"at\">smooth =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb13-1\"><a href=\"#cb13-1\" tabindex=\"-1\"></a><span class=\"fu\">plot_mvgam_smooth</span>(notrend_mod, <span class=\"at\">smooth =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>These multidimensional smooths have done a good job of capturing the\nseasonal variation in our observations:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb14-1\"><a href=\"#cb14-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb15-1\"><a href=\"#cb15-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">2</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb16-1\"><a href=\"#cb16-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;forecast&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This basic model gives us confidence that we can capture the seasonal\nvariation in the observations. But the model has not captured the\nremaining temporal dynamics, which is obvious when we inspect Dunn-Smyth\nresiduals for a few series:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb17-1\"><a href=\"#cb17-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;residuals&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">1</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb18-1\"><a href=\"#cb18-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(notrend_mod, <span class=\"at\">type =</span> <span class=\"st\">&quot;residuals&quot;</span>, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n</div>\n<div id=\"multiseries-dynamics\" class=\"section level3\">\n<h3>Multiseries dynamics</h3>\n<p>Now it is time to get into multivariate State-Space models. We will\nfit two models that can both incorporate lagged cross-dependencies in\nthe latent process models. The first model assumes that the process\nerrors operate independently from one another, while the second assumes\nthat there may be contemporaneous correlations in the process errors.\nBoth models include a Vector Autoregressive component for the process\nmeans, and so both can model complex community dynamics. The models can\nbe described mathematically as follows:</p>\n<p><span class=\"math display\">\\[\\begin{align*}\n\\boldsymbol{count}_t &amp; \\sim \\text{Normal}(\\mu_{obs[t]},\n\\sigma_{obs}) \\\\\n\\mu_{obs[t]} &amp; = process_t \\\\\nprocess_t &amp; \\sim \\text{MVNormal}(\\mu_{process[t]}, \\Sigma_{process})\n\\\\\n\\mu_{process[t]} &amp; = A * process_{t-1} +\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp})_t +\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp})_t \\\\\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp}) &amp; =\n\\sum_{k=1}^{K}b_{global} * \\beta_{global} \\\\\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp}) &amp; =\n\\sum_{k=1}^{K}b_{series} * \\beta_{series} \\end{align*}\\]</span></p>\n<p>Here you can see that there are no terms in the observation model\napart from the underlying process model. But we could easily add\ncovariates into the observation model if we felt that they could explain\nsome of the systematic observation errors. We also assume independent\nobservation processes (there is no covariance structure in the\nobservation errors <span class=\"math inline\">\\(\\sigma_{obs}\\)</span>).\nAt present, <code>mvgam</code> does not support multivariate observation\nmodels. But this feature will be added in future versions. However the\nunderlying process model is multivariate, and there is a lot going on\nhere. This component has a Vector Autoregressive part, where the process\nmean at time <span class=\"math inline\">\\(t\\)</span> <span class=\"math inline\">\\((\\mu_{process[t]})\\)</span> is a vector that\nevolves as a function of where the vector-valued process model was at\ntime <span class=\"math inline\">\\(t-1\\)</span>. The <span class=\"math inline\">\\(A\\)</span> matrix captures these dynamics with\nself-dependencies on the diagonal and possibly asymmetric\ncross-dependencies on the off-diagonals, while also incorporating the\nnonlinear smooth functions that capture seasonality for each series. The\ncontemporaneous process errors are modeled by <span class=\"math inline\">\\(\\Sigma_{process}\\)</span>, which can be\nconstrained so that process errors are independent (i.e. setting the\noff-diagonals to 0) or can be fully parameterized using a Cholesky\ndecomposition (using <code>Stan</code>’s <span class=\"math inline\">\\(LKJcorr\\)</span> distribution to place a prior on\nthe strength of inter-species correlations). For those that are\ninterested in the inner-workings, <code>mvgam</code> makes use of a\nrecent breakthrough by <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Sarah\nHeaps to enforce stationarity of Bayesian VAR processes</a>. This is\nadvantageous as we often don’t expect forecast variance to increase\nwithout bound forever into the future, but many estimated VARs tend to\nbehave this way.</p>\n<p><br> Ok that was a lot to take in. Let’s fit some models to try and\ninspect what is going on and what they assume. But first, we need to\nupdate <code>mvgam</code>’s default priors for the observation and\nprocess errors. By default, <code>mvgam</code> uses a fairly wide\nStudent-T prior on these parameters to avoid being overly informative.\nBut our observations are z-scored and so we do not expect very large\nprocess or observation errors. However, we also do not expect very small\nobservation errors either as we know these measurements are not perfect.\nSo let’s update the priors for these parameters. In doing so, you will\nget to see how the formula for the latent process (i.e. trend) model is\nused in <code>mvgam</code>:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb19-1\"><a href=\"#cb19-1\" tabindex=\"-1\"></a>priors <span class=\"ot\">&lt;-</span> <span class=\"fu\">get_mvgam_priors</span>(</span>\n<span id=\"cb19-2\"><a href=\"#cb19-2\" tabindex=\"-1\"></a>  <span class=\"co\"># observation formula, which has no terms in it</span></span>\n<span id=\"cb19-3\"><a href=\"#cb19-3\" tabindex=\"-1\"></a>  y <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"dv\">1</span>,</span>\n<span id=\"cb19-4\"><a href=\"#cb19-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb19-5\"><a href=\"#cb19-5\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span id=\"cb19-6\"><a href=\"#cb19-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb19-7\"><a href=\"#cb19-7\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> trend) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb19-8\"><a href=\"#cb19-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb19-9\"><a href=\"#cb19-9\" tabindex=\"-1\"></a>  <span class=\"co\"># VAR1 model with uncorrelated process errors</span></span>\n<span id=\"cb19-10\"><a href=\"#cb19-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">VAR</span>(),</span>\n<span id=\"cb19-11\"><a href=\"#cb19-11\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb19-12\"><a href=\"#cb19-12\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train</span>\n<span id=\"cb19-13\"><a href=\"#cb19-13\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>Get names of all parameters whose priors can be modified:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb20-1\"><a href=\"#cb20-1\" tabindex=\"-1\"></a>priors[, <span class=\"dv\">3</span>]</span>\n<span id=\"cb20-2\"><a href=\"#cb20-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [1] &quot;(Intercept)&quot;                                                                                                                                                                                                                                                           </span></span>\n<span id=\"cb20-3\"><a href=\"#cb20-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [2] &quot;process error sd&quot;                                                                                                                                                                                                                                                      </span></span>\n<span id=\"cb20-4\"><a href=\"#cb20-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [3] &quot;diagonal autocorrelation population mean&quot;                                                                                                                                                                                                                              </span></span>\n<span id=\"cb20-5\"><a href=\"#cb20-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [4] &quot;off-diagonal autocorrelation population mean&quot;                                                                                                                                                                                                                          </span></span>\n<span id=\"cb20-6\"><a href=\"#cb20-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [5] &quot;diagonal autocorrelation population variance&quot;                                                                                                                                                                                                                          </span></span>\n<span id=\"cb20-7\"><a href=\"#cb20-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [6] &quot;off-diagonal autocorrelation population variance&quot;                                                                                                                                                                                                                      </span></span>\n<span id=\"cb20-8\"><a href=\"#cb20-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [7] &quot;shape1 for diagonal autocorrelation precision&quot;                                                                                                                                                                                                                         </span></span>\n<span id=\"cb20-9\"><a href=\"#cb20-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [8] &quot;shape1 for off-diagonal autocorrelation precision&quot;                                                                                                                                                                                                                     </span></span>\n<span id=\"cb20-10\"><a href=\"#cb20-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [9] &quot;shape2 for diagonal autocorrelation precision&quot;                                                                                                                                                                                                                         </span></span>\n<span id=\"cb20-11\"><a href=\"#cb20-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [10] &quot;shape2 for off-diagonal autocorrelation precision&quot;                                                                                                                                                                                                                     </span></span>\n<span id=\"cb20-12\"><a href=\"#cb20-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [11] &quot;observation error sd&quot;                                                                                                                                                                                                                                                  </span></span>\n<span id=\"cb20-13\"><a href=\"#cb20-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [12] &quot;te(temp,month) smooth parameters, te(temp,month):trendtrend1 smooth parameters, te(temp,month):trendtrend2 smooth parameters, te(temp,month):trendtrend3 smooth parameters, te(temp,month):trendtrend4 smooth parameters, te(temp,month):trendtrend5 smooth parameters&quot;</span></span></code></pre></div>\n<p>And their default prior distributions:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb21-1\"><a href=\"#cb21-1\" tabindex=\"-1\"></a>priors[, <span class=\"dv\">4</span>]</span>\n<span id=\"cb21-2\"><a href=\"#cb21-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [1] &quot;(Intercept) ~ student_t(3, -0.1, 2.5);&quot;</span></span>\n<span id=\"cb21-3\"><a href=\"#cb21-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [2] &quot;sigma ~ inv_gamma(1.418, 0.452);&quot;      </span></span>\n<span id=\"cb21-4\"><a href=\"#cb21-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [3] &quot;es[1] = 0;&quot;                            </span></span>\n<span id=\"cb21-5\"><a href=\"#cb21-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [4] &quot;es[2] = 0;&quot;                            </span></span>\n<span id=\"cb21-6\"><a href=\"#cb21-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [5] &quot;fs[1] = sqrt(0.455);&quot;                  </span></span>\n<span id=\"cb21-7\"><a href=\"#cb21-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [6] &quot;fs[2] = sqrt(0.455);&quot;                  </span></span>\n<span id=\"cb21-8\"><a href=\"#cb21-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [7] &quot;gs[1] = 1.365;&quot;                        </span></span>\n<span id=\"cb21-9\"><a href=\"#cb21-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [8] &quot;gs[2] = 1.365;&quot;                        </span></span>\n<span id=\"cb21-10\"><a href=\"#cb21-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  [9] &quot;hs[1] = 0.071175;&quot;                     </span></span>\n<span id=\"cb21-11\"><a href=\"#cb21-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [10] &quot;hs[2] = 0.071175;&quot;                     </span></span>\n<span id=\"cb21-12\"><a href=\"#cb21-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [11] &quot;sigma_obs ~ inv_gamma(1.418, 0.452);&quot;  </span></span>\n<span id=\"cb21-13\"><a href=\"#cb21-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; [12] &quot;lambda_trend ~ normal(5, 30);&quot;</span></span></code></pre></div>\n<p>Setting priors is easy in <code>mvgam</code> as you can use\n<code>brms</code> routines. Here we use more informative Normal priors\nfor both error components, but we impose a lower bound of 0.2 for the\nobservation errors:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb22-1\"><a href=\"#cb22-1\" tabindex=\"-1\"></a>priors <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb22-2\"><a href=\"#cb22-2\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.1</span>), <span class=\"at\">class =</span> sigma_obs, <span class=\"at\">lb =</span> <span class=\"fl\">0.2</span>),</span>\n<span id=\"cb22-3\"><a href=\"#cb22-3\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.25</span>), <span class=\"at\">class =</span> sigma)</span>\n<span id=\"cb22-4\"><a href=\"#cb22-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>You may have noticed something else unique about this model: there is\nno intercept term in the observation formula. This is because a shared\nintercept parameter can sometimes be unidentifiable with respect to the\nlatent VAR process, particularly if our series have similar long-run\naverages (which they do in this case because they were z-scored). We\nwill often get better convergence in these State-Space models if we drop\nthis parameter. <code>mvgam</code> accomplishes this by fixing the\ncoefficient for the intercept to zero. Now we can fit the first model,\nwhich assumes that process errors are contemporaneously uncorrelated</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb23-1\"><a href=\"#cb23-1\" tabindex=\"-1\"></a>var_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb23-2\"><a href=\"#cb23-2\" tabindex=\"-1\"></a>  <span class=\"co\"># observation formula, which is empty</span></span>\n<span id=\"cb23-3\"><a href=\"#cb23-3\" tabindex=\"-1\"></a>  <span class=\"at\">forumla =</span> y <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"dv\">1</span>,</span>\n<span id=\"cb23-4\"><a href=\"#cb23-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb23-5\"><a href=\"#cb23-5\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span id=\"cb23-6\"><a href=\"#cb23-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb23-7\"><a href=\"#cb23-7\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> trend) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb23-8\"><a href=\"#cb23-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb23-9\"><a href=\"#cb23-9\" tabindex=\"-1\"></a>  <span class=\"co\"># VAR1 model with uncorrelated process errors</span></span>\n<span id=\"cb23-10\"><a href=\"#cb23-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">VAR</span>(),</span>\n<span id=\"cb23-11\"><a href=\"#cb23-11\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb23-12\"><a href=\"#cb23-12\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train,</span>\n<span id=\"cb23-13\"><a href=\"#cb23-13\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> plankton_test,</span>\n<span id=\"cb23-14\"><a href=\"#cb23-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb23-15\"><a href=\"#cb23-15\" tabindex=\"-1\"></a>  <span class=\"co\"># include the updated priors</span></span>\n<span id=\"cb23-16\"><a href=\"#cb23-16\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> priors,</span>\n<span id=\"cb23-17\"><a href=\"#cb23-17\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb23-18\"><a href=\"#cb23-18\" tabindex=\"-1\"></a>)</span></code></pre></div>\n</div>\n<div id=\"inspecting-ss-models\" class=\"section level3\">\n<h3>Inspecting SS models</h3>\n<p>This model’s summary is a bit different to other <code>mvgam</code>\nsummaries. It separates parameters based on whether they belong to the\nobservation model or to the latent process model. This is because we may\noften have covariates that impact the observations but not the latent\nprocess, so we can have fairly complex models for each component. You\nwill notice that some parameters have not fully converged, particularly\nfor the VAR coefficients (called <code>A</code> in the output) and for\nthe process errors (<code>Sigma</code>). Note that we set\n<code>include_betas = FALSE</code> to stop the summary from printing\noutput for all of the spline coefficients, which can be dense and hard\nto interpret:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb24-1\"><a href=\"#cb24-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(var_mod, <span class=\"at\">include_betas =</span> <span class=\"cn\">FALSE</span>)</span>\n<span id=\"cb24-2\"><a href=\"#cb24-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation formula:</span></span>\n<span id=\"cb24-3\"><a href=\"#cb24-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt; y ~ 1</span></span>\n<span id=\"cb24-4\"><a href=\"#cb24-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017ff1154728&gt;</span></span>\n<span id=\"cb24-5\"><a href=\"#cb24-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-6\"><a href=\"#cb24-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM process formula:</span></span>\n<span id=\"cb24-7\"><a href=\"#cb24-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ~te(temp, month, k = c(4, 4)) + te(temp, month, k = c(4, 4), </span></span>\n<span id=\"cb24-8\"><a href=\"#cb24-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     by = trend) - 1</span></span>\n<span id=\"cb24-9\"><a href=\"#cb24-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt; &lt;environment: 0x0000017ff1154728&gt;</span></span>\n<span id=\"cb24-10\"><a href=\"#cb24-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-11\"><a href=\"#cb24-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Family:</span></span>\n<span id=\"cb24-12\"><a href=\"#cb24-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt; gaussian</span></span>\n<span id=\"cb24-13\"><a href=\"#cb24-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-14\"><a href=\"#cb24-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Link function:</span></span>\n<span id=\"cb24-15\"><a href=\"#cb24-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; identity</span></span>\n<span id=\"cb24-16\"><a href=\"#cb24-16\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-17\"><a href=\"#cb24-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Trend model:</span></span>\n<span id=\"cb24-18\"><a href=\"#cb24-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; VAR()</span></span>\n<span id=\"cb24-19\"><a href=\"#cb24-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-20\"><a href=\"#cb24-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N process models:</span></span>\n<span id=\"cb24-21\"><a href=\"#cb24-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5 </span></span>\n<span id=\"cb24-22\"><a href=\"#cb24-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-23\"><a href=\"#cb24-23\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N series:</span></span>\n<span id=\"cb24-24\"><a href=\"#cb24-24\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 5 </span></span>\n<span id=\"cb24-25\"><a href=\"#cb24-25\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-26\"><a href=\"#cb24-26\" tabindex=\"-1\"></a><span class=\"co\">#&gt; N timepoints:</span></span>\n<span id=\"cb24-27\"><a href=\"#cb24-27\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 120 </span></span>\n<span id=\"cb24-28\"><a href=\"#cb24-28\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-29\"><a href=\"#cb24-29\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Status:</span></span>\n<span id=\"cb24-30\"><a href=\"#cb24-30\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Fitted using Stan </span></span>\n<span id=\"cb24-31\"><a href=\"#cb24-31\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 4 chains, each with iter = 1500; warmup = 1000; thin = 1 </span></span>\n<span id=\"cb24-32\"><a href=\"#cb24-32\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Total post-warmup draws = 2000</span></span>\n<span id=\"cb24-33\"><a href=\"#cb24-33\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-34\"><a href=\"#cb24-34\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Observation error parameter estimates:</span></span>\n<span id=\"cb24-35\"><a href=\"#cb24-35\" tabindex=\"-1\"></a><span class=\"co\">#&gt;              2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-36\"><a href=\"#cb24-36\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[1] 0.20 0.26  0.34 1.01   412</span></span>\n<span id=\"cb24-37\"><a href=\"#cb24-37\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[2] 0.24 0.40  0.54 1.02   193</span></span>\n<span id=\"cb24-38\"><a href=\"#cb24-38\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[3] 0.43 0.65  0.83 1.15    29</span></span>\n<span id=\"cb24-39\"><a href=\"#cb24-39\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[4] 0.25 0.37  0.49 1.01   242</span></span>\n<span id=\"cb24-40\"><a href=\"#cb24-40\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma_obs[5] 0.31 0.43  0.56 1.03   226</span></span>\n<span id=\"cb24-41\"><a href=\"#cb24-41\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-42\"><a href=\"#cb24-42\" tabindex=\"-1\"></a><span class=\"co\">#&gt; GAM observation model coefficient (beta) estimates:</span></span>\n<span id=\"cb24-43\"><a href=\"#cb24-43\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             2.5% 50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-44\"><a href=\"#cb24-44\" tabindex=\"-1\"></a><span class=\"co\">#&gt; (Intercept)    0   0     0  NaN   NaN</span></span>\n<span id=\"cb24-45\"><a href=\"#cb24-45\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-46\"><a href=\"#cb24-46\" tabindex=\"-1\"></a><span class=\"co\">#&gt; standard deviation:</span></span>\n<span id=\"cb24-47\"><a href=\"#cb24-47\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%  50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-48\"><a href=\"#cb24-48\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[1] 0.26 0.34  0.42 1.01   463</span></span>\n<span id=\"cb24-49\"><a href=\"#cb24-49\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[2] 0.23 0.39  0.55 1.09    35</span></span>\n<span id=\"cb24-50\"><a href=\"#cb24-50\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[3] 0.10 0.49  0.80 1.33    14</span></span>\n<span id=\"cb24-51\"><a href=\"#cb24-51\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[4] 0.33 0.45  0.59 1.02   201</span></span>\n<span id=\"cb24-52\"><a href=\"#cb24-52\" tabindex=\"-1\"></a><span class=\"co\">#&gt; sigma[5] 0.22 0.35  0.51 1.04   142</span></span>\n<span id=\"cb24-53\"><a href=\"#cb24-53\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-54\"><a href=\"#cb24-54\" tabindex=\"-1\"></a><span class=\"co\">#&gt; var coefficient matrix:</span></span>\n<span id=\"cb24-55\"><a href=\"#cb24-55\" tabindex=\"-1\"></a><span class=\"co\">#&gt;          2.5%    50% 97.5% Rhat n_eff</span></span>\n<span id=\"cb24-56\"><a href=\"#cb24-56\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,1]  0.600  0.790 0.910 1.03   163</span></span>\n<span id=\"cb24-57\"><a href=\"#cb24-57\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,2] -0.420 -0.140 0.041 1.04   111</span></span>\n<span id=\"cb24-58\"><a href=\"#cb24-58\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,3] -0.210  0.016 0.310 1.00   345</span></span>\n<span id=\"cb24-59\"><a href=\"#cb24-59\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,4] -0.055  0.056 0.220 1.01   543</span></span>\n<span id=\"cb24-60\"><a href=\"#cb24-60\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[1,5] -0.037  0.120 0.380 1.03   181</span></span>\n<span id=\"cb24-61\"><a href=\"#cb24-61\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,1] -0.540 -0.190 0.025 1.03   128</span></span>\n<span id=\"cb24-62\"><a href=\"#cb24-62\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,2]  0.062  0.430 0.740 1.02   242</span></span>\n<span id=\"cb24-63\"><a href=\"#cb24-63\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,3] -0.290  0.026 1.300 1.20    26</span></span>\n<span id=\"cb24-64\"><a href=\"#cb24-64\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,4] -0.110  0.110 0.370 1.03   117</span></span>\n<span id=\"cb24-65\"><a href=\"#cb24-65\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[2,5] -0.040  0.230 0.640 1.03   133</span></span>\n<span id=\"cb24-66\"><a href=\"#cb24-66\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,1] -0.330 -0.030 0.190 1.02   333</span></span>\n<span id=\"cb24-67\"><a href=\"#cb24-67\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,2] -0.500 -0.051 0.320 1.03   193</span></span>\n<span id=\"cb24-68\"><a href=\"#cb24-68\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,3] -0.034  0.520 0.900 1.08    64</span></span>\n<span id=\"cb24-69\"><a href=\"#cb24-69\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,4] -0.090  0.120 0.500 1.04   142</span></span>\n<span id=\"cb24-70\"><a href=\"#cb24-70\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[3,5] -0.290  0.027 0.380 1.01   465</span></span>\n<span id=\"cb24-71\"><a href=\"#cb24-71\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,1] -0.450 -0.120 0.086 1.06    89</span></span>\n<span id=\"cb24-72\"><a href=\"#cb24-72\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,2] -0.660 -0.180 0.130 1.06   107</span></span>\n<span id=\"cb24-73\"><a href=\"#cb24-73\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,3] -0.270  0.086 1.300 1.16    30</span></span>\n<span id=\"cb24-74\"><a href=\"#cb24-74\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,4]  0.520  0.730 0.960 1.02   212</span></span>\n<span id=\"cb24-75\"><a href=\"#cb24-75\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[4,5] -0.051  0.190 0.650 1.03   150</span></span>\n<span id=\"cb24-76\"><a href=\"#cb24-76\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,1] -0.110  0.053 0.270 1.00   449</span></span>\n<span id=\"cb24-77\"><a href=\"#cb24-77\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,2] -0.430 -0.110 0.130 1.01   238</span></span>\n<span id=\"cb24-78\"><a href=\"#cb24-78\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,3] -0.150  0.060 0.780 1.12    41</span></span>\n<span id=\"cb24-79\"><a href=\"#cb24-79\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,4] -0.210 -0.040 0.110 1.01   373</span></span>\n<span id=\"cb24-80\"><a href=\"#cb24-80\" tabindex=\"-1\"></a><span class=\"co\">#&gt; A[5,5]  0.460  0.740 0.950 1.00   370</span></span>\n<span id=\"cb24-81\"><a href=\"#cb24-81\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-82\"><a href=\"#cb24-82\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Approximate significance of GAM process smooths:</span></span>\n<span id=\"cb24-83\"><a href=\"#cb24-83\" tabindex=\"-1\"></a><span class=\"co\">#&gt;                               edf Ref.df Chi.sq p-value</span></span>\n<span id=\"cb24-84\"><a href=\"#cb24-84\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month)              3.374     15 37.656   0.427</span></span>\n<span id=\"cb24-85\"><a href=\"#cb24-85\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend1 2.798     15  3.441   0.996</span></span>\n<span id=\"cb24-86\"><a href=\"#cb24-86\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend2 4.454     15 48.402   0.245</span></span>\n<span id=\"cb24-87\"><a href=\"#cb24-87\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend3 1.748     15  3.363   1.000</span></span>\n<span id=\"cb24-88\"><a href=\"#cb24-88\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend4 1.352     15  6.409   0.999</span></span>\n<span id=\"cb24-89\"><a href=\"#cb24-89\" tabindex=\"-1\"></a><span class=\"co\">#&gt; te(temp,month):seriestrend5 3.085     15  6.703   0.979</span></span>\n<span id=\"cb24-90\"><a href=\"#cb24-90\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-91\"><a href=\"#cb24-91\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Stan MCMC diagnostics:</span></span>\n<span id=\"cb24-92\"><a href=\"#cb24-92\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with effective samples per iteration</span></span>\n<span id=\"cb24-93\"><a href=\"#cb24-93\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✖ Rhats above 1.05 found for some parameters</span></span>\n<span id=\"cb24-94\"><a href=\"#cb24-94\" tabindex=\"-1\"></a><span class=\"co\">#&gt;     Use pairs() and mcmc_plot() to investigate</span></span>\n<span id=\"cb24-95\"><a href=\"#cb24-95\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with divergences</span></span>\n<span id=\"cb24-96\"><a href=\"#cb24-96\" tabindex=\"-1\"></a><span class=\"co\">#&gt; ✔ No issues with maximum tree depth</span></span>\n<span id=\"cb24-97\"><a href=\"#cb24-97\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-98\"><a href=\"#cb24-98\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Samples were drawn using sampling(hmc). For each parameter, n_eff is a</span></span>\n<span id=\"cb24-99\"><a href=\"#cb24-99\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   crude measure of effective sample size, and Rhat is the potential scale</span></span>\n<span id=\"cb24-100\"><a href=\"#cb24-100\" tabindex=\"-1\"></a><span class=\"co\">#&gt;   reduction factor on split MCMC chains (at convergence, Rhat = 1)</span></span>\n<span id=\"cb24-101\"><a href=\"#cb24-101\" tabindex=\"-1\"></a><span class=\"co\">#&gt; </span></span>\n<span id=\"cb24-102\"><a href=\"#cb24-102\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Use how_to_cite() to get started describing this model</span></span></code></pre></div>\n<p>The convergence of this model isn’t fabulous (more on this in a\nmoment). But we can again plot the smooth functions, which this time\noperate on the process model. We can see the same plot using\n<code>trend_effects = TRUE</code> in the plotting functions:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb25-1\"><a href=\"#cb25-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(var_mod, <span class=\"st\">&quot;smooths&quot;</span>, <span class=\"at\">trend_effects =</span> <span class=\"cn\">TRUE</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAIAAAD2dYQOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAgAElEQVR4nO3de3wU1d0/8O9CuAS8lIs2XEMwi4jwqGhUNqKghJogFloFxSpoMamoTUTRpop35aeoTVpFE3hUakXBPuKlJH0CFYQmKkGLD4qVDYQgEFAitZZwS9zfH2d3Mntm9szMzu7s7J7P+8WLV3Z3dmZ2d8585pw5Z8YTCAQIAABAVp0SvQIAAACJhCAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqqROEDdXlRblF1WYnry7yeDyejuktvj2JhX9S9j14Inxy/lsyN88406xyYpceWonyXNE3KQWUQZNQBmO69FDZU+SWN1icZaoEYXWRt6Ckss7s5A3lj1YS+crm5Uf19iRm7ZPmzyvzEVU+Kt6uEvvtueO3q15YkuhVSDSUQZNQBmOrYdUK24tOlSC0hu21fNMmZSd6Tdwue9I0H1FdyUIZjtOjV11UUJnodUgyKINmoQwa8G+tI6LCqoCittjyVhVIflWF4R8p+I34q8oKfcGnfIVlfv4NvuBT1t7uL/OxN1dVBV9mL/rLlIdV/rD1KqyqKvP5iHuRY2G2/MqRr7Cs4zVloco7yecLvq73SZXp1YtSf1nKmmm+gYjz7PgwZb7Qs37BLyJa59DH9XWsW8cqJ3jpuhug+gV5oAyiDCZk6cqX4SvT/1VNStkg5J9UfVPcrsza2/1lPv4VIp/PpzOpdh5hyw1jYbb6M470adTvFRRCblHqlQyumvKM6UKovySdDyRaZ/H3mNilq78PX2GwBCMIlW8BZVC79iiDsV16QPX1Bd8U6UBHKBWCMBDQFCzuECpsO9IcXll6uz/sEKfjBw97yOYT+vmChzb+jsfaHyqK2QZ/b3/HY9FCuUKqFCmj6XXeYvTld6x+aMfl9wt/EeE6+DXHlL7wNUzs0pXD0fAfSUYogyiDCVi63vGL9ephagah7rFd6GW9bcr827n9XehoJPzQJezXNbU5m58t91KElzsWoX/szRfCiNML1zrCBDqZYO0XEX4go0/k5NJVrTIIQpRBlEHnl+5n7dhKY4H2IMIUOTvL2Ocb4SUiIu8I/Z9XO6XKZ9sidQAzP9uRwzSngyPPNiYsz17nkzvIiaWzDh+F91k/NQ/2oQwaS/0ymJ1fURtQusdkF09hSWj1m0rpINRUkCvyHXx7UN1WP/+UTgGyTOeHjsVsBWIx++i/0ljsYWK99Oq3KomIKgs8Ho/HGxw+UVkg91hCDspgLKEMalQX5ebmaouc1W8qNYOQdTimupKF5Q3Ej3UOHukJflXh2y2rLCiqbiCihuryRyuJ7B4n5bNDnrqShdUNREQNoa77hVOi2UeYZm+to/9Kgz9X6PMq32LyLF1OKIOxhzKoXbp3BNXVKeMsG8rfiu73TbEgrCxg32128X2FRESVJV7lYD00dDd72Egi3aNEU2+Paq28Ho/HW8DqDKGWtODlESxfBIENsA3N1eMNFsEqS8fKoU9qQsO2z4hUh1jBTVi73sJ5Rv2Vht7IfYsaCVh6foXqyFZ9WiSqakuqQBk0vUoog/aXHnq1LjjbSiLylS21erYiVYIwf15Vx6AeaiDKr/BXFSr9kX2FZX5lkGXweE59OGrl7VapBsf4Csv89veS2cW12jFMZueq+aRGgpdtEB3rmptn1F9pfoXuKCJ3LB0UKIMog4lYen5Fx/jL6LeTSL1oUhr7Im0OwTS5FFH/JX+Zz/W9DNmncPtaQrJBGTQPZTDuUqVGaA1r2ahbsSquXbyMNFQvLKlLbLcuQ+yCkPE+9wHyQRk0C2XQAXIGYbBhObGlsHrho58VVkXd2uMI1iZj8dwHgAkog+agDDrBEwgEEr0OAAAACSNpjRAAAIBBEAIAgNQQhAAAIDUEIQAASA1BCAAAUkMQAgCA1BCEAAAgNQQhAABIDUEIAABSQxACAIDUEIQAACA1BCEAAEgNQQgAAFJDEAIAgNQQhAAAIDUEIQAASA1BCAAAUkMQAgCA1BCEAAAgNQQhAABIDUEIAABSS0v0Cljg8XgivRQIBJxcEwA5oQxCSvIk++bLSmbtwqcTuxrHW1sTstw9H1Y+Tlc9d2FvIvro3cqvcguv6k1E3/75w5arLqSnlhy4dvaYAeFvGffAfMEM1z30SNQrc+yQtS9B+KU1/eHZhjG3XXYeETX97c5/nbsgu6vy2id1ix/5kk4/f/r/O/MkIqLdG37z3Vns7+bv/93vxJOI6NihQ+rZTV+xTLwyr0yaovx9NPTeX66tsfSJ5CRIR7FVtxWrHzZ/uuIpmvj0WT8K+/V5/EuTni2PYllx1aVHj/jNvGtPg5lbKuA2V7VLerr5ic+/bY54gk9efFn75Dk3zrS0StFJphohMB+9O/+eTUQ06LbiwjEdT3/71X7l795XXdibyK/7dnHUiUuRoZq7S+28vfnTFbM3NBPR5WMv3pnR+6rQ8//89juiU4IPdm/4aPDNi05+562TT2JPfLLrYO6o4N8sBbWWT5uhfqjN7OtXvaV+uGRcXvQfQ0oxSZohP/oRERGdPDhD59VNa8sf+JyGj515e6yXm0QMS6idY9nY4pJPN+dcAkEYG3E9BuRcNP3p2umhB/8Z+Pnn33fpMZCoaddXAy8Z2KNLx4RdO3XumtZD/Ywxm3Xr3Hl3Cl7liqj22DZ7wpx1E4iI6NsP5nx/wuAePYhob+vBERkZPU/pFZzolKl3EdXXpA3J6NG1JxE11X+5/69fLn6RiGjkQ6G6AjdzLvm69uwZ/uohLilZDfKXgg8D4aIuAvU1C+7dTHT2tJf7dNrVerRLj15Ezbv3dcnUbLpjJpXWTKK9H/9x3heTy87tpT+7iA6ufPWF5/cQERVcVVoyVHl+e9mTK6qIiGjEZb+yPlsdhpU2MSerdBxLNTwiSgtf+uibZqkfipOvSw9ry4orBGGSGz6u+G8LcucREV35y6cvJKIDG4qe2H/jwqsuPHBgh/X5ffg/d975YXBu9wwXPa88QzTm6YVXXUhEmhzlGj+ja5Xd00KX5HC7p4O7vzl1wMns78zbbytmVYTmT1c89em/zjuL1SrCGs1W3nizYNFaXC5C/ORMLK2ZSEREO/xbP2jYe25O/x3+qgF9pqkn2vHXkoMX2EqpHR+9P/xXNdf1Itpe9mr93qE5/YmIaO/HtXRVac1QItpe9uRH9edenhP9MiKy1NDiniqdIUvJ52Y4R5i6Dmwoer9vxc/PiOotXzwx7/NLQvGm9/yBFc+tG3xraIIILJ06NdxZjKBzrrub7ae2lz3pv+C2i9kZxEk7sleNzySi5k9X/PlH027P1Hmv4Zkk3eSbtvxVU6sut6jPEcYV10q/9+M/ruh1Q8lQIjq48tWPBl6nCbyD9SVVdPd1wYBkJj65ICYrE79si3eNUHxiz07ymawRjpw+zXgi21AjjAurLQyxpd52cz+MONnGZxdxz+ze/n+egTd0SU8nGpid9d6eQ+ld+kZ4nhreGzAwb9GduY0XlT87Y4zO7ImMvofjhw+rH2qOZg6seG5Becbs2p+fQUTHW1vHPTD/3if/obx83Sk/60lEp4y+4t211RPOvbL1/Wc2ZFx3t35TMLdb1CY0l5RWa5AQ84PR2HZA2//dnk79WFv6kc6dOqf17NE17HX/U09+eWlx4ZCwJnOzAebkmREx+3seOyf2LLV2phmt6hk/vZKIAghCaRl2rxLTJpx52aeeSkREp2b2pybB8183b6ndm/fgoo209pe3LSNVFgpW3uKK9Z1269PqQsDtlcJqkOXznyUiIiUprXbbUfe5OHaodepLi4ko8GKlpZmA24R6lp13W/6gyFP5n3pg7ZBi1uNaLtrSqi6kaQ4GPIs9tS/efsexpSMITYl5Dc9Sg8Pom2Zpj8t0n9SdgP3BWvO3vL6cm2zUNazjzYRFr9+c2TMt7aQ+6X2JaN/eb9K69GJ/U7eeaSsXzXn49eVE+4prd9wzrU/68Nu3XMxmcNUtE+Y3tfdJ/zEdbz2sXXlulcx/6rbwCoH2JxBXQbhuO1bbpmTri2hfzMtITGY4ftaijbOIiGjrsl9+3d6jz6lE+/akZV3ap09wH39g7S8fbJ79bGmkVg3m/NvmaA/jdJ/UnYD9wUp9FPPRnZvh9IyT/VkMK3ncxN6JHX2z/TWrLS0rtnCO0BQ7ZVI38xJ12GWwZW9efH3z5FfyM4g2P3z/3lkPFwyO8DxVz7+Xbn0lP4No35/ufzfz4ZvHUjAIoyaOSdLsQbiWVY6ZfjqRao3Kewv+UCZeJaBQGbTTDuGIr19/+sFnGolo6NwH77qmLxERHVh7/oNvqKYRtfNH8sFrc4prw2cb5vMFt306zvpso2CmJSl+TZ0UOQi1tT3GTPhl502wtA7RSUAQVhd5CjQNTr4yf21xdhRzc2cQqrdIwx2Ei4KQ9v3p/uInthERXf2b5fefTbS/6vriPYWvT27inqfND1+zgO1Czp5Z/kp+BtkOQk6b5hQRV87FP7r4DBMbTaHuCqEOxZQPwniUQbdxKJi3Lju/ut+bd44fqPzBvbro79Hlq8L8iRLdj2xn92IzCJX8023kNFl9TM0grC7yFHymLXAN5bnekpFVgYp8qzNkhXDdQ48kdjwNCcPPZtTZGXBj8ox0nHAFoE1YhxPTpqygBqndIxhWH3WrjMneXqIrTmXQbV3nDRsYosN9zK9WPzqfCl/OO5Xo/x676R+XvDjzoo4Xv162et+MvIxlj1cP/q36eWvrFtsv1smdiaXWzrTu3XWfHzL2It3nY8vhc4TVb1X6yvzaw87s4qVlK7xvVVfkWy6FicMdqbmnaSh02s+UuJ6RtpSy2vOXYoJzitqDaMM2gyQavGVPSpVBAceC2ZvB+pFlZPHf6akz8k4l+lr7FrcdNESNK+BOdm+JLXSWCYrionlRn+ezeUmFSO0PCvXmaOn0dcxZOiRUnzlnxB+Eq1+qv9Utry/napDaY3D1z8f9+uLqI+hK76PT59JOG4CbbVgyfc4aogmlqwZ02v7td116ZBAdbGroPLRHumb0TrfOnTqn6TzvRgmp8zGd0/lXB+fkkFOtMg4HYf6UwoKCmeWTtM0yM0vqfGVeZ9cmOpa6bMWWblUveY/CONoPIq5QWqpBaquPrq3Qx1kqlMGEGzt7+ZbZRES0uX7zm5/syi8YvLn+jWEDZiV2tWLN+SENLPyYXfX1cV2WmtM1wvyKgL881+sp4Z73lfkDUZ2oV2g7R8RjlKuSgvGrAmoPyrhzznYqeeKDssTi1q3tyBHx8SZXg7RaRLVjVNQPUzgX41QG43qyWZcrDgHH/LryH1dOumYp0fDSF349NJ2IPnngnt2/fOLKYI9rcrTE2WwBslPhI4u7F64KyCJQCb/Ozu6pUmT4hO4JHktBaNg0yjWHxjsI1VskV+AdCMKsi8dGvQiBxvUb2Mwb129g/0daeuP6DW1HjojnxjW7cd+YfqPc/qrri5dunlD6yYzTRXMO1ReTvXQ4g5XBeI8D0/6g8Yve2EaszfbhYDMsDbun/JFf/Fh/GtZWtOX15bo7hzN+euUXb7/D/lee0Z2PeoIv3n7H6q7GahAK6n9KEPYfOdLSOkQnmYJQ0Es73kGobQ6NeRByzZ6CohjbINTNvEgRZZM4X7mFWg1CNXU572hB3V91/XP02MMFgzcvHvXBf30y878izjnUupBz6y3idZCNoAw6H4TxYz9i1eXX1ppvXjzqzQGr2EbL/hBOLmhPirR6luZmML0wCLXFX9D46XAQJlNnGd3MdmAMUxQnBcXJp9vbJerkMzwKE8ePkw3x4mWpDw91cUmpbUpV/tbulNsOH95QtXTYte8MTScac9G0//fBprnjxqpeVU/sqhvEuIqgDKp/jnULx974LhHRtQs3PH6BatI9b/z8MXpm0dV610U3YLidGx45mWcz1NsOH45VlO46sPuci68emp7ONto96enK/aNMLsL59iSFyTqfGyRTEKYY8WhTm9Thp84Pbdcs9+DKSfthfr/GJbrFamtzY9NPJij9Y4YPUvbF7IewOngDIvpo4Y20sHH9hUQf/nbOG00XBGMvmI4jf53g1XNEDAu1d0A/IiLqd9rwsOddcYo0MlZanTzOtsPpcYR6V7RQFEYzmpeIiI4datXeDJPrPhNd3xlWHYztxV/EVUDDQzYz7Q/mtz87x2Wdu3UTT9B+9Gj0Mw9fsfYjR7gPxdUgjXLxQGOnoZelp6cR0d79/k5dOrO/ifw1q7WH8C7fy9gQrzKoHGPtbG68bsL8zulElH2654Om9O5DiYh2n3ZT/a6bXpt6P3VK7945qkWYXAFGeyAVP1xlNIZjljp36eT/+mBaen+iA43/TDsttNHGSRR1PvVDcZ9P8a7GcGcSV04Pn6gIBKYUeQoo6uKmj10rKynGRI+6ZnoMd7KWmt3jIWPYMMGre7Zsid+ixblIkaOx6aP36ZJ7uNY57kcJ3gImec6gmxavMhiBv3E3jR9IRAOHDCTaTeTNHKKZyLBVPApxOs/tsMyBWf949cOmqT/LrK97fcTg2YleH61EDXiIrQQ0jeZX+MtyvbnlUV7YUFfN3aVde/ZgV8lycxyOumZ6rJrgWATGu7QPGDVKPMG+bdsEr4pjkmMzNbVfhfoowV+z9DR6de3en83qv3HJ81m31vQnodStERLFpwxG4M0aaDxRPHagVsPVpcGZU7KkNm/CxOeJRtz7ckkU51bjJ7kaP8USco4wu7g2EI+b3LAIHPfAfOez0HzvGG2zidW2UC4Cxaf9DFs+uRYJLrrEOSeeFRF906S+p6FBS6k2NS0tXUtdRIO7xVl5jxER0YLuv7Ez5+QX+zKobGmnZQ//Z9PXnbsPJmpu6OzN665qCO3ahTp3caaXhNUdtPngdHjXf9lvNjS6Y2sVd37Rmd52W2jGsGEpeWUZJ6x76JGEZKEh9Tie6MS8Fqit8NnMHju0i45huyv3pXFNyom9F1qqGTtrcuWkAU8QEf1i0ZYhu/505aQdJVvuvzTR6yVmPt7MRKZL65fWcSXFsYMAVvYd2x0l0zhCXazrtvbGcoZnDcV9Z5RhhSY7yxjWCAUpyNUIdc9XqyPQThWwc7du6nTRbmeJOmV9SmbmN01Np2QG2364qiSFapMZw4Yp68x9EHF1sz1C3/rBOTm76uvZrk2783LmyvfJjpXBBB5C6bLTUct45kZDNcRhadhB2jHqnYm6LCi0yccmC769e/cBo0aZPCSNtG/RLdTKHqDvYPHIydhI2SAkInbWMFIWmgxCIjr/tjmGV4sXB6G4g4xhEHIXYYk6CFn9T7zDSmzfLQEzzaqCAinec7E9kXZ4BoLQDAShVeKYdLI2abO3naVWbsN9izoRlYmdCcIUaRo93tqqDbZjh1pr7i4d98B8FpPa8RXmaW8Sa2dAhaXe1VkXjxVvmmYa4gXtDOKts1NXa7nYWHnFeQ9sIqKZr+57Jqwt7L25/aoLmheav8nmD8fCdmTi9fymqan96FFxZdeQthtqsh8mOslSx6joaNsJ1Ljki+0hHT9zG6c5tQOBOJZqk1YZVvgErH5qSz9BxrBh4t83riIEYUN5rrekjn82+jFGCVRzd+nEJxfoVhlN2vjsIjt3nIjteAmrHG1qb6y8xT+3pflSop0vTJ635tJg7AXT8byHb1dNu2ZexvQ/sT+vX24lIAXUH1PZL0f92RPcHS7ZyqADezGl5TwKbquwCti8AJOdmSdKYlOQIgRhQ/nMkjr3ljjLWBa6sPuMmM2uMWYaQq3q0y9D9/mW5n1ERI1+8k4kIqIh2cO/aGikCVlEtHN79rMtzTvmTm5QvWNnwz8j5p+yFDtlQ3vWIa6DGmMt1cpgTFiqEXIMK6zJkpTuTDI71C2iiaIbhP6tdb6ypUlWAsW3YWJtpKTqPmPpujM2K4VRENycwWR3mCgaQkmvLVQdfgdbWgTvbdz5T0pL69S1CxF5Ons8Xbt06kpE3omXE1GTx9O5U9cunYLTNvk9nfxXZkynxz7566+yiIjoh2PH2WvBWFUtWnlGzWTbKdt7cg2nXChqr2Ij+JiOSMoymFiGjefit4urm3b21DFsVqU4b5wOX//T4a6hArpB6B3hq9vqJ4r3WFtnKaMMKapB985nYXRieHjFckg3hIw0NmwVvr6m6mWiFc+3/I5emNhn7ryWZ/ib0xOR6UQ0SbfhlFxaU0zNMuhm6qTUVi7tjK8FXW6oCCp0gzC7+L5Cz6Pl8/LjftmJWDFzrVGGnSw0jMPj3O0I0tNJmIXHW11x+4IBo0Zx25adKmBL8z5WvTMpK3tEfdV2oiyi7dvqRxRkqV5rbPhcPemEZw4GW0V/NW/m5Q2NlJdFgmUdbGlh9UV19VQciuL6ojYU3VMmiSgZy6DVflWuYti6wFUoueqjzZ7Yljq4uuqmDRzX9jk31Cn8YXWRx+PxeDwFlVRX4vVwiqoTs5LGpr602NL0NXeXsnH3VhfEstDSW7a8vtz5m3dHrU+/jJbmfeyf5TdPuP3xrdN79enTq890Wv5MXuMLE/vM7RipPiJbScbGFy6f+EIj+1NQd+zVp496xYhIWbeW5n19+mUo/5Rp1A8Zts/SbfhSInDftm0Zw4Y50O/RhGQtg1L5pqlJ/Y9tPNp/iV7NGFBfc8PwgotEpPvZ2UPdL8Ql31IyjSMU3Hpw5Y03G46O4M4CsumVgYbmhxWSiZGFXI2Q6zhq5v6C6nOE3MBB8UjBqGuEug2hlmqEVqy5o8/0l4mIKOexTTW/yhJPTaoziLq0K88d43MiHYOz5hrlVWduCppEBGXQTqt1wom3FkOCzYn9Ia4yxnXIo5OsjpdQfy2R3pvAcYTVRZ5HR3DX420oz/VuvS+hndgENwU9duiQ9iVxNB471EqhTjTawRWG92ziRhaKhxV+8fY79q+vFomyAZlpc4/UfsUqgmQx+TqlRT0O9fLy774rF07xQ1tb2LKEK8baTtVxyH1ScduXsidiVUNK/InD5CuDZkR1XNX4/OXn/baeiGjW8pbfdfQz7jiWCn9en/hAymq7rqWOWmTUlGopP1ImNVlZc8kpiU7GkzD+rZohTW721fMvLZ601lTneza4wtLco2ggBQcoTaZ2ZrJv27Y9W7YMGDXKTEOQo5KsDMbImj+snLLpYEvLwZbl9FSwPZ2IGl946vPHNh1saTm46bHPVc+7k7odVWmHT6UW1Ki55BsIP6JX37PT6ynhpi2scnNv7o5KYfPG6RuodNqMWw5+Mmn1kZW+QbrTWxpcoWW1E6m6UtgW3hMnhrfxjI5SHTRkowpoGbcsroKoM32otnGwpYWdXFR/KHEFkdO5W7eEHagmbRmMoranPgfMUQbqNDZsPTN4cvm0YVTVQMQeZP3qrzVsgv99i6Y8r25b152teOQPR1x9JKMapOHWFb+uN8lVX+QG+yawdhi+X8uvCAQq9Jtl3G3zpmULdmSXTjv/bGpevOFfM/Mnnk1EA4dM3PxdMw3qZ2IOUQyusJOFhhrXbxAMJQQxbUtp0kjaMmhIm0+WwomIiLayDsYhwVbTnMeMZysI3WhXJmbs5GJqYJ8xgWNUdA/w8ysCrj3u1DfijCnLz/tu8YqNe8/5165zxtx8IhER7d7ZlHWWkoLspKCYMrjCahZqL0YaSdvhw7GtAqqPAduPHk3eHsxi2sqoYR2RRaCZ+m6kU4aJk3xlMBIlgawmDfvFPZ081DmtUxoRdfZ4zvR601Snc7y3rvnuVtqxKK/ohYLVc4aK5vbdd9+pH2o3Hi4pxWtr54yjYcecSLloJhhiO1TDKpuXe+U+IMtFZ7pzRjhH2FCey/fbdn/X7X43TzuDvvrRz70sBpufX03TzjwpihkpLaVmWDpfuOX15aOumR7FKsWP+XbRJGX/rGFiJGUZDNOrT59effocbGlh/6KbyVDviK3+HUREtP1LOv200PM7FuXlLdoRejTCK0xBM5T1ZP/YyhvWIx3Ahve4aYSPQ9indmZZukEYus4hz/3XPTyx/0n/2vs9EX1f9d5ayhs7OtoZWRplGKe+M6x1NOazlVASZmHylkGi8Ai0O6+84qkrzzn55JNPPvkqunvO0FAADp1z94hS9vw5K6cW616ZyA5tIiY8GtVxKFsoxpvuOMJkOj+h7rr9yqQpRP/537o1fzpIl+ZMKcoKG9LQsvNvczbuJyI6/fKVvkHiwRWsKw3rTVpzd6l2Ym58RZf0dPX5Qm40haVhher7EbLThCZvQMjukMk1R3APda8jE96pRNTlQdxZ5uSTT+YaoAyxtyhvFM+Bm1jcNKo0XrEPyJ0v1G2eYjcHJlULz4+9XksfJ3aSrwwqmcci0Mwbnex7ZYl402JZKPiMhn1tNNNbaK5UNz9q+5hYHZDQfvQo228o99cV32iXm9gk8+9SplF2XM6UQd0gdMF4JdNYIVwyLq9bz57Xr3rrlUlTlJfC0+v7zw72GH3yrt+8T8VXjOxnNMpQnXO6d67QBiGFbmdPRkHI3bBefGNeS/cjNBxQH9cgdJjJIFRTPqzJ4faJC8LkK4MsGMynILlsc1IzPP1MwnOfjgUhY+eOYy44Ha7PDUFIDeW53hXTkuJ4lBXC584d0+3EE4ho9rrVRLRkXB4RdevZk77efH093TXp7LOIuvZsr3rvA8qZWHAiEVHXnj2J/v3uX5bvPvvmWwbyucjlHKsaquNQNwiJiLWRcted0QYhEUXqQartSuOdmCe4Q72lINQ6JTMzJYOQnzh0qVIzN7JwQRAmXxlMpSA0pN72DHsDJbCCaJULc9GZqztFahpVhjKpufH2aFwQMpLdVsQAACAASURBVCwO1bVDIvp279+fozGPBLvSUNee7SwFL9i1+JEvhz9020/OU00svh6bdgLxNdh0g5AiZKE2CNO6dzd/xTUuC81cYk0dD6kdhBQhC90XhMlXBlOpadSQ7rYXKRGdryBGnYXSBqFuZ5n8Cs05+iQ6UU9ES8blLRmXd/2qt65f9Vbwqdbtz32VeWsoBYm+f/cvy1/8hohotO/mlTcO2fPpvwxna/7mTZ+8+PLom2YZTsZGFpqcp0nKRcIgmSVxGVQuaCAbdf+aBK4G9gBRSNYjMjNYjZCdOPx0x97zR43tfaj1WPDFzj8ZP+MnRJs3Lb7nwORHvL3zs7uaGWhoifnBhYbiOr6e9SVJsUEUds4RAtihZCGrGnKtLFYvW2N4nRr1Q1alc9VlPE1K7N2wI15rlBvFlFveEKMlNpTnhkZDqZcRt/FRr0yacv2qt84aOfYnHW2Z+19atXkzERGdffq59N1/TM6q/uP6vaaXa3JMRTxu0hTFIWESDjBIfclbBhNeK0o4N1QNwTz9IGwoz/WWjFQNYqoaWeKNRTkMzbgiP9QtLsg/4lE75fDov/9z9HvNv0OH2D++mZR69u/1/d7viYg2f/kxnXyCelaRb224ffc/v5hVs938WpnMQpMNpCaHFbYfPdp+9OieLVsyhg1jf6v/Cd7IsvCHY8fV/7hpfmhrU/8zXBlXSa5ab9KVQW5rUUbgid6StJtTp7Q09b9Ik5n5EhLL/P7B1NyOHIn6X0w+TtQidpYh7qS83nPWdYyO4ruHR9tdXBlH+Ny5Y7iX1N1niCh8fMV/1ny0ZukBGnbOZNZ9pmvPnsqUU19avOq2YvV7la4x9TULarNLS3rV37F4Dbvl+pn5dzx3YW9B3xntzQvFnUh1O8sof2tHU9i8PSHXDiMYTaHtBKG7C+DGAqrHCFL4la7YM6S5/JVJVodPqD+a64dPJF8ZbGnep9vTyvwl1lKs74yauuzY6TujDHWNhG26rF1UaR1V/0GacYfsj5jcdyweeTbovPOMJ7LN4S3PO8JXt9VPlE3Zw0ZS5FuT6xLc9mxB38yj/zZu4WRVwyXj8og8Ey6Ywm5hpj01uHzajEnPlq+88WbtHM6+qPjHn7488c99Hru7NIeI6ODKV9fVjro8N/JCaxc+PfqmWYbX5mZtpFteXy6ezF+zenBOjuBkoToXWb1QfKqAiwTB+UKd8VLcLQPT0kiTaspDbdpZyj+bNYbkqg7GU7zKIOnt4jt17aLuTUoJvbZ1ChCnoIIr8spD7a7AZv7ZSb72w/x7dVu8nLnWqP5Ft+eV+bwFRVM6jg2riwoqfWV+2z3WsovvK/QUeKgqUJE/r+xRb1E1W0ZD+cwSMpq/zZuCMkvG5c1et5oNNBRYeePNU19arJOFTX+b7fcuue2c0F2Tv23aQwMtrYHrpV7fmST8OClYBpWBhiRfHLI2Utk+tRnq8EvgzXb0a4TZxbV+yvWqtm9fWYyG9uZXBAJTipSiU+CpDM4+UOvUyGGWhdwoQy2WheyP0HP/eru+pTDvstAdLQ6ufHUFXcWqhiImb9jELslteJ8mSz1Io+s/ljJZmJR3YiKi1C2DMseh5Abn6OwpXXKnOf0ryyQRVpwX9M3s1ou/0US3k8LPEYafMuQG3XNXllFOGbJ6ofLqprUr9oye9tOTqUuP5rInV+y87Fdl5/bSvj3SBdiIaOOziyxdiZQiXINNyULx+Hp2UlCQhYJrsGlTJIqbr4bNXHgSyGbjJ9cuZ+bioopI3QQSeGWZJMLK4DdNTeLbD2kpHZXNJKKbzyCavCQb+5jOjK83efhrqYOM1YbQ9sNHoq7wtYWWlZ03wdJCo+PebSve1KMMBZOxeqHSd+a80d7XXimvJCIacMvNpSW9LCzRUidSl9QLKQnbFZO3Figb7vQhoY6YQlj9zyUVPkMpUiN8gE7s3rc39xJXR9StICrnC7upeo2SpoY3fcUy7nwhN0HPU/rStx/8uWXMVV4i4QXYrHYiJRO3p1C/Kr4SKWlOmIuvwcaO8SNFi80Kok26/UIptJ7RVQHVrw4YNSrZS4czlBqh4ZTiKmOnrl3UIw3c3MvUUusF1w4c2xqh7pYsOOqNaxVQ3fhpGIFt5mbuTI0wQhDqX+nQvdc5DDlxVt/ep4cemAlCinBhUm1LKdd3pmvbl3d+0vvp8cGbR/c8pe9HH37w1TdVz24iokHF95RM69vxdptXIjW8PYXJS3ITUedu3bhCYiYIGaUhy+SFSeNNfflQ9oc6qm0GIbsdjDPXOdSXbGUwJkGofmh4HjEpglDbRybeQShu+4lTEEZR/3NVEOoOqA/2T0ui6xw+QCcu6Ju5oFfa1sOWzzMZ9iBllL4zIb2v7U2bVI8vuHDMICI674Z1DxWqU1DL5JVITbJ6/96oL0XY0ryP/evTL8Mll6Fha6KsWEzmmTFsmNXbrcVB8pXBUzIzYztD7X1xYzt/BzjfU9T5K6sNzskZnJOzq75efLc4l4t0SOWbNsn9t3/RaG/b2H5sqvUTn2x8oWE/0jAnZ553VsejY4e2sL4zNef2MnnNUsMrkZocWZjWvbuShcoRGds02WEauyUm+4MdD7Lxhdy+nhUhroLIHY2yI3rl3CEZnYqzVGW0dKSsXbr9tlAyuiups5KsDO7bto1loaC9QXdzUr2qswGomx+4U4mW2idtVh9NLktJPqU6y/7Q3hpaFzuqS+CFcC21haprgdpBgVriKmDb4cPmFx1zke9HmCR3BQ2dI+z5cdqhv7RF0zTKcAMqxJ1I+Qm++8e8V9YPuaq0ZKj+2+3cxddkJ1KKcDt78XVnDO9oz9G9r6/6IVfOYxiE4gWRvSCMdH2NBDaNJl0ZVPJP3d4gbi+11MuUu8iRdgJx3cuBIIx0gtOxbqJk4maEBkeEJoJQORG4q77eTP4pogjCM356pTPn6VPmHGHnK3oNzO0c9pKlIORucG8hCL/7x52vfHv93ZNzwqY3DkIKZaE4CEmThbHqO0MRus+ETR/TXBQTN7eavKaGwmR3GPaQyz9ld+DM5Z30JVsZ1K1JK98w6W1mVrcuMW77caxNUtvl1WrycaI4KUiRS7H95FMYngg0edovOLGwCsguv/zF2+8Mv3Ky+XlGzfS1Rt3KZq/Rjoc9e5JqNEWkICTNyEJG90a+kV61GoRp6ekmO5GSxb4zpNd9hntV93nGcFdl6VSiODWttheZqQJGagV1QRAmXxnU/TLV2w93ZlrbDs+xGoS6fW0ELCWlYG46lx50MAgNTwrGKgjFV3Zk7AehcvsBZXfnTBBGPEc4AiOJ44+NLORGUxgSH0lZvXOhcqsKItK2lHKlSHzKR8tSNS62UaedWF07iVQFdJMkK4OG36H2nDSZaMoTEJ9iNGyNsNT7RjC3uLZ8knA716ZgbG8xz1o+uf4HUTNTBVS6RDh8yjBy02jwCvVupwyfWNCX77QWpxohCW9PEZq+x7gH5lPopvaCYYVkNJqC9EYWal/teGjlujMcJSqiqyA6zGSZN3N9/Ug78QQ3jSZVGdTtNCje3lhrBPeksu0ZbmxWq4wuYTMI1d+YtpxaDULx4YvVQRHRnQVkf0TqFThy+jSTS7dDt0ZYXVRQSUReT0n48248P6HSVvuvPX9p63pFr37cycKEWPfQIywLY8XkFWeYCPXCuntG/f0nW+6/NMK7lBqh/aP1hFP2F+xTxPZIOf6SrwyynabVPvTabcx8XxvZOFwqzbSF2qGcBWQPE9trVP/uExWBQIXTa2JfWu6PMnPb/73yWBulR9lDjN3O3to4Cts2PrvIzH2amLbDh7U3LNTFj6n4aGHWPFpaf9lfR436a3n9Al9wMu6YXRlfQXoFTxwnNuuLNrMqUuMnm62lxk9LfeHiI/nKINvMLF1bRJfyw3Xu1o0bmxjDDIhtbTK2Ax4sdYeJbRXQalto1CMilIFhic0/Repca7SFiDX5728/FtvPpb2+mmLSs+WsjXTikwtq7i5V/6GtDubOu7N24dPKQ+39KHTvUDH6pllKo4HJ21MoVJvyh7+dRy+tnzeeuo8v/9nUpt3kM755FKsgclUr99C2qsVwCCDbF+ASa1ap957a6zxEXV9U7jSrfpXVF5V71Qr+UHDPaK+jq3tlXYcvtytoLo4r5SAmfhVBdV8Yl0Qgk0zXGhXc9uwBSnuI2ECfjqbRKM4RUug0of1zhEQ07oH57BwhR3vKUB2BXCdSMhpZKK4gslOGTW/cMpfu+5+rB3RO777ztZvuoIdXXqsfhOJxh+wP9TG7YNEhTZXT8+7/BxHR9Uu2LbxY9cr6+RnPZX+4fOYQvbdpD3XVFT4yij0zR75q3F7bX7OanLq8UxIRlMEv3n5HuylquzQrf2vHvHLE5xdJsz1YSotIm+7fSjOvWUZEdMPLTU+PZ8/trPjZJfd9TEREM17+ZsF480thDCtt2v60lt5usHSjgqD8KPY7hYqrgBT5RKDW8dbgrM65cabJt9iRTDVC4U1B0xdohk8kHDtNqJuFHJM3LGQsnSxkGnfSFTMGEBHR7vdW0+SH1SlYV5rz/sT6UsPyrQSPtR3Q+iXvFKzetzyTaP286Ut3XhyMvffmD5uxnOiceyO9j1sKxbTCp6ZtCLLUC1wqNm+OrVtfjPrSXNyGZ3jhQOOk3Pni0/TyN03jidbemVn6t6YFlxHR2oq3r3j/mzeHEO2s+Nncip3ji4ZEt74RVzVRbS3O3CBCORfoqiogJ5mCEHRxm5deBXFPY+PQrAFERO3rXnpwyA2NfY60szd9tDBrXtrS+ktqcnJqyusX+AyOH9lBum4/eH6RoWl2+r8cnpnRfvQoUb/TAv/rP3p0EBHRrswbtuy54U9Xvjxg0NGj7eHvVS4Ip36y/ciRGJ7naztyxDsxeI1ZVvlTh5+bS6xrcX0fGMHGyb52itwix/2C6urj2gU5M98k+ln5rlKf8qThcVKkpFRyaGfNO4GsJ9uPHiUakH3OF9u2HR2XSTsH3Piur1/70aNE/i8/zs7vd7TdRA1NnMoxrPNFcY9AMn0W0E4VkCJsEpEoVcCESJEg9BP1P9z81KFj7OH5J2VO7RrNfJzvKRMdi5XCAZeO3zFu4YeNF2/Imkcvrb8w9PyHv51HS+tLxxOFnTisWzB4yZD1L147xNzcrVTU/Nt30aWDiWjwkMFEu+zP0Bp105yyI4aY2PL6cnblB/bQfIuF8kNozynq7ql3vnbT74es3FU/cOdrN019bXCkRn4t9XYVqWn0jCzWPSczexg1EBHRkGCHnabK6bO/uHf1wvDpDcPVbWI1KNCQ1VarxEqRIOxD1Cf9lCvaW4efcBIdbl6f6PVxgKUszLz6+caPFmatH9sYTME9TXsGUN3SL2+/7wkiItrZ5A9NW1daTEtX0h05OR/Tz5aaaDK1wnva4FjOTkD3jhxK+UfjZ5woG6SSiGrigw/t3ln9I4ZaUHe/t9r76xcHEtGQsXn0yi4iLgg33PMwPXG/hfux6GlqCAuy9fOGzaYl2/5yMT+dawNPzX5XXvOiOBJygxQJwt5ERGl96dA/20/K7dxtf3tbFB/NZHWQuzGh85TmCHZ7CvEG17HHP+t2v3K7jD11c699j0bSFfcOaD98hGjPmprApHv7th8+sm5h8Q8LN1zchy5eP5Voz1e7w/YzUVyBZVD/oV80NLTnDCRq8LcPuvTIkY6G0GPHqf24yXkaDmnQ7e3CUb4NNH7G3PHWw+rWLXaNCK6fl9IcTeZ2lOofMbQBNHwZGDju8JF2IjrSFjh+TL1h7Hztpouf2XLu3JWGGxU3AWvzHzQge6vf337BYCL/tsDEWzJYK+iGe0ZVZq/acvNgU42i9tm5zhFXTKzW/+zcIELbECqeXtwWanhznthKkSAkImr/99oj3cafQERpdCzGIygcYKm/jMJMFuoYcPX/rPe9NGcZO3FIHy17OGtm4wCiPW/8gRbevn5s1jy6duGGxy8YMMRss1NkvusnL5k6+BkiouvK64fsfm3q/fQ70+2uAlzycaXdTp1POapNoj7VSUG9oWqrjKYaq/d89WXWoODowt07aUjHOULa/VoFPbx+7v13RL1+Y2dNrpw04Akiol8s2jJk15+unLTjjKvf+BMRTRr1IBHR1a9Evh6FG4gLRfwkV0OoVjINn9Cl6rGmuqZMe1tL57T+jt2GyfbwCfaH7jW49d7O39FesBUKBlc0rSye0HSdP7fOey8tqSm5hPY27e1/2tDuRER73vj5Y/TMoqtjfK9VG9TdWxjxflN8NKp9ddQ105W/lU7ezlzeKdmpe42Kj+QM7zjGTa+zVTe/M2PlwGVzRhNRbcWVa3JXP6I0++3d29S//86yPPYkd1cW7coIQkI8riOxxCN/HLguthrXEGqnCsgvOlQjzLn1FvPvilqSVZsi4e8+0TmtD9Fc/5ZnvB1d8G/9+IPnzh2j+/bZ6zp2qVwD6fQVy5ZPm6GemGUhG0qvDKiPieiuwU1RDaggosyp5f76Mm+tz19zPhER7V4ya8VP1v9mHHtZOe5mj0wPNoqa7t5KLYbdW7T7XPMjnEBX7cKn2YhY7UtKOo6+aVakzZv9IuxXGHXNdK7rDfPF2+9Qv5zLm353xk8f/OKF2bOraE0JeSfmBTeM/v0ziXbSiNMG8DPX3WgNtzeyMbQjVtSn9yJxrNqnZqlHqPulSBDqUqcgEUVKQUYJP+40IZeCRMRqhCz/YpiCNkWXhZRT4u8oaOfPvuXVCQs/bJzx1c+vfe+K155XT6gUNvHugyuTZvY1kd7Lsdm9hdulIvbiRLdGqKSj4CBP/Ysof3Pbs/pHPONXS9bUrM7c++Y5NOl9okuCT+9t3JmV1d/UqpqpEZrJobjSJnHCr//nWASyzSaAGqF53fv25q4jQ6YvJWOepW4y6nbRLkatnXZwfWdIeL5afBkaVkfMemTwmprfZdKRNr0Sp66WpWmu/WHnvJ2dE/W60+u2dupK7Bim1HC8tfW4poMD2/KVKwuOvmmW+lUuNbmGU+5H6dIjnfsRR4WaymdPXEXBzb7R/0O/iw8fbrO45XOUTVHZ2rWbujMMYy+2/Z9j2x3G2qLDN54oOkzYkSJBGLXrV71Fmlpg8lIalKI/XgurI1qWkFYaRtv5AtU+J6nvOxaJ9uK63ASWzgtwv6+yAaz46RLtxBg2GjXnR0Q4nIKUkkHInRoUUJ8OFF9ctGvPHpZOB5q8slo8tB0+rFQNyehKH4bEx9FWj0btHD+Ku7eQZrfI9ebn52bUOTvYLOPIdQ5Tw6rbirv06MFda55dgF7BlTL1NegZrsrIEdcguRAVjNxg1BuMYX3RTv0ysewUOpt3SoqioYWVO4dTkFIyCOMhtp1iHKAU8pQ5px3X7i3aqonzRTE1cMk38ckF3ATiA0R1NHbRhA33M9mpPpLeFsWxW2rqy7z3riKic25ZumKqufOWCaVtU3F4v+F8RVDhfBA2lOd6S+qIiHxlqvtvVxd5Cijqm45263USOyOo7hrKnRTkmL+amvZeExTP037ayorhuRPB3Fj5V2/i3B7BoM4Xz4Hn3MzFOybtXs/OgNzjhw/nzrtTeaitmhxP5RH3cSmD//n6m66a8+7agqOuMorri9wZxy49enA/k/iMI7cBaEclCXKUlSndi+Po0guMTx64t63y7XfGUvMf71nw4llP3tDP5Mwcpf6M2utix7UKmNiTghyng7C6yFsysipQm09E1UUeT666INolGCDB4UYNxtbEJxdE3S4a3bB6Q+rwU/ImIafQBDsXB/qzqKsU2vCTRJzKoOC2nWrqaOTqi1ZLDfcLcvVF+4XIfAHh4oSIqHm3/ydjHiIi6peV+c81zUSJC0JBoXNJW1FiU5AcD8Lqtyp9Zf7gEWd+RaCqyOP1bI36IFQx17+FIg+QmL1u9ZJxecrfRKQ8VNcLuSGDrI/o1JcWK8+oG0iVG/AmHaV4GzYNkYlyYv6oWTvDuFY3xQPaUrrCJxavMrh82gx1YWGU8qIuO8rfhvey5tQufFp9d2vuTteGPXE4UQzYjURv4P9XNCjY6yxz0HD1K1aLjH0uSTtdiTopyHH4yjLVRZ5HR4QffzaU53pXTPPft9Vr1CwjuO3ZM95R3GAJ0hsvYb53DBPpOjIU4VIyFKGbjLgdlTsXoj04MrzWTPiyYnka3zAs7VQr7TSkaHE7PnGFT9vRX+3YoeCreU88bm7tkki8yqBuEwvrla0QVxm1pUytS48elmqQhoXOUg3SchncvPj65smv5GcQ0YYl85smP/KLH5ufgUvZbJXRtoVS5K9dOVT13TXXzkJNcrhGmD+lsKBgYXWxqqxlF9dWbfV4C4ioUPxmmzcFtXqLpSgurp3AzqJx4toRCIbdW+zU+ZQdbiAFg9DRMqi9KpNg5ob90bg2GK4GabXoWapBWq4+9htAm/YRZRDta9o1ODP5UzC2Et4WynH6HGF+hb8s18udlsivCFSRp6Ay+tl2O+kEbdcYZci81cGCrLiqi6WZrjHmR9Bru8PFUBKNDbdayVPTVvhaW1rML1qp8ynUtY3k6iFsVZzKICtlykkH5uihQ+qHXBnkqoCTni3n5qk+EtX+ZNzPZGnkhrZJQJ2j2vJraVxHW2srdc66dPuDo64hIvqva598ufXwccH7bbDZAhS33cXXyx6v/OEXc6/p2/GUuji7KgUpZS66/dy5YyIFYaSKoPiy2uJramtxHWTsBKHNptGE+brmsU/PvjfvVPUzs37TPPvFmRdFeIc6CMWn9MhEDa9j1/btB09tO/2uC3vrThbpRJR6v6nMquAPZeKFAoWXQfVle9VYQHbTDM8lon3+muJ/HKCh45ef1y/81Z5cDZJroREXUu3IDYWg7vjRu/Pv2UR04ezan58RaRrSO52hnUbZeuNafl0ahFuWjv7d2qlzFpWOiHIGqd006jRn7jhvp5to8tEGHtHfl8769Z4Zv8+pHH3ToN+/OJOWzvr1+0TZM95+ceYgzQx0D66jOkL84ol5S94ZMmX5rWPVd4v6qLbqL9T3LgoLQnX+rXvoEW31AmKCqxEqWEDqFMbmjcXfjVo+rR81b5zvP+ER74nqF1feeHPz5xs2DR47+UQiTcuquOIuqBFGugjOng8r/3jKHese6r3/4/8u2nBKxVhWnTmw4rkF5TuJNFuaQnyFVa0Y9tNJnK+XPX73Uw1E2TPe/u3EsGK+Zenod/u9fcf4n278vHTEmYlaP0tSJAh1hwxyKWjm2jFkullM3DsmtgxHRDlmw3/PKt57dfm5L4y+qX/5szNCnXQ/X7vr6jfvvGggXfTm8ade2dQ6rm3o3AfvuqYvUWtrm+rtbPSebjcWbYVP3J+FyP/UA1vHPvTI3G8/uPX3f/vt7DGnHGolOrjy1Reaxkwr+GDvzkMD1GOY1bvFY4d0roqphpiMwq0ff6C9opPShY316P73vv1hr554wpaGA9dkZn3/9TeUdmLG9m0NPxr841ATVbeerft3brjr85ZLA8P/cyp17dmDO+PINaWKz+gfb+0oNayMH/rmgPJMlx49iA7+/f/6zriu+7FDrb1+nP1D/fZD3xAR1dcs8J9Xuu7GHuR/e9zyT9dN9pLeGEftEiN11+qSnh6poVV4OPj5gtueW8kaWlWHoaxK99XqR+dT4cvhh6dx9dXqysbJL288rZW2Ljv/v+s3XqsKvNOu3lhCdGDtqL1f76YzTd7SNLEduVMkCDkRDz8j0J4UNCn1escI/d+6vVe/eef4gTT+TXrqla00RtPuMfDU/is/XZu1d8czD855hogolIghMRu959/6l/NG3EVEvcfc8OP5r/nH/Lo/EfWael0p0cGVH/j3ENm5mAfbJAIv2jhpJpkFfTPZKCY1/RFN/95xq38/EWV7T+/ffMI5w4kCRIdb94ZPtX/nhgoa9otezRkRdu/injhme7o1/W3Su58R0YjLJgyhPhfwLx8ckFNa0ouIiPqceub+A3vIq7nLk2WRAi9yR8qvX3+6OuvBRRv70odvPLPs6/tmdHwnwZrZz+9wLgWJqGkvZZ1FREQjzpq66NMPrj2T/6X7nplHa74isn9vbwekyDlCgDhJ9gLiAJRBiCsHymCneC8AAADAzZK+RmiHxxP7jx/zeSbFSsZjnkmxkmBTUvzKSbGS8ZhnUqxkTKBGCAAAUkMQAgCA1BCEAAAgNQQhAABIDUEIAABSQxACAIDUEIQAACA1Nw7pAAAAcAxqhAAAIDUEIQAASA1BCAAAUkMQAgCA1BCEAAAgNQQhAABIDUEIAABSQxACAIDUEIQAACA1BCEAAEhNtiBsKM/1FFULXlTJLW9wdN3C1iDiwhO8ku5fw7D1cPFvLS2X/y7u38Ldv4Zh6+Hi31olIBF/mY+IqLAqwutVhZFfc4C/zKesXFUhka/MrzNVIlfS/WuocPlvLS2X/y7u38Ldv4YKl//WYWQJwuBv4iss9EX88l1QBlVbdVWh7jae6DLo7jUMBAJJ8VtLKQl+F/dv4e5fw0AgkBS/dTh5mkanVQUCgdp5IyJO0LDtM99njyaunu7fWuebNik79NA7wle31c9PlNCVdP8aBrn+t5aU638X92/h7l/DINf/1uFkCcLs4uJ8g0n8W+vqaFro6GopzXT2t2nY9pnmuc+28WuQyJV0/xoy7v+t5eT+38X9W7j715Bx/2/NkSUITcivCARqi0PHWtnDRtaVLIx0mjdh3L+S7l9DSpKVlFBS/C7uX0n3ryG5bSVTMwjDuiNF7LQk5h3hi/FacbiVzB42UjPJyGHZOm9UiftKqrl/DaOVFCuZZFAG48H9axitBK9kagZhdnFtx2nQCqM6OlNdFF5e/VvrfCO8cVpBIu1Kcs39ust3fCXDuH8NTUqKlUxyKINx4f41NMltKxldH5uk5S+L2Isp/KUI3bHiyUzH6MSupPvXMPKaCF5K5EpKzehTYQAACDpJREFUyM2/i/u3cPevYeQ1EbyU6DIoexCGf/9VhcoBQmJ+lWCvY275blpJ96+hwuW/tbRc/ru4fwt3/xoqXP5bd/AEAoHoqpIAAAApIDXPEQIAAJiEIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIwFTQ0NCR6FQCkhjKY1BCEya6hPNczc1Wi1wJAXiiDSQ9BCAAAUkMQJrWG8lxvSR3VlXg9RdWhZzxBueUNylSe3PLyouDzRdVUrfqbiKi6yJNbXq28NfgsABhBGUwFCMKkll1c6y/zka/MH6jIZ2VyxTR/IBAIBAL+aSu8SjmkupKtUwKBQKCqkCoLPG9NCQQCAX+Zr/LR0BR1JQVb72NvLPusAOUQwBSUwVSAIEwh1QtL6grvK85mj7KLl5ZRycJQYSqckk9ElD+lUPk7e9hIqtvqD01QVZEffON9hVT5FkohgFUog8kJQZg6GrZ9RlRZ4FF4S+ros23saNM3wqtMqP5b90nvCJ/yRgAwC2UwSSEIU4uvLNgoE1IbOjgFACegDCYhBGHqCG9lsUr9Tv/WOho5DKUXwBqUwSSFIEwh+fPKfJUFysn56iJVrzVjlQVK97WCSl/ZvPy4rCNAKkMZTE4IwmSXPWmaL9R1O7u41l9GJV52eqLgszK/hVaZwkIqiOZ9AJJDGUx6nkAgkOh1gISrLvIUUFWgAkegAImBMphIqBECAIDUEIQAACA1NI0CAIDUUCMEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKSGIAQAAKkhCAEAQGoIQgAAkBqCEAAApIYgBAAAqSEIAQBAaghCAACQGoIQAACkhiAEAACpIQgBAEBqCEIAAJAaghAAAKT2/wGkykK/xvA1VAAAAABJRU5ErkJggg==\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The autoregressive coefficient matrix is of particular interest here,\nas it captures lagged dependencies and cross-dependencies in the latent\nprocess model. Unfortunately <code>bayesplot</code> doesn’t know this is\na matrix of parameters so what we see is actually the transpose of the\nVAR matrix. Using <code>dir = &#39;v&#39;</code> in the <code>facet_args</code>\nargument will accomplish this:</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb26-1\"><a href=\"#cb26-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb26-2\"><a href=\"#cb26-2\" tabindex=\"-1\"></a>  var_mod,</span>\n<span id=\"cb26-3\"><a href=\"#cb26-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&#39;A&#39;</span>,</span>\n<span id=\"cb26-4\"><a href=\"#cb26-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb26-5\"><a href=\"#cb26-5\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&#39;hist&#39;</span>,</span>\n<span id=\"cb26-6\"><a href=\"#cb26-6\" tabindex=\"-1\"></a>  <span class=\"at\">facet_args =</span> <span class=\"fu\">list</span>(<span class=\"at\">dir =</span> <span class=\"st\">&#39;v&#39;</span>)</span>\n<span id=\"cb26-7\"><a href=\"#cb26-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>There is a lot happening in this matrix. Each cell captures the\nlagged effect of the process in the column on the process in the row in\nthe next timestep. So for example, the effect in cell [1,3] shows how an\n<em>increase</em> in the process for series 3 (Greens) at time <span class=\"math inline\">\\(t\\)</span> is expected to impact the process for\nseries 1 (Bluegreens) at time <span class=\"math inline\">\\(t+1\\)</span>.\nThe latent process model is now capturing these effects and the smooth\nseasonal effects.</p>\n<p>The process error <span class=\"math inline\">\\((\\Sigma)\\)</span>\ncaptures unmodelled variation in the process models. Again, we fixed the\noff-diagonals to 0, so the histograms for these will look like flat\nboxes:</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb27-1\"><a href=\"#cb27-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb27-2\"><a href=\"#cb27-2\" tabindex=\"-1\"></a>  var_mod,</span>\n<span id=\"cb27-3\"><a href=\"#cb27-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&#39;Sigma&#39;</span>,</span>\n<span id=\"cb27-4\"><a href=\"#cb27-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb27-5\"><a href=\"#cb27-5\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&#39;hist&#39;</span>,</span>\n<span id=\"cb27-6\"><a href=\"#cb27-6\" tabindex=\"-1\"></a>  <span class=\"at\">facet_args =</span> <span class=\"fu\">list</span>(<span class=\"at\">dir =</span> <span class=\"st\">&#39;v&#39;</span>)</span>\n<span id=\"cb27-7\"><a href=\"#cb27-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The observation error estimates <span class=\"math inline\">\\((\\sigma_{obs})\\)</span> represent how much the\nmodel thinks we might miss the true count when we take our imperfect\nmeasurements:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb28-1\"><a href=\"#cb28-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(var_mod, <span class=\"at\">variable =</span> <span class=\"st\">&quot;sigma_obs&quot;</span>, <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>, <span class=\"at\">type =</span> <span class=\"st\">&quot;hist&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>These are still a bit hard to identify overall, especially when\ntrying to estimate both process and observation error. Often we need to\nmake some strong assumptions about which of these is more important for\ndetermining unexplained variation in our observations.</p>\n</div>\n<div id=\"correlated-process-errors\" class=\"section level3\">\n<h3>Correlated process errors</h3>\n<p>Let’s see if these estimates improve when we allow the process errors\nto be correlated. Once again, we need to first update the priors for the\nobservation errors:</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb29-1\"><a href=\"#cb29-1\" tabindex=\"-1\"></a>priors <span class=\"ot\">&lt;-</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb29-2\"><a href=\"#cb29-2\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.1</span>), <span class=\"at\">class =</span> sigma_obs, <span class=\"at\">lb =</span> <span class=\"fl\">0.2</span>),</span>\n<span id=\"cb29-3\"><a href=\"#cb29-3\" tabindex=\"-1\"></a>  <span class=\"fu\">prior</span>(<span class=\"fu\">normal</span>(<span class=\"fl\">0.5</span>, <span class=\"fl\">0.25</span>), <span class=\"at\">class =</span> sigma)</span>\n<span id=\"cb29-4\"><a href=\"#cb29-4\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>And now we can fit the correlated process error model</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb30-1\"><a href=\"#cb30-1\" tabindex=\"-1\"></a>varcor_mod <span class=\"ot\">&lt;-</span> <span class=\"fu\">mvgam</span>(</span>\n<span id=\"cb30-2\"><a href=\"#cb30-2\" tabindex=\"-1\"></a>  <span class=\"co\"># observation formula, which remains empty</span></span>\n<span id=\"cb30-3\"><a href=\"#cb30-3\" tabindex=\"-1\"></a>  <span class=\"at\">formula =</span> y <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"dv\">1</span>,</span>\n<span id=\"cb30-4\"><a href=\"#cb30-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb30-5\"><a href=\"#cb30-5\" tabindex=\"-1\"></a>  <span class=\"co\"># process model formula, which includes the smooth functions</span></span>\n<span id=\"cb30-6\"><a href=\"#cb30-6\" tabindex=\"-1\"></a>  <span class=\"at\">trend_formula =</span> <span class=\"sc\">~</span> <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>)) <span class=\"sc\">+</span></span>\n<span id=\"cb30-7\"><a href=\"#cb30-7\" tabindex=\"-1\"></a>    <span class=\"fu\">te</span>(temp, month, <span class=\"at\">k =</span> <span class=\"fu\">c</span>(<span class=\"dv\">4</span>, <span class=\"dv\">4</span>), <span class=\"at\">by =</span> trend) <span class=\"sc\">-</span> <span class=\"dv\">1</span>,</span>\n<span id=\"cb30-8\"><a href=\"#cb30-8\" tabindex=\"-1\"></a></span>\n<span id=\"cb30-9\"><a href=\"#cb30-9\" tabindex=\"-1\"></a>  <span class=\"co\"># VAR1 model with correlated process errors</span></span>\n<span id=\"cb30-10\"><a href=\"#cb30-10\" tabindex=\"-1\"></a>  <span class=\"at\">trend_model =</span> <span class=\"fu\">VAR</span>(<span class=\"at\">cor =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb30-11\"><a href=\"#cb30-11\" tabindex=\"-1\"></a>  <span class=\"at\">family =</span> <span class=\"fu\">gaussian</span>(),</span>\n<span id=\"cb30-12\"><a href=\"#cb30-12\" tabindex=\"-1\"></a>  <span class=\"at\">data =</span> plankton_train,</span>\n<span id=\"cb30-13\"><a href=\"#cb30-13\" tabindex=\"-1\"></a>  <span class=\"at\">newdata =</span> plankton_test,</span>\n<span id=\"cb30-14\"><a href=\"#cb30-14\" tabindex=\"-1\"></a></span>\n<span id=\"cb30-15\"><a href=\"#cb30-15\" tabindex=\"-1\"></a>  <span class=\"co\"># include the updated priors</span></span>\n<span id=\"cb30-16\"><a href=\"#cb30-16\" tabindex=\"-1\"></a>  <span class=\"at\">priors =</span> priors,</span>\n<span id=\"cb30-17\"><a href=\"#cb30-17\" tabindex=\"-1\"></a>  <span class=\"at\">silent =</span> <span class=\"dv\">2</span></span>\n<span id=\"cb30-18\"><a href=\"#cb30-18\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p>The <span class=\"math inline\">\\((\\Sigma)\\)</span> matrix now captures\nany evidence of contemporaneously correlated process error:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb31-1\"><a href=\"#cb31-1\" tabindex=\"-1\"></a><span class=\"fu\">mcmc_plot</span>(</span>\n<span id=\"cb31-2\"><a href=\"#cb31-2\" tabindex=\"-1\"></a>  varcor_mod,</span>\n<span id=\"cb31-3\"><a href=\"#cb31-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&#39;Sigma&#39;</span>,</span>\n<span id=\"cb31-4\"><a href=\"#cb31-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span>,</span>\n<span id=\"cb31-5\"><a href=\"#cb31-5\" tabindex=\"-1\"></a>  <span class=\"at\">type =</span> <span class=\"st\">&#39;hist&#39;</span>,</span>\n<span id=\"cb31-6\"><a href=\"#cb31-6\" tabindex=\"-1\"></a>  <span class=\"at\">facet_args =</span> <span class=\"fu\">list</span>(<span class=\"at\">dir =</span> <span class=\"st\">&#39;v&#39;</span>)</span>\n<span id=\"cb31-7\"><a href=\"#cb31-7\" tabindex=\"-1\"></a>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This symmetric matrix tells us there is support for correlated\nprocess errors, as several of the off-diagonal entries are strongly\nnon-zero. But it is easier to interpret these estimates if we convert\nthe covariance matrix to a correlation matrix. Here we compute the\nposterior median process error correlations:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb32-1\"><a href=\"#cb32-1\" tabindex=\"-1\"></a>Sigma_post <span class=\"ot\">&lt;-</span> <span class=\"fu\">as.matrix</span>(</span>\n<span id=\"cb32-2\"><a href=\"#cb32-2\" tabindex=\"-1\"></a>  varcor_mod, </span>\n<span id=\"cb32-3\"><a href=\"#cb32-3\" tabindex=\"-1\"></a>  <span class=\"at\">variable =</span> <span class=\"st\">&quot;Sigma&quot;</span>, </span>\n<span id=\"cb32-4\"><a href=\"#cb32-4\" tabindex=\"-1\"></a>  <span class=\"at\">regex =</span> <span class=\"cn\">TRUE</span></span>\n<span id=\"cb32-5\"><a href=\"#cb32-5\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb32-6\"><a href=\"#cb32-6\" tabindex=\"-1\"></a>median_correlations <span class=\"ot\">&lt;-</span> <span class=\"fu\">cov2cor</span>(</span>\n<span id=\"cb32-7\"><a href=\"#cb32-7\" tabindex=\"-1\"></a>  <span class=\"fu\">matrix</span>(<span class=\"fu\">apply</span>(Sigma_post, <span class=\"dv\">2</span>, median),</span>\n<span id=\"cb32-8\"><a href=\"#cb32-8\" tabindex=\"-1\"></a>         <span class=\"at\">nrow =</span> <span class=\"dv\">5</span>, </span>\n<span id=\"cb32-9\"><a href=\"#cb32-9\" tabindex=\"-1\"></a>         <span class=\"at\">ncol =</span> <span class=\"dv\">5</span></span>\n<span id=\"cb32-10\"><a href=\"#cb32-10\" tabindex=\"-1\"></a>  )</span>\n<span id=\"cb32-11\"><a href=\"#cb32-11\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb32-12\"><a href=\"#cb32-12\" tabindex=\"-1\"></a><span class=\"fu\">rownames</span>(median_correlations) <span class=\"ot\">&lt;-</span> </span>\n<span id=\"cb32-13\"><a href=\"#cb32-13\" tabindex=\"-1\"></a>  <span class=\"fu\">colnames</span>(median_correlations) <span class=\"ot\">&lt;-</span> </span>\n<span id=\"cb32-14\"><a href=\"#cb32-14\" tabindex=\"-1\"></a>  <span class=\"fu\">levels</span>(plankton_train<span class=\"sc\">$</span>series)</span>\n<span id=\"cb32-15\"><a href=\"#cb32-15\" tabindex=\"-1\"></a></span>\n<span id=\"cb32-16\"><a href=\"#cb32-16\" tabindex=\"-1\"></a><span class=\"fu\">round</span>(median_correlations, <span class=\"dv\">2</span>)</span>\n<span id=\"cb32-17\"><a href=\"#cb32-17\" tabindex=\"-1\"></a><span class=\"co\">#&gt;             Bluegreens Diatoms Greens Other.algae Unicells</span></span>\n<span id=\"cb32-18\"><a href=\"#cb32-18\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Bluegreens        1.00   -0.20  -0.04        0.17     0.48</span></span>\n<span id=\"cb32-19\"><a href=\"#cb32-19\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Diatoms          -0.20    1.00   0.13        0.45     0.17</span></span>\n<span id=\"cb32-20\"><a href=\"#cb32-20\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Greens           -0.04    0.13   1.00        0.30    -0.05</span></span>\n<span id=\"cb32-21\"><a href=\"#cb32-21\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Other.algae       0.17    0.45   0.30        1.00     0.28</span></span>\n<span id=\"cb32-22\"><a href=\"#cb32-22\" tabindex=\"-1\"></a><span class=\"co\">#&gt; Unicells          0.48    0.17  -0.05        0.28     1.00</span></span></code></pre></div>\n</div>\n<div id=\"impulse-response-functions\" class=\"section level3\">\n<h3>Impulse response functions</h3>\n<p>Because Vector Autoregressions can capture complex lagged\ndependencies, it is often difficult to understand how the member time\nseries are thought to interact with one another. A method that is\ncommonly used to directly test for possible interactions is to compute\nan <a href=\"https://en.wikipedia.org/wiki/Impulse_response\">Impulse\nResponse Function</a> (IRF). If <span class=\"math inline\">\\(h\\)</span>\nrepresents the simulated forecast horizon, an IRF asks how each of the\nremaining series might respond over times <span class=\"math inline\">\\((t+1):h\\)</span> if a focal series is given an\ninnovation “shock” at time <span class=\"math inline\">\\(t = 0\\)</span>.\n<code>mvgam</code> can compute Generalized and Orthogonalized IRFs from\nmodels that included latent VAR dynamics. We simply feed the fitted\nmodel to the <code>irf()</code> function and then use the S3\n<code>plot()</code> function to view the estimated responses. By\ndefault, <code>irf()</code> will compute IRFs by separately imposing\npositive shocks of one standard deviation to each series in the VAR\nprocess. Here we compute Generalized IRFs over a horizon of 12\ntimesteps:</p>\n<div class=\"sourceCode\" id=\"cb33\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb33-1\"><a href=\"#cb33-1\" tabindex=\"-1\"></a>irfs <span class=\"ot\">&lt;-</span> <span class=\"fu\">irf</span>(varcor_mod, <span class=\"at\">h =</span> <span class=\"dv\">12</span>)</span></code></pre></div>\n<p>A summary of the IRFs can be computed using the\n<code>summary()</code> function:</p>\n<div class=\"sourceCode\" id=\"cb34\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb34-1\"><a href=\"#cb34-1\" tabindex=\"-1\"></a><span class=\"fu\">summary</span>(irfs)</span>\n<span id=\"cb34-2\"><a href=\"#cb34-2\" tabindex=\"-1\"></a><span class=\"co\">#&gt; # A tibble: 300 × 5</span></span>\n<span id=\"cb34-3\"><a href=\"#cb34-3\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    shock                  horizon irfQ50 irfQ2.5 irfQ97.5</span></span>\n<span id=\"cb34-4\"><a href=\"#cb34-4\" tabindex=\"-1\"></a><span class=\"co\">#&gt;    &lt;chr&gt;                    &lt;int&gt;  &lt;dbl&gt;   &lt;dbl&gt;    &lt;dbl&gt;</span></span>\n<span id=\"cb34-5\"><a href=\"#cb34-5\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  1 Process_1 -&gt; Process_1       1 0.350   0.264     0.441</span></span>\n<span id=\"cb34-6\"><a href=\"#cb34-6\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  2 Process_1 -&gt; Process_1       2 0.297   0.227     0.374</span></span>\n<span id=\"cb34-7\"><a href=\"#cb34-7\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  3 Process_1 -&gt; Process_1       3 0.251   0.190     0.323</span></span>\n<span id=\"cb34-8\"><a href=\"#cb34-8\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  4 Process_1 -&gt; Process_1       4 0.214   0.155     0.283</span></span>\n<span id=\"cb34-9\"><a href=\"#cb34-9\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  5 Process_1 -&gt; Process_1       5 0.182   0.125     0.253</span></span>\n<span id=\"cb34-10\"><a href=\"#cb34-10\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  6 Process_1 -&gt; Process_1       6 0.155   0.0966    0.227</span></span>\n<span id=\"cb34-11\"><a href=\"#cb34-11\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  7 Process_1 -&gt; Process_1       7 0.132   0.0744    0.205</span></span>\n<span id=\"cb34-12\"><a href=\"#cb34-12\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  8 Process_1 -&gt; Process_1       8 0.113   0.0563    0.185</span></span>\n<span id=\"cb34-13\"><a href=\"#cb34-13\" tabindex=\"-1\"></a><span class=\"co\">#&gt;  9 Process_1 -&gt; Process_1       9 0.0967  0.0419    0.167</span></span>\n<span id=\"cb34-14\"><a href=\"#cb34-14\" tabindex=\"-1\"></a><span class=\"co\">#&gt; 10 Process_1 -&gt; Process_1      10 0.0833  0.0307    0.152</span></span>\n<span id=\"cb34-15\"><a href=\"#cb34-15\" tabindex=\"-1\"></a><span class=\"co\">#&gt; # ℹ 290 more rows</span></span></code></pre></div>\n<p>But it is easier to understand these responses using plots. For\nexample, we can plot the expected responses of the remaining series to a\npositive shock for series 3 (Greens) using the <code>plot()</code>\nfunction:</p>\n<div class=\"sourceCode\" id=\"cb35\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb35-1\"><a href=\"#cb35-1\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(irfs, <span class=\"at\">series =</span> <span class=\"dv\">3</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>This series of plots makes it clear that some of the other series\nwould be expected to show both instantaneous responses to a shock for\nthe Greens (due to their correlated process errors) as well as delayed\nand nonlinear responses over time (due to the complex lagged dependence\nstructure captured by the <span class=\"math inline\">\\(A\\)</span>\nmatrix). This hopefully makes it clear why IRFs are an important tool in\nthe analysis of multivariate autoregressive models. You can also use\nthese IRFs to calculate a relative contribution from each shock to the\nforecast error variance for a focal series. This method, known as a <a href=\"https://en.wikipedia.org/wiki/Variance_decomposition_of_forecast_errors\">Forecast\nError Variance Decomposition</a> (FEVD), is useful to get an idea about\nthe amount of information that each series contributes to the evolution\nof all other series in a Vector Autoregression:</p>\n<div class=\"sourceCode\" id=\"cb36\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb36-1\"><a href=\"#cb36-1\" tabindex=\"-1\"></a>fevds <span class=\"ot\">&lt;-</span> <span class=\"fu\">fevd</span>(varcor_mod, <span class=\"at\">h =</span> <span class=\"dv\">12</span>)</span>\n<span id=\"cb36-2\"><a href=\"#cb36-2\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(fevds)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAHgCAMAAABOyeNrAAABgFBMVEUAAAAAADoAAGYAOpAAZrYAsPYAv30ZGT8ZGWIZP4EZYp8aGhozMzMzMzw6AAA6ADo6AGY6OmY6OpA6kNs/GRk/GT8/GWI/P2I/P4E/gb1BSU1FTUVJSUFNSUFNTU1NTW5NTY5NXp1NaX9NbqtNjrVNjshiGRliGT9iGWJiPxlin9lmAABmADpmAGZmOgBmtv9pTW5uTU1uTW5uTY5ubo5ubqtuq+Rvtf95eU1/aW6BPxmBPz+BP2KBn4GBvb2BvdmDTU2OTU2OTWmOTW6OTYOOTY6Obm6Og02OyP+QOgCQOjqQOmaQkDqQkGaQtpCQ27aQ29uQ2/+fYhmf2dmijk2jpQCrZE2rbk2rbm6rbo6ryKur5P+2ZgC225C22/+2//+9gT+92dnIjk3I///Zn2LZrYDZvYHZw5fZ2Z/Z2a3Z2b3Z2cPZ2dnbkDrb/7bb///kq27k///na/Pr6+v4dm3/tmb/yI7/25D/27b/29v/5Kv//7b//8j//9v//+T///8qqyQYAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAcbklEQVR4nO2di3/fNkLA08de1146yO62HZAODnbbyhE2oMAOKOOZjuMgLWWP5mibjVB6ydotSwJZE//rZ9myJdmyLNlW7J9/3+9ny09+KFatb2RZPz1WEoAIrIydAJgniAVRQCyIAmJBFBALooBYEIXuYl2dAlNKy9XppWVEeoi1Nz5XJ5SWIjFXx06HALH6gVgNIFY/EKsBxOoHYjWAWP1ArAYQqx+I1QBi9QOxGkCsfiBWA3MXa/e1KylvBt+X3R/eDbp/8dIiYr3nd2qIWN0S8+WVKy+H3ZjxiCyWEOTxT24F38DA+xctLeL83R/4xQkSq0tiRKSH3wtJy4icg1hPPnxv9/V3X777+O3Ml/TjpVt7ckP+DZp/inde+usYJVaXtHwp8vGOX5EVLFbwjdnzLsuXQqz0L373tTRv7ry59+Urj9K7KT7SjfSP7/E7d7WP4NsXLlaHtHgXLMFidUkMJVZ+/7KqxHvZfRQ3Kc2j3BmRWekOmWe1rItXxwpPy5MPPatC4XWs4MTsvvZSkOQjcg4llvwU/z/52a3dNx7tZcX+FVHwpzdY3Cr5UYvne/8ipuXx275V7OASKzwx3sXnMoll/mG+o6oxrzzSPsx4vvcvXlqyZ5UfXcUKuTG+Fb5lEkurSqSb+Ya4aeqjHs/3/kVLS4BXncXyTowIUWLV71/15UeU8Xfyt547lZef6GL5puXhlbwuFJAYn7R0vDEPr1yhjnUu0PLeAGJp5G9Kvn+Txv2bQlriidXjxozHhMTqACVWA4jVD8RqALH6gVgNIFY/EKuBhRZrCkwpLYwr1Okhlr5x0LTReGCQs0qxJpCWIhFXz/GSjWchVr+zEKvhLMTqdxZiNZyFWP3OQqyGsxCr31mI1XDW1MU6+ZMvss/nH63/+OvyI2cKmYlYDWdNXKyj9bcysc4+2Uye/UHxIZlCZiJWw1nTFmvn+ud5ifX8H78QhZf8kEenkJmI1XDWtMUqH4Unf/Z18vzv78uPRDYCHgi+LQgPdYiihTJKsULS0u+61l+oJ6Y5LcNf13oV/caMh5dYRz/OjJIf8lie9vIfFB7SggfOE60hS4kVfl1bKDwt31pKLGuSg39zh3/IYpdYAsRSUbRESLHuFSCWjZPWOtYw92XOYqnQgc22HqHFF+vsk5v5W+HN2lvhMPdl6cRyh/r8QxZHLPF/cztWcC4gVrtYniHrzsUQywViqShaIhArZ05iqdvse914Yr1YgFihTFksW8h2XcSKxvKIpeWH8zcj1iAspVhOxYYWS4UQy4tZiGXLmXhi2YoxxKoyW7F8M7iPWIMohljzFEv9wj5i9VAMsRDLR6xgxRALscLE8gxZdyIWYiGWFcRCLAeIhVhRQCzEigJiIVYUeog1ucEUFjdsoZbD4aF7lsEUKqNVyLqzR8h+eCEGU7igxFJRtERQYuUgFmJFAbEQKwqIhVhRQCzEigJiIVYUEAuxooBYiBUFxEKsKCAWYkUBsRArCoiFWFFALMSKAmIhVhQQC7GigFiIFQXEQqwouMQqJ/B7ti7YzD7fmu4cpIi1GGKZC1GIubh3NrXDiIVYDhxiGZMki2m4zz69rx1GLMRy4BDLmNZdFF3po1E8EFOmuTKFxQ0GU4yFQyx9IYrs8+QDvdSixFJRtERQYuV4llhH5TTcZT0LsRDLgWcda+dmsRexEMsH51thuRBF/gAUxdbZZzQ3IJYH7e1Y2coU+RPx2fr69fLFELEQywEt74gVBcRCrCggFmJFAbEQKwqIhVhRQCzEigJiIVYUEAuxooBYiBUFxEKsKCAWYkUBsRArCoiFWFFALMSKAmIhVhRYmaJ/iMEUFkyx9ldWNvYvPfWKSYmlomiJoMTKMcTavvTVjY3T25e9YiIWYjnQxfruxkb6X3J48YFPTMRCLAeIhVhRMB6F++JR+N2NNa+YiIVYDszK++FKip9XiIVYLmjHQqwoIBZiRcEQ6/T2WuLb2oBYiOXCbMcSTtGOhVgDUGluEB80NyBWfxALsaJgtmMJpWjHQqwBoB0LsaJAcwNiRQGxECsKhljHq+JRuELlHbF6o4tVbcEqV6YolqRQOxLEQiwnluaGAm1linxGW3OpCsRCLAdmiWWIpWZNlpO7G0tVIBZiuTDqWGbTqJrnXS5JoXawMgWDKVowH4UreuVdrUwhl6TQl6qgxKLEcuK7lo6oZ5k7EAuxHPiu/iXEoo6FWN442rHUyhRySQptqYoEsRDLiflWuJa+GKpGB7UyhVySgnYsxPKl2o61vZYc+g2FRizEclAVa/8y/bEQawCqXZNTqzwnb0AsxHJQG0yxvXJhyysmYiGWA7rNIFYUEAuxolCKlc0IskJ/LMQaBkosxIqCo9tMC4iFWA4cHf1aQCzEclCZH8tv+tEMxEIsB47+WC0gFmI5oPKOWFFALMSKAuMKESsKrv5YbhhMoYIMpqhBf6xqiBJrEOiPhVhRoD8WYkWB/liIFQWaGxArCoiFWFEwK+9rATERC7EcmF9Cr6yseHdwQCzEclB9FG6vUHlHrAGw1LG2acdCrN5YSiw/rxALsVyYDaTez8EEsRDLCV2TESsKtGMhVhQQC7GigFiIFQXEQqwouNYrVBP4nbwvpuMuFqjIQSzEcuAQSy1EIaZKFlNy5wtUSBALsRwosfZXCuSKOmqS5COh186mXKBCgliLKJbI5Vpb5fE179ZLbxztWOa07mlILlCRwsoUCzqYIltD99C/p0F3HJV3YyEKMRW3XKBCHqbEUlG0REy6xJLTvmyHTKXQEUOsfI6sou6ul1jPP7opzynrWYi1iGKtqWD2rfDxqz9fufjL9FEot/OxpQOUaNXBFGlZuV+rY6VvhWW1HbEWWCyx6HeuVrY25f6lp8erl7M6VrktqlvHq/3NqtSxxO8/rK1MIb2SC1QYmYlYCyVWXnu/LF/90wzPHEptKrdffdDZJYOKWKJ3cqUdKy20RPuVqLbLBSoSLe2ItWBiZfl86alsA1jLS6hrW8W26OFy2RXZl8oQ+8P0VXTb7xcj1qKKlYkk6++lWKo+r1Wze1CdFOSy9ysDYi2eWLLBSjz6ZGNWIdah3rgV1n/KDt8VLpNYybbwR1SkT2+n5UdqUyFWsZ3Vg4ZoMEWspRIr/35FvBiK5oXUskKsYlu8NwZ0I26G+bGWS6xzo8f8WNlPxEIsK8yPhVhRYH4sxIoC82MhVhSYHwuxokBzA2JFAbEQKwq1R2HWf8IHxEIsB9XKe+JtFmItoFjfWvFTJQzX8C83iIVYDnqIxWCKMrgwgynGESsfw+E7EyklloqiJYISK8d8Kzwsvvv2ALEQywHNDYiFWIi1qGLtr6xs+C4MjViI5cBsx7r0VT4CzAfEmp1YeUdPzzq2hm3MWG341wbtWOU+3wyejVhCkO/+MLRj8qGtzzFiVSUKz/55iXV6e+P4N/7o4gM5Ciz9uLBVDAk7XNE/JNsXftFSYiX74lG4VO1YtpwJz+BZiXV8bSsbHp33JRbTiKQf6cb+5eS7nz7QPhRtj8IlbMey5Yza90KBO/TCbMTK6lgbmSjCnvSpmDsjHo/pDvmUrD0s28UKIbpYbk/6iGXLGWWJp05zFEsKIj7F/6cfbx3/pmgjSJ+E+WCx1awbqPxIqvF0zFE6oy0g4OnE4GJZNEEsS4n109IcOdTGGHHj8VbodslgALHKrG4Ry5pL+v3zEUvLD6cmiJV/qjpWuplvCJvUh/qtrY9C37ZRLe3hYt2z5Hr4K/5oYn1ToELfxBPLLbQ1+XpaagSIVX0rFA8/uYRXdSWv9hJr5RxGQtseSR1uebBY7vxQmhxY1HGHBhLLnb7zEGtIzqvybi053GK5b6+nWJZfZy11RhMrWKepiCXnY2ga0xVXLOcTThcr/PZ6imWxqUWTcxGrh05TEauF2pfQWjuWWplChtSOxE8s559orwozYi2SWGYPUrUyhQypHSrtwTpZH0nhmekWS13X5sFoYrmFCb+uNfl6WmqMI1alz7uaNVmGtGmUk7pYzlKi5b4MLVZ4fsQTSytke0g0kFjnh0MsNc+7DKkdamWKcTEHU4zM1emlZUQcj0K1MoUMGUtVmH8UB00bjQcGOcssscZNi1linc8lG89qEuuelYaTe+GovDtKrFraEQuxTBzNDV51LAliIZZJKZbs5aehVqaQIbWjlnbEQiwTh1hqZQpHO5YEsRDLxLYQZsh3hRLEQiyTvt1mJIiFWCZ9vyuUIBZimfQQawpMKS1Xp5eWGm6xuo0rFLHqj7ruYkEDja3e4QcG/V2CFrG6jCsU51sW30GswVlwsULHFR6KgWDbtSILsQZnwcXqMK7QVsq5+mPB7PCpY4WPK9TWMC/pPqMfLCAeJVYSPK7Qakz3OUhhAfEXy39coX3N+x6T206BKaVl/D5Q7fiL5T2u0O5Vn8lt98bn6oTSsjczsXzHFeZfBba8FYZU3q+OnZF7ExPr+9WxJwUn76+vb2ahZ+vr6299UR5Qm5UY4oCMY0bJei3VBrkUBxovVOIWa0h6tLyPnZF70xLrVz+qjD0pEH0jTz7I+kfubBq3sNysxMg4ypUxohwJW2qDXIoDzRcqGVCsgHGFgXWssXNyb1pi/e9vVfpFFjfqSGR9ltNnn97X76DarMTIduVddY0oO9c/F32Yqh0wiwONF1KMU2IhVh/+57crPbn1m5Vvpk+u4lmVGJuWGLIAq0QRGtW6jBcHGi+kGEMs1R/Lc3LbsXNyb1pi/ffvVMaeaPdK9L1NEc8prTBRm/UYxVY1iiiYqoNcigONF1KMWmJ5cnXsnNyblliOEuv5RzfVhq2eVS+xjvS6vIrSUmK5LnTOUHkfisY6VvqypmexTax6HWvnpjXKib2OVb4VOi50ziDWUPzqR5WxJwUqu0UxdPaZqtWXm5UYWu27EkX4UxvkUhxovJDiRSudHXAQV6zd166kvBmcSU8+fM/rvBCxuqXlYRrn5btep36/OvZEIhulxIE0eF174OWb9RhFFaseRWvHMqPJUxsuVDIbsX6Y5snjn9wKzM00OyOI1Sktd/wSoidmysxKrLT42X393ZfvPn47+9tPP166tSc3vryif5TRXn83klihaXnyM38REUvHEEs2pg7XjpVl5u4Pbu2+lopy5829L195JJ5y6Ue68fB7e4/fuat9qNz8mxiPwi5pSZ274ll6IpaBOR235wL2GV6ZmdVr3ssyVeRY+iTK8jd7JKU75JOp8oB6+Ga8OlZgWlIRvUstxNKJ246V51z+Kf5P82j3jUd7siRIn0Jpbqc/iw8Z6Y1HUcTqkpYMz3oWYun0WEAgMDPNUuKdshqTPou0j738Rczz9a2rWN5pyUCsDhh1rKC+o6GZqdVr0s18Q+Sg+lDxYpdY3mkRoSd/5dfcsPhidRtXeGitlfeY5z00M6tvYuKBcyd/BbtTaSyKLpZ3Wh5eqT4YWxMzZVrE6jKuUETar1fOaXkfjJmIFbxeYZLYlqaYkFj5a5t3AaHn5RTSMhexuowrbC2x6JrcgxmI1W1c4fGqpRspgykGYwZidVyvsG0kND1IezEvsULWK2ybuwGxejEvsbzHFYpQ29wNYY/CKTCltMxMLO/1CvetQ3V6VN71DWb0m8IyI+24xRoSpooc7KwlEyvyeoUSxFo6sVow53lnOm7EGgh3iVUOg2QBgfazEEvH2dxwJCeWcCyEKUGsxRDr/HCJlc8IkLBIk99ZiKXjHmJfjIZsXgizXGE1PNQhihYy1nsMSku/61p/4UQWn2znBSsxruTumizFciyEWd7c8JAWPHCeaA1ZSqzw69pC4Wn5dnFKrHHEqtNUYgkQS0VJ9MRMmbFKrGpzw0lrHSvcCFsGI9Y5MWaJpX+hqE2O07AQZrgRtgxGrHNi1Eeh1iMim2rCuRBmuBG2DEasc2JcsUJa3tXkXSoUnsGIdU6MKta22YeriWax3CFbBiPWOTFq5b3p++oKXcW6ZwkehBd8iNUFt1jdxhXaRzr37d0QUSx3CLG60CJWl3GFiWhbRyzEahMrfFxhenqbWIfW1SvsINY8xQoeV3j68b+3PQrD+rxnPxFrTmJ1Gle4v9ZWxwocpZP9RKw5idVlXGF6BmIhlrdY3uMK814xtadcfRoj3+nXEGvWYnmPK0xamhuKb6AD+7wj1lzF8h5XSDsWYk2mP5YLxFpusXzHFXYc/oVYyypWC5RYiBVdrMBZk7MRBBY3fEMdomghBlN0YRyxAud5z36GFzX3LEFKrNlhfqXj1xMrB7EQy0GP6bizn4i1UGJ9YyXGlai8I1Z0sfiuELEGA7EQK7JYtrkbXCAWYjmguQGxqLwjVl9GEits6d7sJ2IhlpUeS/dmPxFrRmJ1G1e4by2LqGMhlhKr07jC+nIngh5fQmc/EWtuYoWOKzz92Cpij6V7s5+INTexQscVZl8Eto3S4bvC5Rary7jCVERbqUVzA2KZJVbSYb3ClmXlwkCsWYs15HqF1dW/ygn8nq0LNrPPt8w5SBFrpmIFrVd4+i8PqldyzN1gLkQh5uLe2dRORqx5izXgeoWV3g3GJMliGu6zT+9rZyPW7MQaEodYxrTuouhKH43igZiiVqawuNESUmsDHfQJMZiiCwOKFbJeofko1BeiyD5PPtBLLZ8SS60vZQlpwQPnidYQJVYXximxKpV3vcQ6KqfhLutZiIVYDhzNDXoda+dmsddDLE83EOv8mYRY2kIU+QNQFFtnn7U3NyAWmGKd3l7T+87k7VjZyhT5E/HZ+vr18sWwKlawG4OLpdKCWKNjiLUtnPLtlYVYiOVguFE6UxLLqRhinQeIhVhRGG467mmKZVEMsc4DywICnn2eF02seyqIWPEZrtsMYvXIhvnRV6xwIyYgllMxxBqEJRfLEkKsQUCsmlju8xDLD8QKFMv2CxGrDmIhVhT6zt3gzn01L68lpAUPnCdaQ4g1bfrO3RCsE2ItB33nbpimWCotiDUSfeduCNYpolg2yRFrJHrM3ZCNIFD1b4sl7pD3idaQZTCF5V1AC2keDBy6tziDKc6PvnM3TL3EsoSsxRgl1sAM19yAWD2yYX7MUyx1mlUsp2KINQh927HCjYgnlu00xBoJ861wLX0xDFtsfMHFsiiGWINQbcfKpxXxibkYYlkUa6mCaV8vIVZ3qmLtXw7r8z5rsTxDLyJWnerwr9Qqz1ULpyeWGtmrQtbrIlZ8agNWtxvnD6mAWIjloG9zw9TFsijWUrdHrEFALMSKQilWWnPv8pXOgotlUQyxBmF5SqxvLI7ZQog1CIjllRbECkV7FJYrrM7zUdhLLPc/BLHq2OZuWNSvdLzFciqGWIPQd7aZcCNesAQRa3a4xCpXpiiWpFA7kpmIZVEMsQbBb2WKfEZbc6mKmYlVhhBrECzTGBVVLDVrspzc3ViqYr5iWUoxxArG0dyg5nmXS1KoHWplCosbow2msLhhC7UctoZa/iEMpqjhEEutTCGXpNCXqliKEsv3F1Ji1amtTLFR9pox1tIR9SxzB2IhlgOzP9alr25slAPtzSpVKtbS1bEQqzuV5gbR4lA0N6iVKeSSFNpSFQliIZYTh1jayhRySYo5t2Mh1rCY7VjiURg2HTdiIZaVvtNxIxZiWVnKbjOIFR/EQqwoIBZiRQGxECsKpVint5enBylixUeVWIeqX4MXiIVYDsyvdELcQizEclCpY4kHoqdbiIVYDuqV99Pb1LEQqzf1EstzThDEQiwX5ox+3lYliIVYTvS3wgCrEsRCLCe0YyFWFGh5R6wo9BBrmUbptPxCRunUoMSqhiixBgGxECsKiIVYUUAsxIoCYiFWFBALsaKAWIgVBcRCrCggFmJFAbEQKwqIhVhRQCzEigJiIVYUEAuxooBYiBUFxEKsKCAWYkXBJZaaGfLkfTHPe7HySQ5iIZYDh1hqhRMxB7eY6z1f+USCWIjlwCGWmn37SOi1sylXPpEgFmI58FryRJCG5MonKUu35EnLL2QwRQ2vJU+SfNJ3ufKJPEyJpaIkemJA4FliPf/optxb1rMQC7EceNWx0rfCstqOWIjlg/OtsFjhRHolVz6RhxELsRy0t2OlhZZovxLVdrnySQ5iIZYDWt4RKwqIhVhRQCzEigJiIVYUEAuxooBYiBUFxEKsKCAWYkUBsRArCoiFWFFALMSKAmIhVhQQC7GigFiIFQXEQqwosDJF/xCDKSxQYlVDlFiDgFiIFQXEQqwoIBZiRQGxECsKiIVYUUAsxIoCYiFWFBALsaKAWIgVBcRCrCggFmJFAbEQKwqIhVhRQCzEigJiIVYUJiJWcGYi1sTxW5lChtSOJFQsdwYj1uzwWplChtQOgY9YvhmMWLPDa9ZkGdKmUU7qYoXnB2LNGK953mVI7VArU4yLOZhiZBBLx2tlChkylqow/0APmjYaDwxylllijZsWSiyDbiWWYAqZiViTpW8dS4JYiGXitTKFDKkdgilkJmJNFq+VKRztWBLEQiyTvi3vEsRCLBPEGuwsxNLpIdYUmFJaEEtnoBLL70j4Ac8oU0oLZCDW0GmBDMQaOi2Q0V0sAAeIBVFALIgCYkEUEAuiEC5WrSd8ycn7Yql7gVj2/q0vygNq04wi9ssolRhZJwrblbID5YWe/20Rbfy0VKMtOcFi1XrCl4iuWicfZN21djaNOOVmNUqSdyKsxTgSOWS7UnagvNDZJ3+xOZW01C605ASLVeulVR45Erc7u7tnn97Xo6jNapSk6Dhoxti5/rnoUlG/Un6gvNDzf/in+1NJS/VCy06wWLV+pcbRfDt9WhTPh8TYrEeRZUYlRpZ11isVKmSbJ38qHoV/Pom01KItOcFi1XrC6wdFV8AU8WzQ/oDVZi1KsVGJkeWZ9UoyM/MLHf3eH99//nd/eX8KaalFW3IGLbGef3RTbdjqNrUoR3qNW4vRUkrIC+X7/3lzCmmxXmiJGbCOlb4g6bfVlpm1KDs37TFO7PWa8k1sU0vLf2xOIS3WCy0xHd4KKz3hS9QtFn/7Z5+VeaY2q1HKR0clRpZn1itlxUdxobP//N2vn/2+iDZ+WmrRlpyu7VhaT/gC2RIkjqTB6/eNI+mmJYp8utRjaG1HZjR5rryQaMe6fn8aaalGW3JoeYcoIBZEAbEgCogFUUAsiAJiQRQQC6IwO7FOb69kbIRF+7//yj6Or23Vj1l3gpsZirXWIVbhDg4NBWJlINbQzFgs8VC8nLry6s9XLj4QGxcflDuT49X0cbkmPzfEzyza8bV/zR+jeuRfXtvKThMHiv3XfrEa/LhdKuYr1unty9n/x6uX841k/9JT8fndjY3s/2T/4oOshDpe3ShLrNVLT8V+I7I8WOzL9+fnjfWvnD4zFCsrW9aSQ5Ht6Y9UmyTfSG0qBPr/p0kmzPGrD7JtJdZGtmFElge3U5ds+8HGDMWSJdZh6kHmjsj+/fxVce2wLGQO080LW8m2fDLqdSwhlh45P5iVT5b9YGVZxBIbiSy5ElF4pVLlYnx3Y0U+EhOXWIcXtqq/FLEczFgsYcKhdCbXQrmQCVLs1B6RpVh6ZPFDnlvbDw3MV6yyni2y//S2qCBd2Cp2CkGOVy/kdan0jKwynyixjMiihFrdqP9SxHIwX7FUy8CW3LiwpZob0rrVhX9LbZJVrXRb7FXC6JHTH9tZFe1Cbf9o/8zJMzuxYBogFkQBsSAKiAVRQCyIAmJBFBALooBYEAXEgiggFkTh18LfboPd3nSjAAAAAElFTkSuQmCC\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The plot above shows the median contribution to forecast error\nvariance for each series.</p>\n</div>\n<div id=\"comparing-forecast-scores\" class=\"section level3\">\n<h3>Comparing forecast scores</h3>\n<p>But which model is better? We can compute the variogram score for out\nof sample forecasts to get a sense of which model does a better job of\ncapturing the dependence structure in the true evaluation set:</p>\n<div class=\"sourceCode\" id=\"cb37\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb37-1\"><a href=\"#cb37-1\" tabindex=\"-1\"></a><span class=\"co\"># create forecast objects for each model</span></span>\n<span id=\"cb37-2\"><a href=\"#cb37-2\" tabindex=\"-1\"></a>fcvar <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(var_mod)</span>\n<span id=\"cb37-3\"><a href=\"#cb37-3\" tabindex=\"-1\"></a>fcvarcor <span class=\"ot\">&lt;-</span> <span class=\"fu\">forecast</span>(varcor_mod)</span>\n<span id=\"cb37-4\"><a href=\"#cb37-4\" tabindex=\"-1\"></a></span>\n<span id=\"cb37-5\"><a href=\"#cb37-5\" tabindex=\"-1\"></a><span class=\"co\"># plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better</span></span>\n<span id=\"cb37-6\"><a href=\"#cb37-6\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fcvarcor, <span class=\"at\">score =</span> <span class=\"st\">&quot;variogram&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb37-7\"><a href=\"#cb37-7\" tabindex=\"-1\"></a>  <span class=\"fu\">score</span>(fcvar, <span class=\"at\">score =</span> <span class=\"st\">&quot;variogram&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score</span>\n<span id=\"cb37-8\"><a href=\"#cb37-8\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb37-9\"><a href=\"#cb37-9\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb37-10\"><a href=\"#cb37-10\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb37-11\"><a href=\"#cb37-11\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb37-12\"><a href=\"#cb37-12\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb37-13\"><a href=\"#cb37-13\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb37-14\"><a href=\"#cb37-14\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb37-15\"><a href=\"#cb37-15\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb37-16\"><a href=\"#cb37-16\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(variogram[VAR1cor] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> variogram[VAR1])</span>\n<span id=\"cb37-17\"><a href=\"#cb37-17\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb37-18\"><a href=\"#cb37-18\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>And we can also compute the energy score for out of sample forecasts\nto get a sense of which model provides forecasts that are better\ncalibrated:</p>\n<div class=\"sourceCode\" id=\"cb38\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb38-1\"><a href=\"#cb38-1\" tabindex=\"-1\"></a><span class=\"co\"># plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better</span></span>\n<span id=\"cb38-2\"><a href=\"#cb38-2\" tabindex=\"-1\"></a>diff_scores <span class=\"ot\">&lt;-</span> <span class=\"fu\">score</span>(fcvarcor, <span class=\"at\">score =</span> <span class=\"st\">&quot;energy&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score <span class=\"sc\">-</span></span>\n<span id=\"cb38-3\"><a href=\"#cb38-3\" tabindex=\"-1\"></a>  <span class=\"fu\">score</span>(fcvar, <span class=\"at\">score =</span> <span class=\"st\">&quot;energy&quot;</span>)<span class=\"sc\">$</span>all_series<span class=\"sc\">$</span>score</span>\n<span id=\"cb38-4\"><a href=\"#cb38-4\" tabindex=\"-1\"></a><span class=\"fu\">plot</span>(diff_scores,</span>\n<span id=\"cb38-5\"><a href=\"#cb38-5\" tabindex=\"-1\"></a>  <span class=\"at\">pch =</span> <span class=\"dv\">16</span>, <span class=\"at\">cex =</span> <span class=\"fl\">1.25</span>, <span class=\"at\">col =</span> <span class=\"st\">&quot;darkred&quot;</span>,</span>\n<span id=\"cb38-6\"><a href=\"#cb38-6\" tabindex=\"-1\"></a>  <span class=\"at\">ylim =</span> <span class=\"fu\">c</span>(</span>\n<span id=\"cb38-7\"><a href=\"#cb38-7\" tabindex=\"-1\"></a>    <span class=\"sc\">-</span><span class=\"dv\">1</span> <span class=\"sc\">*</span> <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>),</span>\n<span id=\"cb38-8\"><a href=\"#cb38-8\" tabindex=\"-1\"></a>    <span class=\"fu\">max</span>(<span class=\"fu\">abs</span>(diff_scores), <span class=\"at\">na.rm =</span> <span class=\"cn\">TRUE</span>)</span>\n<span id=\"cb38-9\"><a href=\"#cb38-9\" tabindex=\"-1\"></a>  ),</span>\n<span id=\"cb38-10\"><a href=\"#cb38-10\" tabindex=\"-1\"></a>  <span class=\"at\">bty =</span> <span class=\"st\">&quot;l&quot;</span>,</span>\n<span id=\"cb38-11\"><a href=\"#cb38-11\" tabindex=\"-1\"></a>  <span class=\"at\">xlab =</span> <span class=\"st\">&quot;Forecast horizon&quot;</span>,</span>\n<span id=\"cb38-12\"><a href=\"#cb38-12\" tabindex=\"-1\"></a>  <span class=\"at\">ylab =</span> <span class=\"fu\">expression</span>(energy[VAR1cor] <span class=\"sc\">~</span> <span class=\"sc\">-</span><span class=\"er\">~</span> energy[VAR1])</span>\n<span id=\"cb38-13\"><a href=\"#cb38-13\" tabindex=\"-1\"></a>)</span>\n<span id=\"cb38-14\"><a href=\"#cb38-14\" tabindex=\"-1\"></a><span class=\"fu\">abline</span>(<span class=\"at\">h =</span> <span class=\"dv\">0</span>, <span class=\"at\">lty =</span> <span class=\"st\">&quot;dashed&quot;</span>)</span></code></pre></div>\n<p><img role=\"img\" src=\"data:image/png;base64,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\" width=\"60%\" style=\"display: block; margin: auto;\" /></p>\n<p>The models tend to provide similar forecasts, though the correlated\nerror model does slightly better overall. We would probably need to use\na more extensive rolling forecast evaluation exercise if we felt like we\nneeded to only choose one for production. <code>mvgam</code> offers some\nutilities for doing this (i.e. see <code>?lfo_cv</code> for guidance).\nAlternatively, we could use forecasts from <em>both</em> models by\ncreating an evenly-weighted ensemble forecast distribution. This\ncapability is available using the <code>ensemble()</code> function in\n<code>mvgam</code> (see <code>?ensemble</code> for guidance).</p>\n<p>Using <code>how_to_cite()</code> for models with VAR dynamics will\ngive you information on how they are restricted to remain\nstationary:</p>\n<div class=\"sourceCode\" id=\"cb39\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb39-1\"><a href=\"#cb39-1\" tabindex=\"-1\"></a>description <span class=\"ot\">&lt;-</span> <span class=\"fu\">how_to_cite</span>(varcor_mod)</span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb40\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb40-1\"><a href=\"#cb40-1\" tabindex=\"-1\"></a>description</span></code></pre></div>\n<pre><code>#&gt; Methods text skeleton\n#&gt; We used the R package mvgam (version 1.1.52; Clark &amp; Wells, 2023) to\n#&gt;   construct, fit and interrogate the model. mvgam fits Bayesian\n#&gt;   State-Space models that can include flexible predictor effects in both\n#&gt;   the process and observation components by incorporating functionalities\n#&gt;   from the brms (Burkner 2017), mgcv (Wood 2017) and splines2 (Wang &amp; Yan,\n#&gt;   2023) packages. To encourage stability and prevent forecast variance\n#&gt;   from increasing indefinitely, we enforced stationarity of the Vector\n#&gt;   Autoregressive process following methods described by Heaps (2023) and\n#&gt;   Clark et al. (2025). The mvgam-constructed model and observed data were\n#&gt;   passed to the probabilistic programming environment Stan (version\n#&gt;   2.36.0; Carpenter et al. 2017, Stan Development Team 2026), specifically\n#&gt;   through the cmdstanr interface (Gabry &amp; Cesnovar, 2021). We ran 4\n#&gt;   Hamiltonian Monte Carlo chains for 1000 warmup iterations and 500\n#&gt;   sampling iterations for joint posterior estimation. Rank normalized\n#&gt;   split Rhat (Vehtari et al. 2021) and effective sample sizes were used to\n#&gt;   monitor convergence.</code></pre>\n<pre><code>#&gt; \n#&gt; Primary references\n#&gt; Clark, NJ and Wells K (2023). Dynamic Generalized Additive Models\n#&gt;   (DGAMs) for forecasting discrete ecological time series. Methods in\n#&gt;   Ecology and Evolution, 14, 771-784. doi.org/10.1111/2041-210X.13974\n#&gt; Burkner, PC (2017). brms: An R Package for Bayesian Multilevel Models\n#&gt;   Using Stan. Journal of Statistical Software, 80(1), 1-28.\n#&gt;   doi:10.18637/jss.v080.i01\n#&gt; Wood, SN (2017). Generalized Additive Models: An Introduction with R\n#&gt;   (2nd edition). Chapman and Hall/CRC.\n#&gt; Wang W and Yan J (2021). Shape-Restricted Regression Splines with R\n#&gt;   Package splines2. Journal of Data Science, 19(3), 498-517.\n#&gt;   doi:10.6339/21-JDS1020 https://doi.org/10.6339/21-JDS1020.\n#&gt; Heaps, SE (2023). Enforcing stationarity through the prior in vector\n#&gt;   autoregressions. Journal of Computational and Graphical Statistics 32,\n#&gt;   74-83.\n#&gt; Clark NJ, Ernest SKM, Senyondo H, Simonis J, White EP, Yenni GM,\n#&gt;   Karunarathna KANK (2025). Beyond single-species models: leveraging\n#&gt;   multispecies forecasts to navigate the dynamics of ecological\n#&gt;   predictability. PeerJ 13:e18929.\n#&gt; Carpenter B, Gelman A, Hoffman MD, Lee D, Goodrich B, Betancourt M,\n#&gt;   Brubaker M, Guo J, Li P and Riddell A (2017). Stan: A probabilistic\n#&gt;   programming language. Journal of Statistical Software 76.\n#&gt; Gabry J, Cesnovar R, Johnson A, and Bronder S (2026). cmdstanr: R\n#&gt;   Interface to &#39;CmdStan&#39;. https://mc-stan.org/cmdstanr/,\n#&gt;   https://discourse.mc-stan.org.\n#&gt; Vehtari A, Gelman A, Simpson D, Carpenter B, and Burkner P (2021).\n#&gt;   Rank-normalization, folding, and localization: An improved Rhat for\n#&gt;   assessing convergence of MCMC (with discussion). Bayesian Analysis 16(2)\n#&gt;   667-718. https://doi.org/10.1214/20-BA1221.\n#&gt; \n#&gt; Other useful references\n#&gt; Arel-Bundock V, Greifer N, and Heiss A (2024). How to interpret\n#&gt;   statistical models using marginaleffects for R and Python. Journal of\n#&gt;   Statistical Software, 111(9), 1-32.\n#&gt;   https://doi.org/10.18637/jss.v111.i09\n#&gt; Gabry J, Simpson D, Vehtari A, Betancourt M, and Gelman A (2019).\n#&gt;   Visualization in Bayesian workflow. Journal of the Royal Statatistical\n#&gt;   Society A, 182, 389-402. doi:10.1111/rssa.12378.\n#&gt; Vehtari A, Gelman A, and Gabry J (2017). Practical Bayesian model\n#&gt;   evaluation using leave-one-out cross-validation and WAIC. Statistics and\n#&gt;   Computing, 27, 1413-1432. doi:10.1007/s11222-016-9696-4.\n#&gt; Burkner PC, Gabry J, and Vehtari A. (2020). Approximate leave-future-out\n#&gt;   cross-validation for Bayesian time series models. Journal of Statistical\n#&gt;   Computation and Simulation, 90(14), 2499-2523.\n#&gt;   https://doi.org/10.1080/00949655.2020.1783262</code></pre>\n<p>More advanced hierarchical panel VAR models can also be handled by\nusing the <code>gr</code> and <code>subgr</code> arguments in\n<code>VAR()</code>. These models are useful if you have a data for the\nsame set of series (<code>subgr</code>) that are measured in different\nregions (<code>gr</code>), such as species measured in different\nsampling regions or financial series measured in different\ncountries.</p>\n</div>\n</div>\n<div id=\"further-reading\" class=\"section level2\">\n<h2>Further reading</h2>\n<p>The following papers and resources offer a lot of useful material\nabout multivariate State-Space models and how they can be applied in\npractice:</p>\n<p>Auger‐Méthé, Marie, et al. <a href=\"https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470\">A\nguide to state–space modeling of ecological time series</a>.\n<em>Ecological Monographs</em> 91.4 (2021): e01470.</p>\n<p>Clark, Nicholas J., et al. <a href=\"https://peerj.com/articles/18929/\">Beyond single-species models:\nleveraging multispecies forecasts to navigate the dynamics of ecological\npredictability</a>. <em>PeerJ</em>. (2025): 13:e18929</p>\n<p>Heaps, Sarah E. <a href=\"https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648\">Enforcing\nstationarity through the prior in vector autoregressions</a>.\n<em>Journal of Computational and Graphical Statistics</em> 32.1 (2023):\n74-83.</p>\n<p>Hannaford, Naomi E., et al. <a href=\"https://doi.org/10.1016/j.csda.2022.107659\">A sparse Bayesian\nhierarchical vector autoregressive model for microbial dynamics in a\nwastewater treatment plant</a>. <em>Computational Statistics &amp; Data\nAnalysis</em> 179 (2023): 107659.</p>\n<p>Holmes, Elizabeth E., Eric J. Ward, and Wills Kellie. <a href=\"https://journal.r-project.org/articles/RJ-2012-002/\">MARSS:\nmultivariate autoregressive state-space models for analyzing time-series\ndata</a>. <em>R Journal</em>. 4.1 (2012): 11.</p>\n<p>Karunarathna, K.A.N.K., et al. <a href=\"https://doi.org/10.1016/j.ecolmodel.2024.110648\">Modelling\nnonlinear responses of a desert rodent species to environmental change\nwith hierarchical dynamic generalized additive models</a>.\n<em>Ecological Modelling</em> (2024): 490, 110648.</p>\n<p>Ward, Eric J., et al. <a href=\"https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x\">Inferring\nspatial structure from time‐series data: using multivariate state‐space\nmodels to detect metapopulation structure of California sea lions in the\nGulf of California, Mexico</a>. <em>Journal of Applied Ecology</em> 47.1\n(2010): 47-56.</p>\n</div>\n<div id=\"interested-in-contributing\" class=\"section level2\">\n<h2>Interested in contributing?</h2>\n<p>I’m actively seeking PhD students and other researchers to work in\nthe areas of ecological forecasting, multivariate model evaluation and\ndevelopment of <code>mvgam</code>. Please see <a href=\"https://ecogambler.netlify.app/opportunities/\">this small list of\nopportunities on my website</a> and do reach out if you are interested\n(n.clark’at’uq.edu.au)</p>\n</div>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "man/GP.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_trend_types.R\n\\name{GP}\n\\alias{GP}\n\\title{Specify dynamic Gaussian process trends in \\pkg{mvgam} models}\n\\usage{\nGP(...)\n}\n\\arguments{\n\\item{...}{unused}\n}\n\\value{\nAn object of class \\code{mvgam_trend}, which contains a list of\narguments to be interpreted by the parsing functions in \\pkg{mvgam}.\n}\n\\description{\nSet up low-rank approximate Gaussian Process trend models using Hilbert\nbasis expansions in \\pkg{mvgam}. This function does not evaluate its\narguments – it exists purely to help set up a model with particular GP\ntrend models.\n}\n\\details{\nA GP trend is estimated for each series using Hilbert space\napproximate Gaussian Processes. In \\code{mvgam}, latent squared exponential GP\ntrends are approximated using by default \\code{20} basis functions and\nusing a multiplicative factor of \\code{c = 5/4}, which saves computational\ncosts compared to fitting full GPs while adequately estimating GP\n\\code{alpha} and \\code{rho} parameters.\n}\n\\references{\nRiutort-Mayol G, Burkner PC, Andersen MR, Solin A and Vehtari A\n(2023). Practical Hilbert space approximate Bayesian Gaussian processes for\nprobabilistic programming. Statistics and Computing 33, 1.\nhttps://doi.org/10.1007/s11222-022-10167-2\n}\n\\seealso{\n\\code{\\link[brms]{gp}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/RW.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_trend_types.R\n\\name{RW}\n\\alias{RW}\n\\alias{AR}\n\\alias{CAR}\n\\alias{VAR}\n\\title{Specify autoregressive dynamic processes in \\pkg{mvgam}}\n\\usage{\nRW(ma = FALSE, cor = FALSE, gr = NA, subgr = NA)\n\nAR(p = 1, ma = FALSE, cor = FALSE, gr = NA, subgr = NA)\n\nCAR(p = 1)\n\nVAR(ma = FALSE, cor = FALSE, gr = NA, subgr = NA)\n}\n\\arguments{\n\\item{ma}{\\code{Logical}. Include moving average terms of order \\code{1}?\nDefault is \\code{FALSE}.}\n\n\\item{cor}{\\code{Logical}. Include correlated process errors as part of a\nmultivariate normal process model? If \\code{TRUE} and if\n\\code{n_series > 1} in the supplied data, a fully structured covariance\nmatrix will be estimated for the process errors. Default is \\code{FALSE}.}\n\n\\item{gr}{An optional grouping variable, which must be a \\code{factor} in the\nsupplied \\code{data}, for setting up hierarchical residual correlation\nstructures. If specified, this will automatically set \\code{cor = TRUE} and set\nup a model where the residual correlations for a specific level of \\code{gr}\nare modelled hierarchically:\n\n\\eqn{\\Omega_{group} = \\alpha_{cor}\\Omega_{global} +\n  (1 - \\alpha_{cor})\\Omega_{group, local}},\n\nwhere \\eqn{\\Omega_{global}} is a \\emph{global} correlation matrix,\n\\eqn{\\Omega_{group, local}} is a \\emph{local deviation} correlation matrix and\n\\eqn{\\alpha_{cor}} is a weighting parameter controlling how strongly the\nlocal correlation matrix \\eqn{\\Omega_{group}} is shrunk towards the global\ncorrelation matrix \\eqn{\\Omega_{global}} (larger values of\n\\eqn{\\alpha_{cor}} indicate a greater degree of shrinkage, i.e. a greater\ndegree of partial pooling).\n\nWhen used within a \\code{VAR()} model, this essentially sets up a hierarchical\npanel vector autoregression where both the autoregressive and correlation\nmatrices are learned hierarchically. If \\code{gr} is supplied then \\code{subgr}\n\\emph{must} also be supplied.}\n\n\\item{subgr}{A subgrouping \\code{factor} variable specifying which element in\n\\code{data} represents the different time series. Defaults to \\code{series}, but\nnote that models that use the hierarchical correlations, where the\n\\code{subgr} time series are measured in each level of \\code{gr}, \\emph{should not}\ninclude a \\code{series} element in \\code{data}. Rather, this element will be created\ninternally based on the supplied variables for \\code{gr} and \\code{subgr}.\n\nFor example, if you are modelling temporal counts for a group of species\n(labelled as \\code{species} in \\code{data}) across three different geographical\nregions (labelled as \\code{region}), and you would like the residuals to be\ncorrelated within regions, then you should specify \\code{gr = region} and\n\\code{subgr = species}. Internally, \\code{mvgam()} will create the \\code{series} element\nfor the data using:\n\n\\code{series = interaction(group, subgroup, drop = TRUE)}}\n\n\\item{p}{A non-negative integer specifying the autoregressive (AR) order.\nDefault is \\code{1}. Cannot currently be larger than \\code{3} for \\code{AR}\nterms, and cannot be anything other than \\code{1} for continuous time AR\n(\\code{CAR}) terms.}\n}\n\\value{\nAn object of class \\code{mvgam_trend}, which contains a list of\narguments to be interpreted by the parsing functions in \\pkg{mvgam}.\n}\n\\description{\nSet up autoregressive or autoregressive moving average trend models in\n\\pkg{mvgam}. These functions do not evaluate their arguments – they exist\npurely to help set up a model with particular autoregressive trend models.\n}\n\\details{\nUse \\code{vignette(\"mvgam_overview\")} to see the full details of\navailable stochastic trend types in \\pkg{mvgam}, or view the rendered\nversion on the package website at:\nhttps://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html\n}\n\\examples{\n\\dontrun{\n# A short example to illustrate CAR(1) models\n# Function to simulate CAR1 data with seasonality\nsim_corcar1 = function(n = 125,\n                       phi = 0.5,\n                       sigma = 2,\n                       sigma_obs = 0.75) {\n  # Sample irregularly spaced time intervals\n  time_dis <- c(1, runif(n - 1, 0, 5))\n\n  # Set up the latent dynamic process\n  x <- vector(length = n); x[1] <- -0.3\n  for (i in 2:n) {\n    # zero-distances will cause problems in sampling, so mvgam uses a\n    # minimum threshold; this simulation function emulates that process\n    if (time_dis[i] == 0) {\n      x[i] <- rnorm(\n        1,\n        mean = (phi^1e-3) * x[i - 1],\n        sd = sigma * (1 - phi^(2 * 1e-3)) / (1 - phi^2)\n      )\n    } else {\n      x[i] <- rnorm(\n        1,\n        mean = (phi^time_dis[i]) * x[i - 1],\n        sd = sigma * (1 - phi^(2 * time_dis[i])) / (1 - phi^2)\n      )\n    }\n  }\n\n  # Add 12-month seasonality\n  cov1 <- sin(2 * pi * (1:n) / 12)\n  cov2 <- cos(2 * pi * (1:n) / 12)\n  beta1 <- runif(1, 0.3, 0.7)\n  beta2 <- runif(1, 0.2, 0.5)\n  seasonality <- beta1 * cov1 + beta2 * cov2\n\n  # Take Gaussian observations with error and return\n  data.frame(\n    y = rnorm(n, mean = x + seasonality, sd = sigma_obs),\n    season = rep(1:12, 20)[1:n],\n    time = cumsum(time_dis)\n  )\n}\n\n# Sample two time series\ndat <- rbind(\n  dplyr::bind_cols(\n    sim_corcar1(phi = 0.65, sigma_obs = 0.55),\n    data.frame(series = 'series1')\n  ),\n  dplyr::bind_cols(\n    sim_corcar1(phi = 0.8, sigma_obs = 0.35),\n    data.frame(series = 'series2')\n  )\n) \\%>\\%\n  dplyr::mutate(series = as.factor(series))\n\n# mvgam with CAR(1) trends and series-level seasonal smooths\nmod <- mvgam(\n  formula = y ~ -1,\n  trend_formula = ~ s(season, bs = 'cc', k = 5, by = trend),\n  trend_model = CAR(),\n  priors = c(\n    prior(exponential(3), class = sigma),\n    prior(beta(4, 4), class = sigma_obs)\n  ),\n  data = dat,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\n# View usual summaries and plots\nsummary(mod)\nconditional_effects(mod, type = 'expected')\nplot(mod, type = 'trend', series = 1)\nplot(mod, type = 'trend', series = 2)\nplot(mod, type = 'residuals', series = 1)\nplot(mod, type = 'residuals', series = 2)\nmcmc_plot(\n  mod,\n  variable = 'ar1',\n  regex = TRUE,\n  type = 'hist'\n)\n\n# Now an example illustrating hierarchical dynamics\nset.seed(123)\n\n# Simulate three species monitored in three different regions\nsimdat1 <- sim_mvgam(\n  trend_model = VAR(cor = TRUE),\n  prop_trend = 0.95,\n  n_series = 3,\n  mu = c(1, 2, 3)\n)\nsimdat2 <- sim_mvgam(\n  trend_model = VAR(cor = TRUE),\n  prop_trend = 0.95,\n  n_series = 3,\n  mu = c(1, 2, 3)\n)\nsimdat3 <- sim_mvgam(\n  trend_model = VAR(cor = TRUE),\n  prop_trend = 0.95,\n  n_series = 3,\n  mu = c(1, 2, 3)\n)\n\n# Set up the data but DO NOT include 'series'\nall_dat <- rbind(\n  simdat1$data_train \\%>\\%\n    dplyr::mutate(region = 'qld'),\n  simdat2$data_train \\%>\\%\n    dplyr::mutate(region = 'nsw'),\n  simdat3$data_train \\%>\\%\n    dplyr::mutate(region = 'vic')\n) \\%>\\%\n  dplyr::mutate(\n    species = gsub('series', 'species', series),\n    species = as.factor(species),\n    region = as.factor(region)\n  ) \\%>\\%\n  dplyr::arrange(series, time) \\%>\\%\n  dplyr::select(-series)\n\n# Check priors for a hierarchical AR1 model\nget_mvgam_priors(\n  formula = y ~ species,\n  trend_model = AR(gr = region, subgr = species),\n  data = all_dat\n)\n\n# Fit the model\nmod <- mvgam(\n  formula = y ~ species,\n  trend_model = AR(gr = region, subgr = species),\n  data = all_dat,\n  chains = 2,\n  silent = 2\n)\n\n# Check standard outputs\nsummary(mod)\n\n# Inspect posterior estimates for the correlation weighting parameter\nmcmc_plot(mod, variable = 'alpha_cor', type = 'hist')\n}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/ZMVN.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_trend_types.R\n\\name{ZMVN}\n\\alias{ZMVN}\n\\title{Specify correlated residual processes in \\pkg{mvgam}}\n\\usage{\nZMVN(unit = time, gr = NA, subgr = series)\n}\n\\arguments{\n\\item{unit}{The unquoted name of the variable that represents the unit of\nanalysis in \\code{data} over which latent residuals should be correlated. This\nvariable should be either a \\code{numeric} or \\code{integer} variable in the\nsupplied \\code{data}. Defaults to \\code{time} to be consistent with other\nfunctionalities in \\pkg{mvgam}, though note that the data need not be time\nseries in this case. See examples below for further details and\nexplanations}\n\n\\item{gr}{An optional grouping variable, which must be a \\code{factor} in the\nsupplied \\code{data}, for setting up hierarchical residual correlation\nstructures. If specified, this will automatically set up a model where the\nresidual correlations for a specific level of \\code{gr} are modelled\nhierarchically:\n\n\\eqn{\\Omega_{group} = p\\Omega_{global} + (1 - p)\\Omega_{group, local}},\n\nwhere \\eqn{\\Omega_{global}} is a \\emph{global} correlation matrix,\n\\eqn{\\Omega_{group, local}} is a \\emph{local deviation} correlation matrix, and\n\\eqn{p} is a weighting parameter controlling how strongly the local\ncorrelation matrix \\eqn{\\Omega_{group}} is shrunk towards the global\ncorrelation matrix \\eqn{\\Omega_{global}}. If \\code{gr} is supplied then \\code{subgr}\n\\emph{must} also be supplied}\n\n\\item{subgr}{A subgrouping \\code{factor} variable specifying which element in\n\\code{data} represents the different observational units. Defaults to \\code{series}\nto be consistent with other functionalities in \\pkg{mvgam}, though note\nthat the data need not be time series in this case\n\nModels that use the hierarchical correlations (by supplying a value for\n\\code{gr}) \\emph{should not} include a \\code{series} element in \\code{data}. Rather, this\nelement will be created internally based on the supplied variables for \\code{gr}\nand \\code{subgr}\n\nFor example, if you are modelling counts for a group of species (labelled\nas \\code{species} in the data) across sampling sites (labelled as \\code{site} in the\ndata) in three different geographical regions (labelled as \\code{region}), and\nyou would like the residuals to be correlated within regions, then you\nshould specify \\code{unit = site}, \\code{gr = region}, and \\code{subgr = species}\n\nInternally, \\code{mvgam()} will appropriately order the data by \\code{unit} (in this\ncase, by \\code{site}) and create the \\code{series} element for the data using\nsomething like:\n\n\\code{series = as.factor(paste0(group, '_', subgroup))}}\n}\n\\value{\nAn object of class \\code{mvgam_trend}, which contains a list of\narguments to be interpreted by the parsing functions in \\pkg{mvgam}\n}\n\\description{\nSet up latent correlated multivariate Gaussian residual processes in\n\\pkg{mvgam}. This function does not evaluate its arguments – it exists\npurely to help set up a model with particular error processes\n}\n\\examples{\n\\dontrun{\n# Simulate counts of four species over ten sampling locations\nsite_dat <- data.frame(\n  site = rep(1:10, 4),\n  species = as.factor(sort(rep(letters[1:4], 10))),\n  y = c(NA, rpois(39, 3))\n)\nhead(site_dat)\n\n# Set up a correlated residual (i.e. Joint Species Distribution) model\ntrend_model <- ZMVN(unit = site, subgr = species)\nmod <- mvgam(\n  y ~ species,\n  trend_model = ZMVN(unit = site, subgr = species),\n  data = site_dat,\n  chains = 2,\n  silent = 2\n)\n\n# Inspect the estimated species-species residual covariances\nmcmc_plot(mod, variable = 'Sigma', regex = TRUE, type = 'hist')\n\n# A hierarchical correlation example\nSigma <- matrix(\n  c(1, -0.4, 0.5,\n    -0.4, 1, 0.3,\n    0.5, 0.3, 1),\n  byrow = TRUE,\n  nrow = 3\n)\n\nmake_site_dat <- function(...) {\n  errors <- mgcv::rmvn(\n    n = 30,\n    mu = c(0.6, 0.8, 1.8),\n    V = Sigma\n  )\n  site_dat <- do.call(rbind, lapply(1:3, function(spec) {\n    data.frame(\n      y = rpois(30, lambda = exp(errors[, spec])),\n      species = paste0('species', spec),\n      site = 1:30\n    )\n  }))\n  site_dat\n}\n\nsite_dat <- rbind(\n  make_site_dat() \\%>\\%\n    dplyr::mutate(group = 'group1'),\n  make_site_dat() \\%>\\%\n    dplyr::mutate(group = 'group2')\n) \\%>\\%\n  dplyr::mutate(\n    species = as.factor(species),\n    group = as.factor(group)\n  )\n\n# Fit the hierarchical correlated residual model\nmod <- mvgam(\n  y ~ species,\n  trend_model = ZMVN(unit = site, gr = group, subgr = species),\n  data = site_dat,\n  chains = 2,\n  silent = 2\n)\n\n# Inspect the estimated species-species residual covariances\nmcmc_plot(mod, variable = 'Sigma', regex = TRUE, type = 'hist')\n}\n\n}\n"
  },
  {
    "path": "man/add_residuals.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/add_residuals.R\n\\name{add_residuals.mvgam}\n\\alias{add_residuals.mvgam}\n\\alias{add_residuals}\n\\title{Calculate randomized quantile residuals for \\pkg{mvgam} objects}\n\\usage{\nadd_residuals(object, ...)\n\n\\method{add_residuals}{mvgam}(object, ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{...}{unused}\n}\n\\value{\nA list object of class \\code{mvgam} with residuals included in the \\code{'resids'} slot\n}\n\\description{\nCalculate randomized quantile residuals for \\pkg{mvgam} objects\n}\n\\details{\nFor each series, randomized quantile (i.e. Dunn-Smyth) residuals are calculated for inspecting model diagnostics\nIf the fitted model is appropriate then Dunn-Smyth residuals will be standard normal in distribution and no\nautocorrelation will be evident. When a particular observation is missing, the residual is calculated by comparing independent\ndraws from the model's posterior distribution\n}\n"
  },
  {
    "path": "man/all_neon_tick_data.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/all_neon_tick_data.R\n\\docType{data}\n\\name{all_neon_tick_data}\n\\alias{all_neon_tick_data}\n\\title{NEON Amblyomma and Ixodes tick abundance survey data}\n\\format{\nA tibble/dataframe containing covariate information alongside the main fields of:\n\\describe{\n\\item{Year}{Year of sampling}\n\\item{epiWeek}{Epidemiological week of sampling}\n\\item{plot_ID}{NEON plot ID for survey location}\n\\item{siteID}{NEON site ID for survey location}\n\\item{amblyomma_americanum}{Counts of A. americanum nymphs}\n\\item{ixodes_scapularis}{Counts of I. scapularis nymphs}\n}\n}\n\\source{\n\\url{https://www.neonscience.org/data}\n}\n\\usage{\nall_neon_tick_data\n}\n\\description{\nA dataset containing timeseries of Amblyomma americanum and Ixodes scapularis nymph abundances at NEON sites\n}\n\\keyword{datasets}\n"
  },
  {
    "path": "man/augment.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/tidier_methods.R\n\\name{augment.mvgam}\n\\alias{augment.mvgam}\n\\title{Augment an \\code{mvgam} object's data}\n\\usage{\n\\method{augment}{mvgam}(x, robust = FALSE, probs = c(0.025, 0.975), ...)\n}\n\\arguments{\n\\item{x}{An object of class \\code{mvgam}.}\n\n\\item{robust}{If \\code{FALSE} (the default) the mean is used as the measure of\ncentral tendency and the standard deviation as the measure of variability.\nIf \\code{TRUE}, the median and the median absolute deviation (MAD) are applied\ninstead.}\n\n\\item{probs}{The percentiles to be computed by the quantile function.}\n\n\\item{...}{Unused, included for generic consistency only.}\n}\n\\value{\nA \\code{list} or \\code{tibble} (see details) combining:\n\\itemize{\n\\item The data supplied to \\code{mvgam()}.\n\\item The outcome variable, named as \\code{.observed}.\n\\item The fitted backcasts, along with their variability and credible bounds.\n\\item The residuals, along with their variability and credible bounds.\n}\n}\n\\description{\nAdd fits and residuals to the data, implementing the generic \\code{augment} from\nthe package \\pkg{broom}.\n}\n\\details{\nA \\code{list} is returned if \\code{class(x$obs_data) == 'list'}, otherwise a \\code{tibble}\nis returned, but the contents of either object is the same.\n\nThe arguments \\code{robust} and \\code{probs} are applied to both the fit and residuals\ncalls (see \\code{\\link[=fitted.mvgam]{fitted.mvgam()}} and \\code{\\link[=residuals.mvgam]{residuals.mvgam()}} for details).\n}\n\\examples{\n\\dontrun{\nset.seed(0)\ndat <- sim_mvgam(\n  T = 80,\n  n_series = 3,\n  mu = 2,\n  trend_model = AR(p = 1),\n  prop_missing = 0.1,\n  prop_trend = 0.6\n)\n\nmod1 <- mvgam(\n  formula = y ~ s(season, bs = 'cc', k = 6),\n  data = dat$data_train,\n  trend_model = AR(),\n  family = poisson(),\n  noncentred = TRUE,\n  chains = 2,\n  silent = 2\n)\n\naugment(mod1, robust = TRUE, probs = c(0.25, 0.75))\n}\n\n\n}\n\\seealso{\n\\code{\\link{residuals.mvgam}},\n\\code{\\link{fitted.mvgam}}\n\nOther tidiers: \n\\code{\\link{tidy.mvgam}()}\n}\n\\concept{tidiers}\n"
  },
  {
    "path": "man/code.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/stan_utils.R\n\\name{code}\n\\alias{code}\n\\alias{stancode.mvgam_prefit}\n\\alias{stancode.mvgam}\n\\alias{standata.mvgam_prefit}\n\\title{Stan code and data objects for \\pkg{mvgam} models}\n\\usage{\ncode(object)\n\n\\method{stancode}{mvgam_prefit}(object, ...)\n\n\\method{stancode}{mvgam}(object, ...)\n\n\\method{standata}{mvgam_prefit}(object, ...)\n}\n\\arguments{\n\\item{object}{An object of class \\code{mvgam} or \\code{mvgam_prefit},\nreturned from a call to \\code{mvgam}}\n\n\\item{...}{ignored}\n}\n\\value{\nEither a character string containing the fully commented \\pkg{Stan} code\nto fit a \\pkg{mvgam} model or a named list containing the data objects needed\nto fit the model in Stan.\n}\n\\description{\nGenerate Stan code and data objects for \\pkg{mvgam} models\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam()\nmod <- mvgam(y ~ s(season) +\n               s(time, by = series),\n             family = poisson(),\n             data = simdat$data_train,\n             run_model = FALSE)\n\n# View Stan model code\nstancode(mod)\n\n# View Stan model data\nsdata <- standata(mod)\nstr(sdata)\n}\n\n}\n"
  },
  {
    "path": "man/conditional_effects.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/conditional_effects.R\n\\name{conditional_effects.mvgam}\n\\alias{conditional_effects.mvgam}\n\\alias{plot.mvgam_conditional_effects}\n\\alias{print.mvgam_conditional_effects}\n\\title{Display conditional effects of predictors for \\pkg{mvgam} models}\n\\usage{\n\\method{conditional_effects}{mvgam}(\n  x,\n  effects = NULL,\n  type = \"expected\",\n  points = FALSE,\n  rug = FALSE,\n  ...\n)\n\n\\method{plot}{mvgam_conditional_effects}(x, plot = TRUE, ask = FALSE, ...)\n\n\\method{print}{mvgam_conditional_effects}(x, ...)\n}\n\\arguments{\n\\item{x}{Object of class \\code{mvgam}, \\code{jsdgam} or \\code{mvgam_conditional_effects}}\n\n\\item{effects}{An optional character vector naming effects (main effects or\ninteractions) for which to compute conditional plots. Interactions are\nspecified by a \\code{:} between variable names. If \\code{NULL} (the\ndefault), plots are generated for all main effects and two-way interactions\nestimated in the model. When specifying \\code{effects} manually, \\emph{all}\ntwo-way interactions (including grouping variables) may be plotted\neven if not originally modeled.}\n\n\\item{type}{\\code{character} specifying the scale of predictions. When this has\nthe value \\code{link} the linear predictor is calculated on the link\nscale. If \\code{expected} is used (the default), predictions reflect the\nexpectation of the response (the mean) but ignore uncertainty in the\nobservation process. When \\code{response} is used, the predictions take\nuncertainty in the observation process into account to return predictions\non the outcome scale. Two special cases are also allowed: type \\code{latent_N}\nwill return the estimated latent abundances from an N-mixture distribution,\nwhile type \\code{detection} will return the estimated detection probability from\nan N-mixture distribution.}\n\n\\item{points}{\\code{Logical}. Indicates if the original data points should be\nadded, but only if \\code{type == 'response'}. Default is \\code{TRUE}.}\n\n\\item{rug}{\\code{Logical}. Indicates if displays tick marks should be plotted on\nthe axes to mark the distribution of raw data, but only if\n\\code{type == 'response'}. Default is \\code{TRUE}.}\n\n\\item{...}{other arguments to pass to \\code{\\link[marginaleffects]{plot_predictions}}}\n\n\\item{plot}{Logical; indicates if plots should be\nplotted directly in the active graphic device.\nDefaults to \\code{TRUE}.}\n\n\\item{ask}{\\code{Logical}. Indicates if the user is prompted before a new page is\nplotted. Only used if plot is \\code{TRUE}. Default is \\code{FALSE}.}\n}\n\\value{\n\\code{conditional_effects} returns an object of class\n\\code{mvgam_conditional_effects} which is a named list with one slot per\neffect containing a \\code{\\link[ggplot2]{ggplot}} object, which can be\nfurther customized using the \\pkg{ggplot2} package. The corresponding\n\\code{plot} method will draw these plots in the active graphic device.\n}\n\\description{\nDisplay conditional effects of one or more numeric and/or categorical\npredictors in models of class \\code{mvgam} and \\code{jsdgam}, including two-way\ninteraction effects.\n}\n\\details{\nThis function acts as a wrapper to the more flexible\n\\code{\\link[marginaleffects]{plot_predictions}}. When creating\n\\code{conditional_effects} for a particular predictor (or interaction of\ntwo predictors), one has to choose the values of all other predictors to\ncondition on. By default, the mean is used for continuous variables and the\nreference category is used for factors. Use\n\\code{\\link[marginaleffects]{plot_predictions}} to change these and create\nmore bespoke conditional effects plots.\n}\n\\examples{\n\\dontrun{\n# Simulate some data\nsimdat <- sim_mvgam(\n  family = poisson(),\n  seasonality = 'hierarchical'\n)\n\n# Fit a model\nmod <- mvgam(\n  y ~ s(season, by = series, k = 5) + year:series,\n  family = poisson(),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Plot all main effects on the response scale\nconditional_effects(mod)\n\n# Change the prediction interval to 70\\% using plot_predictions() argument\n# 'conf_level'\nconditional_effects(mod, conf_level = 0.7)\n\n# Plot all main effects on the link scale\nconditional_effects(mod, type = 'link')\n\n# Works the same for smooth terms, including smooth interactions\nset.seed(0)\ndat <- mgcv::gamSim(1, n = 200, scale = 2)\nmod <- mvgam(\n  y ~ te(x0, x1, k = 5) + s(x2, k = 6) + s(x3, k = 6),\n  data = dat,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\nconditional_effects(mod)\nconditional_effects(mod, conf_level = 0.5, type = 'link')\n\n# ggplot objects can be modified and combined with the help of many\n# additional packages. Here is an example using the patchwork package\n\n# Simulate some nonlinear data\ndat <- mgcv::gamSim(1, n = 200, scale = 2)\nmod <- mvgam(\n  y ~ s(x1, bs = 'moi') + te(x0, x2),\n  data = dat,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\n# Extract the list of ggplot conditional_effect plots\nm <- plot(conditional_effects(mod), plot = FALSE)\n\n# Add custom labels and arrange plots together using patchwork::wrap_plots()\nlibrary(patchwork)\nlibrary(ggplot2)\nwrap_plots(\n  m[[1]] + labs(title = 's(x1, bs = \"moi\")'),\n  m[[2]] + labs(title = 'te(x0, x2)')\n)\n}\n\n}\n\\seealso{\n\\code{\\link[marginaleffects]{plot_predictions}},\n\\code{\\link[marginaleffects]{plot_slopes}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/dynamic.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/dynamic.R\n\\name{dynamic}\n\\alias{dynamic}\n\\title{Defining dynamic coefficients in \\pkg{mvgam} formulae}\n\\usage{\ndynamic(variable, k, rho = 5, stationary = TRUE, scale = TRUE)\n}\n\\arguments{\n\\item{variable}{The variable that the dynamic smooth will be a function of}\n\n\\item{k}{Optional number of basis functions for computing approximate GPs.\nIf missing, \\code{k} will be set as large as possible to accurately estimate\nthe nonlinear function.}\n\n\\item{rho}{Either a positive numeric stating the length scale to be used for\napproximating the squared exponential Gaussian Process smooth (see\n\\code{\\link[mgcv]{gp.smooth}} for details) or missing, in which case the\nlength scale will be estimated by setting up a Hilbert space approximate GP.}\n\n\\item{stationary}{Logical. If \\code{TRUE} (the default) and \\code{rho} is\nsupplied, the latent Gaussian Process smooth will not have a linear trend\ncomponent. If \\code{FALSE}, a linear trend in the covariate is added to\nthe Gaussian Process smooth. Leave at \\code{TRUE} if you do not believe\nthe coefficient is evolving with much trend, as the linear component of\nthe basis functions can be hard to penalize to zero. This sometimes causes\ndivergence issues in \\code{Stan}. See \\code{\\link[mgcv]{gp.smooth}} for\ndetails. Ignored if \\code{rho} is missing (in which case a Hilbert space\napproximate GP is used).}\n\n\\item{scale}{Logical; If \\code{TRUE} (the default) and \\code{rho} is missing,\npredictors are scaled so that the maximum Euclidean distance between two\npoints is \\code{1}. This often improves sampling speed and convergence. Scaling\nalso affects the estimated length-scale parameters in that they resemble\nthose of scaled predictors (not of the original predictors) if scale is\n\\code{TRUE}.}\n}\n\\value{\na \\code{list} object for internal usage in 'mvgam'\n}\n\\description{\nSet up time-varying (dynamic) coefficients for use in \\pkg{mvgam} models.\nCurrently, only low-rank Gaussian Process smooths are available for\nestimating the dynamics of the time-varying coefficient.\n}\n\\details{\n\\code{mvgam} currently sets up dynamic coefficients as low-rank\nsquared exponential Gaussian Process smooths via the call\n\\code{s(time, by = variable, bs = \"gp\", m = c(2, rho, 2))}. These smooths,\nif specified with reasonable values for the length scale parameter, will\ngive more realistic out of sample forecasts than standard splines such as\nthin plate or cubic. But the user must set the value for \\code{rho}, as there\nis currently no support for estimating this value in \\code{mgcv}. This may\nnot be too big of a problem, as estimating latent length scales is often\ndifficult anyway. The \\code{rho} parameter should be thought of as a prior\non the smoothness of the latent dynamic coefficient function (where higher\nvalues of \\code{rho} lead to smoother functions with more temporal\ncovariance structure). Values of \\code{k} are set automatically to ensure\nenough basis functions are used to approximate the expected wiggliness of\nthe underlying dynamic function (\\code{k} will increase as \\code{rho}\ndecreases).\n}\n\\examples{\n\\dontrun{\n# Simulate a time-varying coefficient\n# (as a Gaussian Process with length scale = 10)\nset.seed(1111)\nN <- 200\n\n# A function to simulate from a squared exponential Gaussian Process\nsim_gp <- function(N, c, alpha, rho) {\n  Sigma <- alpha ^ 2 *\n    exp(-0.5 * ((outer(1:N, 1:N, \"-\") / rho) ^ 2)) +\n    diag(1e-9, N)\n  c + mgcv::rmvn(1, mu = rep(0, N), V = Sigma)\n}\n\nbeta <- sim_gp(alpha = 0.75, rho = 10, c = 0.5, N = N)\nplot(\n  beta, type = 'l', lwd = 3, bty = 'l',\n  xlab = 'Time', ylab = 'Coefficient', col = 'darkred'\n)\n\n# Simulate the predictor as a standard normal\npredictor <- rnorm(N, sd = 1)\n\n# Simulate a Gaussian outcome variable\nout <- rnorm(N, mean = 4 + beta * predictor, sd = 0.25)\ntime <- seq_along(predictor)\nplot(\n  out, type = 'l', lwd = 3, bty = 'l',\n  xlab = 'Time', ylab = 'Outcome', col = 'darkred'\n)\n\n# Gather into a data.frame and fit a dynamic coefficient model\ndata <- data.frame(out, predictor, time)\n\n# Split into training and testing\ndata_train <- data[1:190, ]\ndata_test <- data[191:200, ]\n\n# Fit a model using the dynamic function\nmod <- mvgam(\n  out ~\n    # mis-specify the length scale slightly as this\n    # won't be known in practice\n    dynamic(predictor, rho = 8, stationary = TRUE),\n  family = gaussian(),\n  data = data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Inspect the summary\nsummary(mod)\n\n# Plot the time-varying coefficient estimates\nplot(mod, type = 'smooths')\n\n# Extrapolate the coefficient forward in time\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = 'dashed', lwd = 2)\n\n# Overlay the true simulated time-varying coefficient\nlines(beta, lwd = 2.5, col = 'white')\nlines(beta, lwd = 2)\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/ensemble.mvgam_forecast.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/ensemble.R\n\\name{ensemble.mvgam_forecast}\n\\alias{ensemble.mvgam_forecast}\n\\alias{ensemble}\n\\title{Combine forecasts from \\pkg{mvgam} models into evenly weighted ensembles}\n\\usage{\nensemble(object, ...)\n\n\\method{ensemble}{mvgam_forecast}(object, ..., ndraws = 5000)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam_forecast}.\nSee \\code{\\link[=forecast.mvgam]{forecast.mvgam()}}}\n\n\\item{...}{More \\code{mvgam_forecast} objects.}\n\n\\item{ndraws}{Positive integer specifying the number of draws to use from each\nforecast distribution for creating the ensemble. If some of the ensemble members have\nfewer draws than \\code{ndraws}, their forecast distributions will be resampled with replacement\nto achieve the correct number of draws}\n}\n\\value{\nAn object of class \\code{mvgam_forecast} containing the ensemble\npredictions. This object can be readily used with the supplied S3\nfunctions \\code{plot} and \\code{score}.\n}\n\\description{\nGenerate evenly weighted ensemble forecast distributions from\n\\code{mvgam_forecast} objects.\n}\n\\details{\nIt is widely recognised in the forecasting literature that\ncombining forecasts from different models often results in improved\nforecast accuracy. The simplest way to create an ensemble is to use\nevenly weighted combinations of forecasts from the different models.\nThis is straightforward to do in a Bayesian setting with \\pkg{mvgam} as\nthe posterior MCMC draws contained in each \\code{mvgam_forecast} object\nwill already implicitly capture correlations among the temporal posterior\npredictions.\n}\n\\examples{\n\\dontrun{\n# Simulate some series and fit a few competing dynamic models\nset.seed(1)\nsimdat <- sim_mvgam(\n  n_series = 1,\n  prop_trend = 0.6,\n  mu = 1\n)\n\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test\n)\n\nm1 <- mvgam(\n  y ~ 1,\n  trend_formula = ~ time +\n    s(season, bs = 'cc', k = 9),\n  trend_model = AR(p = 1),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  chains = 2,\n  silent = 2\n)\n\nm2 <- mvgam(\n  y ~ time,\n  trend_model = RW(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  chains = 2,\n  silent = 2\n)\n\n# Calculate forecast distributions for each model\nfc1 <- forecast(m1)\nfc2 <- forecast(m2)\n\n# Generate the ensemble forecast\nensemble_fc <- ensemble(fc1, fc2)\n\n# Plot forecasts\nplot(fc1)\nplot(fc2)\nplot(ensemble_fc)\n\n# Score forecasts\nscore(fc1)\nscore(fc2)\nscore(ensemble_fc)\n}\n\n}\n\\seealso{\n\\code{\\link{plot.mvgam_forecast}},\n\\code{\\link{score.mvgam_forecast}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/evaluate_mvgams.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/evaluate_mvgams.R\n\\name{evaluate_mvgams}\n\\alias{evaluate_mvgams}\n\\alias{eval_mvgam}\n\\alias{roll_eval_mvgam}\n\\alias{compare_mvgams}\n\\title{Evaluate forecasts from fitted \\pkg{mvgam} objects}\n\\usage{\neval_mvgam(\n  object,\n  n_samples = 5000,\n  eval_timepoint = 3,\n  fc_horizon = 3,\n  n_cores = 1,\n  score = \"drps\",\n  log = FALSE,\n  weights\n)\n\nroll_eval_mvgam(\n  object,\n  n_evaluations = 5,\n  evaluation_seq,\n  n_samples = 5000,\n  fc_horizon = 3,\n  n_cores = 1,\n  score = \"drps\",\n  log = FALSE,\n  weights\n)\n\ncompare_mvgams(\n  model1,\n  model2,\n  n_samples = 1000,\n  fc_horizon = 3,\n  n_evaluations = 10,\n  n_cores = 1,\n  score = \"drps\",\n  log = FALSE,\n  weights\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}}\n\n\\item{n_samples}{\\code{integer} specifying the number of samples to generate\nfrom the model's posterior distribution}\n\n\\item{eval_timepoint}{\\code{integer} indexing the timepoint that represents\nour last 'observed' set of outcome data}\n\n\\item{fc_horizon}{\\code{integer} specifying the length of the forecast\nhorizon for evaluating forecasts}\n\n\\item{n_cores}{Deprecated. Parallel processing is no longer supported}\n\n\\item{score}{\\code{character} specifying the type of ranked probability score\nto use for evaluation. Options are: \\code{variogram}, \\code{drps} or \\code{crps}}\n\n\\item{log}{\\code{logical}. Should the forecasts and truths be logged prior\nto scoring? This is often appropriate for comparing performance of models\nwhen series vary in their observation ranges}\n\n\\item{weights}{optional \\code{vector} of weights (where\n\\code{length(weights) == n_series}) for weighting pairwise correlations\nwhen evaluating the variogram score for multivariate forecasts. Useful for\ndown-weighting series that have larger magnitude observations or that are\nof less interest when forecasting. Ignored if \\code{score != 'variogram'}}\n\n\\item{n_evaluations}{\\code{integer} specifying the total number of\nevaluations to perform}\n\n\\item{evaluation_seq}{Optional \\code{integer sequence} specifying the exact\nset of timepoints for evaluating the model's forecasts. This sequence\ncannot have values \\code{<3} or\n\\code{> max(training timepoints) - fc_horizon}}\n\n\\item{model1}{\\code{list} object returned from \\code{mvgam} representing\nthe first model to be evaluated}\n\n\\item{model2}{\\code{list} object returned from \\code{mvgam} representing\nthe second model to be evaluated}\n}\n\\value{\nFor \\code{eval_mvgam}, a \\code{list} object containing information on\nspecific evaluations for each series (if using \\code{drps} or \\code{crps} as the score)\nor a vector of scores when using \\code{variogram}.\n\nFor \\code{roll_eval_mvgam}, a \\code{list} object containing information on specific\nevaluations for each series as well as a total evaluation summary (taken by\nsumming the forecast score for each series at each evaluation and averaging\nthe coverages at each evaluation)\n\nFor \\code{compare_mvgams}, a series of plots comparing forecast Rank Probability\nScores for each competing model. A lower score is preferred. Note however\nthat it is possible to select a model that ultimately would perform poorly\nin true out-of-sample forecasting. For example if a wiggly smooth function\nof 'year' is included in the model then this function will be learned prior\nto evaluating rolling window forecasts, and the model could generate very\ntight predictions as a result. But when forecasting ahead to timepoints that\nthe model has not seen (i.e. next year), the smooth function will end up\nextrapolating, sometimes in very strange and unexpected ways. It is therefore\nrecommended to only use smooth functions for covariates that are adequately\nmeasured in the data (i.e. 'seasonality', for example) to reduce possible\nextrapolation of smooths and let the latent trends in the \\code{mvgam} model\ncapture any temporal dependencies in the data. These trends are time series\nmodels and so will provide much more stable forecasts\n}\n\\description{\nEvaluate forecasts from fitted \\pkg{mvgam} objects\n}\n\\details{\n\\code{eval_mvgam} may be useful when both repeated fitting of a model\nusing \\code{\\link{update.mvgam}} for exact leave-future-out cross-validation\nand approximate leave-future-out cross-validation using \\code{\\link{lfo_cv}}\nare impractical. The function generates a set of samples representing fixed\nparameters estimated from the full \\code{mvgam} model and latent trend states\nat a given point in time. The trends are rolled forward a total of\n\\code{fc_horizon} timesteps according to their estimated state space dynamics\nto generate an 'out-of-sample' forecast that is evaluated against the true\nobservations in the horizon window. This function therefore simulates a\nsituation where the model's parameters had already been estimated but we have\nonly observed data up to the evaluation timepoint and would like to generate\nforecasts from the latent trends that have been observed up to that timepoint.\nEvaluation involves calculating an appropriate Rank Probability Score and a\nbinary indicator for whether or not the true value lies within the forecast's\n90\\% prediction interval\n\n\\code{roll_eval_mvgam} sets up a sequence of evaluation timepoints along a rolling\nwindow and iteratively calls \\code{eval_mvgam} to evaluate 'out-of-sample'\nforecasts. Evaluation involves calculating the Rank Probability Scores and a\nbinary indicator for whether or not the true value lies within the forecast's\n90\\% prediction interval\n\n\\code{compare_mvgams} automates the evaluation to compare two fitted models using\nrolling window forecast evaluation and provides a series of summary plots to\nfacilitate model selection. It is essentially a wrapper for\n\\code{roll_eval_mvgam}\n}\n\\examples{\n\\dontrun{\n# Simulate from a Poisson-AR2 model with a seasonal smooth\nset.seed(1)\ndat <- sim_mvgam(\n  T = 75,\n  n_series = 1,\n  prop_trend = 0.75,\n  trend_model = AR(p = 2),\n  family = poisson()\n)\n\n# Fit an appropriate model\nmod_ar2 <- mvgam(\n  formula = y ~ s(season, bs = 'cc'),\n  trend_model = AR(p = 2),\n  family = poisson(),\n  data = dat$data_train,\n  newdata = dat$data_test,\n  chains = 2,\n  silent = 2\n)\n\n# Fit a less appropriate model\nmod_rw <- mvgam(\n  formula = y ~ 1,\n  trend_model = RW(),\n  family = poisson(),\n  data = dat$data_train,\n  newdata = dat$data_test,\n  chains = 2,\n  silent = 2\n)\n\n# Compare Discrete Ranked Probability Scores for the testing period\nfc_ar2 <- forecast(mod_ar2)\nfc_rw <- forecast(mod_rw)\nscore_ar2 <- score(\n  object = fc_ar2,\n  score = 'drps'\n)\nscore_rw <- score(\n  object = fc_rw,\n  score = 'drps'\n)\nsum(score_ar2$series_1$score)\nsum(score_rw$series_1$score)\n\n# Use rolling evaluation for approximate comparisons of 3-step ahead\n# forecasts across the training period\ncompare_mvgams(\n  model1 = mod_ar2,\n  model2 = mod_rw,\n  fc_horizon = 3,\n  n_samples = 1000,\n  n_evaluations = 5\n)\n\n# A more appropriate comparison would be to use approximate\n# leave-future-out CV to compare forecasts (see ?mvgam::lfo_cv())\n}\n}\n\\seealso{\n\\code{\\link{forecast}}, \\code{\\link{score}}, \\code{\\link{lfo_cv}}\n}\n"
  },
  {
    "path": "man/fevd.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/fevd.mvgam.R\n\\name{fevd.mvgam}\n\\alias{fevd.mvgam}\n\\alias{fevd}\n\\title{Calculate latent VAR forecast error variance decompositions}\n\\usage{\nfevd(object, ...)\n\n\\method{fevd}{mvgam}(object, h = 10, ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} resulting from a call to \\code{\\link[=mvgam]{mvgam()}}\nthat used a Vector Autoregressive latent process model (either as \\code{VAR(cor = FALSE)} or\n\\code{VAR(cor = TRUE)}; see \\code{\\link[=VAR]{VAR()}} for details)}\n\n\\item{...}{ignored}\n\n\\item{h}{Positive \\code{integer} specifying the forecast horizon over which to calculate\nthe IRF}\n}\n\\value{\nSee \\code{\\link{mvgam_fevd-class}} for a full description of the quantities that are\ncomputed and returned by this function, along with key references.\n}\n\\description{\nCompute forecast error variance decompositions from\n\\code{mvgam} models with Vector Autoregressive dynamics\n}\n\\examples{\n\\dontrun{\n# Simulate some time series that follow a latent VAR(1) process\nsimdat <- sim_mvgam(\n  family = gaussian(),\n  n_series = 4,\n  trend_model = VAR(cor = TRUE),\n  prop_trend = 1\n)\nplot_mvgam_series(data = simdat$data_train, series = \"all\")\n\n# Fit a model that uses a latent VAR(1)\nmod <- mvgam(\n  formula = y ~ -1,\n  trend_formula = ~ 1,\n  trend_model = VAR(cor = TRUE),\n  family = gaussian(),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Plot the autoregressive coefficient distributions;\n# use 'dir = \"v\"' to arrange the order of facets\n# correctly\nmcmc_plot(\n  mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n# Calulate forecast error variance decompositions for each series\nfevds <- fevd(mod, h = 12)\n\n# Plot median contributions to forecast error variance\nplot(fevds)\n\n# View a summary of the error variance decompositions\nsummary(fevds)\n}\n}\n\\references{\nLütkepohl, H. (2007).\nNew Introduction to Multiple Time Series Analysis. 2nd ed. Springer-Verlag Berlin Heidelberg.\n}\n\\seealso{\n\\code{\\link[=VAR]{VAR()}}, \\code{\\link[=irf]{irf()}}, \\code{\\link[=stability]{stability()}}, \\code{\\link{mvgam_fevd-class}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/fitted.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/posterior_epred.mvgam.R\n\\name{fitted.mvgam}\n\\alias{fitted.mvgam}\n\\title{Expected values of the posterior predictive distribution for \\pkg{mvgam} objects}\n\\usage{\n\\method{fitted}{mvgam}(\n  object,\n  process_error = TRUE,\n  scale = c(\"response\", \"linear\"),\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n)\n}\n\\arguments{\n\\item{object}{An object of class \\code{mvgam}}\n\n\\item{process_error}{Logical. If \\code{TRUE} and a dynamic trend model was\nfit, expected uncertainty in the process model is accounted for by using\ndraws from a stationary, zero-centred multivariate Normal distribution\nusing any estimated process variance-covariance parameters. If\n\\code{FALSE}, uncertainty in the latent trend component is ignored when\ncalculating predictions}\n\n\\item{scale}{Either \\code{\"response\"} or \\code{\"linear\"}.\nIf \\code{\"response\"}, results are returned on the scale\nof the response variable. If \\code{\"linear\"},\nresults are returned on the scale of the linear predictor term,\nthat is without applying the inverse link function or\nother transformations.}\n\n\\item{summary}{Should summary statistics be returned\ninstead of the raw values? Default is \\code{TRUE}..}\n\n\\item{robust}{If \\code{FALSE} (the default) the mean is used as\nthe measure of central tendency and the standard deviation as\nthe measure of variability. If \\code{TRUE}, the median and the\nmedian absolute deviation (MAD) are applied instead.\nOnly used if \\code{summary} is \\code{TRUE}.}\n\n\\item{probs}{The percentiles to be computed by the \\code{quantile}\nfunction. Only used if \\code{summary} is \\code{TRUE}.}\n\n\\item{...}{Further arguments passed to \\code{\\link[brms]{prepare_predictions}}\nthat control several aspects of data validation and prediction.}\n}\n\\value{\nAn \\code{array} of predicted \\emph{mean} response values.\n\nIf \\code{summary = FALSE} the output resembles those of\n\\code{\\link{posterior_epred.mvgam}} and \\code{\\link{predict.mvgam}}.\n\nIf \\code{summary = TRUE} the output is an \\code{n_observations} x \\code{E}\nmatrix. The number of summary statistics \\code{E} is equal to \\code{2 +\n  length(probs)}: The \\code{Estimate} column contains point estimates (either\nmean or median depending on argument \\code{robust}), while the\n\\code{Est.Error} column contains uncertainty estimates (either standard\ndeviation or median absolute deviation depending on argument\n\\code{robust}). The remaining columns starting with \\code{Q} contain\nquantile estimates as specified via argument \\code{probs}.\n}\n\\description{\nThis method extracts posterior estimates of the fitted values (i.e. the\nactual predictions, including estimates for any trend states, that were\nobtained when fitting the model). It also includes an option for obtaining\nsummaries of the computed draws.\n}\n\\details{\nThis method gives the actual fitted values from the model (i.e. what\nyou will see if you generate hindcasts from the fitted model using\n\\code{\\link{hindcast.mvgam}} with \\code{type = 'expected'}). These predictions\ncan be overly precise if a flexible dynamic trend component was included in\nthe model. This is in contrast to the set of predict functions (i.e.\n\\code{\\link{posterior_epred.mvgam}} or \\code{\\link{predict.mvgam}}), which\nwill assume any dynamic trend component has reached stationarity when\nreturning hypothetical predictions.\n}\n\\examples{\n\\dontrun{\n# Simulate some data and fit a model\nsimdat <- sim_mvgam(n_series = 1, trend_model = AR())\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc'),\n  trend_model = AR(),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Extract fitted values (posterior expectations)\nexpectations <- fitted(mod)\nstr(expectations)\n}\n\n}\n\\seealso{\n\\code{\\link{hindcast.mvgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/forecast.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/forecast.mvgam.R\n\\name{forecast.mvgam}\n\\alias{forecast.mvgam}\n\\title{Extract or compute hindcasts and forecasts for a fitted\n\\code{mvgam} object}\n\\usage{\n\\method{forecast}{mvgam}(object, newdata, data_test, n_cores = 1, type = \"response\", ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} or \\code{jsdgam}.\nSee \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining the same variables that were included in the original \\code{data}\nused to fit the model. If included, the covariate information in\n\\code{newdata} will be used to generate forecasts from the fitted model\nequations. If this same \\code{newdata} was originally included in the call\nto \\code{mvgam}, then forecasts have already been produced by the\ngenerative model and these will simply be extracted and plotted. However\nif no \\code{newdata} was supplied to the original model call, an\nassumption is made that the \\code{newdata} supplied here comes\nsequentially after the data supplied in the original model (i.e. we\nassume there is no time gap between the last observation of series 1 in\nthe original data and the first observation for series 1 in\n\\code{newdata})}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{n_cores}{Deprecated. Parallel processing is no longer supported}\n\n\\item{type}{When this has the value \\code{link} (default) the linear\npredictor is calculated on the link scale. If \\code{expected} is used,\npredictions reflect the expectation of the response (the mean) but ignore\nuncertainty in the observation process. When \\code{response} is used, the\npredictions take uncertainty in the observation process into account to\nreturn predictions on the outcome scale. When \\code{variance} is used, the\nvariance of the response with respect to the mean (mean-variance\nrelationship) is returned. When \\code{type = \"terms\"}, each component of the\nlinear predictor is returned separately in the form of a \\code{list} (possibly\nwith standard errors, if \\code{summary = TRUE}): this includes parametric model\ncomponents, followed by each smooth component, but excludes any offset and\nany intercept. Two special cases are also allowed: type \\code{latent_N} will\nreturn the estimated latent abundances from an N-mixture distribution,\nwhile type \\code{detection} will return the estimated detection probability from\nan N-mixture distribution}\n\n\\item{...}{Ignored}\n}\n\\value{\nAn object of class \\code{mvgam_forecast} containing hindcast and\nforecast distributions. See \\code{\\link{mvgam_forecast-class}} for\ndetails.\n}\n\\description{\nExtract or compute hindcasts and forecasts for a fitted\n\\code{mvgam} object\n}\n\\details{\nPosterior predictions are drawn from the fitted \\code{mvgam} and\nused to simulate a forecast distribution\n}\n\\examples{\n\\dontrun{\n  # Simulate data with 3 series and AR trend model\n  simdat <- sim_mvgam(n_series = 3, trend_model = AR())\n\n  # Fit mvgam model\n  mod <- mvgam(\n    y ~ s(season, bs = 'cc', k = 6),\n    trend_model = AR(),\n    noncentred = TRUE,\n    data = simdat$data_train,\n    chains = 2,\n    silent = 2\n  )\n\n  # Hindcasts on response scale\n  hc <- hindcast(mod)\n  str(hc)\n\n  # Use summary() to extract hindcasts / forecasts for custom plotting\n  head(summary(hc), 12)\n\n  # Or just use the plot() function for quick plots\n  plot(hc, series = 1)\n  plot(hc, series = 2)\n  plot(hc, series = 3)\n\n  # Forecasts on response scale\n  fc <- forecast(\n    mod,\n    newdata = simdat$data_test\n  )\n  str(fc)\n  head(summary(fc), 12)\n  plot(fc, series = 1)\n  plot(fc, series = 2)\n  plot(fc, series = 3)\n\n  # Forecasts as expectations\n  fc <- forecast(\n    mod,\n    newdata = simdat$data_test,\n    type = 'expected'\n  )\n  head(summary(fc), 12)\n  plot(fc, series = 1)\n  plot(fc, series = 2)\n  plot(fc, series = 3)\n\n  # Dynamic trend extrapolations\n  fc <- forecast(\n    mod,\n    newdata = simdat$data_test,\n    type = 'trend'\n  )\n  head(summary(fc), 12)\n  plot(fc, series = 1)\n  plot(fc, series = 2)\n  plot(fc, series = 3)\n}\n\n}\n\\seealso{\n\\code{\\link[=hindcast.mvgam]{hindcast.mvgam()}}, \\code{\\link[=plot.mvgam_forecast]{plot.mvgam_forecast()}},\n\\code{\\link[=summary.mvgam_forecast]{summary.mvgam_forecast()}}, \\code{\\link[=score.mvgam_forecast]{score.mvgam_forecast()}}\n\\code{\\link[=ensemble.mvgam_forecast]{ensemble.mvgam_forecast()}}\n}\n"
  },
  {
    "path": "man/formula.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/formula.mvgam.R\n\\name{formula.mvgam}\n\\alias{formula.mvgam}\n\\alias{formula.mvgam_prefit}\n\\title{Extract formulae from \\pkg{mvgam} objects}\n\\usage{\n\\method{formula}{mvgam}(x, trend_effects = FALSE, ...)\n\n\\method{formula}{mvgam_prefit}(x, trend_effects = FALSE, ...)\n}\n\\arguments{\n\\item{x}{\\code{mvgam}, \\code{jsdgam} or \\code{mvgam_prefit} object}\n\n\\item{trend_effects}{\\code{logical}, return the formula from the\nobservation model (if \\code{FALSE}) or from the underlying process\nmodel (if\\code{TRUE})}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{formula} object\n}\n\\description{\nExtract formulae from \\pkg{mvgam} objects\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/get_mvgam_priors.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/get_mvgam_priors.R\n\\name{get_mvgam_priors}\n\\alias{get_mvgam_priors}\n\\title{Extract information on default prior distributions for an \\pkg{mvgam} model}\n\\usage{\nget_mvgam_priors(\n  formula,\n  trend_formula,\n  factor_formula,\n  knots,\n  trend_knots,\n  trend_model = \"None\",\n  family = poisson(),\n  data,\n  unit = time,\n  species = series,\n  use_lv = FALSE,\n  n_lv,\n  trend_map,\n  ...\n)\n}\n\\arguments{\n\\item{formula}{A \\code{formula} object specifying the GAM observation model formula.\nThese are exactly like the formula for a GLM except that smooth terms, \\code{s()},\n\\code{te()}, \\code{ti()}, \\code{t2()}, as well as time-varying \\code{dynamic()} terms,\nnonparametric \\code{gp()} terms and offsets using \\code{offset()}, can be added to the\nright hand side to specify that the linear predictor depends on smooth\nfunctions of predictors (or linear functionals of these).\n\nIn \\code{nmix()} family models, the \\code{formula} is used to set up a linear predictor\nfor the detection probability. Details of the formula syntax used by\n\\pkg{mvgam} can be found in \\code{\\link{mvgam_formulae}}}\n\n\\item{trend_formula}{An optional \\code{formula} object specifying the GAM process\nmodel formula. If supplied, a linear predictor will be modelled for the\nlatent trends to capture process model evolution separately from the\nobservation model.\n\n\\strong{Important notes:}\n\\itemize{\n\\item Should not have a response variable specified on the left-hand side\n(e.g., \\code{~ season + s(year)})\n\\item Use \\code{trend} instead of \\code{series} for effects that vary across time series\n\\item Only available for \\code{RW()}, \\code{AR()} and \\code{VAR()} trend models\n\\item In \\code{nmix()} family models, sets up linear predictor for latent abundance\n\\item Consider dropping one intercept using \\code{- 1} convention to avoid\nestimation challenges\n}}\n\n\\item{factor_formula}{Can be supplied instead \\code{trend_formula} to match\nsyntax from \\link{jsdgam}}\n\n\\item{knots}{An optional \\code{list} containing user specified knot values for\nbasis construction. For most bases the user simply supplies the knots to be\nused, which must match up with the \\code{k} value supplied. Different terms can\nuse different numbers of knots, unless they share a covariate.}\n\n\\item{trend_knots}{As for \\code{knots} above, this is an optional \\code{list} of knot\nvalues for smooth functions within the \\code{trend_formula}.}\n\n\\item{trend_model}{\\code{character} or \\code{function} specifying the time series dynamics\nfor the latent trend.\n\n\\strong{Available options:}\n\\itemize{\n\\item \\code{None}: No latent trend component (GAM component only, like \\code{\\link[mgcv]{gam}})\n\\item \\code{ZMVN} or \\code{ZMVN()}: Zero-Mean Multivariate Normal (Stan only)\n\\item \\code{'RW'} or \\code{RW()}: Random Walk\n\\item \\code{'AR1'}, \\code{'AR2'}, \\code{'AR3'} or \\code{AR(p = 1, 2, 3)}: Autoregressive models\n\\item \\code{'CAR1'} or \\code{CAR(p = 1)}: Continuous-time AR (Ornstein–Uhlenbeck process)\n\\item \\code{'VAR1'} or \\code{VAR()}: Vector Autoregressive (Stan only)\n\\item \\code{'PWlogistic'}, \\code{'PWlinear'} or \\code{PW()}: Piecewise trends (Stan only)\n\\item \\code{'GP'} or \\code{GP()}: Gaussian Process with squared exponential kernel (Stan only)\n}\n\n\\strong{Additional features:}\n\\itemize{\n\\item Moving average and/or correlated process error terms available for most types\n(e.g., \\code{RW(cor = TRUE)} for multivariate Random Walk)\n\\item Hierarchical correlations possible for structured data\n\\item See \\link{mvgam_trends} for details and \\code{\\link[=ZMVN]{ZMVN()}} for examples\n}}\n\n\\item{family}{\\code{family} specifying the exponential observation family for the series.\n\n\\strong{Supported families:}\n\\itemize{\n\\item \\code{gaussian()}: Real-valued data\n\\item \\code{betar()}: Proportional data on \\verb{(0,1)}\n\\item \\code{lognormal()}: Non-negative real-valued data\n\\item \\code{student_t()}: Real-valued data\n\\item \\code{Gamma()}: Non-negative real-valued data\n\\item \\code{bernoulli()}: Binary data\n\\item \\code{poisson()}: Count data (default)\n\\item \\code{nb()}: Overdispersed count data\n\\item \\code{binomial()}: Count data with imperfect detection when number of trials is known\n(use \\code{cbind()} to bind observations and trials)\n\\item \\code{beta_binomial()}: As \\code{binomial()} but allows for overdispersion\n\\item \\code{nmix()}: Count data with imperfect detection when number of trials is unknown\n(State-Space N-Mixture model with Poisson latent states and Binomial observations)\n}\n\nSee \\code{\\link{mvgam_families}} for more details.}\n\n\\item{data}{A \\code{dataframe} or \\code{list} containing the model response variable\nand covariates required by the GAM \\code{formula} and optional \\code{trend_formula}.\n\n\\strong{Required columns for most models:}\n\\itemize{\n\\item \\code{series}: A \\code{factor} index of the series IDs (number of levels should equal\nnumber of unique series labels)\n\\item \\code{time}: \\code{numeric} or \\code{integer} index of time points. For most dynamic trend\ntypes, time should be measured in discrete, regularly spaced intervals\n(i.e., \\code{c(1, 2, 3, ...)}). Irregular spacing is allowed for \\code{trend_model = CAR(1)},\nbut zero intervals are adjusted to \\code{1e-12} to prevent sampling errors.\n}\n\n\\strong{Special cases:}\n\\itemize{\n\\item Models with hierarchical temporal correlation (e.g., \\code{AR(gr = region, subgr = species)})\nshould NOT include a \\code{series} identifier\n\\item Models without temporal dynamics (\\code{trend_model = 'None'} or \\code{trend_model = ZMVN()})\ndon't require a \\code{time} variable\n}}\n\n\\item{unit}{The unquoted name of the variable that represents the unit of\nanalysis in \\code{data} over which latent residuals should be correlated. This\nvariable should be either a \\code{numeric} or \\code{integer} variable in the\nsupplied \\code{data}. Defaults to \\code{time} to be consistent with other\nfunctionalities in \\pkg{mvgam}, though note that the data need not be time\nseries in this case. See examples below for further details and\nexplanations}\n\n\\item{species}{The unquoted name of the \\code{factor} variable that indexes the\ndifferent response units in \\code{data} (usually \\code{'species'} in a JSDM).\nDefaults to \\code{series} to be consistent with other \\code{mvgam} models}\n\n\\item{use_lv}{\\code{logical}. If \\code{TRUE}, use dynamic factors to estimate series'\nlatent trends in a reduced dimension format. Only available for \\code{RW()},\n\\code{AR()} and \\code{GP()} trend models. Default is \\code{FALSE}.\nSee \\code{\\link{lv_correlations}} for examples.}\n\n\\item{n_lv}{\\code{integer} specifying the number of latent dynamic factors to use\nif \\code{use_lv == TRUE}. Cannot exceed \\code{n_series}. Default is\n\\code{min(2, floor(n_series / 2))}.}\n\n\\item{trend_map}{Optional \\code{data.frame} specifying which series should depend on\nwhich latent trends. Enables multiple series to depend on the same latent\ntrend process with different observation processes.\n\n\\strong{Required structure:}\n\\itemize{\n\\item Column \\code{series}: Single unique entry for each series (matching factor levels in data)\n\\item Column \\code{trend}: Integer values indicating which trend each series depends on\n}\n\n\\strong{Notes:}\n\\itemize{\n\\item Sets up latent factor model by enabling \\code{use_lv = TRUE}\n\\item Process model intercept is NOT automatically suppressed\n\\item Not yet supported for continuous time models (\\code{CAR()})\n}}\n\n\\item{...}{Not currently used}\n}\n\\value{\neither a \\code{data.frame} containing the prior definitions (if any\nsuitable priors can be altered by the user) or \\code{NULL}, indicating\nthat no priors in the model can be modified\n}\n\\description{\nThis function lists the parameters that can have their prior distributions\nchanged for a given model, as well listing their default distributions\n}\n\\details{\nUsers can supply a model formula, prior to fitting the model, so\nthat default priors can be inspected and altered. To make alterations,\nchange the contents of the \\code{prior} column and supplying this\n\\code{data.frame} to the \\code{\\link{mvgam}} or \\code{\\link{jsdgam}}\nfunctions using the argument \\code{priors}. If using \\code{Stan} as the backend,\nusers can also modify the parameter bounds by modifying the\n\\code{new_lowerbound} and/or \\code{new_upperbound} columns. This will be necessary\nif using restrictive distributions on some parameters, such as a Beta\ndistribution for the trend sd parameters for example (Beta only has\nsupport on \\code{(0,1)}), so the upperbound cannot be above \\code{1}. Another\noption is to make use of the prior modification functions in \\pkg{brms}\n(i.e. \\code{\\link[brms]{prior}}) to change prior distributions and bounds\n(just use the name of the parameter that you'd like to change as the\n\\code{class} argument; see examples below)\n}\n\\note{\nOnly the \\code{prior}, \\code{new_lowerbound} and/or \\code{new_upperbound} columns of\nthe output should be altered when defining the user-defined priors for\nthe model. Use only if you are familiar with the underlying probabilistic\nprogramming language. There are no sanity checks done to ensure that the\ncode is legal (i.e. to check that lower bounds are smaller than upper\nbounds, for example)\n}\n\\examples{\n\\dontrun{\n# ========================================================================\n# Example 1: Simulate data and inspect default priors\n# ========================================================================\n\ndat <- sim_mvgam(trend_rel = 0.5)\n\n# Get a model file that uses default mvgam priors for inspection (not\n# always necessary, but this can be useful for testing whether your\n# updated priors are written correctly)\nmod_default <- mvgam(\n  y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n  family = nb(),\n  data = dat$data_train,\n  trend_model = AR(p = 2),\n  run_model = FALSE\n)\n\n# Inspect the model file with default mvgam priors\nstancode(mod_default)\n\n# Look at which priors can be updated in mvgam\ntest_priors <- get_mvgam_priors(\n  y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n  family = nb(),\n  data = dat$data_train,\n  trend_model = AR(p = 2)\n)\ntest_priors\n\n# ========================================================================\n# Example 2: Modify priors manually\n# ========================================================================\n\n# Make a few changes; first, change the population mean for the\n# series-level random intercepts\ntest_priors$prior[2] <- \"mu_raw ~ normal(0.2, 0.5);\"\n\n# Now use stronger regularisation for the series-level AR2 coefficients\ntest_priors$prior[5] <- \"ar2 ~ normal(0, 0.25);\"\n\n# Check that the changes are made to the model file without any warnings\n# by setting 'run_model = FALSE'\nmod <- mvgam(\n  y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n  family = nb(),\n  data = dat$data_train,\n  trend_model = AR(p = 2),\n  priors = test_priors,\n  run_model = FALSE\n)\nstancode(mod)\n\n# No warnings, the model is ready for fitting now in the usual way with\n# the addition of the 'priors' argument\n\n# ========================================================================\n# Example 3: Use brms syntax for prior modification\n# ========================================================================\n\n# The same can be done using 'brms' functions; here we will also change\n# the ar1 prior and put some bounds on the ar coefficients to enforce\n# stationarity; we set the prior using the 'class' argument in all brms\n# prior functions\nbrmsprior <- c(\n  prior(normal(0.2, 0.5), class = mu_raw),\n  prior(normal(0, 0.25), class = ar1, lb = -1, ub = 1),\n  prior(normal(0, 0.25), class = ar2, lb = -1, ub = 1)\n)\nbrmsprior\n\nmod <- mvgam(\n  y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n  family = nb(),\n  data = dat$data_train,\n  trend_model = AR(p = 2),\n  priors = brmsprior,\n  run_model = FALSE\n)\nstancode(mod)\n\n# ========================================================================\n# Example 4: Error handling example\n# ========================================================================\n\n# Look at what is returned when an incorrect spelling is used\ntest_priors$prior[5] <- \"ar2_bananas ~ normal(0, 0.25);\"\nmod <- mvgam(\n  y ~ s(series, bs = \"re\") + s(season, bs = \"cc\") - 1,\n  family = nb(),\n  data = dat$data_train,\n  trend_model = AR(p = 2),\n  priors = test_priors,\n  run_model = FALSE\n)\nstancode(mod)\n\n# ========================================================================\n# Example 5: Parametric (fixed effect) priors\n# ========================================================================\n\nsimdat <- sim_mvgam()\n\n# Add a fake covariate\nsimdat$data_train$cov <- rnorm(NROW(simdat$data_train))\n\npriors <- get_mvgam_priors(\n  y ~ cov + s(season),\n  data = simdat$data_train,\n  family = poisson(),\n  trend_model = AR()\n)\n\n# Change priors for the intercept and fake covariate effects\npriors$prior[1] <- \"(Intercept) ~ normal(0, 1);\"\npriors$prior[2] <- \"cov ~ normal(0, 0.1);\"\n\nmod2 <- mvgam(\n  y ~ cov + s(season),\n  data = simdat$data_train,\n  trend_model = AR(),\n  family = poisson(),\n  priors = priors,\n  run_model = FALSE\n)\nstancode(mod2)\n\n# ========================================================================\n# Example 6: Alternative brms syntax for fixed effects\n# ========================================================================\n\n# Likewise using 'brms' utilities (note that you can use Intercept rather\n# than `(Intercept)`) to change priors on the intercept\nbrmsprior <- c(\n  prior(normal(0.2, 0.5), class = cov),\n  prior(normal(0, 0.25), class = Intercept)\n)\nbrmsprior\n\nmod2 <- mvgam(\n  y ~ cov + s(season),\n  data = simdat$data_train,\n  trend_model = AR(),\n  family = poisson(),\n  priors = brmsprior,\n  run_model = FALSE\n)\nstancode(mod2)\n\n# ========================================================================\n# Example 7: Bulk prior assignment\n# ========================================================================\n\n# The \"class = 'b'\" shortcut can be used to put the same prior on all\n# 'fixed' effect coefficients (apart from any intercepts)\nset.seed(0)\ndat <- mgcv::gamSim(1, n = 200, scale = 2)\ndat$time <- 1:NROW(dat)\nmod <- mvgam(\n  y ~ x0 + x1 + s(x2) + s(x3),\n  priors = prior(normal(0, 0.75), class = \"b\"),\n  data = dat,\n  family = gaussian(),\n  run_model = FALSE\n)\nstancode(mod)\n}\n\n}\n\\seealso{\n\\code{\\link{mvgam}}, \\code{\\link{mvgam_formulae}},\n\\code{\\link[brms]{prior}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/gratia_mvgam_enhancements.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/gratia_methods.R\n\\name{gratia_mvgam_enhancements}\n\\alias{gratia_mvgam_enhancements}\n\\alias{drawDotmvgam}\n\\alias{draw.mvgam}\n\\alias{eval_smoothDothilbertDotsmooth}\n\\alias{eval_smooth.hilbert.smooth}\n\\alias{eval_smoothDotmodDotsmooth}\n\\alias{eval_smooth.mod.smooth}\n\\alias{eval_smoothDotmoiDotsmooth}\n\\alias{eval_smooth.moi.smooth}\n\\title{Enhance post-processing of \\pkg{mvgam} models using \\pkg{gratia} functionality}\n\\usage{\ndrawDotmvgam(\n  object,\n  trend_effects = FALSE,\n  data = NULL,\n  select = NULL,\n  parametric = FALSE,\n  terms = NULL,\n  residuals = FALSE,\n  scales = c(\"free\", \"fixed\"),\n  ci_level = 0.95,\n  n = 100,\n  n_3d = 16,\n  n_4d = 4,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  constant = NULL,\n  fun = NULL,\n  dist = 0.1,\n  rug = TRUE,\n  contour = TRUE,\n  grouped_by = FALSE,\n  ci_alpha = 0.2,\n  ci_col = \"black\",\n  smooth_col = \"black\",\n  resid_col = \"steelblue3\",\n  contour_col = \"black\",\n  n_contour = NULL,\n  partial_match = FALSE,\n  discrete_colour = NULL,\n  discrete_fill = NULL,\n  continuous_colour = NULL,\n  continuous_fill = NULL,\n  position = \"identity\",\n  angle = NULL,\n  ncol = NULL,\n  nrow = NULL,\n  guides = \"keep\",\n  widths = NULL,\n  heights = NULL,\n  crs = NULL,\n  default_crs = NULL,\n  lims_method = \"cross\",\n  wrap = TRUE,\n  envir = environment(formula(object)),\n  ...\n)\n\neval_smoothDothilbertDotsmooth(\n  smooth,\n  model,\n  n = 100,\n  n_3d = NULL,\n  n_4d = NULL,\n  data = NULL,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  dist = NULL,\n  ...\n)\n\neval_smoothDotmodDotsmooth(\n  smooth,\n  model,\n  n = 100,\n  n_3d = NULL,\n  n_4d = NULL,\n  data = NULL,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  dist = NULL,\n  ...\n)\n\neval_smoothDotmoiDotsmooth(\n  smooth,\n  model,\n  n = 100,\n  n_3d = NULL,\n  n_4d = NULL,\n  data = NULL,\n  unconditional = FALSE,\n  overall_uncertainty = TRUE,\n  dist = NULL,\n  ...\n)\n}\n\\arguments{\n\\item{object}{a fitted mvgam, the result of a call to \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{trend_effects}{logical specifying whether smooth terms from the \\code{trend_formula} should\nbe drawn. If \\code{FALSE}, only terms from the observation formula are drawn. If \\code{TRUE}, only\nterms from the \\code{trend_formula} are drawn}\n\n\\item{data}{a data frame of covariate values at which to evaluate the\nmodel's smooth functions}\n\n\\item{select}{character, logical, or numeric; which smooths to plot. If\n\\code{NULL}, the default, then all model smooths are drawn.\nCharacter \\code{select} matches the labels for smooths\nas shown for example in the output from \\code{summary(object)}. Logical\n\\code{select} operates as per numeric \\code{select} in the order that smooths are\nstored}\n\n\\item{parametric}{logical; plot parametric terms also? Note that \\code{select} is\nused for selecting which smooths to plot. The \\code{terms} argument is used to\nselect which parametric effects are plotted. The default, as with\n\\code{\\link[mgcv:plot.gam]{mgcv::plot.gam()}}, is to not draw parametric effects}\n\n\\item{terms}{character; which model parametric terms should be drawn? The\nDefault of \\code{NULL} will plot all parametric terms that can be drawn.}\n\n\\item{residuals}{currently ignored for \\code{mvgam} models}\n\n\\item{scales}{character; should all univariate smooths be plotted with the\nsame y-axis scale? If \\code{scales = \"free\"}, the default, each univariate\nsmooth has its own y-axis scale. If \\code{scales = \"fixed\"}, a common y axis\nscale is used for all univariate smooths.\n\nCurrently does not affect the y-axis scale of plots of the parametric\nterms}\n\n\\item{ci_level}{numeric between 0 and 1; the coverage of credible interval.}\n\n\\item{n}{numeric; the number of points over the range of the covariate at\nwhich to evaluate the smooth}\n\n\\item{n_3d, n_4d}{numeric; the number of points over the range of last\ncovariate in a 3D or 4D smooth. The default is \\code{NULL} which achieves the\nstandard behaviour of using \\code{n} points over the range of all covariate,\nresulting in \\code{n^d} evaluation points, where \\code{d} is the dimension of the\nsmooth. For \\code{d > 2} this can result in very many evaluation points and slow\nperformance. For smooths of \\code{d > 4}, the value of \\code{n_4d} will be used for\nall dimensions \\verb{> 4}, unless this is \\code{NULL}, in which case the default\nbehaviour (using \\code{n} for all dimensions) will be observed}\n\n\\item{unconditional}{ignored for \\code{mvgam} models as all appropriate\nuncertainties are already included in the posterior estimates}\n\n\\item{overall_uncertainty}{ignored for \\code{mvgam} models as all appropriate\nuncertainties are already included in the posterior estimates}\n\n\\item{constant}{numeric; a constant to add to the estimated values of the\nsmooth. \\code{constant}, if supplied, will be added to the estimated value\nbefore the confidence band is computed}\n\n\\item{fun}{function; a function that will be applied to the estimated values\nand confidence interval before plotting. Can be a function or the name of a\nfunction. Function \\code{fun} will be applied after adding any \\code{constant}, if\nprovided}\n\n\\item{dist}{numeric; if greater than 0, this is used to determine when\na location is too far from data to be plotted when plotting 2-D smooths.\nThe data are scaled into the unit square before deciding what to exclude,\nand \\code{dist} is a distance within the unit square. See\n\\code{\\link[mgcv:exclude.too.far]{mgcv::exclude.too.far()}} for further details}\n\n\\item{rug}{logical; draw a rug plot at the bottom of each plot for 1-D\nsmooths or plot locations of data for higher dimensions.}\n\n\\item{contour}{logical; should contours be draw on the plot using\n\\code{\\link[ggplot2:geom_contour]{ggplot2::geom_contour()}}}\n\n\\item{grouped_by}{logical; should factor by smooths be drawn as one panel\nper level of the factor (\\code{FALSE}, the default), or should the individual\nsmooths be combined into a single panel containing all levels (\\code{TRUE})?}\n\n\\item{ci_alpha}{numeric; alpha transparency for confidence or simultaneous\ninterval}\n\n\\item{ci_col}{colour specification for the confidence/credible intervals\nband. Affects the fill of the interval}\n\n\\item{smooth_col}{colour specification for the smooth line}\n\n\\item{resid_col}{colour specification for residual points. Ignored}\n\n\\item{contour_col}{colour specification for contour lines}\n\n\\item{n_contour}{numeric; the number of contour bins. Will result in\n\\code{n_contour - 1} contour lines being drawn. See \\code{\\link[ggplot2:geom_contour]{ggplot2::geom_contour()}}}\n\n\\item{partial_match}{logical; should smooths be selected by partial matches\nwith \\code{select}? If \\code{TRUE}, \\code{select} can only be a single string to match\nagainst}\n\n\\item{discrete_colour}{a suitable colour scale to be used when plotting\ndiscrete variables}\n\n\\item{discrete_fill}{a suitable fill scale to be used when plotting\ndiscrete variables.}\n\n\\item{continuous_colour}{a suitable colour scale to be used when plotting\ncontinuous variables}\n\n\\item{continuous_fill}{a suitable fill scale to be used when plotting\ncontinuous variables}\n\n\\item{position}{Position adjustment, either as a string, or the result of a\ncall to a position adjustment function}\n\n\\item{angle}{numeric; the angle at which the x axis tick labels are to be\ndrawn passed to the \\code{angle} argument of \\code{\\link[ggplot2:guide_axis]{ggplot2::guide_axis()}}}\n\n\\item{ncol, nrow}{numeric; the numbers of rows and columns over which to\nspread the plots}\n\n\\item{guides}{character; one of \\code{\"keep\"} (the default), \\code{\"collect\"}, or\n\\code{\"auto\"}. Passed to \\code{\\link[patchwork:plot_layout]{patchwork::plot_layout()}}}\n\n\\item{widths, heights}{The relative widths and heights of each column and\nrow in the grid. Will get repeated to match the dimensions of the grid. If\nthere is more than 1 plot and \\code{widths = NULL}, the value of \\code{widths} will\nbe set internally to \\code{widths = 1} to accommodate plots of smooths that\nuse a fixed aspect ratio.=}\n\n\\item{crs}{the coordinate reference system (CRS) to use for the plot. All\ndata will be projected into this CRS. See \\code{\\link[ggplot2:ggsf]{ggplot2::coord_sf()}} for\ndetails}\n\n\\item{default_crs}{the coordinate reference system (CRS) to use for the\nnon-sf layers in the plot. If left at the default \\code{NULL}, the CRS used is\n4326 (WGS84), which is appropriate for spline-on-the-sphere smooths, which\nare parameterized in terms of latitude and longitude as coordinates. See\n\\code{\\link[ggplot2:ggsf]{ggplot2::coord_sf()}} for more details}\n\n\\item{lims_method}{character; affects how the axis limits are determined. See\n\\code{\\link[ggplot2:ggsf]{ggplot2::coord_sf()}}. Be careful; in testing of some examples, changing\nthis to \\code{\"orthogonal\"} for example with the chlorophyll-a example from\nSimon Wood's GAM book quickly used up all the RAM in my test system and the\nOS killed R. This could be incorrect usage on my part; right now the grid\nof points at which SOS smooths are evaluated (if not supplied by the user)\ncan produce invalid coordinates for the corners of tiles as the grid is\ngenerated for tile centres without respect to the spacing of those tiles}\n\n\\item{wrap}{logical; wrap plots as a patchwork? If \\code{FALSE}, a list of\nggplot objects is returned, 1 per term plotted}\n\n\\item{envir}{an environment to look up the data within}\n\n\\item{...}{additional arguments passed to other methods}\n\n\\item{smooth}{a smooth object of class \\code{\"gp.smooth\"} (returned from a model using either the\n\\code{dynamic()} function or the \\code{gp()} function) or of class \\code{\"moi.smooth\"} or \\code{\"mod.smooth\"}\n(returned from a model using the 'moi' or 'mod' basis)}\n\n\\item{model}{a fitted \\code{mgcv} model of clas \\code{gam} or \\code{bam}}\n}\n\\description{\nThese evaluation and plotting functions exist to allow some popular \\code{gratia}\nmethods to work with \\code{mvgam} or \\code{jsdgam} models\n}\n\\details{\nThese methods allow \\code{mvgam} models to be \\emph{Enhanced} if users have the \\code{gratia}\npackage installed, making available the popular \\code{draw()} function to plot partial effects\nof \\code{mvgam} smooth functions using \\code{\\link[ggplot2:ggplot]{ggplot2::ggplot()}} utilities\n}\n\\examples{\n\\dontrun{\n# Fit a simple GAM and draw partial effects of smooths using 'gratia'\nset.seed(0)\ndat <- mgcv::gamSim(\n  eg = 1,\n  n = 200,\n  scale = 2\n)\n\nmod <- mvgam(\n  formula = y ~ s(x1, bs = 'moi') +\n    te(x0, x2),\n  data = dat,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\nif (require(\"gratia\")) {\n  gratia::draw(mod)\n}\n}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/hindcast.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/hindcast.mvgam.R\n\\name{hindcast.mvgam}\n\\alias{hindcast.mvgam}\n\\alias{hindcast}\n\\title{Extract hindcasts for a fitted \\code{mvgam} object}\n\\usage{\nhindcast(object, ...)\n\n\\method{hindcast}{mvgam}(object, type = \"response\", ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} or \\code{jsdgam}.\nSee \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{...}{Ignored}\n\n\\item{type}{When this has the value \\code{link} (default) the linear\npredictor is calculated on the link scale. If \\code{expected} is used,\npredictions reflect the expectation of the response (the mean) but ignore\nuncertainty in the observation process. When \\code{response} is used, the\npredictions take uncertainty in the observation process into account to\nreturn predictions on the outcome scale. When \\code{variance} is used, the\nvariance of the response with respect to the mean (mean-variance\nrelationship) is returned. When \\code{type = \"terms\"}, each component of the\nlinear predictor is returned separately in the form of a \\code{list} (possibly\nwith standard errors, if \\code{summary = TRUE}): this includes parametric model\ncomponents, followed by each smooth component, but excludes any offset and\nany intercept. Two special cases are also allowed: type \\code{latent_N} will\nreturn the estimated latent abundances from an N-mixture distribution,\nwhile type \\code{detection} will return the estimated detection probability from\nan N-mixture distribution}\n}\n\\value{\nAn object of class \\code{mvgam_forecast} containing hindcast distributions.\nSee \\code{\\link{mvgam_forecast-class}} for details.\n}\n\\description{\nExtract hindcasts for a fitted \\code{mvgam} object\n}\n\\details{\nPosterior hindcasts (i.e. retrodictions) are drawn from the fitted \\code{mvgam} and\norganized into a convenient format for plotting\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(n_series = 3, trend_model = AR())\nmod <- mvgam(y ~ s(season, bs = 'cc'),\n             trend_model = AR(),\n             noncentred = TRUE,\n             data = simdat$data_train,\n             chains = 2,\n             silent = 2)\n\n# Hindcasts on response scale\nhc <- hindcast(mod)\nstr(hc)\nhead(summary(hc), 12)\nplot(hc, series = 1)\nplot(hc, series = 2)\nplot(hc, series = 3)\n\n# Hindcasts as expectations\nhc <- hindcast(mod, type = 'expected')\nhead(summary(hc), 12)\nplot(hc, series = 1)\nplot(hc, series = 2)\nplot(hc, series = 3)\n\n# Estimated latent trends\nhc <- hindcast(mod, type = 'trend')\nhead(summary(hc), 12)\nplot(hc, series = 1)\nplot(hc, series = 2)\nplot(hc, series = 3)\n}\n}\n\\seealso{\n\\code{\\link[=plot.mvgam_forecast]{plot.mvgam_forecast()}}, \\code{\\link[=summary.mvgam_forecast]{summary.mvgam_forecast()}},\n\\code{\\link[=forecast.mvgam]{forecast.mvgam()}}, \\code{\\link[=fitted.mvgam]{fitted.mvgam()}}, \\code{\\link[=predict.mvgam]{predict.mvgam()}}\n}\n"
  },
  {
    "path": "man/how_to_cite.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/how_to_cite.R\n\\name{how_to_cite.mvgam}\n\\alias{how_to_cite.mvgam}\n\\alias{how_to_cite}\n\\title{Generate a methods description for \\pkg{mvgam} models}\n\\usage{\nhow_to_cite(object, ...)\n\n\\method{how_to_cite}{mvgam}(object, ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} resulting from a call\nto \\code{\\link[=mvgam]{mvgam()}} or \\code{\\link[=jsdgam]{jsdgam()}}}\n\n\\item{...}{ignored}\n}\n\\value{\nAn object of class \\code{how_to_cite} containing a text description\nof the methods as well as lists of both primary and additional references.\n}\n\\description{\nCreate a brief but fully referenced methods description, along with a useful\nlist of references, for fitted \\code{mvgam} and \\code{jsdgam} models.\n}\n\\details{\nThis function uses the model's structure to come up with a very\nbasic but hopefully useful methods description that can help users to\nappropriately acknowledge the hard work of developers and champion open\nscience. Please do not consider the text returned by this function to be a\ncompletely adequate methods section; it is only meant to get you started.\n}\n\\examples{\n\\dontrun{\n#--------------------------------------------------\n# Simulate 4 time series with hierarchical seasonality\n# and a VAR(1) dynamic process\n#--------------------------------------------------\nset.seed(0)\n\nsimdat <- sim_mvgam(\n  seasonality = 'hierarchical',\n  trend_model = VAR(cor = TRUE),\n  family = gaussian()\n)\n\n# Fit an appropriate model\nmod1 <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  data = simdat$data_train,\n  family = gaussian(),\n  trend_model = VAR(cor = TRUE),\n  chains = 2,\n  silent = 2\n)\n\nhow_to_cite(mod1)\n\n#--------------------------------------------------\n# For a GP example, simulate data using the mgcv package\n#--------------------------------------------------\ndat <- mgcv::gamSim(1, n = 30, scale = 2)\n\n# Fit a model that uses an approximate GP from brms\nmod2 <- mvgam(\n  y ~ gp(x2, k = 12),\n  data = dat,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\nhow_to_cite(mod2)\n}\n\n}\n\\seealso{\n\\code{\\link[utils]{citation}}, \\code{\\link{mvgam}},\n\\code{\\link{jsdgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/index-mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/index-mvgam.R\n\\name{index-mvgam}\n\\alias{index-mvgam}\n\\alias{variables}\n\\alias{Index}\n\\alias{and}\n\\alias{their}\n\\alias{`mgcv`}\n\\alias{coefficient}\n\\alias{names}\n\\alias{variables.mvgam}\n\\title{Index \\code{mvgam} objects}\n\\usage{\n\\method{variables}{mvgam}(x, ...)\n}\n\\arguments{\n\\item{x}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{...}{Arguments passed to individual methods (if applicable).}\n}\n\\value{\na \\code{list} object of the variables that can be extracted, along\nwith their aliases\n}\n\\description{\nIndex \\code{mvgam} objects\n}\n\\examples{\n\\dontrun{\n# Simulate data and fit a model\nsimdat <- sim_mvgam(\n  n_series = 1,\n  trend_model = AR()\n)\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  trend_model = AR(),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Extract model variables\nvariables(mod)\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/irf.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/irf.mvgam.R\n\\name{irf.mvgam}\n\\alias{irf.mvgam}\n\\alias{irf}\n\\title{Calculate latent VAR impulse response functions}\n\\usage{\nirf(object, ...)\n\n\\method{irf}{mvgam}(object, h = 10, cumulative = FALSE, orthogonal = FALSE, ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} resulting from a call to \\code{\\link[=mvgam]{mvgam()}}\nthat used a Vector Autoregressive latent process model (either as \\code{VAR(cor = FALSE)} or\n\\code{VAR(cor = TRUE)}; see \\code{\\link[=VAR]{VAR()}} for details)}\n\n\\item{...}{ignored}\n\n\\item{h}{Positive \\code{integer} specifying the forecast horizon over which to calculate\nthe IRF}\n\n\\item{cumulative}{\\code{Logical} flag indicating whether the IRF should be cumulative}\n\n\\item{orthogonal}{\\code{Logical} flag indicating whether orthogonalized IRFs should be\ncalculated. Note that the order of the variables matters when calculating these}\n}\n\\value{\nAn object of \\code{\\link{mvgam_irf-class}} containing the posterior IRFs. This\nobject can be used with the supplied S3 functions \\code{\\link[=plot.mvgam_irf]{plot.mvgam_irf()}}\nand \\code{\\link[=summary.mvgam_irf]{summary.mvgam_irf()}}\n}\n\\description{\nCompute Generalized or Orthogonalized Impulse Response Functions (IRFs) from\n\\code{mvgam} models with Vector Autoregressive dynamics\n}\n\\details{\nSee \\code{\\link{mvgam_irf-class}} for a full description of the quantities that are\ncomputed and returned by this function, along with key references.\n}\n\\examples{\n\\dontrun{\n# Fit a model to the portal time series that uses a latent VAR(1)\nmod <- mvgam(\n  formula = captures ~ -1,\n  trend_formula = ~ trend,\n  trend_model = VAR(cor = TRUE),\n  family = poisson(),\n  data = portal_data,\n  chains = 2,\n  silent = 2\n)\n\n# Plot the autoregressive coefficient distributions;\n# use 'dir = \"v\"' to arrange the order of facets\n# correctly\nmcmc_plot(\n  mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n# Calulate Generalized IRFs for each series\nirfs <- irf(\n  mod,\n  h = 12,\n  cumulative = FALSE\n)\n\n# Plot them\nplot(irfs, series = 1)\nplot(irfs, series = 2)\nplot(irfs, series = 3)\nplot(irfs, series = 4)\n\n# Calculate posterior median, upper and lower 95th quantiles\n# of the impulse responses\nsummary(irfs)\n}\n}\n\\seealso{\n\\code{\\link{mvgam_irf-class}}, \\code{\\link[=VAR]{VAR()}}, \\code{\\link[=plot.mvgam_irf]{plot.mvgam_irf()}}, \\code{\\link[=stability]{stability()}}, \\code{\\link[=fevd]{fevd()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/jsdgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/jsdgam.R\n\\name{jsdgam}\n\\alias{jsdgam}\n\\title{Fit Joint Species Distribution Models in \\pkg{mvgam}}\n\\usage{\njsdgam(\n  formula,\n  factor_formula = ~-1,\n  knots,\n  factor_knots,\n  data,\n  newdata,\n  family = poisson(),\n  unit = time,\n  species = series,\n  share_obs_params = FALSE,\n  priors,\n  n_lv = 2,\n  backend = getOption(\"brms.backend\", \"cmdstanr\"),\n  algorithm = getOption(\"brms.algorithm\", \"sampling\"),\n  control = list(max_treedepth = 10, adapt_delta = 0.8),\n  chains = 4,\n  burnin = 500,\n  samples = 500,\n  thin = 1,\n  parallel = TRUE,\n  threads = 1,\n  silent = 1,\n  run_model = TRUE,\n  return_model_data = FALSE,\n  residuals = TRUE,\n  ...\n)\n}\n\\arguments{\n\\item{formula}{A \\code{formula} object specifying the GAM observation model\nformula. These are exactly like the formula for a GLM except that smooth\nterms, \\code{s()}, \\code{te()}, \\code{ti()}, \\code{t2()}, as well as time-varying \\code{dynamic()}\nterms, nonparametric \\code{gp()} terms and offsets using \\code{offset()}, can be\nadded to the right hand side to specify that the linear predictor depends\non smooth functions of predictors (or linear functionals of these).\nDetails of the formula syntax used by \\pkg{mvgam} can be found in\n\\code{\\link{mvgam_formulae}}}\n\n\\item{factor_formula}{A \\code{formula} object specifying the linear predictor\neffects for the latent factors. Use \\code{by = trend} within calls to functional\nterms (i.e. \\code{s()}, \\code{te()}, \\code{ti()}, \\code{t2()}, \\code{dynamic()}, or \\code{gp()}) to\nensure that each factor captures a different axis of variation. See the\nexample below as an illustration}\n\n\\item{knots}{An optional \\code{list} containing user specified knot values for\nbasis construction. For most bases the user simply supplies the knots to be\nused, which must match up with the \\code{k} value supplied. Different terms can\nuse different numbers of knots, unless they share a covariate.}\n\n\\item{factor_knots}{An optional \\code{list} containing user specified knot\nvalues to be used for basis construction of any smooth terms in\n\\code{factor_formula}. For most bases the user simply supplies the knots to be\nused, which must match up with the \\code{k} value supplied (note that the\nnumber of knots is not always just \\code{k}). Different terms can use different\nnumbers of knots, unless they share a covariate}\n\n\\item{data}{A \\code{dataframe} or \\code{list} containing the model response\nvariable and covariates required by the GAM \\code{formula} and\n\\code{factor_formula} objects}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data containing the same\nvariables as in \\code{data}. If included, observations in variable \\code{y} will be\nset to \\code{NA} when fitting the model so that posterior simulations can be obtained.}\n\n\\item{family}{\\code{family} specifying the observation family for the\noutcomes. Currently supported families are:\n\\itemize{\n\\item\\code{gaussian()} for real-valued data\n\\item\\code{betar()} for proportional data on \\verb{(0,1)}\n\\item\\code{lognormal()} for non-negative real-valued data\n\\item\\code{student_t()} for real-valued data\n\\item\\code{Gamma()} for non-negative real-valued data\n\\item\\code{bernoulli()} for binary data\n\\item\\code{poisson()} for count data\n\\item\\code{nb()} for overdispersed count data\n\\item\\code{binomial()} for count data with imperfect detection when the number\nof trials is known; note that the \\code{cbind()} function must be used to\nbind the discrete observations and the discrete number of trials\n\\item\\code{beta_binomial()} as for \\code{binomial()} but allows for overdispersion}\nDefault is \\code{poisson()}. See \\code{\\link{mvgam_families}} for more details}\n\n\\item{unit}{The unquoted name of the variable that represents the unit of\nanalysis in \\code{data} over which latent residuals should be correlated. This\nvariable should be either a \\code{numeric} or \\code{integer} variable in the\nsupplied \\code{data}. Defaults to \\code{time} to be consistent with other\nfunctionalities in \\pkg{mvgam}, though note that the data need not be time\nseries in this case. See examples below for further details and\nexplanations}\n\n\\item{species}{The unquoted name of the \\code{factor} variable that indexes the\ndifferent response units in \\code{data} (usually \\code{'species'} in a JSDM).\nDefaults to \\code{series} to be consistent with other \\code{mvgam} models}\n\n\\item{share_obs_params}{\\code{logical}. If \\code{TRUE} and the \\code{family} has additional\nfamily-specific observation parameters (e.g., variance components, dispersion\nparameters), these will be shared across all outcome variables. Useful when\nmultiple outcomes share properties. Default is \\code{FALSE}.}\n\n\\item{priors}{An optional \\code{data.frame} with prior definitions (in Stan\nsyntax) or, preferentially, a vector containing objects of class\n\\code{brmsprior} (see. \\code{\\link[brms]{prior}} for details). See\n\\link{get_mvgam_priors} and for more information on changing default prior\ndistributions}\n\n\\item{n_lv}{\\code{integer} the number of latent factors to use for modelling\nresidual associations. Cannot be \\verb{> n_species}. Defaults arbitrarily to \\code{2}}\n\n\\item{backend}{Character string naming the package for Stan model fitting.\nOptions are \\code{\"cmdstanr\"} (default) or \\code{\"rstan\"}. Can be set globally via\n\\code{\"brms.backend\"} option. See https://mc-stan.org/rstan/ and\nhttps://mc-stan.org/cmdstanr/ for details.}\n\n\\item{algorithm}{Character string naming the estimation approach:\n\\itemize{\n\\item \\code{\"sampling\"}: MCMC (default)\n\\item \\code{\"meanfield\"}: Variational inference with factorized normal distributions\n\\item \\code{\"fullrank\"}: Variational inference with multivariate normal distribution\n\\item \\code{\"laplace\"}: Laplace approximation (cmdstanr only)\n\\item \\code{\"pathfinder\"}: Pathfinder algorithm (cmdstanr only)\n}\n\nCan be set globally via \\code{\"brms.algorithm\"} option. Limited testing suggests\n\\code{\"meanfield\"} performs best among non-MCMC approximations for dynamic GAMs.}\n\n\\item{control}{Named \\code{list} for controlling sampler behaviour. Valid elements\ninclude \\code{max_treedepth}, \\code{adapt_delta} and \\code{init}.}\n\n\\item{chains}{\\code{integer} specifying the number of parallel chains for the model.\nIgnored for variational inference algorithms.}\n\n\\item{burnin}{\\code{integer} specifying the number of warmup iterations to tune\nsampling algorithms. Ignored for variational inference algorithms.}\n\n\\item{samples}{\\code{integer} specifying the number of post-warmup iterations for\nsampling the posterior distribution.}\n\n\\item{thin}{Thinning interval for monitors. Ignored for variational inference\nalgorithms.}\n\n\\item{parallel}{\\code{logical} specifying whether to use multiple cores for parallel\nMCMC simulation. If \\code{TRUE}, uses \\code{min(c(chains, parallel::detectCores() - 1))} cores.}\n\n\\item{threads}{\\code{integer} Experimental option to use multithreading for\nwithin-chain parallelisation in \\code{Stan}. We recommend its use only if\nyou are experienced with \\code{Stan}'s \\code{reduce_sum} function and have a\nslow running model that cannot be sped up by any other means. Currently\nworks for all families when using \\pkg{cmdstanr} as the backend}\n\n\\item{silent}{Verbosity level between \\code{0} and \\code{2}. If \\code{1} (default), most\ninformational messages are suppressed. If \\code{2}, even more messages are\nsuppressed. Sampling progress is still printed - set \\code{refresh = 0} to\ndisable. For \\code{backend = \"rstan\"}, also set \\code{open_progress = FALSE} to\nprevent additional progress bars.}\n\n\\item{run_model}{\\code{logical}. If \\code{FALSE}, the model is not fitted but instead\nthe function returns the model file and the data/initial values needed to\nfit the model outside of \\code{mvgam}.}\n\n\\item{return_model_data}{\\code{logical}. If \\code{TRUE}, the list of data needed to fit\nthe model is returned, along with initial values for smooth and AR parameters,\nonce the model is fitted. Helpful for users who wish to modify the model file\nto add other stochastic elements. Default is \\code{FALSE} unless \\code{run_model == FALSE}.}\n\n\\item{residuals}{\\code{logical}. Whether to compute series-level randomized quantile\nresiduals. Default is \\code{TRUE}. Set to \\code{FALSE} to save time and reduce object\nsize (can add later using \\link{add_residuals}).}\n\n\\item{...}{Other arguments to pass to \\link{mvgam}}\n}\n\\value{\nA \\code{list} object of class \\code{mvgam} containing model output,\nthe text representation of the model file, the mgcv model output (for easily\ngenerating simulations at unsampled covariate values), Dunn-Smyth residuals\nfor each species and key information needed for other functions in the\npackage. See \\code{\\link{mvgam-class}} for details. Use\n\\code{methods(class = \"mvgam\")} for an overview on available methods\n}\n\\description{\nThis function sets up a Joint Species Distribution Model whereby the residual\nassociations among species can be modelled in a reduced-rank format using a\nset of latent factors. The factor specification is extremely flexible,\nallowing users to include spatial, temporal or any other type of predictor\neffects to more efficiently capture unmodelled residual associations, while\nthe observation model can also be highly flexible (including all smooth, GP\nand other effects that \\pkg{mvgam} can handle)\n}\n\\details{\nJoint Species Distribution Models allow for responses of multiple\nspecies to be learned hierarchically, whereby responses to environmental\nvariables in \\code{formula} can be partially pooled and any latent, unmodelled\nresidual associations can also be learned. In \\pkg{mvgam}, both of these\neffects can be modelled with the full power of latent factor Hierarchical\nGAMs, providing unmatched flexibility to model full communities of species.\nWhen calling \\link{jsdgam}, an initial State-Space model using \\code{trend = 'None'} is\nset up and then modified to include the latent factors and their linear\npredictors. Consequently, you can inspect priors for these models using\n\\link{get_mvgam_priors} by supplying the relevant \\code{formula}, \\code{factor_formula},\n\\code{data} and \\code{family} arguments and keeping the default \\code{trend = 'None'}.\n\nIn a JSDGAM, the expectation of response \\eqn{Y_{ij}} is modelled with\n\n\\deqn{g(\\mu_{ij}) = X_i\\beta + u_i\\theta_j,}\n\nwhere \\eqn{g(.)} is a known link function,\n\\eqn{X} is a design matrix of linear predictors (with associated \\eqn{\\beta}\ncoefficients), \\eqn{u} are \\eqn{n_{lv}}-variate latent factors\n(\\eqn{n_{lv}}<<\\eqn{n_{species}}) and \\eqn{\\theta_j} are species-specific\nloadings on the latent factors, respectively. The design matrix \\eqn{X} and\n\\eqn{\\beta} coefficients are constructed and modelled using \\code{formula} and\ncan contain any of \\code{mvgam}'s predictor effects, including random intercepts\nand slopes, multidimensional penalized smooths, GP effects etc... The factor\nloadings \\eqn{\\theta_j} are constrained for identifiability but can be used\nto reconstruct an estimate of the species' residual variance-covariance\nmatrix using \\eqn{\\Theta \\Theta'} (see the example below and\n\\code{\\link[=residual_cor]{residual_cor()}} for details). The latent factors are further modelled using:\n\\deqn{\nu_i \\sim \\text{Normal}(Q_i\\beta_{factor}, 1)\n}\nwhere the second design matrix \\eqn{Q} and associated \\eqn{\\beta_{factor}}\ncoefficients are constructed and modelled using \\code{factor_formula}. Again, the\neffects that make up this linear predictor can contain any of \\code{mvgam}'s\nallowed predictor effects, providing enormous flexibility for modelling\nspecies' communities.\n}\n\\examples{\n\\dontrun{\n# ========================================================================\n# Example 1: Basic JSDGAM with Portal Data\n# ========================================================================\n\n# Fit a JSDGAM to the portal_data captures\nmod <- jsdgam(\n  formula = captures ~\n    # Fixed effects of NDVI and mintemp, row effect as a GP of time\n    ndvi_ma12:series + mintemp:series + gp(time, k = 15),\n  factor_formula = ~ -1,\n  data = portal_data,\n  unit = time,\n  species = series,\n  family = poisson(),\n  n_lv = 2,\n  silent = 2,\n  chains = 2\n)\n\n# Plot covariate effects\nlibrary(ggplot2); theme_set(theme_bw())\nplot_predictions(\n  mod,\n  condition = c('ndvi_ma12', 'series', 'series')\n)\n\nplot_predictions(\n  mod,\n  condition = c('mintemp', 'series', 'series')\n)\n\n# A residual correlation plot\nplot(residual_cor(mod))\n\n# An ordination biplot can also be constructed\n# from the factor scores and their loadings\nif(requireNamespace('ggrepel', quietly = TRUE)){\n  ordinate(mod, alpha = 0.7)\n}\n\n# ========================================================================\n# Example 2: Advanced JSDGAM with Spatial Predictors\n# ========================================================================\n\n# Simulate latent count data for 500 spatial locations and 10 species\nset.seed(0)\nN_points <- 500\nN_species <- 10\n\n# Species-level intercepts (on the log scale)\nalphas <- runif(N_species, 2, 2.25)\n\n# Simulate a covariate and species-level responses to it\ntemperature <- rnorm(N_points)\nbetas <- runif(N_species, -0.5, 0.5)\n\n# Simulate points uniformly over a space\nlon <- runif(N_points, min = 150, max = 155)\nlat <- runif(N_points, min = -20, max = -19)\n\n# Set up spatial basis functions as a tensor product of lat and lon\nsm <- mgcv::smoothCon(\n  mgcv::te(lon, lat, k = 5),\n  data = data.frame(lon, lat),\n  knots = NULL\n)[[1]]\n\n# The design matrix for this smooth is in the 'X' slot\ndes_mat <- sm$X\ndim(des_mat)\n\n# Function to generate a random covariance matrix where all variables\n# have unit variance (i.e. diagonals are all 1)\nrandom_Sigma = function(N){\n  L_Omega <- matrix(0, N, N);\n  L_Omega[1, 1] <- 1;\n  for (i in 2 : N) {\n    bound <- 1;\n    for (j in 1 : (i - 1)) {\n      L_Omega[i, j] <- runif(1, -sqrt(bound), sqrt(bound));\n      bound <- bound - L_Omega[i, j] ^ 2;\n    }\n    L_Omega[i, i] <- sqrt(bound);\n  }\n  Sigma <- L_Omega \\%*\\% t(L_Omega);\n  return(Sigma)\n}\n\n# Simulate a variance-covariance matrix for the correlations among\n# basis coefficients\nSigma <- random_Sigma(N = NCOL(des_mat))\n\n# Now simulate the species-level basis coefficients hierarchically, where\n# spatial basis function correlations are a convex sum of a base correlation\n# matrix and a species-level correlation matrix\nbasis_coefs <- matrix(NA, nrow = N_species, ncol = NCOL(Sigma))\nbase_field <- mgcv::rmvn(1, mu = rep(0, NCOL(Sigma)), V = Sigma)\nfor(t in 1:N_species){\n  corOmega <- (cov2cor(Sigma) * 0.7) +\n    (0.3 * cov2cor(random_Sigma(N = NCOL(des_mat))))\n  basis_coefs[t, ] <- mgcv::rmvn(1, mu = rep(0, NCOL(Sigma)), V = corOmega)\n}\n\n# Simulate the latent spatial processes\nst_process <- do.call(rbind, lapply(seq_len(N_species), function(t){\n  data.frame(\n    lat = lat,\n    lon = lon,\n    species = paste0('species_', t),\n    temperature = temperature,\n    process = alphas[t] +\n      betas[t] * temperature +\n      des_mat \\%*\\% basis_coefs[t,]\n  )\n}))\n\n# Now take noisy observations at some of the points (60)\nobs_points <- sample(1:N_points, size = 60, replace = FALSE)\nobs_points <- data.frame(\n  lat = lat[obs_points],\n  lon = lon[obs_points],\n  site = 1:60\n)\n\n# Keep only the process data at these points\nst_process \\%>\\%\n  dplyr::inner_join(obs_points, by = c('lat', 'lon')) \\%>\\%\n  # now take noisy Poisson observations of the process\n  dplyr::mutate(count = rpois(NROW(.), lambda = exp(process))) \\%>\\%\n  dplyr::mutate(species = factor(\n    species,\n    levels = paste0('species_', 1:N_species)\n  )) \\%>\\%\n  dplyr::group_by(lat, lon) -> dat\n\n# View the count distributions for each species\nggplot(dat, aes(x = count)) +\n  geom_histogram() +\n  facet_wrap(~ species, scales = 'free')\n\nggplot(dat, aes(x = lon, y = lat, col = log(count + 1))) +\n  geom_point(size = 2.25) +\n  facet_wrap(~ species, scales = 'free') +\n  scale_color_viridis_c()\n\n# ------------------------------------------------------------------------\n# Model Fitting with Custom Priors\n# ------------------------------------------------------------------------\n\n# Inspect default priors for a joint species model with three spatial factors\npriors <- get_mvgam_priors(\n  formula = count ~\n    # Environmental model includes random slopes for\n    # a linear effect of temperature\n    s(species, bs = 're', by = temperature),\n\n  # Each factor estimates a different nonlinear spatial process, using\n  # 'by = trend' as in other mvgam State-Space models\n  factor_formula = ~ gp(lon, lat, k = 6, by = trend) - 1,\n  n_lv = 3,\n\n  # The data and grouping variables\n  data = dat,\n  unit = site,\n  species = species,\n\n  # Poisson observations\n  family = poisson()\n)\nhead(priors)\n\n# Fit a JSDM that estimates hierarchical temperature responses\n# and that uses three latent spatial factors\nmod <- jsdgam(\n  formula = count ~\n    # Environmental model includes random slopes for a\n    # linear effect of temperature\n    s(species, bs = 're', by = temperature),\n\n  # Each factor estimates a different nonlinear spatial process, using\n  # 'by = trend' as in other mvgam State-Space models\n  factor_formula = ~ gp(lon, lat, k = 6, by = trend) - 1,\n  n_lv = 3,\n\n  # Change default priors for fixed random effect variances and\n  # factor GP marginal deviations to standard normal\n  priors = c(\n    prior(std_normal(), class = sigma_raw),\n    prior(std_normal(), class = `alpha_gp_trend(lon, lat):trendtrend1`),\n    prior(std_normal(), class = `alpha_gp_trend(lon, lat):trendtrend2`),\n    prior(std_normal(), class = `alpha_gp_trend(lon, lat):trendtrend3`)\n  ),\n\n  # The data and the grouping variables\n  data = dat,\n  unit = site,\n  species = species,\n\n  # Poisson observations\n  family = poisson(),\n  chains = 2,\n  silent = 2\n)\n\n# ------------------------------------------------------------------------\n# Model Visualization and Diagnostics\n# ------------------------------------------------------------------------\n\n# Plot the implicit species-level intercept estimates\nplot_predictions(mod, condition = 'species', type = 'link')\n\n# Plot species' hierarchical responses to temperature\nplot_predictions(\n  mod,\n  condition = c('temperature', 'species', 'species'),\n  type = 'link'\n)\n\n# Plot posterior median estimates of the latent spatial factors\nplot(mod, type = 'smooths', trend_effects = TRUE)\n\n# Or using gratia, if you have it installed\nif(requireNamespace('gratia', quietly = TRUE)){\n  gratia::draw(mod, trend_effects = TRUE, dist = 0)\n}\n\n# Plot species' randomized quantile residual distributions\n# as a function of latitude\npp_check(\n  mod,\n  type = 'resid_ribbon_grouped',\n  group = 'species',\n  x = 'lat',\n  ndraws = 200\n)\n\n# ------------------------------------------------------------------------\n# Residual Correlation Analysis\n# ------------------------------------------------------------------------\n\n# Calculate residual spatial correlations\npost_cors <- residual_cor(mod)\nnames(post_cors)\n\n# Look at lower and upper credible interval estimates for\n# some of the estimated correlations\npost_cors$cor[1:5, 1:5]\npost_cors$cor_upper[1:5, 1:5]\npost_cors$cor_lower[1:5, 1:5]\n\n# Plot of the posterior median correlations for those estimated\n# to be non-zero\nplot(post_cors, cluster = TRUE)\n\n# An ordination biplot can also be constructed\n# from the factor scores and their loadings\nif(requireNamespace('ggrepel', quietly = TRUE)){\n  ordinate(mod)\n}\n\n# ------------------------------------------------------------------------\n# Model Validation and Prediction\n# ------------------------------------------------------------------------\n\n# Posterior predictive checks and ELPD-LOO can ascertain model fit\npp_check(\n  mod,\n  type = \"pit_ecdf_grouped\",\n  group = \"species\",\n  ndraws = 200\n)\nloo(mod)\n\n# Forecast log(counts) for entire region (site value doesn't matter as long\n# as each spatial location has a different and unique site identifier);\n# note this calculation takes a few minutes because of the need to calculate\n# draws from the stochastic latent factors\nnewdata <- st_process \\%>\\%\n  dplyr::mutate(species = factor(\n    species,\n    levels = paste0('species_', 1:N_species)\n  )) \\%>\\%\n  dplyr::group_by(lat, lon) \\%>\\%\n  dplyr::mutate(site = dplyr::cur_group_id()) \\%>\\%\n  dplyr::ungroup()\npreds <- predict(mod, newdata = newdata)\n\n# Plot the median log(count) predictions on a grid\nnewdata$log_count <- preds[,1]\nggplot(newdata, aes(x = lon, y = lat, col = log_count)) +\n  geom_point(size = 1.5) +\n  facet_wrap(~ species, scales = 'free') +\n  scale_color_viridis_c() +\n  theme_classic()\n\n# Not needed for general use; cleans up connections for automated testing\ncloseAllConnections()\n}\n}\n\\references{\nNicholas J Clark & Konstans Wells (2023). Dynamic generalised\nadditive models (DGAMs) for forecasting discrete ecological time series.\nMethods in Ecology and Evolution. 14:3, 771-784.\n\\cr\n\\cr\nDavid I Warton, F Guillaume Blanchet, Robert B O'Hara, Otso Ovaskainen, Sara\nTaskinen, Steven C Walker & Francis KC Hui (2015). So many variables: joint\nmodeling in community ecology. Trends in Ecology & Evolution 30:12, 766-779.\n}\n\\seealso{\n\\code{\\link[=mvgam]{mvgam()}}, \\code{\\link[=residual_cor]{residual_cor()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/lfo_cv.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/lfo_cv.mvgam.R\n\\name{lfo_cv.mvgam}\n\\alias{lfo_cv.mvgam}\n\\alias{lfo_cv}\n\\title{Approximate leave-future-out cross-validation of fitted \\pkg{mvgam} objects}\n\\usage{\nlfo_cv(object, ...)\n\n\\method{lfo_cv}{mvgam}(\n  object,\n  data,\n  min_t,\n  fc_horizon = 1,\n  pareto_k_threshold = 0.7,\n  silent = 1,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{...}{Ignored}\n\n\\item{data}{A \\code{dataframe} or \\code{list} containing the model response variable and covariates\nrequired by the GAM \\code{formula}. Should include columns:\n'series' (character or factor index of the series IDs)\n'time' (numeric index of the time point for each observation).\nAny other variables to be included in the linear predictor of \\code{formula} must also be present}\n\n\\item{min_t}{Integer specifying the minimum training time required before making predictions\nfrom the data. Default is either the \\code{30}th timepoint in the observational data,\nor whatever training time allows for at least\n\\code{10} lfo-cv calculations, if possible.\nThis value is essentially arbitrary so it is highly recommended to change it\nto something that is more suitable to the\ndata and models being evaluated.}\n\n\\item{fc_horizon}{Integer specifying the number of time steps ahead for evaluating forecasts}\n\n\\item{pareto_k_threshold}{Proportion specifying the threshold over which the Pareto shape parameter\nis considered unstable, triggering a model refit. Default is \\code{0.7}}\n\n\\item{silent}{Verbosity level between \\code{0} and \\code{2}. If \\code{1} (the default), most of the informational\nmessages of compiler and sampler are suppressed. If \\code{2}, even more messages are suppressed. The\nactual sampling progress is still printed. Set \\code{refresh = 0} to turn this off as well. If using\n\\code{backend = \"rstan\"} you can also set open_progress = FALSE to prevent opening additional\nprogress bars.}\n}\n\\value{\nA \\code{list} of class \\code{mvgam_lfo} containing the approximate ELPD scores,\nthe Pareto-k shape values and 'the specified \\code{pareto_k_threshold}\n}\n\\description{\nApproximate leave-future-out cross-validation of fitted \\pkg{mvgam} objects\n}\n\\details{\nApproximate leave-future-out cross-validation uses an expanding training window scheme\nto evaluate a model on its forecasting ability. The steps used in this function mirror those laid out\nin the \\href{https://mc-stan.org/loo/articles/loo2-lfo.html}{lfo vignette from the \\code{loo} package},\nwritten by Paul Bürkner, Jonah Gabry, Aki Vehtari. First, we refit the model using the first \\code{min_t}\nobservations to perform a single exact \\code{fc_horizon}-ahead forecast step. This forecast is evaluated against\nthe \\code{min_t + fc_horizon} out of sample observations using the Expected Log Predictive Density (ELPD).\nNext, we approximate each successive round of\nexpanding window forecasts by moving forward one step at a time \\verb{for i in 1:N_evaluations} and re-weighting\ndraws from the model's posterior predictive distribution using Pareto Smoothed\nImportance Sampling (PSIS). In each iteration \\code{i}, PSIS weights are obtained for the next observation\nthat would have been included in the model if we had re-fit (i.e. the last observation that would have\nbeen in the training data, or \\code{min_t + i}). If these importance ratios are stable, we consider the\napproximation adequate and use the re-weighted posterior's forecast for evaluating the next holdout\nset of testing observations (\\code{(min_t + i + 1):(min_t + i + fc_horizon)}). At some point the\nimportance ratio variability will become too large and importance sampling will fail. This is\nindicated by the estimated shape parameter \\code{k} of the generalized Pareto distribution\ncrossing a certain threshold \\code{pareto_k_threshold}. Only then do we refit the model using\nall of the observations up to the time of the failure. We then restart the process and iterate forward\nuntil the next refit is triggered (Bürkner et al. 2020).\n}\n\\examples{\n\\dontrun{\n# Simulate from a Poisson-AR2 model with a seasonal smooth\nset.seed(100)\ndat <- sim_mvgam(T = 75,\n                n_series = 1,\n                prop_trend = 0.75,\n                trend_model = 'AR2',\n                family = poisson())\n\n# Plot the time series\nplot_mvgam_series(data = dat$data_train,\n                 newdata = dat$data_test,\n                 series = 1)\n\n# Fit an appropriate model\nmod_ar2 <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n               trend_model = AR(p = 2),\n               family = poisson(),\n               data = dat$data_train,\n               newdata = dat$data_test,\n               chains = 2,\n               silent = 2)\n\n# Fit a less appropriate model\nmod_rw <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n              trend_model = RW(),\n              family = poisson(),\n              data = dat$data_train,\n              newdata = dat$data_test,\n              chains = 2,\n              silent = 2)\n\n# Compare Discrete Ranked Probability Scores for the testing period\nfc_ar2 <- forecast(mod_ar2)\nfc_rw <- forecast(mod_rw)\nscore_ar2 <- score(fc_ar2, score = 'drps')\nscore_rw <- score(fc_rw, score = 'drps')\nsum(score_ar2$series_1$score)\nsum(score_rw$series_1$score)\n\n# Now use approximate leave-future-out CV to compare\n# rolling forecasts; start at time point 40 to reduce\n# computational time and to ensure enough data is available\n# for estimating model parameters\nlfo_ar2 <- lfo_cv(mod_ar2,\n                 min_t = 40,\n                 fc_horizon = 3,\n                 silent = 2)\nlfo_rw <- lfo_cv(mod_rw,\n                min_t = 40,\n                fc_horizon = 3,\n                silent = 2)\n\n# Plot Pareto-K values and ELPD estimates\nplot(lfo_ar2)\nplot(lfo_rw)\n\n# Proportion of timepoints in which AR2 model gives better forecasts\nlength(which((lfo_ar2$elpds - lfo_rw$elpds) > 0)) /\n      length(lfo_ar2$elpds)\n\n# A higher total ELPD is preferred\nlfo_ar2$sum_ELPD\nlfo_rw$sum_ELPD\n}\n}\n\\references{\nPaul-Christian Bürkner, Jonah Gabry & Aki Vehtari (2020). Approximate leave-future-out cross-validation for Bayesian time series models\nJournal of Statistical Computation and Simulation. 90:14, 2499-2523.\n}\n\\seealso{\n\\code{\\link{forecast}}, \\code{\\link{score}}, \\code{\\link{compare_mvgams}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/logLik.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/logLik.mvgam.R\n\\name{logLik.mvgam}\n\\alias{logLik.mvgam}\n\\title{Compute pointwise Log-Likelihoods from fitted \\pkg{mvgam} objects}\n\\usage{\n\\method{logLik}{mvgam}(object, linpreds, newdata, family_pars, include_forecast = TRUE, ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} or \\code{jsdgam}}\n\n\\item{linpreds}{Optional \\code{matrix} of linear predictor draws to use for\ncalculating pointwise log-likelihoods.}\n\n\\item{newdata}{Optional \\code{data.frame} or \\code{list} object specifying which series\neach column in \\code{linpreds} belongs to. If \\code{linpreds} is supplied, then\n\\code{newdata} must also be supplied.}\n\n\\item{family_pars}{Optional \\code{list} containing posterior draws of\nfamily-specific parameters (i.e. shape, scale or overdispersion parameters).\nRequired if \\code{linpreds} and \\code{newdata} are supplied.}\n\n\\item{include_forecast}{Logical. If \\code{newdata} were fed to the model to\ncompute forecasts, should the log-likelihood draws for these observations\nalso be returned. Defaults to \\code{TRUE}.}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{matrix} of dimension \\verb{n_samples x n_observations} containing the\npointwise log-likelihood draws for all observations in \\code{newdata}. If no\n\\code{newdata} is supplied, log-likelihood draws are returned for all observations\nthat were originally fed to the model (training observations and, if supplied\nto the original model via the \\code{newdata} argument in \\code{\\link{mvgam}},\ntesting observations).\n}\n\\description{\nCompute pointwise Log-Likelihoods from fitted \\pkg{mvgam} objects\n}\n\\examples{\n\\dontrun{\n# Simulate some data and fit a model\nsimdat <- sim_mvgam(\n  n_series = 1,\n  trend_model = AR()\n)\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  trend_model = AR(),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Extract log-likelihood values\nlls <- logLik(mod)\nstr(lls)\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/loo.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/loo.mvgam.R\n\\name{loo.mvgam}\n\\alias{loo.mvgam}\n\\alias{loo_compare.mvgam}\n\\title{LOO information criteria for \\pkg{mvgam} models}\n\\usage{\n\\method{loo}{mvgam}(x, incl_dynamics = FALSE, ...)\n\n\\method{loo_compare}{mvgam}(x, ..., model_names = NULL, incl_dynamics = FALSE)\n}\n\\arguments{\n\\item{x}{Object of class \\code{mvgam}}\n\n\\item{incl_dynamics}{Deprecated and currently ignored}\n\n\\item{...}{More \\code{mvgam} objects}\n\n\\item{model_names}{If \\code{NULL} (the default) will use model names derived\nfrom deparsing the call. Otherwise will use the passed values as model names}\n}\n\\value{\nFor \\code{loo.mvgam}, an object of class \\code{psis_loo} (see \\code{\\link[loo:loo]{loo::loo()}}\nfor details). For \\code{loo_compare.mvgam}, an object of class \\code{compare.loo}\n(see \\code{\\link[loo:loo_compare]{loo::loo_compare()}} for details).\n}\n\\description{\nExtract the LOOIC (leave-one-out information criterion) using \\code{\\link[loo:loo]{loo::loo()}}.\n}\n\\details{\nWhen comparing two (or more) fitted \\code{mvgam} models, we can estimate the\ndifference in their in-sample predictive accuracies using the Expected Log\nPredictive Density (ELPD). This metric can be approximated using Pareto\nSmoothed Importance Sampling (PSIS), which re-weights posterior draws to\napproximate predictions for a datapoint had it not been included in the\noriginal model fit (i.e. leave-one-out cross-validation).\n\nSee \\code{\\link[loo:loo]{loo::loo()}} and \\code{\\link[loo:loo_compare]{loo::loo_compare()}} for further details on how this\nimportance sampling works.\n\nNote: In-sample predictive metrics such as PSIS-LOO can sometimes be overly\noptimistic for models that include process error components (e.g. those with\n\\code{trend_model}, \\code{trend_formula}, or \\code{factor_formula}). Consider using\nout-of-sample evaluations for further scrutiny (see\n\\code{\\link{forecast.mvgam}}, \\code{\\link{score.mvgam_forecast}},\n\\code{\\link{lfo_cv}}).\n}\n\\examples{\n\\dontrun{\n#--------------------------------------------------\n# Simulate 4 time series with hierarchical seasonality\n# and independent AR1 dynamic processes\n#--------------------------------------------------\nset.seed(111)\n\nsimdat <- sim_mvgam(\n  seasonality = 'hierarchical',\n  trend_model = AR(),\n  family = gaussian()\n)\n\n# Fit a model with shared seasonality\nmod1 <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  data = rbind(simdat$data_train, simdat$data_test),\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\nconditional_effects(mod1)\n\nmc.cores.def <- getOption('mc.cores')\noptions(mc.cores = 1)\nloo(mod1)\n\n# Fit a model with hierarchical seasonality\nmod2 <- update(\n  mod1,\n  formula = y ~ s(season, bs = 'cc', k = 6) +\n    s(season, series, bs = 'fs', xt = list(bs = 'cc'), k = 4),\n  chains = 2,\n  silent = 2\n)\n\nconditional_effects(mod2)\nloo(mod2)\n\n# Add AR1 dynamic errors to mod2\nmod3 <- update(\n  mod2,\n  trend_model = AR(),\n  chains = 2,\n  silent = 2\n)\n\nconditional_effects(mod3)\nplot(mod3, type = 'trend')\nloo(mod3)\n\n#--------------------------------------------------\n# Compare models using LOO\n#--------------------------------------------------\nloo_compare(mod1, mod2, mod3)\noptions(mc.cores = mc.cores.def)\n\n#--------------------------------------------------\n# Compare forecast abilities using LFO-CV\n#--------------------------------------------------\n\nlfo_mod2 <- lfo_cv(mod2, min_t = 92)\nlfo_mod3 <- lfo_cv(mod3, min_t = 92)\n\n# Plot forecast ELPD differences\nplot(\n  y = lfo_mod2$elpds - lfo_mod3$elpds,\n  x = lfo_mod2$eval_timepoints,\n  pch = 16,\n  ylab = 'ELPD_mod2 - ELPD_mod3',\n  xlab = 'Evaluation timepoint'\n)\n\nabline(h = 0, lty = 'dashed')\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/lv_correlations.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/lv_correlations.R\n\\name{lv_correlations}\n\\alias{lv_correlations}\n\\title{Calculate trend correlations based on latent factor loadings for\n\\pkg{mvgam} models}\n\\usage{\nlv_correlations(object)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} that used latent\nfactors, either with \\code{use_lv = TRUE} or by supplying a \\code{trend_map}. See\n\\code{\\link[=mvgam]{mvgam()}} for details and for an example.}\n}\n\\value{\nA \\code{list} object containing the mean posterior correlations and\nthe full array of posterior correlations.\n}\n\\description{\nThis function uses factor loadings from a fitted dynamic factor\n\\code{mvgam} model to calculate temporal correlations among series' trends.\n}\n\\details{\nAlthough this function will still work, it is now recommended to use\n\\code{\\link[=residual_cor]{residual_cor()}} to obtain residual correlation information in a more\nuser-friendly format that allows for a deeper investigation of relationships\namong the time series.\n}\n\\examples{\n\\dontrun{\n#--------------------------------------------------\n# Fit a model that uses two AR(1) dynamic factors to model\n# the temporal dynamics of the four rodent species in the portal_data\n#--------------------------------------------------\nmod <- mvgam(\n  captures ~ series,\n  trend_model = AR(),\n  use_lv = TRUE,\n  n_lv = 2,\n  data = portal_data,\n  chains = 2,\n  silent = 2\n)\n\n# Plot the two dynamic factors\nplot(mod, type = 'factors')\n\n# Calculate correlations among the series\nlvcors <- lv_correlations(mod)\nnames(lvcors)\nlapply(lvcors, class)\n\n# Recommended: use residual_cor() instead\nlvcors <- residual_cor(mod)\nnames(lvcors)\nlvcors$cor\n\n# Plot credible correlations as a matrix\nplot(lvcors, cluster = TRUE)\n\n# Not needed for general use; cleans up connections for automated testing\ncloseAllConnections()\n}\n\n}\n\\seealso{\n\\code{\\link[=residual_cor]{residual_cor()}}, \\code{\\link[=plot.mvgam_residcor]{plot.mvgam_residcor()}}\n}\n"
  },
  {
    "path": "man/mcmc_plot.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mcmc_plot.mvgam.R\n\\name{mcmc_plot.mvgam}\n\\alias{mcmc_plot.mvgam}\n\\title{MCMC plots of \\pkg{mvgam} parameters, as implemented in \\pkg{bayesplot}}\n\\usage{\n\\method{mcmc_plot}{mvgam}(\n  object,\n  type = \"intervals\",\n  variable = NULL,\n  regex = FALSE,\n  use_alias = TRUE,\n  ...\n)\n}\n\\arguments{\n\\item{object}{An \\R object typically of class \\code{brmsfit}}\n\n\\item{type}{The type of the plot.\nSupported types are (as names) \\code{hist}, \\code{dens},\n\\code{hist_by_chain}, \\code{dens_overlay},\n\\code{violin}, \\code{intervals}, \\code{areas},\n\\code{areas_ridges}, \\code{combo}, \\code{acf},\n\\code{acf_bar}, \\code{trace}, \\code{trace_highlight},\n\\code{scatter}, \\code{hex}, \\code{pairs}, \\code{violin},\n\\code{rhat}, \\code{rhat_hist}, \\code{neff}, \\code{neff_hist}\nand \\code{nuts_energy}.\nFor an overview on the various plot types see\n\\code{\\link[bayesplot:MCMC-overview]{MCMC-overview}}.}\n\n\\item{variable}{Names of the variables (parameters) to plot, as given by a\ncharacter vector or a regular expression (if \\code{regex = TRUE}). By\ndefault, a hopefully not too large selection of variables is plotted.}\n\n\\item{regex}{Logical; Indicates whether \\code{variable} should\nbe treated as regular expressions. Defaults to \\code{FALSE}.}\n\n\\item{use_alias}{Logical. If more informative names for parameters are\navailable (i.e. for beta coefficients \\code{b} or for smoothing parameters \\code{rho}),\nreplace the uninformative names with the more informative alias. Defaults to\n\\code{TRUE}.}\n\n\\item{...}{Additional arguments passed to the plotting functions.\nSee \\code{\\link[bayesplot:MCMC-overview]{MCMC-overview}} for\nmore details.}\n}\n\\value{\nA \\code{\\link[ggplot2:ggplot]{ggplot}} object\nthat can be further customized using the \\pkg{ggplot2} package.\n}\n\\description{\nConvenient way to call MCMC plotting functions\nimplemented in the \\pkg{bayesplot} package for \\pkg{mvgam} models\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(n_series = 1, trend_model = AR())\nmod <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n             trend_model = AR(),\n             noncentred = TRUE,\n             data = simdat$data_train,\n             chains = 2,\n             silent = 2)\nmcmc_plot(mod)\nmcmc_plot(mod, type = 'neff_hist')\nmcmc_plot(mod, variable = 'betas', type = 'areas')\nmcmc_plot(mod, variable = 'trend_params', type = 'combo')\n}\n}\n\\seealso{\n\\code{\\link{mvgam_draws}} for an overview of some of the shortcut strings\nthat can be used for argument \\code{variable}\n}\n"
  },
  {
    "path": "man/model.frame.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/model.frame.mvgam.R\n\\name{model.frame.mvgam}\n\\alias{model.frame.mvgam}\n\\alias{model.frame.mvgam_prefit}\n\\title{Extract model.frame from a fitted \\pkg{mvgam} object}\n\\usage{\n\\method{model.frame}{mvgam}(formula, trend_effects = FALSE, ...)\n\n\\method{model.frame}{mvgam_prefit}(formula, trend_effects = FALSE, ...)\n}\n\\arguments{\n\\item{formula}{a model \\code{\\link[stats]{formula}} or \\code{\\link[stats]{terms}}\n    object or an \\R object.}\n\n\\item{trend_effects}{\\code{logical}, return the model.frame from the\nobservation model (if \\code{FALSE}) or from the underlying process\nmodel (if \\code{TRUE})}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{matrix} containing the fitted model frame\n}\n\\description{\nExtract model.frame from a fitted \\pkg{mvgam} object\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/monotonic.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/monotonic.R\n\\name{monotonic}\n\\alias{monotonic}\n\\alias{smooth.construct.moi.smooth.spec}\n\\alias{smooth.construct.mod.smooth.spec}\n\\alias{Predict.matrix.moi.smooth}\n\\alias{Predict.matrix.mod.smooth}\n\\title{Monotonic splines in \\pkg{mvgam} models}\n\\usage{\n\\method{smooth.construct}{moi.smooth.spec}(object, data, knots)\n\n\\method{smooth.construct}{mod.smooth.spec}(object, data, knots)\n\n\\method{Predict.matrix}{moi.smooth}(object, data)\n\n\\method{Predict.matrix}{mod.smooth}(object, data)\n}\n\\arguments{\n\\item{object}{A smooth specification object, usually generated by a term\n\\code{s(x, bs = \"moi\", ...)} or \\code{s(x, bs = \"mod\", ...)}}\n\n\\item{data}{a list containing just the data (including any \\code{by} variable) required by this term, \n            with names corresponding to \\code{object$term} (and \\code{object$by}). The \\code{by} variable \n            is the last element.}\n\n\\item{knots}{a list containing any knots supplied for basis setup --- in same order and with same names as \\code{data}. \n             Can be \\code{NULL}. See details for further information.}\n}\n\\value{\nAn object of class \\code{\"moi.smooth\"} or \\code{\"mod.smooth\"}. In addition to\nthe usual elements of a smooth class documented under \\code{\\link[mgcv]{smooth.construct}},\nthis object will contain a slot called \\code{boundary} that defines the endpoints beyond\nwhich the spline will begin extrapolating (extrapolation is flat due to the first\norder penalty placed on the smooth function)\n}\n\\description{\nUses constructors from package \\pkg{splines2} to build monotonically increasing\nor decreasing splines. Details also in Wang & Yan (2021).\n}\n\\details{\nThe constructor is not normally called directly,\nbut is rather used internally by \\link{mvgam}. If they are not supplied then the\nknots of the spline are placed evenly throughout the covariate values to\nwhich the term refers: For example, if fitting 101 data with an 11\nknot spline of x then there would be a knot at every 10th (ordered) x value.\nThe spline is an implementation of the closed-form I-spline basis based\non the recursion formula given by Ramsay (1988), in which the basis coefficients\nmust be constrained to either be non-negative (for monotonically increasing\nfunctions) or non-positive (monotonically decreasing)\n\\cr\n\\cr\nTake note that when using either monotonic basis, the number of basis functions\n\\code{k} must be supplied as an even integer due to the manner in\nwhich monotonic basis functions are constructed\n}\n\\note{\nThis constructor will result in a valid smooth if using a call to\n\\code{\\link[mgcv]{gam}} or \\code{\\link[mgcv]{bam}}, however the resulting\nfunctions will not be guaranteed to be monotonic because constraints on\nbasis coefficients will not be enforced\n}\n\\examples{\n\\dontrun{\n# Simulate data from a monotonically increasing function\nset.seed(123123)\n\nx <- runif(80) * 4 - 1\nx <- sort(x)\nf <- exp(4 * x) / (1 + exp(4 * x))\ny <- f + rnorm(80) * 0.1\nplot(x, y)\n\n# A standard TRPS smooth doesn't capture monotonicity\nlibrary(mgcv)\n\nmod_data <- data.frame(y = y, x = x)\nmod <- gam(\n  y ~ s(x, k = 16),\n  data = mod_data,\n  family = gaussian()\n)\n\nlibrary(marginaleffects)\nplot_predictions(\n  mod,\n  by = 'x',\n  newdata = data.frame(\n    x = seq(min(x) - 0.5, max(x) + 0.5, length.out = 100)\n  ),\n  points = 0.5\n)\n\n# Using the 'moi' basis in mvgam rectifies this\nmod_data$time <- 1:NROW(mod_data)\nmod2 <- mvgam(\n  y ~ s(x, bs = 'moi', k = 18),\n  data = mod_data,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\nplot_predictions(\n  mod2,\n  by = 'x',\n  newdata = data.frame(\n    x = seq(min(x) - 0.5, max(x) + 0.5, length.out = 100)\n  ),\n  points = 0.5\n)\n\nplot(mod2, type = 'smooth', realisations = TRUE)\n\n# 'by' terms that produce a different smooth for each level of the 'by'\n# factor are also allowed\n\nx <- runif(80) * 4 - 1\nx <- sort(x)\n\n# Two different monotonic smooths, one for each factor level\nf <- exp(4 * x) / (1 + exp(4 * x))\nf2 <- exp(3.5 * x) / (1 + exp(3 * x))\nfac <- c(rep('a', 80), rep('b', 80))\ny <- c(\n  f + rnorm(80) * 0.1,\n  f2 + rnorm(80) * 0.2\n)\n\nplot(x, y[1:80])\nplot(x, y[81:160])\n\n# Gather all data into a data.frame, including the factor 'by' variable\nmod_data <- data.frame(y, x, fac = as.factor(fac))\nmod_data$time <- 1:NROW(mod_data)\n\n# Fit a model with different smooths per factor level\nmod <- mvgam(\n  y ~ s(x, bs = 'moi', by = fac, k = 8),\n  data = mod_data,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\n# Visualise the different monotonic functions\nplot_predictions(\n  mod,\n  condition = c('x', 'fac', 'fac'),\n  points = 0.5\n)\n\nplot(mod, type = 'smooth', realisations = TRUE)\n\n# First derivatives (on the link scale) should never be\n# negative for either factor level\n(derivs <- slopes(\n  mod,\n  variables = 'x',\n  by = c('x', 'fac'),\n  type = 'link'\n))\n\nall(derivs$estimate > 0)\n}\n}\n\\references{\nWang, Wenjie, and Jun Yan. \"Shape-Restricted Regression Splines with R Package splines2.\"\nJournal of Data Science 19.3 (2021).\n\\cr\n\\cr\nRamsay, J. O. (1988). Monotone regression splines in action. Statistical Science, 3(4), 425--441.\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam-class.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam-class.R\n\\name{mvgam-class}\n\\alias{mvgam-class}\n\\title{Fitted \\code{mvgam} object description}\n\\description{\nA fitted \\code{mvgam} object returned by function \\code{\\link{mvgam}}.\nRun \\code{methods(class = \"mvgam\")} to see an overview of available methods.\n}\n\\details{\nA \\code{mvgam} object contains the following elements:\n\\itemize{\n\\item \\code{call} the original observation model formula\n\\item \\code{trend_call} If a \\verb{trend_formula was supplied}, the original trend model\nformula is returned. Otherwise \\code{NULL}\n\\item \\code{family} \\code{character} description of the observation distribution\n\\item \\code{trend_model} \\code{character} description of the latent trend model\n\\item \\code{trend_map} \\code{data.frame} describing the mapping of trend states to\nobservations, if supplied in the original model. Otherwise \\code{NULL}\n\\item \\code{drift} Logical specifying whether a drift term was used in the trend\nmodel\n\\item \\code{priors} If the model priors were updated from their defaults, the prior\n\\code{dataframe} will be returned. Otherwise \\code{NULL}\n\\item \\code{model_output} The \\code{MCMC} object returned by the fitting engine. If the\nmodel was fitted using \\code{Stan}, this will be an object of class \\code{stanfit}\n(see \\code{\\link[rstan]{stanfit-class}} for details). If \\code{JAGS} was used\nas the backend, this will be an object of class \\code{runjags} (see\n\\code{\\link[runjags]{runjags-class}} for details)\n\\item \\code{model_file} The \\code{character} string model file used to describe the model\nin either \\code{Stan} or \\code{JAGS} syntax\n\\item \\code{model_data} If \\code{return_model_data} was set to \\code{TRUE} when fitting the\nmodel, the \\code{list} object containing all data objects needed to condition\nthe model is returned. Each item in the \\code{list} is described in detail at\nthe top of the \\code{model_file}. Otherwise \\code{NULL}\n\\item \\code{inits} If \\code{return_model_data} was set to \\code{TRUE} when fitting the model,\nthe initial value functions used to initialise the MCMC chains will be\nreturned. Otherwise \\code{NULL}\n\\item \\code{monitor_pars} The parameters that were monitored during MCMC sampling\nare returned as a \\verb{character vector}\n\\item \\code{sp_names} A \\verb{character vector} specifying the names for each smoothing\nparameter\n\\item \\code{mgcv_model} An object of class \\code{gam} containing the \\code{mgcv} version of\nthe observation model. This object is used for generating the linear\npredictor matrix when making predictions for new data. The coefficients\nin this model object will contain the posterior median coefficients from\nthe GAM linear predictor, but these are only used if generating plots of\nsmooth functions that \\code{mvgam} currently cannot handle (such as plots for\nthree-dimensional smooths). This model therefore should not be used for\ninference. See \\code{\\link[mgcv]{gamObject}} for details\n\\item \\code{trend_mgcv_model} If a \\verb{trend_formula was supplied}, an object of class\n\\code{gam} containing the \\code{mgcv} version of the trend model. Otherwise \\code{NULL}\n\\item \\code{ytimes} The \\code{matrix} object used in model fitting for indexing which\nseries and timepoints were observed in each row of the supplied data.\nUsed internally by some downstream plotting and prediction functions\n\\item \\code{resids} A named \\code{list} object containing posterior draws of Dunn-Smyth\nrandomized quantile residuals\n\\item \\code{use_lv} Logical flag indicating whether latent dynamic factors were used\nin the model\n\\item \\code{n_lv} If \\code{use_lv == TRUE}, the number of latent dynamic factors used in\nthe model\n\\item \\code{upper_bounds} If bounds were supplied in the original model fit, they\nwill be returned. Otherwise \\code{NULL}\n\\item \\code{obs_data} The original data object (either a \\code{list} or \\code{dataframe})\nsupplied in model fitting.\n\\item \\code{test_data} If test data were supplied (as argument \\code{newdata} in the\noriginal model), it will be returned. Othwerise \\code{NULL}\n\\item \\code{fit_engine} \\code{Character} describing the fit engine, either as \\code{stan} or\n\\code{jags}\n\\item \\code{backend} \\code{Character} describing the backend used for modelling, either\nas \\code{rstan}, \\code{cmdstanr} or \\code{rjags}\n\\item \\code{algorithm} \\code{Character} describing the algorithm used for finding the\nposterior, either as \\code{sampling}, \\code{laplace}, \\code{pathfinder}, \\code{meanfield} or\n\\code{fullrank}\n\\item \\code{max_treedepth} If the model was fitted using \\code{Stan}, the value supplied\nfor the maximum treedepth tuning parameter is returned (see\n\\code{\\link[rstan]{stan}} for details). Otherwise \\code{NULL}\n\\item \\code{adapt_delta} If the model was fitted using \\code{Stan}, the value supplied\nfor the adapt_delta tuning parameter is returned (see\n\\code{\\link[rstan]{stan}} for details). Otherwise \\code{NULL}\n}\n}\n\\seealso{\n\\link{mvgam}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam-package.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam-package.R\n\\docType{package}\n\\name{mvgam-package}\n\\alias{mvgam-package}\n\\title{mvgam: Multivariate (Dynamic) Generalized Additive Models}\n\\description{\n\\if{html}{\\figure{logo.png}{options: style='float: right' alt='logo' width='120'}}\n\nFit Bayesian Dynamic Generalized Additive Models to multivariate observations. Users can build nonlinear State-Space models that can incorporate semiparametric effects in observation and process components, using a wide range of observation families. Estimation is performed using Markov Chain Monte Carlo with Hamiltonian Monte Carlo in the software 'Stan'. References: Clark & Wells (2023) \\doi{10.1111/2041-210X.13974}.\n}\n\\seealso{\nUseful links:\n\\itemize{\n  \\item \\url{https://github.com/nicholasjclark/mvgam}\n  \\item \\url{https://nicholasjclark.github.io/mvgam/}\n  \\item Report bugs at \\url{https://github.com/nicholasjclark/mvgam/issues}\n}\n\n}\n\\author{\n\\strong{Maintainer}: Nicholas J Clark \\email{nicholas.j.clark1214@gmail.com} (\\href{https://orcid.org/0000-0001-7131-3301}{ORCID})\n\nOther contributors:\n\\itemize{\n  \\item KANK Karunarathna (\\href{https://orcid.org/0000-0002-8995-5502}{ORCID}) (ARMA parameterisations and factor models) [contributor]\n  \\item Sarah Heaps (\\href{https://orcid.org/0000-0002-5543-037X}{ORCID}) (VARMA parameterisations) [contributor]\n  \\item Scott Pease (\\href{https://orcid.org/0009-0006-8977-9285}{ORCID}) (broom enhancements) [contributor]\n  \\item Matthijs Hollanders (\\href{https://orcid.org/0000-0003-0796-1018}{ORCID}) (ggplot visualizations) [contributor]\n}\n\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam.R\n\\name{mvgam}\n\\alias{mvgam}\n\\title{Fit a Bayesian Dynamic GAM to Univariate or Multivariate Time Series}\n\\usage{\nmvgam(\n  formula,\n  trend_formula,\n  knots,\n  trend_knots,\n  trend_model = \"None\",\n  noncentred = FALSE,\n  family = poisson(),\n  share_obs_params = FALSE,\n  data,\n  newdata,\n  use_lv = FALSE,\n  n_lv,\n  trend_map,\n  priors,\n  run_model = TRUE,\n  prior_simulation = FALSE,\n  residuals = TRUE,\n  return_model_data = FALSE,\n  backend = getOption(\"brms.backend\", \"cmdstanr\"),\n  algorithm = getOption(\"brms.algorithm\", \"sampling\"),\n  control = list(max_treedepth = 10, adapt_delta = 0.8),\n  chains = 4,\n  burnin = 500,\n  samples = 500,\n  thin = 1,\n  parallel = TRUE,\n  threads = 1,\n  save_all_pars = FALSE,\n  silent = 1,\n  autoformat = TRUE,\n  refit = FALSE,\n  lfo = FALSE,\n  ...\n)\n}\n\\arguments{\n\\item{formula}{A \\code{formula} object specifying the GAM observation model formula.\nThese are exactly like the formula for a GLM except that smooth terms, \\code{s()},\n\\code{te()}, \\code{ti()}, \\code{t2()}, as well as time-varying \\code{dynamic()} terms,\nnonparametric \\code{gp()} terms and offsets using \\code{offset()}, can be added to the\nright hand side to specify that the linear predictor depends on smooth\nfunctions of predictors (or linear functionals of these).\n\nIn \\code{nmix()} family models, the \\code{formula} is used to set up a linear predictor\nfor the detection probability. Details of the formula syntax used by\n\\pkg{mvgam} can be found in \\code{\\link{mvgam_formulae}}}\n\n\\item{trend_formula}{An optional \\code{formula} object specifying the GAM process\nmodel formula. If supplied, a linear predictor will be modelled for the\nlatent trends to capture process model evolution separately from the\nobservation model.\n\n\\strong{Important notes:}\n\\itemize{\n\\item Should not have a response variable specified on the left-hand side\n(e.g., \\code{~ season + s(year)})\n\\item Use \\code{trend} instead of \\code{series} for effects that vary across time series\n\\item Only available for \\code{RW()}, \\code{AR()} and \\code{VAR()} trend models\n\\item In \\code{nmix()} family models, sets up linear predictor for latent abundance\n\\item Consider dropping one intercept using \\code{- 1} convention to avoid\nestimation challenges\n}}\n\n\\item{knots}{An optional \\code{list} containing user specified knot values for\nbasis construction. For most bases the user simply supplies the knots to be\nused, which must match up with the \\code{k} value supplied. Different terms can\nuse different numbers of knots, unless they share a covariate.}\n\n\\item{trend_knots}{As for \\code{knots} above, this is an optional \\code{list} of knot\nvalues for smooth functions within the \\code{trend_formula}.}\n\n\\item{trend_model}{\\code{character} or \\code{function} specifying the time series dynamics\nfor the latent trend.\n\n\\strong{Available options:}\n\\itemize{\n\\item \\code{None}: No latent trend component (GAM component only, like \\code{\\link[mgcv]{gam}})\n\\item \\code{ZMVN} or \\code{ZMVN()}: Zero-Mean Multivariate Normal (Stan only)\n\\item \\code{'RW'} or \\code{RW()}: Random Walk\n\\item \\code{'AR1'}, \\code{'AR2'}, \\code{'AR3'} or \\code{AR(p = 1, 2, 3)}: Autoregressive models\n\\item \\code{'CAR1'} or \\code{CAR(p = 1)}: Continuous-time AR (Ornstein–Uhlenbeck process)\n\\item \\code{'VAR1'} or \\code{VAR()}: Vector Autoregressive (Stan only)\n\\item \\code{'PWlogistic'}, \\code{'PWlinear'} or \\code{PW()}: Piecewise trends (Stan only)\n\\item \\code{'GP'} or \\code{GP()}: Gaussian Process with squared exponential kernel (Stan only)\n}\n\n\\strong{Additional features:}\n\\itemize{\n\\item Moving average and/or correlated process error terms available for most types\n(e.g., \\code{RW(cor = TRUE)} for multivariate Random Walk)\n\\item Hierarchical correlations possible for structured data\n\\item See \\link{mvgam_trends} for details and \\code{\\link[=ZMVN]{ZMVN()}} for examples\n}}\n\n\\item{noncentred}{\\code{logical}. Use non-centred parameterisation for autoregressive\ntrend models? Can improve efficiency by avoiding degeneracies in latent dynamic\nrandom effects estimation. Benefits vary by model - highly informative data\nmay perform worse with this option. Available for \\code{RW()}, \\code{AR()}, \\code{CAR()},\nor \\code{trend = 'None'} with \\code{trend_formula}. Not available for moving average\nor correlated error models.}\n\n\\item{family}{\\code{family} specifying the exponential observation family for the series.\n\n\\strong{Supported families:}\n\\itemize{\n\\item \\code{gaussian()}: Real-valued data\n\\item \\code{betar()}: Proportional data on \\verb{(0,1)}\n\\item \\code{lognormal()}: Non-negative real-valued data\n\\item \\code{student_t()}: Real-valued data\n\\item \\code{Gamma()}: Non-negative real-valued data\n\\item \\code{bernoulli()}: Binary data\n\\item \\code{poisson()}: Count data (default)\n\\item \\code{nb()}: Overdispersed count data\n\\item \\code{binomial()}: Count data with imperfect detection when number of trials is known\n(use \\code{cbind()} to bind observations and trials)\n\\item \\code{beta_binomial()}: As \\code{binomial()} but allows for overdispersion\n\\item \\code{nmix()}: Count data with imperfect detection when number of trials is unknown\n(State-Space N-Mixture model with Poisson latent states and Binomial observations)\n}\n\nSee \\code{\\link{mvgam_families}} for more details.}\n\n\\item{share_obs_params}{\\code{logical}. If \\code{TRUE} and the \\code{family} has additional\nfamily-specific observation parameters (e.g., variance components, dispersion\nparameters), these will be shared across all outcome variables. Useful when\nmultiple outcomes share properties. Default is \\code{FALSE}.}\n\n\\item{data}{A \\code{dataframe} or \\code{list} containing the model response variable\nand covariates required by the GAM \\code{formula} and optional \\code{trend_formula}.\n\n\\strong{Required columns for most models:}\n\\itemize{\n\\item \\code{series}: A \\code{factor} index of the series IDs (number of levels should equal\nnumber of unique series labels)\n\\item \\code{time}: \\code{numeric} or \\code{integer} index of time points. For most dynamic trend\ntypes, time should be measured in discrete, regularly spaced intervals\n(i.e., \\code{c(1, 2, 3, ...)}). Irregular spacing is allowed for \\code{trend_model = CAR(1)},\nbut zero intervals are adjusted to \\code{1e-12} to prevent sampling errors.\n}\n\n\\strong{Special cases:}\n\\itemize{\n\\item Models with hierarchical temporal correlation (e.g., \\code{AR(gr = region, subgr = species)})\nshould NOT include a \\code{series} identifier\n\\item Models without temporal dynamics (\\code{trend_model = 'None'} or \\code{trend_model = ZMVN()})\ndon't require a \\code{time} variable\n}}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data containing the same\nvariables as in \\code{data}. If included, observations in variable \\code{y} will be\nset to \\code{NA} when fitting the model so that posterior simulations can be obtained.}\n\n\\item{use_lv}{\\code{logical}. If \\code{TRUE}, use dynamic factors to estimate series'\nlatent trends in a reduced dimension format. Only available for \\code{RW()},\n\\code{AR()} and \\code{GP()} trend models. Default is \\code{FALSE}.\nSee \\code{\\link{lv_correlations}} for examples.}\n\n\\item{n_lv}{\\code{integer} specifying the number of latent dynamic factors to use\nif \\code{use_lv == TRUE}. Cannot exceed \\code{n_series}. Default is\n\\code{min(2, floor(n_series / 2))}.}\n\n\\item{trend_map}{Optional \\code{data.frame} specifying which series should depend on\nwhich latent trends. Enables multiple series to depend on the same latent\ntrend process with different observation processes.\n\n\\strong{Required structure:}\n\\itemize{\n\\item Column \\code{series}: Single unique entry for each series (matching factor levels in data)\n\\item Column \\code{trend}: Integer values indicating which trend each series depends on\n}\n\n\\strong{Notes:}\n\\itemize{\n\\item Sets up latent factor model by enabling \\code{use_lv = TRUE}\n\\item Process model intercept is NOT automatically suppressed\n\\item Not yet supported for continuous time models (\\code{CAR()})\n}}\n\n\\item{priors}{An optional \\code{data.frame} with prior definitions or, preferably,\na vector of \\code{brmsprior} objects (see \\code{\\link[brms]{prior}()}).\nSee \\code{\\link[=get_mvgam_priors]{get_mvgam_priors()}} and Details for more information.}\n\n\\item{run_model}{\\code{logical}. If \\code{FALSE}, the model is not fitted but instead\nthe function returns the model file and the data/initial values needed to\nfit the model outside of \\code{mvgam}.}\n\n\\item{prior_simulation}{\\code{logical}. If \\code{TRUE}, no observations are fed to the\nmodel, and instead simulations from prior distributions are returned.}\n\n\\item{residuals}{\\code{logical}. Whether to compute series-level randomized quantile\nresiduals. Default is \\code{TRUE}. Set to \\code{FALSE} to save time and reduce object\nsize (can add later using \\link{add_residuals}).}\n\n\\item{return_model_data}{\\code{logical}. If \\code{TRUE}, the list of data needed to fit\nthe model is returned, along with initial values for smooth and AR parameters,\nonce the model is fitted. Helpful for users who wish to modify the model file\nto add other stochastic elements. Default is \\code{FALSE} unless \\code{run_model == FALSE}.}\n\n\\item{backend}{Character string naming the package for Stan model fitting.\nOptions are \\code{\"cmdstanr\"} (default) or \\code{\"rstan\"}. Can be set globally via\n\\code{\"brms.backend\"} option. See https://mc-stan.org/rstan/ and\nhttps://mc-stan.org/cmdstanr/ for details.}\n\n\\item{algorithm}{Character string naming the estimation approach:\n\\itemize{\n\\item \\code{\"sampling\"}: MCMC (default)\n\\item \\code{\"meanfield\"}: Variational inference with factorized normal distributions\n\\item \\code{\"fullrank\"}: Variational inference with multivariate normal distribution\n\\item \\code{\"laplace\"}: Laplace approximation (cmdstanr only)\n\\item \\code{\"pathfinder\"}: Pathfinder algorithm (cmdstanr only)\n}\n\nCan be set globally via \\code{\"brms.algorithm\"} option. Limited testing suggests\n\\code{\"meanfield\"} performs best among non-MCMC approximations for dynamic GAMs.}\n\n\\item{control}{Named \\code{list} for controlling sampler behaviour. Valid elements\ninclude \\code{max_treedepth}, \\code{adapt_delta} and \\code{init}.}\n\n\\item{chains}{\\code{integer} specifying the number of parallel chains for the model.\nIgnored for variational inference algorithms.}\n\n\\item{burnin}{\\code{integer} specifying the number of warmup iterations to tune\nsampling algorithms. Ignored for variational inference algorithms.}\n\n\\item{samples}{\\code{integer} specifying the number of post-warmup iterations for\nsampling the posterior distribution.}\n\n\\item{thin}{Thinning interval for monitors. Ignored for variational inference\nalgorithms.}\n\n\\item{parallel}{\\code{logical} specifying whether to use multiple cores for parallel\nMCMC simulation. If \\code{TRUE}, uses \\code{min(c(chains, parallel::detectCores() - 1))} cores.}\n\n\\item{threads}{\\code{integer}. Experimental option for within-chain parallelisation\nin Stan using \\code{reduce_sum}. Recommended only for experienced Stan users with\nslow models. Currently works for all families except \\code{nmix()} and when using\nCmdstan backend.}\n\n\\item{save_all_pars}{\\code{logical}. Save draws from all variables defined in Stan's\n\\code{parameters} block. Default is \\code{FALSE}.}\n\n\\item{silent}{Verbosity level between \\code{0} and \\code{2}. If \\code{1} (default), most\ninformational messages are suppressed. If \\code{2}, even more messages are\nsuppressed. Sampling progress is still printed - set \\code{refresh = 0} to\ndisable. For \\code{backend = \"rstan\"}, also set \\code{open_progress = FALSE} to\nprevent additional progress bars.}\n\n\\item{autoformat}{\\code{logical}. Use \\code{stanc} parser to automatically format Stan\ncode and check for deprecations. For development purposes - leave as \\code{TRUE}.}\n\n\\item{refit}{\\code{logical}. Indicates whether this is a refit called using\n\\code{\\link[=update.mvgam]{update.mvgam()}}. Users should leave as \\code{FALSE}.}\n\n\\item{lfo}{\\code{logical}. Indicates whether this is part of \\link{lfo_cv.mvgam} call.\nReturns lighter model version for speed. Users should leave as \\code{FALSE}.}\n\n\\item{...}{Further arguments passed to Stan:\n\\itemize{\n\\item For \\code{backend = \"rstan\"}: passed to \\code{\\link[rstan]{sampling}()} or\n\\code{\\link[rstan]{vb}()}\n\\item For \\code{backend = \"cmdstanr\"}: passed to \\code{cmdstanr::sample},\n\\code{cmdstanr::variational}, \\code{cmdstanr::laplace} or \\code{cmdstanr::pathfinder} methods\n}}\n}\n\\value{\nA \\code{list} object of class \\code{mvgam} containing model output, the text\nrepresentation of the model file, the mgcv model output (for easily generating\nsimulations at unsampled covariate values), Dunn-Smyth residuals for each\nseries and key information needed for other functions in the package. See\n\\code{\\link{mvgam-class}} for details. Use \\code{methods(class = \"mvgam\")} for an\noverview on available methods.\n}\n\\description{\nThis function estimates the posterior distribution for Generalised Additive\nModels (GAMs) that can include smooth spline functions, specified in the GAM\nformula, as well as latent temporal processes, specified by \\code{trend_model}.\n\nFurther modelling options include State-Space representations to allow covariates\nand dynamic processes to occur on the latent 'State' level while also capturing\nobservation-level effects. Prior specifications are flexible and explicitly\nencourage users to apply prior distributions that actually reflect their beliefs.\n\nIn addition, model fits can easily be assessed and compared with posterior\npredictive checks, forecast comparisons and leave-one-out / leave-future-out\ncross-validation.\n}\n\\details{\nDynamic GAMs are useful when we wish to predict future values from time series\nthat show temporal dependence but we do not want to rely on extrapolating from\na smooth term (which can sometimes lead to unpredictable and unrealistic behaviours).\nIn addition, smooths can often try to wiggle excessively to capture any\nautocorrelation that is present in a time series, which exacerbates the problem\nof forecasting ahead.\n\nAs GAMs are very naturally viewed through a Bayesian lens, and we often must\nmodel time series that show complex distributional features and missing data,\nparameters for \\pkg{mvgam} models are estimated in a Bayesian framework using\nMarkov Chain Monte Carlo by default.\n\n\\strong{Getting Started Resources:}\n\\itemize{\n\\item General overview: \\code{vignette(\"mvgam_overview\")} and \\code{vignette(\"data_in_mvgam\")}\n\\item Full list of vignettes: \\code{vignette(package = \"mvgam\")}\n\\item Real-world examples: \\code{\\link{mvgam_use_cases}}\n\\item Quick reference: \\href{https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf}{mvgam cheatsheet}\n}\n}\n\\section{Model Specification Details}{\n\n\n\\strong{Formula Syntax:} Details of the formula syntax used by \\pkg{mvgam} can be\nfound in \\code{\\link{mvgam_formulae}}. Note that it is possible to supply an\nempty formula where there are no predictors or intercepts in the observation\nmodel (i.e. \\code{y ~ 0} or \\code{y ~ -1}). In this case, an intercept-only observation\nmodel will be set up but the intercept coefficient will be fixed at zero. This\ncan be handy if you wish to fit pure State-Space models where the variation in\nthe dynamic trend controls the average expectation, and/or where intercepts are\nnon-identifiable (as in piecewise trends).\n\n\\strong{Families and Link Functions:} Details of families supported by \\pkg{mvgam}\ncan be found in \\code{\\link{mvgam_families}}.\n\n\\strong{Trend Models:} Details of latent error process models supported by \\pkg{mvgam}\ncan be found in \\code{\\link{mvgam_trends}}.\n}\n\n\\section{Prior Specifications}{\n\nDefault priors for intercepts and any variance parameters are chosen to be\nvaguely informative, but these should always be checked by the user. Prior\ndistributions for most important model parameters can be altered (see\n\\code{\\link[=get_mvgam_priors]{get_mvgam_priors()}} for details). Note that latent trends are estimated on\nthe link scale so choose priors accordingly.\n\nHowever more control over the model specification can be accomplished by setting\n\\code{run_model = FALSE} and then editing the model code (found in the\n\\code{model_file} slot in the returned object) before running the model using either\n\\pkg{rstan} or \\pkg{cmdstanr}. This is encouraged for complex modelling tasks.\n\n\\strong{Important:} No priors are formally checked to ensure they are in the right\nsyntax so it is up to the user to ensure these are correct.\n}\n\n\\section{Model Components}{\n\n\n\\strong{Random Effects:} For any smooth terms using the random effect basis\n(\\code{\\link[mgcv]{smooth.construct.re.smooth.spec}}), a non-centred\nparameterisation is automatically employed to avoid degeneracies that are common\nin hierarchical models. Note however that centred versions may perform better\nfor series that are particularly informative, so as with any foray into Bayesian\nmodelling, it is worth building an understanding of the model's assumptions and\nlimitations by following a principled workflow. Also note that models are\nparameterised using \\code{drop.unused.levels = FALSE} in \\code{\\link[mgcv]{jagam}}\nto ensure predictions can be made for all levels of the supplied factor variable.\n\n\\strong{Observation Level Parameters:} When more than one series is included in\n\\code{data} and an observation family that contains more than one parameter is\nused, additional observation family parameters (i.e. \\code{phi} for \\code{nb()} or \\code{sigma}\nfor \\code{gaussian()}) are by default estimated independently for each series. But if\nyou wish for the series to share the same observation parameters, set\n\\code{share_obs_params = TRUE}.\n}\n\n\\section{Model Diagnostics}{\n\n\n\\strong{Residuals:} For each series, randomized quantile (i.e. Dunn-Smyth) residuals\nare calculated for inspecting model diagnostics. If the fitted model is\nappropriate then Dunn-Smyth residuals will be standard normal in distribution\nand no autocorrelation will be evident. When a particular observation is missing,\nthe residual is calculated by comparing independent draws from the model's\nposterior distribution.\n}\n\n\\section{Computational Backend}{\n\n\n\\strong{Using Stan:} \\pkg{mvgam} is primarily designed to use Hamiltonian Monte Carlo\nfor parameter estimation via the software \\code{Stan} (using either the \\code{cmdstanr}\nor \\code{rstan} interface). There are great advantages when using \\code{Stan} over Gibbs /\nMetropolis Hastings samplers, which includes the option to estimate nonlinear\neffects via \\href{https://arxiv.org/abs/2004.11408}{Hilbert space approximate Gaussian Processes},\nthe availability of a variety of inference algorithms (i.e. variational inference,\nlaplacian inference etc...) and \\href{https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648}{capabilities to enforce stationarity for complex Vector Autoregressions}.\n\nBecause of the many advantages of \\code{Stan} over \\code{JAGS}, \\strong{further development of\nthe package will only be applied to \\code{Stan}}. This includes the planned addition\nof more response distributions, plans to handle zero-inflation, and plans to\nincorporate a greater variety of trend models. Users are strongly encouraged to\nopt for \\code{Stan} over \\code{JAGS} in any proceeding workflows.\n}\n\n\\section{Recommended Workflow}{\n\n\n\\strong{How to Start:} The \\href{https://github.com/nicholasjclark/mvgam/raw/master/misc/mvgam_cheatsheet.pdf}{\\code{mvgam} cheatsheet}\nis a good starting place if you are just learning to use the package. It gives\nan overview of the package's key functions and objects, as well as providing a\nreasonable workflow that new users can follow.\n\n\\strong{Recommended Steps:}\n\\enumerate{\n\\item \\strong{Data Preparation:} Check that your data are in a suitable tidy format for\n\\pkg{mvgam} modeling (see the \\href{https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html}{data formatting vignette}\nfor guidance)\n\\item \\strong{Data Exploration:} Inspect features of the data using \\code{\\link{plot_mvgam_series}}.\nNow is also a good time to familiarise yourself with the package's example\nworkflows that are detailed in the vignettes:\n\\itemize{\n\\item \\href{https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html}{Getting started vignette}\n\\item \\href{https://nicholasjclark.github.io/mvgam/articles/shared_states.html}{Shared latent states vignette}\n\\item \\href{https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html}{Time-varying effects vignette}\n\\item \\href{https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html}{State-Space models vignette}\n\\item \\href{https://nicholasjclark.github.io/mvgam/articles/nmixtures.html}{\"Fitting N-mixture models in \\code{mvgam}\"}\n\\item \\href{https://nicholasjclark.github.io/mvgam/reference/jsdgam.html}{\"Joint Species Distribution Models in \\code{mvgam}\"}\n\\item \\href{https://ecogambler.netlify.app/blog/time-varying-seasonality/}{\"Incorporating time-varying seasonality in forecast models\"}\n\\item \\href{https://ecogambler.netlify.app/blog/autocorrelated-gams/}{\"Temporal autocorrelation in GAMs and the \\code{mvgam} package\"}\n}\n\\item \\strong{Model Structure:} Carefully think about how to structure linear predictor\neffects (i.e. smooth terms using \\code{\\link[mgcv]{s}()}, \\code{\\link[mgcv]{te}()}\nor \\code{\\link[mgcv]{ti}()}, GPs using \\code{\\link[brms]{gp}()}, dynamic\ntime-varying effects using \\code{\\link[=dynamic]{dynamic()}}, and parametric terms), latent temporal\ntrend components (see \\code{\\link{mvgam_trends}}) and the appropriate\nobservation family (see \\code{\\link{mvgam_families}}). Use \\code{\\link[=get_mvgam_priors]{get_mvgam_priors()}}\nto see default prior distributions for stochastic parameters.\n\\item \\strong{Prior Specification:} Change default priors using appropriate prior knowledge\n(see \\code{\\link[brms]{prior}()}). When using State-Space models with a\n\\code{trend_formula}, pay particular attention to priors for any variance parameters\nsuch as process errors and observation errors. Default priors on these parameters\nare chosen to be vaguely informative and to avoid zero (using Inverse Gamma\npriors), but more informative priors will often help with model efficiency\nand convergence.\n\\item \\strong{Model Fitting:} Fit the model using either Hamiltonian Monte Carlo or an\napproximation algorithm (i.e. change the \\code{backend} argument) and use\n\\code{\\link[=summary.mvgam]{summary.mvgam()}}, \\code{\\link[=conditional_effects.mvgam]{conditional_effects.mvgam()}}, \\code{\\link[=mcmc_plot.mvgam]{mcmc_plot.mvgam()}},\n\\code{\\link[=pp_check.mvgam]{pp_check.mvgam()}}, \\code{\\link[=pairs.mvgam]{pairs.mvgam()}} and \\code{\\link[=plot.mvgam]{plot.mvgam()}} to inspect /\ninterrogate the model.\n\\item \\strong{Model Comparison:} Update the model as needed and use \\code{\\link[=loo_compare.mvgam]{loo_compare.mvgam()}}\nfor in-sample model comparisons, or alternatively use \\code{\\link[=forecast.mvgam]{forecast.mvgam()}},\n\\code{\\link[=lfo_cv.mvgam]{lfo_cv.mvgam()}} and \\code{\\link[=score.mvgam_forecast]{score.mvgam_forecast()}} to compare models based on\nout-of-sample forecasts (see the \\href{https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html}{forecast evaluation vignette}\nfor guidance).\n\\item \\strong{Inference and Prediction:} When satisfied with the model structure, use\n\\code{\\link[=predict.mvgam]{predict.mvgam()}}, \\code{\\link[marginaleffects]{plot_predictions}()} and/or\n\\code{\\link[marginaleffects]{plot_slopes}()} for more targeted simulation-based\ninferences (see \\href{https://ecogambler.netlify.app/blog/interpreting-gams/}{\"How to interpret and report nonlinear effects from Generalized Additive Models\"}\nfor some guidance on interpreting GAMs). For time series models, use\n\\code{\\link[=hindcast.mvgam]{hindcast.mvgam()}}, \\code{\\link[=fitted.mvgam]{fitted.mvgam()}}, \\code{\\link[=augment.mvgam]{augment.mvgam()}} and \\code{\\link[=forecast.mvgam]{forecast.mvgam()}}\nto inspect posterior hindcast / forecast distributions.\n\\item \\strong{Documentation:} Use \\code{\\link[=how_to_cite]{how_to_cite()}} to obtain a scaffold methods section\n(with full references) to begin describing this model in scientific publications.\n}\n}\n\n\\examples{\n\\dontrun{\n# =============================================================================\n# Basic Multi-Series Time Series Modeling\n# =============================================================================\n\n# Simulate three time series that have shared seasonal dynamics,\n# independent AR(1) trends, and Poisson observations\nset.seed(0)\ndat <- sim_mvgam(\n  T = 80,\n  n_series = 3,\n  mu = 2,\n  trend_model = AR(p = 1),\n  prop_missing = 0.1,\n  prop_trend = 0.6\n)\n\n# Plot key summary statistics for a single series\nplot_mvgam_series(data = dat$data_train, series = 1)\n\n# Plot all series together\nplot_mvgam_series(data = dat$data_train, series = \"all\")\n\n# Formulate a model using Stan where series share a cyclic smooth for\n# seasonality and each series has an independent AR1 temporal process.\n# Note that 'noncentred = TRUE' will likely give performance gains.\n# Set run_model = FALSE to inspect the returned objects\nmod1 <- mvgam(\n  formula = y ~ s(season, bs = \"cc\", k = 6),\n  data = dat$data_train,\n  trend_model = AR(),\n  family = poisson(),\n  noncentred = TRUE,\n  run_model = FALSE\n)\n\n# View the model code in Stan language\nstancode(mod1)\n\n# View the data objects needed to fit the model in Stan\nsdata1 <- standata(mod1)\nstr(sdata1)\n\n# Now fit the model\nmod1 <- mvgam(\n  formula = y ~ s(season, bs = \"cc\", k = 6),\n  data = dat$data_train,\n  trend_model = AR(),\n  family = poisson(),\n  noncentred = TRUE,\n  chains = 2,\n  silent = 2\n)\n\n# Extract the model summary\nsummary(mod1)\n\n# Plot the historical trend and hindcast distributions for one series\nhc_trend <- hindcast(mod1, type = \"trend\")\nplot(hc_trend)\n\nhc_predicted <- hindcast(mod1, type = \"response\")\nplot(hc_predicted)\n\n# Residual diagnostics\nplot(mod1, type = \"residuals\", series = 1)\nresids <- residuals(mod1)\nstr(resids)\n\n# Fitted values and residuals can be added directly to the training data\naugment(mod1)\n\n# Compute the forecast using covariate information in data_test\nfc <- forecast(mod1, newdata = dat$data_test)\nstr(fc)\nfc_summary <- summary(fc)\nhead(fc_summary, 12)\nplot(fc)\n\n# Plot the estimated seasonal smooth function\nplot(mod1, type = \"smooths\")\n\n# Plot estimated first derivatives of the smooth\nplot(mod1, type = \"smooths\", derivatives = TRUE)\n\n# Plot partial residuals of the smooth\nplot(mod1, type = \"smooths\", residuals = TRUE)\n\n# Plot posterior realisations for the smooth\nplot(mod1, type = \"smooths\", realisations = TRUE)\n\n# Plot conditional response predictions using marginaleffects\nconditional_effects(mod1)\nplot_predictions(mod1, condition = \"season\", points = 0.5)\n\n# Generate posterior predictive checks using bayesplot\npp_check(mod1)\n\n# Extract observation model beta coefficient draws as a data.frame\nbeta_draws_df <- as.data.frame(mod1, variable = \"betas\")\nhead(beta_draws_df)\nstr(beta_draws_df)\n\n# Investigate model fit\nmc.cores.def <- getOption(\"mc.cores\")\noptions(mc.cores = 1)\nloo(mod1)\noptions(mc.cores = mc.cores.def)\n\n\n# =============================================================================\n# Vector Autoregressive (VAR) Models\n# =============================================================================\n\n# Fit a model to the portal time series that uses a latent\n# Vector Autoregression of order 1\nmod <- mvgam(\n  formula = captures ~ -1,\n  trend_formula = ~ trend,\n  trend_model = VAR(cor = TRUE),\n  family = poisson(),\n  data = portal_data,\n  chains = 2,\n  silent = 2\n)\n\n# Plot the autoregressive coefficient distributions;\n# use 'dir = \"v\"' to arrange the order of facets correctly\nmcmc_plot(\n  mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n# Plot the process error variance-covariance matrix in the same way\nmcmc_plot(\n  mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n\n# Calculate Generalized Impulse Response Functions for each series\nirfs <- irf(\n  mod,\n  h = 12,\n  cumulative = FALSE\n)\n\n# Plot some of them\nplot(irfs, series = 1)\nplot(irfs, series = 2)\n\n# Calculate forecast error variance decompositions for each series\nfevds <- fevd(mod, h = 12)\n\n# Plot median contributions to forecast error variance\nplot(fevds)\n\n\n# =============================================================================\n# Dynamic Factor Models\n# =============================================================================\n\n# Now fit a model that uses two RW dynamic factors to model\n# the temporal dynamics of the four rodent species\nmod <- mvgam(\n  captures ~ series,\n  trend_model = RW(),\n  use_lv = TRUE,\n  n_lv = 2,\n  data = portal_data,\n  chains = 2,\n  silent = 2\n)\n\n# Plot the factors\nplot(mod, type = 'factors')\n\n# Plot the hindcast distributions\nhcs <- hindcast(mod)\nplot(hcs, series = 1)\nplot(hcs, series = 2)\nplot(hcs, series = 3)\nplot(hcs, series = 4)\n\n# Use residual_cor() to calculate temporal correlations among the series\n# based on the factor loadings\nlvcors <- residual_cor(mod)\nnames(lvcors)\nlvcors$cor\n\n# For those correlations whose credible intervals did not include\n# zero, plot them as a correlation matrix (all other correlations\n# are shown as zero on this plot)\nplot(lvcors, cluster = TRUE)\n\n\n# =============================================================================\n# Shared Latent Trends with Custom Trend Mapping\n# =============================================================================\n\n# Example of supplying a trend_map so that some series can share\n# latent trend processes\nsim <- sim_mvgam(n_series = 3)\nmod_data <- sim$data_train\n\n# Here, we specify only two latent trends; series 1 and 2 share a trend,\n# while series 3 has its own unique latent trend\ntrend_map <- data.frame(\n  series = unique(mod_data$series),\n  trend = c(1, 1, 2)\n)\n\n# Fit the model using AR1 trends\nmod <- mvgam(\n  formula = y ~ s(season, bs = \"cc\", k = 6),\n  trend_map = trend_map,\n  trend_model = AR(),\n  data = mod_data,\n  return_model_data = TRUE,\n  chains = 2,\n  silent = 2\n)\n\n# The mapping matrix is now supplied as data to the model in the 'Z' element\nmod$model_data$Z\n\n# The first two series share an identical latent trend; the third is different\nplot(residual_cor(mod))\nplot(mod, type = \"trend\", series = 1)\nplot(mod, type = \"trend\", series = 2)\nplot(mod, type = \"trend\", series = 3)\n\n\n# =============================================================================\n# Time-Varying (Dynamic) Coefficients\n# =============================================================================\n\n# Example of how to use dynamic coefficients\n# Simulate a time-varying coefficient for the effect of temperature\nset.seed(123)\nN <- 200\nbeta_temp <- vector(length = N)\nbeta_temp[1] <- 0.4\nfor (i in 2:N) {\n  beta_temp[i] <- rnorm(1, mean = beta_temp[i - 1] - 0.0025, sd = 0.05)\n}\nplot(beta_temp)\n\n# Simulate a covariate called 'temp'\ntemp <- rnorm(N, sd = 1)\n\n# Simulate some noisy Gaussian observations\nout <- rnorm(N,\n  mean = 4 + beta_temp * temp,\n  sd = 0.5\n)\n\n# Gather necessary data into a data.frame; split into training / testing\ndata <- data.frame(out, temp, time = seq_along(temp))\ndata_train <- data[1:180, ]\ndata_test <- data[181:200, ]\n\n# Fit the model using the dynamic() function\nmod <- mvgam(\n  formula = out ~ dynamic(\n    temp,\n    scale = FALSE,\n    k = 40\n  ),\n  family = gaussian(),\n  data = data_train,\n  newdata = data_test,\n  chains = 2,\n  silent = 2\n)\n\n# Inspect the model summary, forecast and time-varying coefficient distribution\nsummary(mod)\nplot(mod, type = \"smooths\")\nfc <- forecast(mod, newdata = data_test)\nplot(fc)\n\n# Propagating the smooth term shows how the coefficient is expected to evolve\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 180, lty = \"dashed\", lwd = 2)\npoints(beta_temp, pch = 16)\n\n\n# =============================================================================\n# Working with Offset Terms\n# =============================================================================\n\n# Example showing how to incorporate an offset; simulate some count data\n# with different means per series\nset.seed(100)\ndat <- sim_mvgam(\n  prop_trend = 0,\n  mu = c(0, 2, 2),\n  seasonality = \"hierarchical\"\n)\n\n# Add offset terms to the training and testing data\ndat$data_train$offset <- 0.5 * as.numeric(dat$data_train$series)\ndat$data_test$offset <- 0.5 * as.numeric(dat$data_test$series)\n\n# Fit a model that includes the offset in the linear predictor as well as\n# hierarchical seasonal smooths\nmod <- mvgam(\n  formula = y ~ offset(offset) +\n    s(series, bs = \"re\") +\n    s(season, bs = \"cc\") +\n    s(season, by = series, m = 1, k = 5),\n  data = dat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Inspect the model file to see the modification to the linear predictor (eta)\nstancode(mod)\n\n# Forecasts for the first two series will differ in magnitude\nfc <- forecast(mod, newdata = dat$data_test)\nplot(fc, series = 1, ylim = c(0, 75))\nplot(fc, series = 2, ylim = c(0, 75))\n\n# Changing the offset for the testing data should lead to changes in\n# the forecast\ndat$data_test$offset <- dat$data_test$offset - 2\nfc <- forecast(mod, newdata = dat$data_test)\nplot(fc)\n\n# Relative Risks can be computed by fixing the offset to the same value\n# for each series\ndat$data_test$offset <- rep(1, NROW(dat$data_test))\npreds_rr <- predict(mod,\n  type = \"link\",\n  newdata = dat$data_test,\n  summary = FALSE\n)\nseries1_inds <- which(dat$data_test$series == \"series_1\")\nseries2_inds <- which(dat$data_test$series == \"series_2\")\n\n# Relative Risks are now more comparable among series\nlayout(matrix(1:2, ncol = 2))\nplot(preds_rr[1, series1_inds],\n  type = \"l\", col = \"grey75\",\n  ylim = range(preds_rr),\n  ylab = \"Series1 Relative Risk\", xlab = \"Time\"\n)\nfor (i in 2:50) {\n  lines(preds_rr[i, series1_inds], col = \"grey75\")\n}\n\nplot(preds_rr[1, series2_inds],\n  type = \"l\", col = \"darkred\",\n  ylim = range(preds_rr),\n  ylab = \"Series2 Relative Risk\", xlab = \"Time\"\n)\nfor (i in 2:50) {\n  lines(preds_rr[i, series2_inds], col = \"darkred\")\n}\nlayout(1)\n\n\n# =============================================================================\n# Binomial Family Models\n# =============================================================================\n\n# Example showcasing how cbind() is needed for Binomial observations\n# Simulate two time series of Binomial trials\ntrials <- sample(c(20:25), 50, replace = TRUE)\nx <- rnorm(50)\ndetprob1 <- plogis(-0.5 + 0.9 * x)\ndetprob2 <- plogis(-0.1 - 0.7 * x)\ndat <- rbind(\n  data.frame(\n    y = rbinom(n = 50, size = trials, prob = detprob1),\n    time = 1:50,\n    series = \"series1\",\n    x = x,\n    ntrials = trials\n  ),\n  data.frame(\n    y = rbinom(n = 50, size = trials, prob = detprob2),\n    time = 1:50,\n    series = \"series2\",\n    x = x,\n    ntrials = trials\n  )\n)\ndat <- dplyr::mutate(dat, series = as.factor(series))\ndat <- dplyr::arrange(dat, time, series)\nplot_mvgam_series(data = dat, series = \"all\")\n\n# Fit a model using the binomial() family; must specify observations\n# and number of trials in the cbind() wrapper\nmod <- mvgam(\n  formula = cbind(y, ntrials) ~ series + s(x, by = series),\n  family = binomial(),\n  data = dat,\n  chains = 2,\n  silent = 2\n)\nsummary(mod)\npp_check(mod,\n  type = \"bars_grouped\",\n  group = \"series\", ndraws = 50\n)\npp_check(mod,\n  type = \"ecdf_overlay_grouped\",\n  group = \"series\", ndraws = 50\n)\nconditional_effects(mod, type = \"link\")\n\n# To view predictions on the probability scale,\n# use ntrials = 1 in datagrid()\nplot_predictions(\n  mod,\n  by = c('x', 'series'),\n  newdata = datagrid(\n    x = runif(100, -2, 2),\n    series = unique,\n    ntrials = 1\n  ),\n  type = 'expected'\n)\n\n# Not needed for general use; cleans up connections for automated testing\ncloseAllConnections()\n}\n}\n\\references{\nNicholas J Clark & Konstans Wells (2023). Dynamic generalised additive models\n(DGAMs) for forecasting discrete ecological time series. Methods in Ecology and\nEvolution. 14:3, 771-784.\n\nNicholas J Clark, SK Morgan Ernest, Henry Senyondo, Juniper Simonis, Ethan P White,\nGlenda M Yenni, KANK Karunarathna (2025). Beyond single-species models: leveraging\nmultispecies forecasts to navigate the dynamics of ecological predictability.\nPeerJ. 13:e18929 https://doi.org/10.7717/peerj.18929\n}\n\\seealso{\n\\code{\\link[mgcv]{jagam}()}, \\code{\\link[mgcv]{gam}()},\n\\code{\\link[mgcv]{gam.models}}, \\code{\\link[=get_mvgam_priors]{get_mvgam_priors()}}, \\code{\\link[=jsdgam]{jsdgam()}},\n\\code{\\link[=hindcast.mvgam]{hindcast.mvgam()}}, \\code{\\link[=forecast.mvgam]{forecast.mvgam()}}, \\code{\\link[=predict.mvgam]{predict.mvgam()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_diagnostics.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_diagnostics.R\n\\name{mvgam_diagnostics}\n\\alias{mvgam_diagnostics}\n\\alias{nuts_params}\n\\alias{rhat}\n\\alias{neff_ratio}\n\\alias{nuts_params.mvgam}\n\\alias{log_posterior.mvgam}\n\\alias{rhat.mvgam}\n\\alias{neff_ratio.mvgam}\n\\title{Extract diagnostic quantities of \\pkg{mvgam} models}\n\\usage{\n\\method{nuts_params}{mvgam}(object, pars = NULL, ...)\n\n\\method{log_posterior}{mvgam}(object, ...)\n\n\\method{rhat}{mvgam}(x, pars = NULL, ...)\n\n\\method{neff_ratio}{mvgam}(object, pars = NULL, ...)\n}\n\\arguments{\n\\item{object, x}{A \\code{mvgam} or \\code{jsdgam} object.}\n\n\\item{pars}{An optional character vector of parameter names.\nFor \\code{nuts_params} these will be NUTS sampler parameter\nnames rather than model parameters. If pars is omitted\nall parameters are included.}\n\n\\item{...}{Arguments passed to individual methods.}\n}\n\\value{\nThe exact form of the output depends on the method.\n}\n\\description{\nExtract quantities that can be used to diagnose sampling behavior\nof the algorithms applied by \\pkg{Stan} at the back-end of \\pkg{mvgam}.\n}\n\\details{\nFor more details see\n\\code{\\link[bayesplot:bayesplot-extractors]{bayesplot-extractors}}.\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(n_series = 1, trend_model = 'AR1')\nmod <- mvgam(y ~ s(season, bs = 'cc', k = 6),\n            trend_model = AR(),\n            noncentred = TRUE,\n            data = simdat$data_train,\n            chains = 2)\nnp <- nuts_params(mod)\nhead(np)\n\n# extract the number of divergence transitions\nsum(subset(np, Parameter == \"divergent__\")$Value)\n\nhead(neff_ratio(mod))\n}\n}\n"
  },
  {
    "path": "man/mvgam_draws.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/as.data.frame.mvgam.R\n\\name{mvgam_draws}\n\\alias{mvgam_draws}\n\\alias{as.data.frame.mvgam}\n\\alias{as.matrix.mvgam}\n\\alias{as.array.mvgam}\n\\alias{as_draws.mvgam}\n\\alias{as_draws_matrix.mvgam}\n\\alias{as_draws_df.mvgam}\n\\alias{as_draws_array.mvgam}\n\\alias{as_draws_list.mvgam}\n\\alias{as_draws_rvars.mvgam}\n\\title{Extract posterior draws from fitted \\pkg{mvgam} objects}\n\\usage{\n\\method{as.data.frame}{mvgam}(\n  x,\n  row.names = NULL,\n  optional = TRUE,\n  variable = \"betas\",\n  use_alias = TRUE,\n  regex = FALSE,\n  ...\n)\n\n\\method{as.matrix}{mvgam}(x, variable = \"betas\", regex = FALSE, use_alias = TRUE, ...)\n\n\\method{as.array}{mvgam}(x, variable = \"betas\", regex = FALSE, use_alias = TRUE, ...)\n\n\\method{as_draws}{mvgam}(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n)\n\n\\method{as_draws_matrix}{mvgam}(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n)\n\n\\method{as_draws_df}{mvgam}(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n)\n\n\\method{as_draws_array}{mvgam}(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n)\n\n\\method{as_draws_list}{mvgam}(\n  x,\n  variable = NULL,\n  regex = FALSE,\n  inc_warmup = FALSE,\n  use_alias = TRUE,\n  ...\n)\n\n\\method{as_draws_rvars}{mvgam}(x, variable = NULL, regex = FALSE, inc_warmup = FALSE, ...)\n}\n\\arguments{\n\\item{x}{\\code{list} object of class \\code{mvgam}}\n\n\\item{row.names}{Ignored}\n\n\\item{optional}{Ignored}\n\n\\item{variable}{A character specifying which parameters to extract. Can\neither be one of the following options:\n\\itemize{\n\\item \\code{obs_params} (other parameters specific to the observation model,\nsuch as overdispersions for negative binomial models or observation error\nSD for gaussian / student-t models)\n\\item \\code{betas} (beta coefficients from the GAM observation model linear\npredictor; default)\n\\item \\code{smooth_params} (smoothing parameters from the GAM observation model)\n\\item \\code{linpreds} (estimated linear predictors on whatever link scale was\nused in the model)\n\\item \\code{trend_params} (parameters governing the trend dynamics, such as AR\nparameters, trend SD parameters or Gaussian Process parameters)\n\\item \\code{trend_betas} (beta coefficients from the GAM latent process model\nlinear predictor; only available if a \\code{trend_formula} was supplied in the\noriginal model)\n\\item \\code{trend_smooth_params} (process model GAM smoothing parameters; only\navailable if a \\code{trend_formula} was supplied in the original model)\n\\item \\code{trend_linpreds} (process model linear predictors on the identity\nscale; only available if a \\code{trend_formula} was supplied in the original\nmodel)\n}\nOR can be a character vector providing the variables to extract.}\n\n\\item{use_alias}{Logical. If more informative names for parameters are\navailable (i.e. for beta coefficients \\code{b} or for smoothing parameters \\code{rho}),\nreplace the uninformative names with the more informative alias. Defaults to\n\\code{TRUE}.}\n\n\\item{regex}{Logical. If not using one of the prespecified options for\nextractions, should \\code{variable} be treated as a (vector of) regular\nexpressions? Any variable in \\code{x} matching at least one of the regular\nexpressions will be selected. Defaults to \\code{FALSE}.}\n\n\\item{...}{Ignored}\n\n\\item{inc_warmup}{Should warmup draws be included? Defaults to \\code{FALSE}.}\n}\n\\value{\nA \\code{data.frame}, \\code{matrix}, or \\code{array} containing the posterior draws.\n}\n\\description{\nExtract posterior draws in conventional formats as data.frames, matrices,\nor arrays.\n}\n\\examples{\n\\dontrun{\nsim <- sim_mvgam(family = Gamma())\n\nmod1 <- mvgam(\n  y ~ s(season, bs = 'cc'),\n  trend_model = AR(),\n  data = sim$data_train,\n  family = Gamma(),\n  chains = 2,\n  silent = 2\n)\n\nbeta_draws_df <- as.data.frame(mod1, variable = 'betas')\nhead(beta_draws_df)\nstr(beta_draws_df)\n\nbeta_draws_mat <- as.matrix(mod1, variable = 'betas')\nhead(beta_draws_mat)\nstr(beta_draws_mat)\n\nshape_pars <- as.matrix(mod1, variable = 'shape', regex = TRUE)\nhead(shape_pars)\n}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_families.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/families.R\n\\name{mvgam_families}\n\\alias{mvgam_families}\n\\alias{tweedie}\n\\alias{student_t}\n\\alias{betar}\n\\alias{nb}\n\\alias{lognormal}\n\\alias{student}\n\\alias{bernoulli}\n\\alias{beta_binomial}\n\\alias{nmix}\n\\title{Supported \\pkg{mvgam} families}\n\\usage{\ntweedie(link = \"log\")\n\nstudent_t(link = \"identity\")\n\nbetar(...)\n\nnb(...)\n\nlognormal(...)\n\nstudent(...)\n\nbernoulli(...)\n\nbeta_binomial(...)\n\nnmix(link = \"log\")\n}\n\\arguments{\n\\item{link}{a specification for the family link function. At present these cannot\nbe changed}\n\n\\item{...}{Arguments to be passed to the \\pkg{mgcv} version of the associated functions}\n}\n\\value{\nObjects of class \\code{family}\n}\n\\description{\nSupported \\pkg{mvgam} families\n}\n\\details{\n\\code{mvgam} currently supports the following standard observation families:\n\\itemize{\n\\item \\code{\\link[stats]{gaussian}} with identity link, for real-valued data\n\\item \\code{\\link[stats]{poisson}} with log-link, for count data\n\\item \\code{\\link[stats]{Gamma}} with log-link, for non-negative real-valued data\n\\item \\code{\\link[stats]{binomial}} with logit-link, for count data when the number\nof trials is known (and must be supplied)\n}\n\nIn addition, the following extended families from the \\code{mgcv} and \\code{brms} packages are supported:\n\\itemize{\n\\item \\code{\\link[mgcv]{betar}} with logit-link, for proportional data on \\verb{(0,1)}\n\\item \\code{\\link[mgcv]{nb}} with log-link, for count data\n\\item \\code{\\link[brms]{lognormal}} with identity-link, for non-negative real-valued data\n\\item \\code{\\link[brms]{bernoulli}} with logit-link, for binary data\n\\item \\code{\\link[brms]{beta_binomial}} with logit-link, as for \\code{binomial()} but allows\nfor overdispersion\n}\n\nFinally, \\code{mvgam} supports the three extended families described here:\n\\itemize{\n\\item \\code{tweedie} with log-link, for count data (power parameter \\code{p} fixed at \\code{1.5})\n\\item \\code{student_t()} (or \\code{\\link[brms]{student}}) with identity-link, for real-valued data\n\\item \\code{nmix} for count data with imperfect detection modeled via a\nState-Space N-Mixture model. The latent states are Poisson (with log link), capturing the 'true' latent\nabundance, while the observation process is Binomial to account for imperfect detection. The\nobservation \\code{formula} in these models is used to set up a linear predictor for the detection\nprobability (with logit link). See the example below for a more detailed worked explanation\nof the \\code{nmix()} family\n}\nOnly \\code{poisson()}, \\code{nb()}, and \\code{tweedie()} are available if\nusing \\code{JAGS}. All families, apart from \\code{tweedie()}, are supported if\nusing \\code{Stan}.\n\nNote that currently it is not possible to change the default link\n\nfunctions in \\pkg{mvgam}, so any call to change these will be silently ignored\n}\n\\examples{\n\\dontrun{\n# =============================================================================\n# N-mixture Models\n# =============================================================================\nset.seed(999)\n\n# Simulate observations for species 1, which shows a declining trend and\n# 0.7 detection probability\ndata.frame(\n  site = 1,\n  # five replicates per year; six years\n  replicate = rep(1:5, 6),\n  time = sort(rep(1:6, 5)),\n  species = 'sp_1',\n  # true abundance declines nonlinearly\n  truth = c(\n    rep(28, 5),\n    rep(26, 5),\n    rep(23, 5),\n    rep(16, 5),\n    rep(14, 5),\n    rep(14, 5)\n  ),\n  # observations are taken with detection prob = 0.7\n  obs = c(\n    rbinom(5, 28, 0.7),\n    rbinom(5, 26, 0.7),\n    rbinom(5, 23, 0.7),\n    rbinom(5, 15, 0.7),\n    rbinom(5, 14, 0.7),\n    rbinom(5, 14, 0.7)\n  )\n) \\%>\\%\n  # add 'series' information, which is an identifier of site, replicate\n  # and species\n  dplyr::mutate(\n    series = paste0(\n      'site_', site,\n      '_', species,\n      '_rep_', replicate\n    ),\n    time = as.numeric(time),\n    # add a 'cap' variable that defines the maximum latent N to\n    # marginalize over when estimating latent abundance; in other words\n    # how large do we realistically think the true abundance could be?\n    cap = 80\n  ) \\%>\\%\n  dplyr::select(-replicate) -> testdat\n\n# Now add another species that has a different temporal trend and a\n# smaller detection probability (0.45 for this species)\ntestdat <- testdat \\%>\\%\n  dplyr::bind_rows(\n    data.frame(\n      site = 1,\n      replicate = rep(1:5, 6),\n      time = sort(rep(1:6, 5)),\n      species = 'sp_2',\n      truth = c(\n        rep(4, 5),\n        rep(7, 5),\n        rep(15, 5),\n        rep(16, 5),\n        rep(19, 5),\n        rep(18, 5)\n      ),\n      obs = c(\n        rbinom(5, 4, 0.45),\n        rbinom(5, 7, 0.45),\n        rbinom(5, 15, 0.45),\n        rbinom(5, 16, 0.45),\n        rbinom(5, 19, 0.45),\n        rbinom(5, 18, 0.45)\n      )\n    ) \\%>\\%\n      dplyr::mutate(\n        series = paste0(\n          'site_', site,\n          '_', species,\n          '_rep_', replicate\n        ),\n        time = as.numeric(time),\n        cap = 50\n      ) \\%>\\%\n      dplyr::select(-replicate)\n  )\n\n# series identifiers\ntestdat$species <- factor(\n  testdat$species,\n  levels = unique(testdat$species)\n)\ntestdat$series <- factor(\n  testdat$series,\n  levels = unique(testdat$series)\n)\n\n# The trend_map to state how replicates are structured\ntestdat \\%>\\%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(\n    trend = as.numeric(factor(paste0(site, species)))\n  ) \\%>\\%\n  dplyr::select(trend, series) \\%>\\%\n  dplyr::distinct() -> trend_map\ntrend_map\n\n# Fit a model\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  chains = 2\n)\n\n# The usual diagnostics\nsummary(mod)\n\n# Plotting conditional effects\nlibrary(ggplot2)\n\nplot_predictions(\n  mod,\n  condition = 'species',\n  type = 'detection'\n) +\n  ylab('Pr(detection)') +\n  ylim(c(0, 1)) +\n  theme_classic() +\n  theme(legend.position = 'none')\n\n# =============================================================================\n# Binomial Models\n# =============================================================================\n\n# Simulate two time series of Binomial trials\ntrials <- sample(c(20:25), 50, replace = TRUE)\nx <- rnorm(50)\ndetprob1 <- plogis(-0.5 + 0.9 * x)\ndetprob2 <- plogis(-0.1 - 0.7 * x)\ndat <- rbind(\n  data.frame(\n    y = rbinom(n = 50, size = trials, prob = detprob1),\n    time = 1:50,\n    series = 'series1',\n    x = x,\n    ntrials = trials\n  ),\n  data.frame(\n    y = rbinom(n = 50, size = trials, prob = detprob2),\n    time = 1:50,\n    series = 'series2',\n    x = x,\n    ntrials = trials\n  )\n)\ndat <- dplyr::mutate(dat, series = as.factor(series))\ndat <- dplyr::arrange(dat, time, series)\n\n# Fit a model using the binomial() family; must specify observations\n# and number of trials in the cbind() wrapper\nmod <- mvgam(\n  cbind(y, ntrials) ~ series + s(x, by = series),\n  family = binomial(),\n  data = dat\n)\nsummary(mod)\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_fevd-class.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_fevd-class.R\n\\name{mvgam_fevd-class}\n\\alias{mvgam_fevd-class}\n\\title{\\code{mvgam_fevd} object description}\n\\description{\nA \\code{mvgam_fevd} object returned by function \\code{\\link[=fevd]{fevd()}}. Run\n\\code{methods(class = \"mvgam_fevd\")} to see an overview of available methods.\n}\n\\details{\nA forecast error variance decomposition is useful for quantifying\nthe amount of information each series that in a Vector Autoregression\ncontributes to the forecast distributions of the other series in the\nautoregression. This object contains the forecast error variance\ndecomposition using the orthogonalised impulse response coefficient\nmatrices \\eqn{\\Psi_h}, which can be used to quantify the contribution of\nseries \\eqn{j} to the h-step forecast error variance of series \\eqn{k}:\n\\deqn{\n  \\sigma_k^2(h) = \\sum_{j=1}^K(\\psi_{kj, 0}^2 + \\ldots + \\psi_{kj,\n  h-1}^2) \\quad\n  }\nIf the orthogonalised impulse reponses \\eqn{(\\psi_{kj, 0}^2 + \\ldots +\n  \\psi_{kj, h-1}^2)} are divided by the variance of the forecast error\n\\eqn{\\sigma_k^2(h)}, this yields an interpretable percentage representing\nhow much of the forecast error variance for \\eqn{k} can be explained by an\nexogenous shock to \\eqn{j}. This percentage is what is calculated and\nreturned in objects of class \\code{mvgam_fevd}, where the posterior\ndistribution of variance decompositions for each variable in the original\nmodel is contained in a separate slot within the returned \\code{list} object\n}\n\\references{\nLütkepohl, H (2006). New Introduction to Multiple Time Series\nAnalysis. Springer, New York.\n}\n\\seealso{\n\\code{\\link[=mvgam]{mvgam()}}, \\code{\\link[=VAR]{VAR()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_forecast-class.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_forecast-class.R\n\\name{mvgam_forecast-class}\n\\alias{mvgam_forecast-class}\n\\title{\\code{mvgam_forecast} object description}\n\\description{\nA \\code{mvgam_forecast} object returned by function \\code{\\link{hindcast}}\nor \\code{\\link{forecast}}. Run \\code{methods(class = \"mvgam_forecast\")} to see\nan overview of available methods.\n}\n\\details{\nA \\code{mvgam_forecast} object contains the following elements:\n\n\\itemize{\n\\item \\code{call} the original observation model formula\n\n\\item \\code{trend_call} If a \\verb{trend_formula was supplied}, the original trend\nmodel formula is returned. Otherwise \\code{NULL}\n\n\\item \\code{family} \\code{character} description of the observation distribution\n\n\\item \\code{family_pars} \\code{list} containing draws of family-specific\nparameters (i.e. shape, scale or overdispersion parameters). Only\nreturned if \\code{type = link}. Otherwise \\code{NULL}\n\n\\item \\code{trend_model} \\code{character} description of the latent trend model\n\n\\item \\code{drift} Logical specifying whether a drift term was used in the\ntrend model\n\n\\item \\code{use_lv} Logical flag indicating whether latent dynamic factors were\nused in the model\n\n\\item \\code{fit_engine} \\code{Character} describing the fit engine, either as \\code{stan}\nor \\code{jags}\n\n\\item \\code{type} The type of predictions included (either \\code{link}, \\code{response}\nor \\code{trend})\n\n\\item \\code{series_names} Names of the time series, taken from\n\\code{levels(data$series)} in the original model fit\n\n\\item \\code{train_observations} A \\code{list} of training observation vectors of\nlength \\code{n_series}\n\n\\item \\code{train_times} A \\code{list} of the unique training times of length\n\\code{n_series}\n\n\\item \\code{test_observations} If the \\code{\\link{forecast}} function was used,\na \\code{list} of test observation vectors of length \\code{n_series}. Otherwise\n\\code{NULL}\n\n\\item \\code{test_times} If the \\code{\\link{forecast}} function was used, a\n\\code{list} of the unique testing (validation) times of length \\code{n_series}.\nOtherwise \\code{NULL}\n\n\\item \\code{hindcasts} A \\code{list} of posterior hindcast distributions of length\n\\code{n_series}.\n\n\\item \\code{forecasts} If the \\code{\\link{forecast}} function was used, a\n\\code{list} of posterior forecast distributions of length \\code{n_series}.\nOtherwise \\code{NULL}\n}\n}\n\\seealso{\n\\link{mvgam}, \\link{hindcast.mvgam}, \\link{forecast.mvgam}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_formulae.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_formulae.R\n\\name{mvgam_formulae}\n\\alias{mvgam_formulae}\n\\title{Details of formula specifications in \\pkg{mvgam} models}\n\\description{\nDetails of formula specifications in \\pkg{mvgam} models\n}\n\\details{\n\\code{\\link{mvgam}} will accept an observation model formula and an optional\nprocess model formula (via the argument \\code{trend_formula}). Neither of these formulae can\nbe specified as lists, contrary to the accepted behaviour in some \\code{mgcv} or \\code{brms} models.\n\\cr\n\\cr\nNote that it is possible to supply an empty formula where\nthere are no predictors or intercepts in the observation model (i.e. \\code{y ~ 0} or \\code{y ~ -1}).\nIn this case, an intercept-only observation model will be set up but the intercept coefficient\nwill be fixed at zero. This can be handy if you wish to fit pure State-Space models where\nthe variation in the dynamic trend controls the average expectation, and/or where intercepts\nare non-identifiable.\n\\cr\n\\cr\nThe formulae supplied to \\code{\\link{mvgam}} and \\code{\\link{jsdgam}}\nare exactly like those supplied to\n\\code{\\link{glm}} except that smooth terms,\n\\code{\\link[mgcv]{s}},\n\\code{\\link[mgcv]{te}},\n\\code{\\link[mgcv]{ti}} and\n\\code{\\link[mgcv]{t2}},\ntime-varying effects using \\code{\\link{dynamic}},\nmonotonically increasing (using \\code{s(x, bs = 'moi')})\nor decreasing splines (using \\code{s(x, bs = 'mod')};\nsee \\code{\\link{smooth.construct.moi.smooth.spec}} for\ndetails), as well as\nGaussian Process functions using \\code{\\link[brms]{gp}} and offsets using\n\\code{\\link[stats]{offset}}\ncan be added to the right hand side (and \\code{.} is not supported in \\code{mvgam} formulae).\n\\cr\n\\cr\nFurther details on specifying different kinds of smooth functions, and how to control their behaviours\nby modifying their potential complexities and / or how the penalties behave, can be found in the\nextensive documentation for the \\code{mgcv} package.\n}\n\\seealso{\n\\code{\\link{mvgam}},\n\\code{\\link[mgcv]{formula.gam}},\n\\code{\\link[mgcv]{gam.models}},\n\\code{\\link[mgcv]{jagam}},\n\\code{\\link[mgcv]{gam}},\n\\code{\\link[mgcv]{s}},\n\\code{\\link[brms]{gp}},\n\\code{\\link[stats]{formula}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_irf-class.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_irf-class.R\n\\name{mvgam_irf-class}\n\\alias{mvgam_irf-class}\n\\title{\\code{mvgam_irf} object description}\n\\description{\nA \\code{mvgam_irf} object returned by function \\code{\\link{irf}}.\nRun \\code{methods(class = \"mvgam_irf\")} to see an overview of available methods.\n}\n\\details{\nGeneralized or Orthogonalized Impulse Response Functions can be\ncomputed using the posterior estimates of Vector Autoregressive parameters.\nThis function generates a positive \"shock\" for a target process at time\n\\code{t = 0} and then calculates how each of the remaining processes in the\nlatent VAR are expected to respond over the forecast horizon \\code{h}. The\nfunction computes IRFs for all processes in the object and returns them in\nan array that can be plotted using the S3 \\code{plot} function. To inspect\ncommunity-level metrics of stability using latent VAR processes, you can\nuse the related \\code{\\link[=stability]{stability()}} function.\n\nA \\code{mvgam_irf} object contains a \\code{list} of posterior impulse response\nfunctions, each stored as its own \\code{list}\n}\n\\references{\nPH Pesaran & Shin Yongcheol (1998).\nGeneralized impulse response analysis in linear multivariate models.\nEconomics Letters 58: 17–29.\n}\n\\seealso{\n\\link{mvgam}, \\link{VAR}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_marginaleffects.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/marginaleffects.mvgam.R\n\\name{mvgam_marginaleffects}\n\\alias{mvgam_marginaleffects}\n\\alias{get_coef.mvgam}\n\\alias{set_coef.mvgam}\n\\alias{get_vcov.mvgam}\n\\alias{get_predict.mvgam}\n\\alias{get_data.mvgam}\n\\alias{get_data.mvgam_prefit}\n\\alias{find_predictors.mvgam}\n\\alias{find_predictors.mvgam_prefit}\n\\title{Helper functions for \\pkg{marginaleffects} calculations in \\pkg{mvgam} models}\n\\usage{\n\\method{get_coef}{mvgam}(model, trend_effects = FALSE, ...)\n\n\\method{set_coef}{mvgam}(model, coefs, trend_effects = FALSE, ...)\n\n\\method{get_vcov}{mvgam}(model, vcov = NULL, ...)\n\n\\method{get_predict}{mvgam}(\n  model,\n  newdata,\n  type = \"response\",\n  mfx,\n  newparams,\n  ndraws,\n  se.fit,\n  process_error = FALSE,\n  ...\n)\n\n\\method{get_data}{mvgam}(x, source = \"environment\", verbose = TRUE, ...)\n\n\\method{get_data}{mvgam_prefit}(x, source = \"environment\", verbose = TRUE, ...)\n\n\\method{find_predictors}{mvgam}(\n  x,\n  effects = c(\"fixed\", \"random\", \"all\"),\n  component = c(\"all\", \"conditional\", \"zi\", \"zero_inflated\", \"dispersion\", \"instruments\",\n    \"correlation\", \"smooth_terms\"),\n  flatten = FALSE,\n  verbose = TRUE,\n  ...\n)\n\n\\method{find_predictors}{mvgam_prefit}(\n  x,\n  effects = c(\"fixed\", \"random\", \"all\"),\n  component = c(\"all\", \"conditional\", \"zi\", \"zero_inflated\", \"dispersion\", \"instruments\",\n    \"correlation\", \"smooth_terms\"),\n  flatten = FALSE,\n  verbose = TRUE,\n  ...\n)\n}\n\\arguments{\n\\item{model}{Model object}\n\n\\item{trend_effects}{\\code{logical}, extract from the process model component\n(only applicable if a \\code{trend_formula} was specified in the model)}\n\n\\item{...}{Additional arguments are passed to the \\code{predict()} method\nsupplied by the modeling package.These arguments are particularly useful\nfor mixed-effects or bayesian models (see the online vignettes on the\n\\code{marginaleffects} website). Available arguments can vary from model to\nmodel, depending on the range of supported arguments by each modeling\npackage. See the \"Model-Specific Arguments\" section of the\n\\code{?slopes} documentation for a non-exhaustive list of available\narguments.}\n\n\\item{coefs}{vector of coefficients to insert in the model object}\n\n\\item{vcov}{Type of uncertainty estimates to report (e.g., for robust standard errors). Acceptable values:\n\\itemize{\n\\item FALSE: Do not compute standard errors. This can speed up computation considerably.\n\\item TRUE: Unit-level standard errors using the default \\code{vcov(model)} variance-covariance matrix.\n\\item String which indicates the kind of uncertainty estimates to return.\n\\itemize{\n\\item Heteroskedasticity-consistent: \\code{\"HC\"}, \\code{\"HC0\"}, \\code{\"HC1\"}, \\code{\"HC2\"}, \\code{\"HC3\"}, \\code{\"HC4\"}, \\code{\"HC4m\"}, \\code{\"HC5\"}. See \\code{?sandwich::vcovHC}\n\\item Heteroskedasticity and autocorrelation consistent: \\code{\"HAC\"}\n\\item Mixed-Models degrees of freedom: \"satterthwaite\", \"kenward-roger\"\n\\item Other: \\code{\"NeweyWest\"}, \\code{\"KernHAC\"}, \\code{\"OPG\"}. See the \\code{sandwich} package documentation.\n\\item \"rsample\", \"boot\", \"fwb\", and \"simulation\" are passed to the \\code{method} argument of the \\code{inferences()} function. To customize the bootstrap or simulation process, call \\code{inferences()} directly.\n}\n\\item One-sided formula which indicates the name of cluster variables (e.g., \\code{~unit_id}). This formula is passed to the \\code{cluster} argument of the \\code{sandwich::vcovCL} function.\n\\item Square covariance matrix\n\\item Function which returns a covariance matrix (e.g., \\code{stats::vcov(model)})\n}}\n\n\\item{newdata}{Grid of predictor values at which we evaluate the slopes.\n\\itemize{\n\\item Warning: Please avoid modifying your dataset between fitting the model and calling a \\code{marginaleffects} function. This can sometimes lead to unexpected results.\n\\item \\code{NULL} (default): Unit-level slopes for each observed value in the dataset (empirical distribution). The dataset is retrieved using \\code{\\link[insight:get_data]{insight::get_data()}}, which tries to extract data from the environment. This may produce unexpected results if the original data frame has been altered since fitting the model.\n\\item \\code{\\link[marginaleffects:datagrid]{datagrid()}} call to specify a custom grid of regressors. For example:\n\\itemize{\n\\item \\code{newdata = datagrid(cyl = c(4, 6))}: \\code{cyl} variable equal to 4 and 6 and other regressors fixed at their means or modes.\n\\item See the Examples section and the \\code{\\link[marginaleffects:datagrid]{datagrid()}} documentation.\n}\n\\item \\code{\\link[=subset]{subset()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \\code{newdata = subset(treatment == 1)}\n\\item \\code{\\link[dplyr:filter]{dplyr::filter()}} call with a single argument to select a subset of the dataset used to fit the model, ex: \\code{newdata = filter(treatment == 1)}\n\\item string:\n\\itemize{\n\\item \"mean\": Slopes evaluated when each predictor is held at its mean or mode.\n\\item \"median\": Slopes evaluated when each predictor is held at its median or mode.\n\\item \"balanced\": Slopes evaluated on a balanced grid with every combination of categories and numeric variables held at their means.\n\\item \"tukey\": Slopes evaluated at Tukey's 5 numbers.\n\\item \"grid\": Slopes evaluated on a grid of representative numbers (Tukey's 5 numbers and unique values of categorical predictors).\n}\n}}\n\n\\item{type}{string indicates the type (scale) of the predictions used to\ncompute contrasts or slopes. This can differ based on the model\ntype, but will typically be a string such as: \"response\", \"link\", \"probs\",\nor \"zero\". When an unsupported string is entered, the model-specific list of\nacceptable values is returned in an error message. When \\code{type} is \\code{NULL}, the\nfirst entry in the error message is used by default.}\n\n\\item{mfx}{Ignored}\n\n\\item{newparams}{Ignored}\n\n\\item{ndraws}{Ignored}\n\n\\item{se.fit}{Ignored}\n\n\\item{process_error}{\\code{logical}. If \\code{TRUE}, uncertainty in the latent\nprocess (or trend) model is incorporated in predictions}\n\n\\item{x}{A fitted model.}\n\n\\item{source}{String, indicating from where data should be recovered. If\n\\code{source = \"environment\"} (default), data is recovered from the environment\n(e.g. if the data is in the workspace). This option is usually the fastest\nway of getting data and ensures that the original variables used for model\nfitting are returned. Note that always the \\emph{current} data is recovered from\nthe environment. Hence, if the data was modified \\emph{after} model fitting\n(e.g., variables were recoded or rows filtered), the returned data may no\nlonger equal the model data. If \\code{source = \"frame\"} (or \\code{\"mf\"}), the data\nis taken from the model frame. Any transformed variables are back-transformed,\nif possible. This option returns the data even if it is not available in\nthe environment, however, in certain edge cases back-transforming to the\noriginal data may fail. If \\code{source = \"environment\"} fails to recover the\ndata, it tries to extract the data from the model frame; if\n\\code{source = \"frame\"} and data cannot be extracted from the model frame, data\nwill be recovered from the environment. Both ways only returns observations\nthat have no missing data in the variables used for model fitting.}\n\n\\item{verbose}{Toggle messages and warnings.}\n\n\\item{effects}{Should model data for fixed effects (\\code{\"fixed\"}), random\neffects (\\code{\"random\"}) or both (\\code{\"all\"}) be returned? Only applies to mixed\nor gee models.}\n\n\\item{component}{Which type of parameters to return, such as parameters for\nthe conditional model, the zero-inflated part of the model, the dispersion\nterm, the instrumental variables or marginal effects be returned? Applies to\nmodels with zero-inflated and/or dispersion formula, or to models with\ninstrumental variables (so called fixed-effects regressions), or models with\nmarginal effects (from \\strong{mfx}). See details in section \\emph{Model Components}\n.May be abbreviated. Note that the \\emph{conditional} component also refers to the\n\\emph{count} or \\emph{mean} component - names may differ, depending on the modeling\npackage. There are three convenient shortcuts (not applicable to \\emph{all} model\nclasses):\n\\itemize{\n\\item \\code{component = \"all\"} returns all possible parameters.\n\\item If \\code{component = \"location\"}, location parameters such as \\code{conditional},\n\\code{zero_inflated}, \\code{smooth_terms}, or \\code{instruments} are returned (everything\nthat are fixed or random effects - depending on the \\code{effects} argument -\nbut no auxiliary parameters).\n\\item For \\code{component = \"distributional\"} (or \\code{\"auxiliary\"}), components like\n\\code{sigma}, \\code{dispersion}, \\code{beta} or \\code{precision} (and other auxiliary\nparameters) are returned.\n}}\n\n\\item{flatten}{Logical, if \\code{TRUE}, the values are returned as character\nvector, not as list. Duplicated values are removed.}\n}\n\\value{\nObjects suitable for internal 'marginaleffects' functions to proceed.\nSee \\code{\\link[marginaleffects:get_coef]{marginaleffects::get_coef()}}, \\code{\\link[marginaleffects:set_coef]{marginaleffects::set_coef()}},\n\\code{\\link[marginaleffects:get_vcov]{marginaleffects::get_vcov()}}, \\code{\\link[marginaleffects:get_predict]{marginaleffects::get_predict()}},\n\\code{\\link[insight:get_data]{insight::get_data()}} and \\code{\\link[insight:find_predictors]{insight::find_predictors()}} for details\n}\n\\description{\nHelper functions for \\pkg{marginaleffects} calculations in \\pkg{mvgam} models\n\nFunctions needed for working with \\pkg{marginaleffects}\n\nFunctions needed for getting data / objects with \\pkg{insight}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_residcor-class.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_residcor-class.R\n\\name{mvgam_residcor-class}\n\\alias{mvgam_residcor-class}\n\\title{\\code{mvgam_residcor} object description}\n\\value{\nObjects of this class are structured as a \\code{list} with the following components:\n\n\\item{cor, cor_lower, cor_upper}{A set of \\eqn{p \\times p} correlation matrices,\ncontaining either the posterior median or mean estimate, plus lower and upper limits\nof the corresponding credible intervals supplied to \\code{probs}}\n\\item{sig_cor}{A \\eqn{p \\times p} correlation matrix containing only those correlations whose credible\ninterval does not contain zero. All other correlations are set to zero}\n\\item{prec, prec_lower, prec_upper}{A set of \\eqn{p \\times p} precision matrices,\ncontaining either the posterior median or mean estimate, plus lower and upper limits\nof the corresponding credible intervals supplied to \\code{probs}}\n\\item{sig_prec}{A \\eqn{p \\times p} precision matrix containing only those precisions whose credible\ninterval does not contain zero. All other precisions are set to zero}\n\\item{cov}{A \\eqn{p \\times p} posterior median or mean covariance matrix}\n\\item{trace}{The median/mean point estimator of the trace (sum of the diagonal elements)\nof the residual covariance matrix \\code{cov}}\n}\n\\description{\nA \\code{mvgam_residcor} object returned by function \\code{\\link[=residual_cor]{residual_cor()}}.\nRun \\code{methods(class = \"mvgam_residcor\")} to see an overview of available methods.\n}\n\\details{\nHui (2016) provides an excellent description of the quantities that this function calculates, so this passage\nis heavily paraphrased from his associated \\pkg{boral} package.\n\nIn latent factor models, the residual covariance matrix is calculated\nbased on the matrix of latent factor loading matrix \\eqn{\\Theta}, where the residual covariance\nmatrix \\eqn{\\Sigma = \\Theta\\Theta'}. A strong residual covariance/correlation matrix\nbetween two species can be interpreted as evidence of species interactions (e.g.,\nfacilitation or competition),\nmissing covariates, as well as any additional species correlation not accounted for by shared\nenvironmental captured in \\code{formula}.\n\nThe residual precision matrix (also known as partial correlation matrix, Ovaskainen et al., 2016)\nis defined as the inverse of the residual correlation matrix. The precision matrix is often used to\nidentify direct or causal relationships between two species e.g., two species can have a zero\nprecision but still be correlated, which can be interpreted as saying that two species are not\ndirectly associated, but they are still correlated \\emph{through} other species. In other words, they\nare conditionally independent given the other species. It is important that the precision matrix\ndoes not exhibit the exact same properties of the correlation e.g., the diagonal elements are\nnot equal to 1. Nevertheless, relatively larger values of precision may imply stronger\ndirect relationships between two species.\n\nIn addition to the residual correlation and precision matrices, the median or mean point estimator\nof trace of the residual covariance matrix is returned,\n\\eqn{\\sum\\limits_{j=1}^p [\\Theta\\Theta']_{jj}}. Often used in other areas of multivariate\nstatistics, the trace may be interpreted as the amount of covariation explained by the latent factors.\nOne situation where the trace may be useful is when comparing a pure latent factor model\n(where no terms are suppled to \\code{formula}) versus a model with latent\nfactors and some additional predictors in \\code{formula} -- the proportional difference in trace\nbetween these two models may be interpreted as the proportion of covariation between species explained\nby the predictors in \\code{formula}. Of course, the trace itself is random due to the MCMC sampling, and so it\nis not always guaranteed to produce sensible answers.\n}\n\\references{\nFrancis KC Hui (2016). BORAL - Bayesian ordination and regression analysis of\nmultivariate abundance data in R. Methods in Ecology and Evolution. 7, 744-750.\n\\cr\n\\cr\nOtso Ovaskainen et al. (2016). Using latent variable models to identify large networks of\nspecies-to-species associations at different spatial scales. Methods in Ecology and Evolution,\n7, 549-555.\n}\n\\seealso{\n\\code{\\link[=jsdgam]{jsdgam()}}, \\code{\\link[=residual_cor]{residual_cor()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/mvgam_trends.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/trends.R\n\\name{mvgam_trends}\n\\alias{mvgam_trends}\n\\title{Supported latent trend models in \\pkg{mvgam}}\n\\description{\nSupported latent trend models in \\pkg{mvgam}\n}\n\\details{\n\\code{mvgam} currently supports the following dynamic trend models:\n\\itemize{\n\\item \\code{None} (no latent trend component; i.e. the GAM component is all\nthat contributes to the linear predictor, and the observation process is\nthe only source of error; similar to what is estimated by\n\\code{\\link[mgcv]{gam}})\n\\item \\code{ZMVN()} (zero-mean correlated errors, useful for modelling time\nseries where no autoregressive terms are needed or for modelling data\nthat are not sampled as time series)\n\\item \\code{RW()}\n\\item \\verb{AR(p = 1, 2, or 3)}\n\\item \\code{CAR(p = 1)} (continuous time autoregressive trends; only available\nin \\code{Stan})\n\\item \\code{VAR()} (only available in \\code{Stan})\n\\item \\code{PW()} (piecewise linear or logistic trends; only available in\n\\code{Stan})\n\\item \\code{GP()} (Gaussian Process with squared exponential kernel; only\navailable in \\code{Stan})\n}\n\nFor most dynamic trend types available in \\code{mvgam} (see argument\n\\code{trend_model}), time should be measured in discrete, regularly spaced\nintervals (i.e. \\code{c(1, 2, 3, ...)}). However, you can use irregularly spaced\nintervals if using \\code{trend_model = CAR(1)}, though note that any temporal\nintervals that are exactly \\code{0} will be adjusted to a very small number\n(\\code{1e-12}) to prevent sampling errors.\n\nFor all autoregressive trend types apart from \\code{CAR()}, moving average and/or\ncorrelated process error terms can also be estimated (for example,\n\\code{RW(cor = TRUE)} will set up a multivariate Random Walk if \\code{data} contains\n\\verb{>1} series). Hierarchical process error correlations can also be handled if\nthe data contain relevant observation units that are nested into relevant\ngrouping and subgrouping levels (i.e. using\n\\code{AR(gr = region, subgr = species)}).\n\nNote that only \\code{RW}, \\code{AR1}, \\code{AR2} and \\code{AR3} are available if using \\code{JAGS}.\nAll trend models are supported if using \\code{Stan}.\n\nDynamic factor models can be used in which the latent factors evolve as\neither \\code{RW}, \\code{AR1-3}, \\code{VAR} or \\code{GP}. For \\code{VAR} models (i.e. \\code{VAR} and\n\\code{VARcor} models), users can either fix the trend error covariances to be \\code{0}\n(using \\code{VAR}) or estimate them and potentially allow for contemporaneously\ncorrelated errors using \\code{VARcor}.\n\nFor all \\code{VAR} models, stationarity of the latent process is enforced through\nthe prior using the parameterisation given by Heaps (2022). Stationarity is\nnot enforced when using \\code{AR1}, \\code{AR2} or \\code{AR3} models, though this can be\nchanged by the user by specifying lower and upper bounds on autoregressive\nparameters using functionality in \\link{get_mvgam_priors} and the \\code{priors}\nargument in \\link{mvgam}.\n\nPiecewise trends follow the formulation in the popular \\code{prophet} package\nproduced by \\code{Facebook}, where users can allow for changepoints to control\nthe potential flexibility of the trend. See Taylor and Letham (2018) for\ndetails.\n}\n\\references{\nSarah E. Heaps (2022) Enforcing stationarity through the prior in Vector\nAutoregressions. Journal of Computational and Graphical Statistics. 32:1,\n1–10.\n\nSean J. Taylor and Benjamin Letham (2018) Forecasting at scale. The American\nStatistician 72.1, 37–45.\n}\n\\seealso{\n\\code{\\link{RW}},\n\\code{\\link{AR}},\n\\code{\\link{CAR}},\n\\code{\\link{VAR}},\n\\code{\\link{PW}},\n\\code{\\link{GP}},\n\\code{\\link{ZMVN}}\n}\n"
  },
  {
    "path": "man/mvgam_use_cases.Rd",
    "content": "\\name{mvgam_use_cases}\n\\alias{mvgam_use_cases}\n\\title{Example use cases for \\pkg{mvgam}}\n\\description{\n\\pkg{mvgam} is a package for fitting dynamic generalized additive models (GAMs) to univariate or multivariate data. It combines the flexibility of smooth functions with latent temporal processes to model autocorrelation, seasonality, and uncertainty. The package supports both univariate and multivariate time series, making it especially useful for ecological and environmental forecasting. Bayesian inference via Stan allows for full uncertainty quantification and forecasting in complex, non-Gaussian settings.\n\nThis help page provides external links to example applications and discussions relevant to the use of \\pkg{mvgam} models. These examples span non-Gaussian time series modelling, multivariate abundance forecasting, and the use of complex predictors such as time-varying seasonality, monotonic nonlinear effects and Gaussian processes.\n}\n\\details{\n\\strong{Non-Gaussian time series modelling and forecasting}\n\n\\pkg{mvgam} is designed for real-world time series data that include discrete, zero-inflated, or overdispersed observations. It supports latent dynamic components and smooth terms to model autocorrelation, trends, and uncertainty.\n\n\\itemize{\n  \\item \\href{https://stats.stackexchange.com/questions/657495}{Uncertain serial autocorrelation in GAM count model residuals}\n  \\item \\href{https://discourse.mc-stan.org/t/fitting-an-autoregressive-model-and-poisson-process-interdependently/37268}{Fitting an autoregressive model and Poisson process interdependently}\n  \\item \\href{https://stats.stackexchange.com/questions/652174}{Cyclical residual patterns and variable selection in GAMs}\n  \\item \\href{https://stats.stackexchange.com/questions/437125}{Causality between two binary time series}\n  \\item \\href{https://stats.stackexchange.com/questions/285100}{Logistic regression on time series data}\n  \\item \\href{https://discourse.mc-stan.org/t/autocorrelation-for-unevenly-spaced-time-series/10001}{Autocorrelation for unevenly spaced time series}\n  \\item \\href{https://stats.stackexchange.com/questions/664160}{Visualising autocorrelation in irregularly spaced count data}\n  \\item \\href{https://ecogambler.netlify.app/blog/vector-autoregressions/}{Blog post: State-Space Vector Autoregressions in \\code{mvgam}}\n  \\item \\href{https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html}{Vignette: State-Space models in \\code{mvgam}}\n  \\item \\href{https://www.youtube.com/watch?v=0zZopLlomsQ&t=4s}{Video tutorial: Ecological forecasting with Dynamic Generalized Additive Models}\n}\n\n\\strong{Multivariate time series modelling and forecasting}\n\n\\pkg{mvgam} supports multivariate models with shared or correlated latent trends, making it suitable for a broad range of applications that gather data on multiple time series simultaneously.\n\n\\itemize{\n  \\item \\href{https://stats.stackexchange.com/questions/172645}{Ecological modelling: multivariate abundance time-series data}\n  \\item \\href{https://discourse.mc-stan.org/t/account-for-relationships-between-species-in-a-multivariate-brms-model/32566}{Relationships between species in multivariate models}\n  \\item \\href{https://discourse.mc-stan.org/t/confirmatory-factor-analysis-using-brms/23139}{Confirmatory factor analysis using \\code{brms}}\n  \\item \\href{https://discourse.mc-stan.org/t/chains-stuck-in-a-local-optimum-correlated-poisson-distributions/37414}{Chains stuck in a local optimum: correlated Poisson distributions}\n  \\item \\href{https://ecogambler.netlify.app/blog/distributed-lags-mgcv/}{Blog post: Hierarchical distributed lag models in \\code{mgcv} and \\code{mvgam}}\n  \\item \\href{https://nicholasjclark.github.io/mvgam/articles/shared_states.html}{Vignette: Multivariate series with shared latent states}\n  \\item \\href{https://www.youtube.com/watch?v=2POK_FVwCHk}{Video tutorial: Time series in R and Stan using the \\code{mvgam} package: hierarchical GAMs}\n}\n\n\\strong{Seasonality and other complex predictors}\n\n\\pkg{mvgam} allows for flexible modelling of seasonal patterns and nonlinear effects using cyclic smooths, Gaussian processes, monotonic smooths and hierarchical structures.\n\n\\itemize{\n  \\item \\href{https://stats.stackexchange.com/questions/478384}{Gaussian process smoothers (\\code{bs = \"gp\"}) in GAMs}\n  \\item \\href{https://stats.stackexchange.com/questions/612312}{Fitting a GAM with double seasonality to a daily time series}\n  \\item \\href{https://stats.stackexchange.com/questions/648143}{Simulating time series with different seasonal effects}\n  \\item \\href{https://discourse.mc-stan.org/t/adding-time-as-monotne-predictor/37109}{Adding time as a monotone predictor}\n  \\item \\href{https://ecogambler.netlify.app/blog/time-varying-seasonality/}{Blog post: Incorporating time-varying seasonality in forecast models}\n  \\item \\href{https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html}{Vignette: Time-varying effects in \\code{mvgam}}\n  \\item \\href{https://www.youtube.com/watch?v=fzPJUW8x6DU}{Video tutorial: Time series in R and Stan using the \\code{mvgam} package: an introduction}\n}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/ordinate.jsdgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/ordinate.jsdgam.R\n\\name{ordinate.jsdgam}\n\\alias{ordinate.jsdgam}\n\\alias{ordinate}\n\\title{Latent variable ordination plots from jsdgam objects}\n\\usage{\nordinate(object, ...)\n\n\\method{ordinate}{jsdgam}(\n  object,\n  which_lvs = c(1, 2),\n  biplot = TRUE,\n  alpha = 0.5,\n  label_sites = TRUE,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{jsdgam} resulting from a\ncall to \\code{\\link[=jsdgam]{jsdgam()}}}\n\n\\item{...}{ignored}\n\n\\item{which_lvs}{A \\code{vector} of indices indicating the two latent variables\nto be plotted (if number of the latent variables specified in the model\nwas more than 2). Defaults to \\code{c(1, 2)}}\n\n\\item{biplot}{\\code{Logical}. If \\code{TRUE}, both the site and the species scores\nwill be plotted, with names for the taxa interpreted based on the\n\\code{species} argument in the original call to \\code{\\link[=jsdgam]{jsdgam()}}. If \\code{FALSE}, only\nthe site scores will be plotted}\n\n\\item{alpha}{A proportional numeric scalar between \\code{0} and \\code{1} that\ncontrols the relative scaling of the latent variables and their loading\ncoefficients}\n\n\\item{label_sites}{\\code{Logical} flag. If \\code{TRUE}, site scores will be\nplotted as labels using names based on the \\code{unit} argument in the\noriginal call to \\code{\\link[=jsdgam]{jsdgam()}}. If \\code{FALSE}, site scores will be shown as\npoints only}\n}\n\\value{\nAn \\code{ggplot} object\n}\n\\description{\nPlot an ordination of latent variables and their factor loadings from\n\\code{jsdgam} models\n}\n\\details{\nThis function constructs a two-dimensional scatterplot in ordination space.\nThe chosen latent variables are first re-rotated using singular value\ndecomposition, so that the first plotted latent variable does not have to\nbe the first latent variable that was estimated in the original model.\nPosterior median estimates of the variables and the species' loadings on\nthese variables are then used to construct the resulting plot. Some attempt\nat de-cluttering the resulting plot is made by using \\code{geom_label_repel()}\nand \\code{geom_text_repel} from the \\pkg{ggrepel} package, but if there are many\nsites and/or species then some labels may be removed automatically. Note\nthat you can typically get better, more readable plot layouts if you also\nhave the \\pkg{ggarrow} and \\pkg{ggpp} packages installed\n}\n\\examples{\n\\dontrun{\n# Fit a JSDGAM to the portal_data captures\nmod <- jsdgam(\n  formula = captures ~\n    # Fixed effects of NDVI and mintemp, row effect as a GP of time\n    ndvi_ma12:series + mintemp:series + gp(time, k = 15),\n  factor_formula = ~ -1,\n  data = portal_data,\n  unit = time,\n  species = series,\n  family = poisson(),\n  n_lv = 2,\n  silent = 2,\n  chains = 2\n)\n\n# Plot a residual ordination biplot\nordinate(\n  mod,\n  alpha = 0.7\n)\n\n# Compare to a residual correlation plot\nplot(\n  residual_cor(mod)\n)\n}\n\n}\n\\seealso{\n\\code{\\link[=jsdgam]{jsdgam()}}, \\code{\\link[=residual_cor]{residual_cor()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/pairs.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/pairs.mvgam.R\n\\name{pairs.mvgam}\n\\alias{pairs.mvgam}\n\\title{Create a matrix of output plots from a \\code{mvgam} object}\n\\usage{\n\\method{pairs}{mvgam}(x, variable = NULL, regex = FALSE, use_alias = TRUE, ...)\n}\n\\arguments{\n\\item{x}{An object of class \\code{mvgam} or \\code{jsdgam}}\n\n\\item{variable}{Names of the variables (parameters) to plot, as given by a\ncharacter vector or a regular expression (if \\code{regex = TRUE}). By\ndefault, a hopefully not too large selection of variables is plotted.}\n\n\\item{regex}{Logical; Indicates whether \\code{variable} should\nbe treated as regular expressions. Defaults to \\code{FALSE}.}\n\n\\item{use_alias}{Logical. If more informative names for parameters are\navailable (i.e. for beta coefficients \\code{b} or for smoothing parameters \\code{rho}),\nreplace the uninformative names with the more informative alias. Defaults to\n\\code{TRUE}.}\n\n\\item{...}{Further arguments to be passed to\n\\code{\\link[bayesplot:MCMC-scatterplots]{mcmc_pairs}}.}\n}\n\\value{\nPlottable objects whose classes depend on the arguments supplied.\nSee \\code{\\link[bayesplot:MCMC-scatterplots]{mcmc_pairs}} for details.\n}\n\\description{\nA \\code{\\link[graphics:pairs]{pairs}}\nmethod that is customized for MCMC output.\n}\n\\details{\nFor a detailed description see\n\\code{\\link[bayesplot:MCMC-scatterplots]{mcmc_pairs}}.\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(n_series = 1, trend_model = 'AR1')\nmod <- mvgam(y ~ s(season, bs = 'cc'),\n             trend_model = AR(),\n             noncentred = TRUE,\n             data = simdat$data_train,\n             chains = 2)\npairs(mod)\npairs(mod, variable = c('ar1', 'sigma'), regex = TRUE)\n}\n\n}\n"
  },
  {
    "path": "man/piecewise_trends.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_trend_types.R\n\\name{PW}\n\\alias{PW}\n\\title{Specify piecewise linear or logistic trends in \\pkg{mvgam} models}\n\\usage{\nPW(\n  n_changepoints = 10,\n  changepoint_range = 0.8,\n  changepoint_scale = 0.05,\n  growth = \"linear\"\n)\n}\n\\arguments{\n\\item{n_changepoints}{A non-negative integer specifying the number of\npotential changepoints. Potential changepoints are selected uniformly from\nthe first \\code{changepoint_range} proportion of timepoints in \\code{data}.\nDefault is \\code{10}.}\n\n\\item{changepoint_range}{Proportion of history in \\code{data} in which trend\nchangepoints will be estimated. Defaults to \\code{0.8} for the first 80\\%.}\n\n\\item{changepoint_scale}{Parameter modulating the flexibility of the\nautomatic changepoint selection by altering the scale parameter of a\nLaplace distribution. The resulting prior will be\n\\code{double_exponential(0, changepoint_scale)}. Large values will allow many\nchangepoints and a more flexible trend, while small values will allow few\nchangepoints. Default is \\code{0.05}.}\n\n\\item{growth}{Character string specifying either \\code{'linear'} or \\code{'logistic'}\ngrowth of the trend. If \\code{'logistic'}, a variable labelled \\code{cap} MUST be in\n\\code{data} to specify the maximum saturation point for the trend (see\ndetails and examples in \\code{\\link{mvgam}} for more information). Default\nis \\code{'linear'}.}\n}\n\\value{\nAn object of class \\code{mvgam_trend}, which contains a list of\narguments to be interpreted by the parsing functions in \\code{mvgam}.\n}\n\\description{\nSet up piecewise linear or logistic trend models in \\code{mvgam}. These\nfunctions do not evaluate their arguments – they exist purely to help set up\na model with particular piecewise trend models.\n}\n\\details{\n\\emph{Offsets and intercepts}:\nFor each of these trend models, an offset parameter is included in the trend\nestimation process. This parameter will be incredibly difficult to identify\nif you also include an intercept in the observation formula. For that\nreason, it is highly recommended that you drop the intercept from the\nformula (i.e. \\code{y ~ x + 0} or \\code{y ~ x - 1}, where \\code{x} are your optional\npredictor terms).\n\n\\emph{Logistic growth and the cap variable}:\nWhen forecasting growth, there is often some maximum achievable point that a\ntime series can reach. For example, total market size, total population size\nor carrying capacity in population dynamics. It can be advantageous for the\nforecast to saturate at or near this point so that predictions are more\nsensible.\n\nThis function allows you to make forecasts using a logistic growth trend\nmodel, with a specified carrying capacity. Note that this capacity does not\nneed to be static over time; it can vary with each series × timepoint\ncombination if necessary. But you must supply a \\code{cap} value for each\nobservation in the data when using \\code{growth = 'logistic'}.\n\nFor observation families that use a non-identity link function, the \\code{cap}\nvalue will be internally transformed to the link scale (i.e. your specified\n\\code{cap} will be log-transformed if you are using a \\code{poisson()} or \\code{nb()}\nfamily). It is therefore important that you specify the \\code{cap} values on the\nscale of your outcome. Note also that no missing values are allowed in\n\\code{cap}.\n}\n\\examples{\n\\dontrun{\n# Example of logistic growth with possible changepoints\ndNt = function(r, N, k) {\n  r * N * (k - N)\n}\n\nNt = function(r, N, t, k) {\n  for (i in 1:(t - 1)) {\n    if (i \\%in\\% c(5, 15, 25, 41, 45, 60, 80)) {\n      N[i + 1] <- max(\n        1,\n        N[i] + dNt(r + runif(1, -0.1, 0.1), N[i], k)\n      )\n    } else {\n      N[i + 1] <- max(1, N[i] + dNt(r, N[i], k))\n    }\n  }\n  N\n}\n\nset.seed(11)\nexpected <- Nt(0.004, 2, 100, 30)\nplot(expected, xlab = 'Time')\n\ny <- rpois(100, expected)\nplot(y, xlab = 'Time')\n\nmod_data <- data.frame(\n  y = y,\n  time = 1:100,\n  cap = 35,\n  series = as.factor('series_1')\n)\nplot_mvgam_series(data = mod_data)\n\nmod <- mvgam(\n  y ~ 0,\n  trend_model = PW(growth = 'logistic'),\n  family = poisson(),\n  data = mod_data,\n  chains = 2,\n  silent = 2\n)\nsummary(mod)\n\nhc <- hindcast(mod)\nplot(hc)\n\nlibrary(ggplot2)\nmcmc_plot(mod, variable = 'delta_trend', regex = TRUE) +\n  scale_y_discrete(labels = mod$trend_model$changepoints) +\n  labs(\n    y = 'Potential changepoint',\n    x = 'Rate change'\n  )\n\nhow_to_cite(mod)\n}\n\n}\n\\references{\nTaylor, Sean J., and Benjamin Letham. \"Forecasting at scale.\"\nThe American Statistician 72.1 (2018): 37–45.\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/pipe.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/utils-pipe.R\n\\name{\\%>\\%}\n\\alias{\\%>\\%}\n\\title{Pipe operator}\n\\usage{\nlhs \\%>\\% rhs\n}\n\\arguments{\n\\item{lhs}{A value or the magrittr placeholder.}\n\n\\item{rhs}{A function call using the magrittr semantics.}\n}\n\\value{\nThe result of calling \\code{rhs(lhs)}.\n}\n\\description{\nSee \\code{magrittr::\\link[magrittr:pipe]{\\%>\\%}} for details.\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/plot.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot.mvgam.R\n\\name{plot.mvgam}\n\\alias{plot.mvgam}\n\\title{Default plots for \\pkg{mvgam} models}\n\\usage{\n\\method{plot}{mvgam}(\n  x,\n  type = \"residuals\",\n  series = 1,\n  residuals = FALSE,\n  newdata,\n  data_test,\n  trend_effects = FALSE,\n  ...\n)\n}\n\\arguments{\n\\item{x}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{type}{\\code{character} specifying which type of plot to return.\nOptions are: \\code{\"series\"}, \\code{\"residuals\"}, \\code{\"smooths\"}, \\code{\"re\"} (random effect smooths),\n\\code{\"pterms\"} (parametric effects), \\code{\"forecast\"}, \\code{\"trend\"}, \\code{\"uncertainty\"},\n\\code{\"factors\"}}\n\n\\item{series}{\\code{integer} specifying which series in the set is to be\nplotted. This is ignored if \\code{type == 're'}}\n\n\\item{residuals}{\\code{logical}. If \\code{TRUE} and \\code{type = 'smooths'},\nposterior quantiles of partial residuals are added to plots of 1-D\nsmooths as a series of ribbon rectangles. Partial residuals for a\nsmooth term are the median Dunn-Smyth residuals that would be obtained\nby dropping the term concerned from the model, while leaving all other\nestimates fixed (i.e. the estimates for the term plus the original\nmedian Dunn-Smyth residuals). Note that because \\code{mvgam} works with\nDunn-Smyth residuals and not working residuals, which are used by\n\\code{mgcv}, the magnitudes of partial residuals will be different to\nwhat you would expect from \\code{\\link[mgcv]{plot.gam}}. Interpretation\nis similar though, as these partial residuals should be evenly scattered\naround the smooth function if the function is well estimated}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining at least 'series' and 'time' in addition to any other\nvariables included in the linear predictor of the original\n\\code{formula}. This argument is optional when plotting out of sample\nforecast period observations (when \\code{type = forecast}) and required\nwhen plotting uncertainty components (\\code{type = uncertainty}).}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{trend_effects}{logical. If \\code{TRUE} and a \\code{trend_formula} was used in\nmodel fitting, terms from the trend (i.e. process) model will be plotted}\n\n\\item{...}{Additional arguments for each individual plotting function.}\n}\n\\value{\nA base R plot or set of plots\n}\n\\description{\nThis function takes a fitted \\code{mvgam} object and produces plots of\nsmooth functions, forecasts, trends and uncertainty components\n}\n\\details{\nThese plots are useful for getting an overview of the fitted\nmodel and its estimated random effects or smooth functions, but the\nindividual plotting functions and the functions from the \\code{marginaleffects}\nand \\code{gratia} packages offer far more customisation.\n}\n\\examples{\n\\dontrun{\n# Simulate some time series\ndat <- sim_mvgam(\n  T = 80,\n  n_series = 3\n)\n\n# Fit a basic model\nmod <- mvgam(\n  y ~ s(season, bs = 'cc') + s(series, bs = 're'),\n  data = dat$data_train,\n  trend_model = RW(),\n  chains = 2,\n  silent = 2\n)\n\n# Plot predictions and residuals for each series\nplot(mod, type = 'forecast', series = 1)\nplot(mod, type = 'forecast', series = 2)\nplot(mod, type = 'forecast', series = 3)\nplot(mod, type = 'residuals', series = 1)\nplot(mod, type = 'residuals', series = 2)\nplot(mod, type = 'residuals', series = 3)\n\n# Plot model effects\nplot(mod, type = 'smooths')\nplot(mod, type = 're')\n\n# More flexible plots with 'marginaleffects' utilities\nlibrary(marginaleffects)\n\nplot_predictions(\n  mod,\n  condition = 'season',\n  type = 'link'\n)\n\nplot_predictions(\n  mod,\n  condition = c('season', 'series', 'series'),\n  type = 'link'\n)\n\nplot_predictions(\n  mod,\n  condition = 'series',\n  type = 'link'\n)\n\n# When using a State-Space model with predictors on the process\n# model, set trend_effects = TRUE to visualise process effects\nmod <- mvgam(\n  y ~ -1,\n  trend_formula = ~ s(season, bs = 'cc'),\n  data = dat$data_train,\n  trend_model = RW(),\n  chains = 2,\n  silent = 2\n)\n\nplot(mod, type = 'smooths', trend_effects = TRUE)\n\n# But 'marginaleffects' functions work without any modification\nplot_predictions(\n  mod,\n  condition = 'season',\n  type = 'link'\n)\n}\n\n}\n\\seealso{\n\\code{\\link{plot_mvgam_resids}},\n\\code{\\link{plot_mvgam_smooth}},\n\\code{\\link{plot_mvgam_fc}},\n\\code{\\link{plot_mvgam_trend}},\n\\code{\\link{plot_mvgam_uncertainty}},\n\\code{\\link{plot_mvgam_factors}},\n\\code{\\link{plot_mvgam_randomeffects}},\n\\code{\\link{conditional_effects.mvgam}},\n\\code{\\link[marginaleffects]{plot_predictions}},\n\\code{\\link[marginaleffects]{plot_slopes}},\n\\code{\\link{gratia_mvgam_enhancements}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot.mvgam_fevd.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_fevd-class.R\n\\name{plot.mvgam_fevd}\n\\alias{plot.mvgam_fevd}\n\\title{Plot forecast error variance decompositions from an \\code{mvgam_fevd} object}\n\\usage{\n\\method{plot}{mvgam_fevd}(x, ...)\n}\n\\arguments{\n\\item{x}{\\code{list} object of class \\code{mvgam_fevd}. See \\code{\\link[=fevd]{fevd()}}}\n\n\\item{...}{ignored}\n}\n\\value{\nA \\code{\\link[ggplot2]{ggplot}} object,\nwhich can be further customized using the \\pkg{ggplot2} package\n}\n\\description{\nThis function takes an \\code{mvgam_fevd} object and produces\na plot of the posterior median contributions to forecast variance for each series\nin the fitted Vector Autoregression\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot.mvgam_irf.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_irf-class.R\n\\name{plot.mvgam_irf}\n\\alias{plot.mvgam_irf}\n\\title{Plot impulse responses from an \\code{mvgam_irf} object}\n\\usage{\n\\method{plot}{mvgam_irf}(x, series = 1, ...)\n}\n\\arguments{\n\\item{x}{\\code{list} object of class \\code{mvgam_irf}. See \\code{\\link[=irf]{irf()}}}\n\n\\item{series}{\\code{integer} specifying which process series should be\ngiven the shock}\n\n\\item{...}{ignored}\n}\n\\value{\nA \\code{ggplot} object showing the expected response of each latent time\nseries to a shock of the focal \\code{series}\n}\n\\description{\nThis function takes an \\code{mvgam_irf} object and produces plots of\nImpulse Response Functions\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot.mvgam_lfo.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/lfo_cv.mvgam.R\n\\name{plot.mvgam_lfo}\n\\alias{plot.mvgam_lfo}\n\\title{Plot Pareto-k and ELPD values from a \\code{mvgam_lfo} object}\n\\usage{\n\\method{plot}{mvgam_lfo}(x, ...)\n}\n\\arguments{\n\\item{x}{An object of class \\code{mvgam_lfo}}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{ggplot} object presenting Pareto-k and ELPD values over the\nevaluation timepoints. For the Pareto-k plot, a dashed red line indicates the\nspecified threshold chosen for triggering model refits. For the ELPD plot,\na dashed red line indicates the bottom 10\\% quantile of ELPD values. Points below\nthis threshold may represent outliers that were more difficult to forecast\n}\n\\description{\nThis function takes an object of class \\code{mvgam_lfo} and creates several\ninformative diagnostic plots\n}\n"
  },
  {
    "path": "man/plot.mvgam_residcor.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_residcor-class.R\n\\name{plot.mvgam_residcor}\n\\alias{plot.mvgam_residcor}\n\\title{Plot residual correlations based on latent factors}\n\\usage{\n\\method{plot}{mvgam_residcor}(x, cluster = FALSE, ...)\n}\n\\arguments{\n\\item{x}{\\code{list} object of class \\code{mvgam_residcor} resulting from a\ncall to \\code{residual_cor(..., summary = TRUE)}}\n\n\\item{cluster}{Logical. Should the variables be re-arranged within the plot\nto group the correlation matrix into clusters of positive and negative correlations?\nDefaults to \\code{FALSE}}\n\n\\item{...}{ignored}\n}\n\\value{\nA \\code{ggplot} object\n}\n\\description{\nPlot residual correlation estimates from Joint Species Distribution\n(\\code{jsdgam}) or dynamic factor (\\code{mvgam}) models\n}\n\\details{\nThis function plots the significant residual correlations from a\n\\code{mvgam_residcor} object, whereby the posterior mean (if \\code{robust = FALSE})\nor posterior median (if \\code{robust = TRUE}) correlations are shown\nonly those correlations whose credible interval does not contain zero. All other\ncorrelations are set to zero in the returned plot\n}\n\\seealso{\n\\code{\\link[=jsdgam]{jsdgam()}}, \\code{\\link[=lv_correlations]{lv_correlations()}}, \\code{\\link[=residual_cor]{residual_cor()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot_mvgam_factors.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_factors.R\n\\name{plot_mvgam_factors}\n\\alias{plot_mvgam_factors}\n\\title{Latent factor summaries for a fitted \\pkg{mvgam} object}\n\\usage{\nplot_mvgam_factors(object, plot = TRUE)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{plot}{\\code{logical} specifying whether factors should be plotted}\n}\n\\value{\nA \\code{data.frame} of factor contributions\n}\n\\description{\nThis function takes a fitted \\code{mvgam} object and returns plots and\nsummary statistics for the latent dynamic factors\n}\n\\details{\nIf the model in \\code{object} was estimated using dynamic factors,\nit is possible that not all factors contributed to the estimated trends.\nThis is due to the regularisation penalty that acts independently on each\nfactor's Gaussian precision, which will squeeze un-needed factors to a\nwhite noise process (effectively dropping that factor from the model). In\nthis function, each factor is tested against a null hypothesis of white\nnoise by calculating the sum of the factor's 2nd derivatives. A factor\nthat has a larger contribution will have a larger sum due to the weaker\npenalty on the factor's precision. If \\code{plot == TRUE}, the factors\nare also plotted.\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam()\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  trend_model = AR(),\n  use_lv = TRUE,\n  n_lv = 2,\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\nplot_mvgam_factors(mod)\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot_mvgam_forecasts.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_fc.R\n\\name{plot_mvgam_forecasts}\n\\alias{plot_mvgam_forecasts}\n\\alias{plot_mvgam_fc}\n\\alias{plot.mvgam_forecast}\n\\title{Plot posterior forecast predictions from \\pkg{mvgam} models}\n\\usage{\nplot_mvgam_fc(\n  object,\n  series = 1,\n  newdata,\n  data_test,\n  realisations = FALSE,\n  n_realisations = 15,\n  hide_xlabels = FALSE,\n  xlab,\n  ylab,\n  ylim,\n  n_cores = 1,\n  return_forecasts = FALSE,\n  return_score = FALSE,\n  ...\n)\n\n\\method{plot}{mvgam_forecast}(\n  x,\n  series = 1,\n  realisations = FALSE,\n  n_realisations = 15,\n  xlab,\n  ylab,\n  ylim,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{series}{\\code{integer} specifying which series in the set is to be\nplotted}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining at least 'series' and 'time' in addition to any other\nvariables included in the linear predictor of the original\n\\code{formula}. If included, the covariate information in \\code{newdata}\nwill be used to generate forecasts from the fitted model equations. If\nthis same \\code{newdata} was originally included in the call to\n\\code{mvgam}, then forecasts have already been produced by the generative\nmodel and these will simply be extracted and plotted. However if no\n\\code{newdata} was supplied to the original model call, an assumption is\nmade that the \\code{newdata} supplied here comes sequentially after the\ndata supplied as \\code{data} in the original model (i.e. we assume there\nis no time gap between the last observation of series 1 in \\code{data}\nand the first observation for series 1 in \\code{newdata}). If\n\\code{newdata} contains observations in column \\code{y}, these\nobservations will be used to compute a Discrete Rank Probability Score\nfor the forecast distribution}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{realisations}{\\code{logical}. If \\code{TRUE}, forecast realisations\nare shown as a spaghetti plot, making it easier to visualise the\ndiversity of possible forecasts. If \\code{FALSE}, the default, empirical\nquantiles of the forecast distribution are shown}\n\n\\item{n_realisations}{\\code{integer} specifying the number of posterior\nrealisations to plot, if \\code{realisations = TRUE}. Ignored otherwise}\n\n\\item{hide_xlabels}{\\code{logical}. If \\code{TRUE}, no xlabels are printed\nto allow the user to add custom labels using \\code{axis} from base\n\\code{R}}\n\n\\item{xlab}{Label for x axis}\n\n\\item{ylab}{Label for y axis}\n\n\\item{ylim}{Optional \\code{vector} of y-axis limits (min, max)}\n\n\\item{n_cores}{\\code{integer} specifying number of cores for generating\nforecasts in parallel}\n\n\\item{return_forecasts}{\\code{logical}. If \\code{TRUE}, the function will\nplot the forecast as well as returning the forecast object (as a\n\\code{matrix} of dimension \\code{n_samples} x \\code{horizon})}\n\n\\item{return_score}{\\code{logical}. If \\code{TRUE} and out of sample test\ndata is provided as \\code{newdata}, a probabilistic score will be\ncalculated and returned. The score used will depend on the observation\nfamily from the fitted model. Discrete families (\\code{poisson},\n\\code{negative binomial}, \\code{tweedie}) use the Discrete Rank\nProbability Score. Other families use the Continuous Rank Probability\nScore. The value returned is the \\code{sum} of all scores within the out\nof sample forecast horizon}\n\n\\item{...}{Further \\code{\\link[graphics]{par}} graphical parameters}\n\n\\item{x}{Object of class \\code{mvgam_forecast}}\n}\n\\value{\nA base \\code{R} graphics plot (for \\code{plot_mvgam_fc}) or a \\code{ggplot}\nobject (for \\code{plot.mvgam_forecast}) and an optional \\code{list} containing\nthe forecast distribution and the out of sample probabilistic forecast\nscore\n}\n\\description{\nPlot posterior forecast predictions from \\pkg{mvgam} models\n}\n\\details{\n\\code{plot_mvgam_fc} generates posterior predictions from an object of\nclass \\code{mvgam}, calculates posterior empirical quantiles and plots\nthem against the observed data. If \\code{realisations = FALSE}, the returned\nplot shows 90, 60, 40 and 20 percent posterior quantiles (as ribbons of\nincreasingly darker shades of red) as well as the posterior median (as a\ndark red line). If \\code{realisations = TRUE}, a set of \\code{n_realisations}\nposterior draws are shown. This function produces an older style base\n\\code{R} plot, as opposed to \\code{plot.mvgam_forecast}\n\n\\code{plot.mvgam_forecast} takes an object of class \\code{mvgam_forecast}, in which\nforecasts have already been computed, and plots the resulting forecast\ndistribution as a \\code{ggplot} object. This function is therefore more\nversatile and is recommended over the older and clunkier\n\\code{plot_mvgam_fc} version\n\nIf \\code{realisations = FALSE}, these posterior quantiles are plotted\nalong with the true observed data that was used to train the model.\nOtherwise, a spaghetti plot is returned to show possible forecast paths.\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(\n  n_series = 3,\n  trend_model = AR()\n)\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Hindcasts on response scale\nhc <- hindcast(mod)\nstr(hc)\nplot(hc, series = 1)\nplot(hc, series = 2)\nplot(hc, series = 3)\n\n# Forecasts on response scale\nfc <- forecast(\n  mod,\n  newdata = simdat$data_test\n)\nstr(fc)\nplot(fc, series = 1)\nplot(fc, series = 2)\nplot(fc, series = 3)\n\n# Forecasts as expectations\nfc <- forecast(\n  mod,\n  newdata = simdat$data_test,\n  type = 'expected'\n)\nplot(fc, series = 1)\nplot(fc, series = 2)\nplot(fc, series = 3)\n\n# Dynamic trend extrapolations\nfc <- forecast(\n  mod,\n  newdata = simdat$data_test,\n  type = 'trend'\n)\nplot(fc, series = 1)\nplot(fc, series = 2)\nplot(fc, series = 3)\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot_mvgam_pterms.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_pterms.R\n\\name{plot_mvgam_pterms}\n\\alias{plot_mvgam_pterms}\n\\title{Plot parametric term partial effects for \\pkg{mvgam} models}\n\\usage{\nplot_mvgam_pterms(object, trend_effects = FALSE)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{trend_effects}{logical. If \\code{TRUE} and a \\code{trend_formula} was used in\nmodel fitting, terms from the trend (i.e. process) model will be plotted}\n}\n\\value{\nA base \\code{R} graphics plot\n}\n\\description{\nThis function plots posterior empirical quantiles for partial effects of\nparametric terms\n}\n\\details{\nPosterior empirical quantiles of each parametric term's partial\neffect estimates (on the link scale) are calculated and visualised as\nribbon plots. These effects can be interpreted as the partial effect that\na parametric term contributes when all other terms in the model have been\nset to \\code{0}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot_mvgam_randomeffects.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_randomeffects.R\n\\name{plot_mvgam_randomeffects}\n\\alias{plot_mvgam_randomeffects}\n\\title{Plot random effect terms from \\pkg{mvgam} models}\n\\usage{\nplot_mvgam_randomeffects(object, trend_effects = FALSE)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{trend_effects}{logical. If \\code{TRUE} and a \\code{trend_formula} was used in\nmodel fitting, terms from the trend (i.e. process) model will be plotted}\n}\n\\value{\nA base \\code{R} graphics plot\n}\n\\description{\nThis function plots posterior empirical quantiles for random effect\nsmooths (bs = re)\n}\n\\details{\nPosterior empirical quantiles of random effect coefficient\nestimates (on the link scale) are calculated and visualised as ribbon\nplots. Labels for coefficients are taken from the levels of the original\nfactor variable that was used to specify the smooth in the model's\nformula\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot_mvgam_resids.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_resids.R\n\\name{plot_mvgam_resids}\n\\alias{plot_mvgam_resids}\n\\title{Residual diagnostics for a fitted \\pkg{mvgam} object}\n\\usage{\nplot_mvgam_resids(object, series = 1, n_draws = 100L, n_points = 1000L)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{series}{\\code{integer} specifying which series in the set is to be\nplotted}\n\n\\item{n_draws}{\\code{integer} specifying the number of posterior residual\ndraws to use for calculating uncertainty in the \\code{\"ACF\"} and \\code{\"pACF\"} frames.\nDefault is \\code{100}}\n\n\\item{n_points}{\\code{integer} specifying the maximum number of points to\nshow in the \"Resids vs Fitted\" and \"Normal Q-Q Plot\" frames. Default is\n\\code{1000}}\n}\n\\value{\nA facetted \\code{ggplot} object\n}\n\\description{\nThis function takes a fitted \\code{mvgam} object and returns various\nresidual diagnostic plots\n}\n\\details{\nA total of four ggplot plots are generated to examine posterior\nDunn-Smyth residuals for the specified series. Plots include a residuals\nvs fitted values plot, a Q-Q plot, and two plots to check for any\nremaining temporal autocorrelation in the residuals. Note, all plots only\nreport statistics from a sample of up to \\code{100} posterior draws (to save\ncomputational time), so uncertainty in these relationships may not be\nadequately represented.\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(\n  n_series = 3,\n  trend_model = AR()\n)\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Plot Dunn Smyth residuals for some series\nplot_mvgam_resids(mod)\nplot_mvgam_resids(mod, series = 2)\n}\n\n}\n\\author{\nNicholas J Clark\n\nNicholas J Clark and Matthijs Hollanders\n}\n"
  },
  {
    "path": "man/plot_mvgam_series.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_series.R\n\\name{plot_mvgam_series}\n\\alias{plot_mvgam_series}\n\\title{Plot observed time series used for \\pkg{mvgam} modelling}\n\\usage{\nplot_mvgam_series(\n  object,\n  data,\n  newdata,\n  y = \"y\",\n  lines = TRUE,\n  series = 1,\n  n_bins = NULL,\n  log_scale = FALSE\n)\n}\n\\arguments{\n\\item{object}{Optional \\code{list} object returned from \\code{mvgam}. Either\n\\code{object} or \\code{data} must be supplied}\n\n\\item{data}{Optional \\code{data.frame} or \\code{list} of training data\ncontaining at least 'series' and 'time'. Use this argument if training\ndata have been gathered in the correct format for \\code{mvgam} modelling\nbut no model has yet been fitted.}\n\n\\item{newdata}{Optional \\code{data.frame} or \\code{list} of test data\ncontaining at least 'series' and 'time' for the forecast horizon, in\naddition to any other variables included in the linear predictor of\n\\code{formula}. If included, the observed values in the test data are\ncompared to the model's forecast distribution for exploring biases in\nmodel predictions}\n\n\\item{y}{Character. What is the name of the outcome variable in the supplied\ndata? Defaults to \\code{'y'}}\n\n\\item{lines}{Logical. If \\code{TRUE}, line plots are used for visualizing\ntime series. If \\code{FALSE}, points are used.}\n\n\\item{series}{Either an \\code{integer} specifying which series in the set is\nto be plotted or the string 'all', which plots all series available in the\nsupplied data}\n\n\\item{n_bins}{\\code{integer} specifying the number of bins to use for\nbinning observed values when plotting a histogram. Default is to use the\nnumber of bins returned by a call to \\code{hist} in base \\code{R}}\n\n\\item{log_scale}{\\code{logical}. If \\code{series == 'all'}, this flag is\nused to control whether the time series plot is shown on the log scale\n(using \\code{log(Y + 1)}). This can be useful when visualizing many series that\nmay have different observed ranges. Default is \\code{FALSE}}\n}\n\\value{\nA set of ggplot objects. If \\code{series} is an integer, the plots\nwill show observed time series, autocorrelation and cumulative\ndistribution functions, and a histogram for the series. If\n\\code{series == 'all'}, a set of observed time series plots is returned in\nwhich all series are shown on each plot but only a single focal series is\nhighlighted, with all remaining series shown as faint gray lines.\n}\n\\description{\nThis function takes either a fitted \\code{mvgam} object or a\n\\code{data.frame} object and produces plots of observed time series, ACF,\nCDF and histograms for exploratory data analysis\n}\n\\examples{\n# Simulate and plot series with observations bounded at 0 and 1 (Beta responses)\nsim_data <- sim_mvgam(\n  family = betar(),\n  trend_model = RW(),\n  prop_trend = 0.6\n)\n\nplot_mvgam_series(\n  data = sim_data$data_train,\n  series = 'all'\n)\n\nplot_mvgam_series(\n  data = sim_data$data_train,\n  newdata = sim_data$data_test,\n  series = 1\n)\n\n# Now simulate series with overdispersed discrete observations\nsim_data <- sim_mvgam(\n  family = nb(),\n  trend_model = RW(),\n  prop_trend = 0.6,\n  phi = 10\n)\n\nplot_mvgam_series(\n  data = sim_data$data_train,\n  series = 'all'\n)\n\n}\n\\author{\nNicholas J Clark and Matthijs Hollanders\n}\n"
  },
  {
    "path": "man/plot_mvgam_smooth.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_smooth.R\n\\name{plot_mvgam_smooth}\n\\alias{plot_mvgam_smooth}\n\\title{Plot smooth terms from \\pkg{mvgam} models}\n\\usage{\nplot_mvgam_smooth(\n  object,\n  trend_effects = FALSE,\n  series = 1,\n  smooth,\n  residuals = FALSE,\n  n_resid_bins = 25,\n  realisations = FALSE,\n  n_realisations = 15,\n  derivatives = FALSE,\n  newdata\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{trend_effects}{logical. If \\code{TRUE} and a \\code{trend_formula} was used in\nmodel fitting, terms from the trend (i.e. process) model will be plotted}\n\n\\item{series}{\\code{integer} specifying which series in the set is to be\nplotted}\n\n\\item{smooth}{Either a \\code{character} or \\code{integer} specifying which\nsmooth term to be plotted}\n\n\\item{residuals}{\\code{logical}. If \\code{TRUE}, posterior quantiles of\npartial residuals are added to plots of 1-D smooths as a series of ribbon\nrectangles. Partial residuals for a smooth term are the median Dunn-Smyth\nresiduals that would be obtained by dropping the term concerned from the\nmodel, while leaving all other estimates fixed (i.e. the estimates for the\nterm plus the original median Dunn-Smyth residuals). Note that because\n\\code{mvgam} works with Dunn-Smyth residuals and not working residuals,\nwhich are used by \\code{mgcv}, the magnitudes of partial residuals will be\ndifferent to what you would expect from \\code{\\link[mgcv]{plot.gam}}.\nInterpretation is similar though, as these partial residuals should be\nevenly scattered around the smooth function if the function is well\nestimated}\n\n\\item{n_resid_bins}{\\code{integer} specifying the number of bins to group\nthe covariate into when plotting partial residuals. Setting this argument\ntoo high can make for messy plots that are difficult to interpret, while\nsetting it too low will likely mask some potentially useful patterns in\nthe partial residuals. Default is \\code{25}}\n\n\\item{realisations}{\\code{logical}. If \\code{TRUE}, posterior realisations\nare shown as a spaghetti plot, making it easier to visualise the diversity\nof possible functions. If \\code{FALSE}, the default, empirical quantiles\nof the posterior distribution are shown}\n\n\\item{n_realisations}{\\code{integer} specifying the number of posterior\nrealisations to plot, if \\code{realisations = TRUE}. Ignored otherwise}\n\n\\item{derivatives}{\\code{logical}. If \\code{TRUE}, an additional plot will\nbe returned to show the estimated 1st derivative for the specified smooth\n(Note: this only works for univariate smooths)}\n\n\\item{newdata}{Optional \\code{dataframe} for predicting the smooth,\ncontaining at least 'series' in addition to any other variables included\nin the linear predictor of the original model's \\code{formula}. Note that\nthis currently is only supported for plotting univariate smooths}\n}\n\\value{\nA base \\code{R} graphics plot\n}\n\\description{\nThis function plots posterior empirical quantiles for a series-specific\nsmooth term\n}\n\\details{\nSmooth functions are shown as empirical quantiles (or spaghetti\nplots) of posterior partial expectations across a sequence of values\nbetween the variable's \\code{min} and \\code{max}, while zeroing out\neffects of all other variables. At present, only univariate and bivariate\nsmooth plots are allowed, though note that bivariate smooths rely on\ndefault behaviour from \\code{\\link[mgcv]{plot.gam}}. \\code{plot_mvgam_smooth}\ngenerates posterior predictions from an object of class \\code{mvgam},\ncalculates posterior empirical quantiles and plots them. If\n\\code{realisations = FALSE}, the returned plot shows 90, 60, 40 and 20 percent\nposterior quantiles (as ribbons of increasingly darker shades of red) as\nwell as the posterior median (as a dark red line). If\n\\code{realisations = TRUE}, a set of \\code{n_realisations} posterior draws are\nshown. For more nuanced visualisation, supply \\code{newdata} just as you\nwould when predicting from a \\code{\\link[mgcv]{gam}} model or use the more\nflexible \\code{\\link{conditional_effects.mvgam}}. Alternatively, if you\nprefer to use partial effect plots in the style of \\code{gratia}, and if you\nhave the \\code{gratia} package installed, you can use \\code{draw.mvgam}. See\n\\code{\\link{gratia_mvgam_enhancements}} for details.\n}\n\\seealso{\n\\code{\\link[mgcv]{plot.gam}},\n\\code{\\link{conditional_effects.mvgam}},\n\\code{\\link{gratia_mvgam_enhancements}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot_mvgam_trend.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_trend.R\n\\name{plot_mvgam_trend}\n\\alias{plot_mvgam_trend}\n\\title{Plot latent trend predictions from \\pkg{mvgam} models}\n\\usage{\nplot_mvgam_trend(\n  object,\n  series = 1,\n  newdata,\n  data_test,\n  realisations = FALSE,\n  n_realisations = 15,\n  n_cores = 1,\n  derivatives = FALSE,\n  xlab,\n  ylab\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{series}{\\code{integer} specifying which series in the set is to be\nplotted}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining at least 'series' and 'time' in addition to any other\nvariables included in the linear predictor of the original \\code{formula}.}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{realisations}{\\code{logical}. If \\code{TRUE}, posterior trend\nrealisations are shown as a spaghetti plot, making it easier to visualise\nthe diversity of possible trend paths. If \\code{FALSE}, the default,\nempirical quantiles of the posterior distribution are shown}\n\n\\item{n_realisations}{\\code{integer} specifying the number of posterior\nrealisations to plot, if \\code{realisations = TRUE}. Ignored otherwise}\n\n\\item{n_cores}{Deprecated. Parallel processing is no longer supported}\n\n\\item{derivatives}{\\code{logical}. If \\code{TRUE}, an additional plot will\nbe returned to show the estimated 1st derivative for the estimated trend}\n\n\\item{xlab}{Label for x axis}\n\n\\item{ylab}{Label for y axis}\n}\n\\value{\nA \\code{ggplot} object\n}\n\\description{\nPlot latent trend predictions from \\pkg{mvgam} models\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(\n  n_series = 3,\n  trend_model = AR()\n)\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  chains = 2\n)\n\n# Plot estimated trends for some series\nplot_mvgam_trend(mod)\nplot_mvgam_trend(mod, series = 2)\n\n# Extrapolate trends forward in time and plot on response scale\nplot_mvgam_trend(\n  mod,\n  newdata = simdat$data_test\n)\n\nplot_mvgam_trend(\n  mod,\n  newdata = simdat$data_test,\n  series = 2\n)\n\n# But it is recommended to compute extrapolations for all series\n# first and then plot\ntrend_fc <- forecast(\n  mod,\n  newdata = simdat$data_test\n)\n\nplot(trend_fc, series = 1)\nplot(trend_fc, series = 2)\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/plot_mvgam_uncertainty.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/plot_mvgam_uncertainty.R\n\\name{plot_mvgam_uncertainty}\n\\alias{plot_mvgam_uncertainty}\n\\title{Plot forecast uncertainty contributions from \\pkg{mvgam} models}\n\\usage{\nplot_mvgam_uncertainty(\n  object,\n  series = 1,\n  newdata,\n  data_test,\n  legend_position = \"topleft\",\n  hide_xlabels = FALSE\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{series}{\\code{integer} specifying which series in the set is to be\nplotted}\n\n\\item{newdata}{A \\code{dataframe} or \\code{list} containing at least 'series'\nand 'time' for the forecast horizon, in addition to any other variables\nincluded in the linear predictor of \\code{formula}}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but users\nare recommended to use \\code{newdata} instead for more seamless integration\ninto \\code{R} workflows}\n\n\\item{legend_position}{The location may also be specified by setting x to a\nsingle keyword from the list: \"none\", \"bottomright\", \"bottom\", \"bottomleft\",\n\"left\", \"topleft\", \"top\", \"topright\", \"right\" and \"center\". This places the\nlegend on the inside of the plot frame at the given location (if it is not\n\"none\").}\n\n\\item{hide_xlabels}{\\code{logical}. If \\code{TRUE}, no xlabels are printed to\nallow the user to add custom labels using \\code{axis} from base \\code{R}}\n}\n\\value{\nA base \\code{R} graphics plot\n}\n\\description{\nPlot forecast uncertainty contributions from \\pkg{mvgam} models\n}\n\\details{\nThe basic idea of this function is to compute forecasts by ignoring\none of the two primary components in a correlated residual model (i.e. by\neither ignoring the linear predictor effects or by ignoring the residual\ndynamics). Some caution is required however, as this function was designed\nearly in the \\pkg{mvgam} development cycle and there are now many types of\nmodels that it cannot handle very well. For example, models with shared\nlatent states, or any type of State-Space models that include terms in the\n\\code{trend_formula}, will either fail or give nonsensical results. Improvements\nare in the works to provide a more general way to decompose forecast\nuncertainties, so please check back at a later date.\n}\n"
  },
  {
    "path": "man/portal_data.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/portal_data.R\n\\docType{data}\n\\name{portal_data}\n\\alias{portal_data}\n\\title{Portal Project rodent capture survey data}\n\\format{\nA \\code{data.frame} containing the following fields:\n\\describe{\n\\item{time}{time of sampling, in lunar monthly cycles}\n\\item{series}{factor indicator of the time series, i.e. the species}\n\\item{captures}{total captures across all control plots at each time point}\n\\item{ndvi_ma12}{12-month moving average of the mean Normalised Difference Vegetation Index}\n\\item{mintemp}{monthly mean of minimum temperature}\n}\n}\n\\source{\n\\url{https://github.com/weecology/PortalData/blob/main/SiteandMethods/Methods.md}\n}\n\\usage{\nportal_data\n}\n\\description{\nA dataset containing time series of total captures (across all control plots) for select rodent species from the Portal Project\n}\n\\keyword{datasets}\n"
  },
  {
    "path": "man/posterior_epred.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/posterior_epred.mvgam.R\n\\name{posterior_epred.mvgam}\n\\alias{posterior_epred.mvgam}\n\\title{Draws from the expected value of the posterior predictive distribution for \\pkg{mvgam} objects}\n\\usage{\n\\method{posterior_epred}{mvgam}(\n  object,\n  newdata,\n  data_test,\n  ndraws = NULL,\n  process_error = TRUE,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} or \\code{jsdgam}.\nSee \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining the same variables that were included in the original \\code{data}\nused to fit the model. If not supplied, predictions are generated for the\noriginal observations used for the model fit.}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{ndraws}{Positive \\code{integer} indicating how many posterior draws\nshould be used. If \\code{NULL} (the default) all draws are used.}\n\n\\item{process_error}{\\code{logical}. If \\code{TRUE} and \\code{newdata} is\nsupplied, expected uncertainty in the process model is accounted for by\nusing draws from any latent trend SD parameters. If \\code{FALSE},\nuncertainty in the latent trend component is ignored when calculating\npredictions. If no \\code{newdata} is supplied, draws from the fitted\nmodel's posterior predictive distribution will be used (which will always\ninclude uncertainty in any latent trend components)}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{matrix} of dimension \\code{n_samples x n_obs}, where\n\\code{n_samples} is the number of posterior samples from the fitted object\nand \\code{n_obs} is the number of observations in \\code{newdata}\n}\n\\description{\nCompute posterior draws of the expected value of the posterior predictive\ndistribution (i.e. the conditional expectation). Can be performed for the\ndata used to fit the model (posterior predictive checks) or for new data.\nBy definition, these predictions have smaller variance than the posterior\npredictions performed by the \\code{\\link{posterior_predict.mvgam}} method.\nThis is because only the uncertainty in the expected value of the posterior\npredictive distribution is incorporated in the draws computed by\n\\code{posterior_epred} while the residual error is ignored there. However,\nthe estimated means of both methods averaged across draws should be very\nsimilar.\n}\n\\details{\nNote that for all types of predictions for models that did not\ninclude a \\code{trend_formula}, uncertainty in the dynamic trend component can\nbe ignored by setting \\code{process_error = FALSE}. However, if a\n\\code{trend_formula} was supplied in the model, predictions for this component\ncannot be ignored. If \\code{process_error = TRUE}, trend predictions will\nignore autocorrelation coefficients or GP length scale coefficients,\nultimately assuming the process is stationary. This method is similar to\nthe types of posterior predictions returned from \\code{brms} models when using\nautocorrelated error predictions for newdata. This function is therefore\nmore suited to posterior simulation from the GAM components of a\n\\code{mvgam} model, while the forecasting functions\n\\code{\\link{plot_mvgam_fc}} and \\code{\\link{forecast.mvgam}} are better\nsuited to generate h-step ahead forecasts that respect the temporal\ndynamics of estimated latent trends.\n}\n\\examples{\n\\dontrun{\n# Simulate some data and fit a model\nsimdat <- sim_mvgam(\n  n_series = 1,\n  trend_model = AR()\n)\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc'),\n  trend_model = AR(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Compute posterior expectations\nexpectations <- posterior_epred(mod)\nstr(expectations)\n}\n\n}\n\\seealso{\n\\code{\\link{hindcast.mvgam}},\n\\code{\\link{posterior_linpred.mvgam}},\n\\code{\\link{posterior_predict.mvgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/posterior_linpred.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/posterior_epred.mvgam.R\n\\name{posterior_linpred.mvgam}\n\\alias{posterior_linpred.mvgam}\n\\title{Posterior draws of the linear predictor for \\pkg{mvgam} objects}\n\\usage{\n\\method{posterior_linpred}{mvgam}(\n  object,\n  transform = FALSE,\n  newdata,\n  ndraws = NULL,\n  data_test,\n  process_error = TRUE,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} or \\code{jsdgam}.\nSee \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{transform}{\\code{logical}; if \\code{FALSE} (the default), draws of\nthe linear predictor are returned. If \\code{TRUE}, draws of the\ntransformed linear predictor, i.e. the conditional expectation, are\nreturned.}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining the same variables that were included in the original \\code{data}\nused to fit the model. If not supplied, predictions are generated for the\noriginal observations used for the model fit.}\n\n\\item{ndraws}{Positive \\code{integer} indicating how many posterior draws\nshould be used. If \\code{NULL} (the default) all draws are used.}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{process_error}{\\code{logical}. If \\code{TRUE} and \\code{newdata} is\nsupplied, expected uncertainty in the process model is accounted for by\nusing draws from any latent trend SD parameters. If \\code{FALSE},\nuncertainty in the latent trend component is ignored when calculating\npredictions. If no \\code{newdata} is supplied, draws from the fitted\nmodel's posterior predictive distribution will be used (which will always\ninclude uncertainty in any latent trend components)}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{matrix} of dimension \\code{n_samples x n_obs}, where\n\\code{n_samples} is the number of posterior samples from the fitted object\nand \\code{n_obs} is the number of observations in \\code{newdata}\n}\n\\description{\nCompute posterior draws of the linear predictor, that is draws before\napplying any link functions or other transformations. Can be performed for\nthe data used to fit the model (posterior predictive checks) or for new data.\n}\n\\details{\nNote that for all types of predictions for models that did not\ninclude a \\code{trend_formula}, uncertainty in the dynamic trend component can\nbe ignored by setting \\code{process_error = FALSE}. However, if a\n\\code{trend_formula} was supplied in the model, predictions for this component\ncannot be ignored. If \\code{process_error = TRUE}, trend predictions will\nignore autocorrelation coefficients or GP length scale coefficients,\nultimately assuming the process is stationary. This method is similar to\nthe types of posterior predictions returned from \\code{brms} models when using\nautocorrelated error predictions for newdata. This function is therefore\nmore suited to posterior simulation from the GAM components of a\n\\code{mvgam} model, while the forecasting functions\n\\code{\\link{plot_mvgam_fc}} and \\code{\\link{forecast.mvgam}} are better\nsuited to generate h-step ahead forecasts that respect the temporal\ndynamics of estimated latent trends.\n}\n\\examples{\n\\dontrun{\n# Simulate some data and fit a model\nsimdat <- sim_mvgam(\n  n_series = 1,\n  trend_model = AR()\n)\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc'),\n  trend_model = AR(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Extract linear predictor values\nlinpreds <- posterior_linpred(mod)\nstr(linpreds)\n}\n\n}\n\\seealso{\n\\code{\\link{hindcast.mvgam}},\n\\code{\\link{posterior_epred.mvgam}},\n\\code{\\link{posterior_predict.mvgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/posterior_predict.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/posterior_epred.mvgam.R\n\\name{posterior_predict.mvgam}\n\\alias{posterior_predict.mvgam}\n\\title{Draws from the posterior predictive distribution for \\pkg{mvgam} objects}\n\\usage{\n\\method{posterior_predict}{mvgam}(\n  object,\n  newdata,\n  data_test,\n  ndraws = NULL,\n  process_error = TRUE,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} or \\code{jsdgam}.\nSee \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining the same variables that were included in the original \\code{data}\nused to fit the model. If not supplied, predictions are generated for the\noriginal observations used for the model fit.}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{ndraws}{Positive \\code{integer} indicating how many posterior draws\nshould be used. If \\code{NULL} (the default) all draws are used.}\n\n\\item{process_error}{Logical. If \\code{TRUE} and \\code{newdata} is supplied,\nexpected uncertainty in the process model is accounted for by using draws\nfrom any latent trend SD parameters. If \\code{FALSE}, uncertainty in the\nlatent trend component is ignored when calculating predictions. If no\n\\code{newdata} is supplied, draws from the fitted model's posterior\npredictive distribution will be used (which will always include uncertainty\nin any latent trend components)}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{matrix} of dimension \\code{n_samples x new_obs}, where\n\\code{n_samples} is the number of posterior samples from the fitted object\nand \\code{n_obs} is the number of observations in \\code{newdata}\n}\n\\description{\nCompute posterior draws of the posterior predictive distribution. Can be\nperformed for the data used to fit the model (posterior predictive checks)\nor for new data. By definition, these draws have higher variance than draws\nof the expected value of the posterior predictive distribution computed by\n\\code{\\link{posterior_epred.mvgam}}. This is because the residual error is\nincorporated in \\code{posterior_predict}. However, the estimated means of\nboth methods averaged across draws should be very similar.\n}\n\\details{\nNote that for all types of predictions for models that did not\ninclude a \\code{trend_formula}, uncertainty in the dynamic trend component can\nbe ignored by setting \\code{process_error = FALSE}. However, if a\n\\code{trend_formula} was supplied in the model, predictions for this component\ncannot be ignored. If \\code{process_error = TRUE}, trend predictions will\nignore autocorrelation coefficients or GP length scale coefficients,\nultimately assuming the process is stationary. This method is similar to\nthe types of posterior predictions returned from \\code{brms} models when using\nautocorrelated error predictions for newdata. This function is therefore\nmore suited to posterior simulation from the GAM components of a\n\\code{mvgam} model, while the forecasting functions\n\\code{\\link{plot_mvgam_fc}} and \\code{\\link{forecast.mvgam}} are better\nsuited to generate h-step ahead forecasts that respect the temporal\ndynamics of estimated latent trends.\n}\n\\examples{\n\\dontrun{\n# Simulate some data and fit a model\nsimdat <- sim_mvgam(n_series = 1, trend_model = AR())\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc'),\n  trend_model = AR(),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Compute posterior predictions\npredictions <- posterior_predict(mod)\nstr(predictions)\n}\n\n}\n\\seealso{\n\\code{\\link{hindcast.mvgam}},\n\\code{\\link{posterior_linpred.mvgam}},\n\\code{\\link{posterior_epred.mvgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/pp_check.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/ppc.mvgam.R\n\\name{pp_check.mvgam}\n\\alias{pp_check.mvgam}\n\\alias{pp_check}\n\\title{Posterior Predictive Checks for \\code{mvgam} models}\n\\usage{\n\\method{pp_check}{mvgam}(\n  object,\n  type,\n  ndraws = NULL,\n  prefix = c(\"ppc\", \"ppd\"),\n  group = NULL,\n  x = NULL,\n  newdata = NULL,\n  ...\n)\n}\n\\arguments{\n\\item{object}{An object of class \\code{mvgam}}\n\n\\item{type}{Type of the ppc plot as given by a character string.\nSee \\code{\\link[bayesplot:PPC-overview]{PPC}} for an overview\nof currently supported types. You may also use an invalid\ntype (e.g. \\code{type = \"xyz\"}) to get a list of supported\ntypes in the resulting error message.}\n\n\\item{ndraws}{Positive integer indicating how many\nposterior draws should be used.\nIf \\code{NULL} all draws are used. If not specified,\nthe number of posterior draws is chosen automatically.\nIgnored if \\code{draw_ids} is not \\code{NULL}.}\n\n\\item{prefix}{The prefix of the \\pkg{bayesplot} function to be applied.\nEither `\"ppc\"` (posterior predictive check; the default)\nor `\"ppd\"` (posterior predictive distribution), the latter being the same\nas the former except that the observed data is not shown for `\"ppd\"`.}\n\n\\item{group}{Optional name of a factor variable in the model\nby which to stratify the ppc plot. This argument is required for\nppc \\code{*_grouped} types and ignored otherwise.}\n\n\\item{x}{Optional name of a variable in the model.\nOnly used for ppc types having an \\code{x} argument\nand ignored otherwise.}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data containing the\nvariables included in the linear predictor of \\code{formula}. If not supplied,\npredictions are generated for the original observations used for the model fit.\nIgnored if using one of the residual plots (i.e. 'resid_hist')}\n\n\\item{...}{Further arguments passed to \\code{\\link{predict.mvgam}}\nas well as to the PPC function specified in \\code{type}}\n}\n\\value{\nA ggplot object that can be further\ncustomized using the \\pkg{ggplot2} package.\n}\n\\description{\nPerform unconditional posterior predictive checks with the help\nof the \\pkg{bayesplot} package.\n}\n\\details{\nUnlike the conditional posterior checks provided by \\code{\\link{ppc}},\nThis function computes \\emph{unconditional} posterior predictive checks (i.e. it generates\npredictions for fake data without considering the true observations associated with those\nfake data). For a detailed explanation of each of the ppc functions,\nsee the \\code{\\link[bayesplot:PPC-overview]{PPC}}\ndocumentation of the \\pkg{\\link[bayesplot:bayesplot-package]{bayesplot}}\npackage.\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(seasonality = \"hierarchical\")\nmod <- mvgam(\n  y ~ series +\n    s(season, bs = \"cc\", k = 6) +\n    s(season, series, bs = \"fs\", k = 4),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Use pp_check(mod, type = \"xyz\") for a list of available plot types\n\n# Default is a density overlay for all observations\npp_check(mod)\n\n# Rootograms particularly useful for count data\npp_check(mod, type = \"rootogram\")\n\n# Grouping plots by series is useful\npp_check(mod,\n  type = \"bars_grouped\",\n  group = \"series\", ndraws = 50\n)\npp_check(mod,\n  type = \"ecdf_overlay_grouped\",\n  group = \"series\", ndraws = 50\n)\npp_check(mod,\n  type = \"stat_freqpoly_grouped\",\n  group = \"series\", ndraws = 50\n)\n\n# Several types can be used to plot distributions of randomized\n# quantile residuals\npp_check(\n  object = mod,\n  x = \"season\",\n  type = \"resid_ribbon\"\n)\npp_check(\n  object = mod,\n  x = \"season\",\n  group = \"series\",\n  type = \"resid_ribbon_grouped\"\n)\npp_check(mod,\n  ndraws = 5,\n  type = \"resid_hist_grouped\",\n  group = \"series\"\n)\n\n# Custom functions accepted\npp_check(mod, type = \"stat\", stat = function(x) mean(x == 0))\npp_check(mod,\n  type = \"stat_grouped\",\n  stat = function(x) mean(x == 0),\n  group = \"series\"\n)\n\n# Some functions accept covariates to set the x-axes\npp_check(mod,\n  x = \"season\",\n  type = \"ribbon_grouped\",\n  prob = 0.5,\n  prob_outer = 0.8,\n  group = \"series\"\n)\n\n# Many plots can be made without the observed data\npp_check(mod, prefix = \"ppd\")\n}\n\n}\n\\seealso{\n\\code{\\link{ppc}}, \\code{\\link{predict.mvgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/ppc.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/ppc.mvgam.R\n\\name{ppc.mvgam}\n\\alias{ppc.mvgam}\n\\alias{ppc}\n\\title{Plot conditional posterior predictive checks from \\pkg{mvgam} models}\n\\usage{\nppc(object, ...)\n\n\\method{ppc}{mvgam}(\n  object,\n  newdata,\n  data_test,\n  series = 1,\n  type = \"hist\",\n  n_bins,\n  legend_position,\n  xlab,\n  ylab,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{...}{Further \\code{\\link[graphics]{par}} graphical parameters}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining at least 'series' and 'time' for the forecast horizon, in\naddition to any other variables included in the linear predictor of\n\\code{formula}. If included, the observed values in the test data are\ncompared to the model's forecast distribution for exploring biases in\nmodel predictions. Note this is only useful if the same \\code{newdata}\nwas also included when fitting the original model.}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{series}{\\code{integer} specifying which series in the set is to be\nplotted}\n\n\\item{type}{\\code{character} specifying the type of posterior predictive\ncheck to calculate and plot. Valid options are: 'rootogram', 'mean',\n'hist', 'density', 'prop_zero', 'pit' and 'cdf'}\n\n\\item{n_bins}{\\code{integer} specifying the number of bins to use for\nbinning observed values when plotting a rootogram or histogram. Default\nis \\code{50} bins for a rootogram, which means that if there are >50 unique\nobserved values, bins will be used to prevent overplotting and facilitate\ninterpretation. Default for a histogram is to use the number of bins\nreturned by a call to \\code{hist} in base \\code{R}}\n\n\\item{legend_position}{The location may also be specified by setting x to a\nsingle keyword from the list \"bottomright\", \"bottom\", \"bottomleft\",\n\"left\", \"topleft\", \"top\", \"topright\", \"right\" and \"center\". This places\nthe legend on the inside of the plot frame at the given location. Or\nalternatively, use \"none\" to hide the legend.}\n\n\\item{xlab}{Label for x axis}\n\n\\item{ylab}{Label for y axis}\n}\n\\value{\nA base \\code{R} graphics plot showing either a posterior rootogram\n(for \\code{type == 'rootogram'}), the predicted vs observed mean for the\nseries (for \\code{type == 'mean'}), predicted vs observed proportion of\nzeroes for the series (for \\code{type == 'prop_zero'}), predicted vs\nobserved histogram for the series (for \\code{type == 'hist'}), kernel\ndensity or empirical CDF estimates for posterior predictions (for\n\\code{type == 'density'} or \\code{type == 'cdf'}) or a Probability\nIntegral Transform histogram (for \\code{type == 'pit'}).\n}\n\\description{\nPlot conditional posterior predictive checks from \\pkg{mvgam} models\n}\n\\details{\nConditional posterior predictions are drawn from the fitted\n\\code{mvgam} and compared against the empirical distribution of the\nobserved data for a specified series to help evaluate the model's ability\nto generate unbiased predictions. For all plots apart from\n\\code{type = 'rootogram'}, posterior predictions can also be compared to out\nof sample observations as long as these observations were included as\n'data_test' in the original model fit and supplied here. Rootograms are\ncurrently only plotted using the 'hanging' style.\n\nNote that the predictions used for these plots are \\emph{conditional on\nthe observed data}, i.e. they are those predictions that have been\ngenerated directly within the \\code{mvgam()} model. They can be misleading if\nthe model included flexible dynamic trend components. For a broader range\nof posterior checks that are created using \\emph{unconditional} \"new data\"\npredictions, see \\code{\\link{pp_check.mvgam}}\n}\n\\examples{\n\\dontrun{\n# Simulate some smooth effects and fit a model\nset.seed(0)\n\ndat <- mgcv::gamSim(\n  1,\n  n = 200,\n  scale = 2\n)\n\nmod <- mvgam(\n  y ~ s(x0) + s(x1) + s(x2) + s(x3),\n  data = dat,\n  family = gaussian(),\n  chains = 2,\n  silent = 2\n)\n\n# Posterior checks\nppc(mod, type = \"hist\")\nppc(mod, type = \"density\")\nppc(mod, type = \"cdf\")\n\n# Many more options are available with pp_check()\npp_check(mod)\npp_check(mod, type = \"ecdf_overlay\")\npp_check(mod, type = \"freqpoly\")\n}\n\n}\n\\seealso{\n\\code{\\link{pp_check.mvgam}}, \\code{\\link{predict.mvgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/predict.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/predict.mvgam.R\n\\name{predict.mvgam}\n\\alias{predict.mvgam}\n\\title{Predict from a fitted \\pkg{mvgam} model}\n\\usage{\n\\method{predict}{mvgam}(\n  object,\n  newdata,\n  data_test,\n  type = \"link\",\n  process_error = FALSE,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} or \\code{jsdgam}.\nSee \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data\ncontaining the same variables that were included in the original \\code{data}\nused to fit the model. If not supplied, predictions are generated for the\noriginal observations used for the model fit.}\n\n\\item{data_test}{Deprecated. Still works in place of \\code{newdata} but\nusers are recommended to use \\code{newdata} instead for more seamless\nintegration into \\code{R} workflows}\n\n\\item{type}{When this has the value \\code{link} (default) the linear\npredictor is calculated on the link scale. If \\code{expected} is used,\npredictions reflect the expectation of the response (the mean) but ignore\nuncertainty in the observation process. When \\code{response} is used, the\npredictions take uncertainty in the observation process into account to\nreturn predictions on the outcome scale. When \\code{variance} is used, the\nvariance of the response with respect to the mean (mean-variance\nrelationship) is returned. When \\code{type = \"terms\"}, each component of the\nlinear predictor is returned separately in the form of a \\code{list} (possibly\nwith standard errors, if \\code{summary = TRUE}): this includes parametric model\ncomponents, followed by each smooth component, but excludes any offset and\nany intercept. Two special cases are also allowed: type \\code{latent_N} will\nreturn the estimated latent abundances from an N-mixture distribution,\nwhile type \\code{detection} will return the estimated detection probability from\nan N-mixture distribution}\n\n\\item{process_error}{Logical. If \\code{TRUE} and a dynamic trend model was\nfit, expected uncertainty in the process model is accounted for by using\ndraws from a stationary, zero-centred multivariate Normal distribution\nusing any estimated process variance-covariance parameters. If\n\\code{FALSE}, uncertainty in the latent trend component is ignored when\ncalculating predictions}\n\n\\item{summary}{Should summary statistics be returned\ninstead of the raw values? Default is \\code{TRUE}..}\n\n\\item{robust}{If \\code{FALSE} (the default) the mean is used as\nthe measure of central tendency and the standard deviation as\nthe measure of variability. If \\code{TRUE}, the median and the\nmedian absolute deviation (MAD) are applied instead.\nOnly used if \\code{summary} is \\code{TRUE}.}\n\n\\item{probs}{The percentiles to be computed by the \\code{quantile}\nfunction. Only used if \\code{summary} is \\code{TRUE}.}\n\n\\item{...}{Ignored}\n}\n\\value{\nPredicted values on the appropriate scale.\n\nIf \\code{summary = FALSE} and \\code{type != \"terms\"}, the output is a matrix of\ndimension \\verb{n_draw x n_observations} containing predicted values for each\nposterior draw in \\code{object}.\n\nIf \\code{summary = TRUE} and \\code{type != \"terms\"}, the output is an\n\\code{n_observations} x \\code{E} matrix. The number of summary statistics\n\\code{E} is equal to \\code{2 + length(probs)}: The \\code{Estimate} column\ncontains point estimates (either mean or median depending on argument\n\\code{robust}), while the \\code{Est.Error} column contains uncertainty\nestimates (either standard deviation or median absolute deviation depending\non argument \\code{robust}). The remaining columns starting with \\code{Q}\ncontain quantile estimates as specified via argument \\code{probs}.\n\nIf \\code{type = \"terms\"} and \\code{summary = FALSE}, the output is a named \\code{list}\ncontaining a separate slot for each effect, with the effects returned as\nmatrices of dimension \\verb{n_draw x 1}. If \\code{summary = TRUE}, the output\nresembles that from \\code{\\link[mgcv]{predict.gam}} when using the call\n\\code{predict.gam(object, type = \"terms\", se.fit = TRUE)}, where mean\ncontributions from each effect are returned in \\code{matrix} form while standard\nerrors (representing the interval: \\code{(max(probs) - min(probs)) / 2}) are\nreturned in a separate \\code{matrix}\n}\n\\description{\nPredict from a fitted \\pkg{mvgam} model\n}\n\\details{\nNote that if your model included a latent temporal trend (i.e. if\nyou used something other than \\code{\"None\"} for the \\code{trend_model} argument), the\npredictions returned by this function will ignore autocorrelation\ncoefficients or GP length scale coefficients by \\emph{assuming the process is\nstationary}. This approach is similar to how predictions are computed from\nother types of regression models that can include correlated residuals,\n\\emph{ultimately treating the temporal dynamics as random effect nuisance\nparameters}. The \\code{predict} function is therefore more suited to\nscenario-based posterior simulation from the GAM components of a\n\\code{mvgam} model, while the hindcast / forecast functions\n\\code{\\link[=hindcast.mvgam]{hindcast.mvgam()}} and \\code{\\link[=forecast.mvgam]{forecast.mvgam()}} are better suited to generate\npredictions that respect the temporal dynamics of estimated latent trends\nat the actual time points supplied in \\code{data} and \\code{newdata}.\n}\n\\examples{\n\\dontrun{\n# Simulate 4 time series with hierarchical seasonality\n# and independent AR1 dynamic processes\nset.seed(123)\nsimdat <- sim_mvgam(\n  seasonality = 'hierarchical',\n  prop_trend = 0.75,\n  trend_model = AR(),\n  family = gaussian()\n)\n\n# Fit a model with shared seasonality\n# and AR(1) dynamics\nmod1 <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  data = simdat$data_train,\n  family = gaussian(),\n  trend_model = AR(),\n  noncentred = TRUE,\n  chains = 2,\n  silent = 2\n)\n\n# Generate predictions against observed data\npreds <- predict(\n  mod1,\n  summary = TRUE\n)\nhead(preds)\n\n# Generate predictions against test data\npreds <- predict(\n  mod1,\n  newdata = simdat$data_test,\n  summary = TRUE\n)\nhead(preds)\n\n# Use plot_predictions(), which relies on predict()\n# to more easily see how the latent AR(1) dynamics are\n# being ignored when using predict()\nplot_predictions(\n  mod1,\n  by = c('time', 'series', 'series'),\n  points = 0.5\n)\n\n# Using the hindcast() function will give a more accurate\n# representation of how the AR(1) processes were estimated to give\n# accurate predictions to the in-sample training data\nhc <- hindcast(mod1)\nplot(hc) +\n  plot(hc, series = 2) +\n  plot(hc, series = 3)\n}\n\n}\n\\seealso{\n\\code{\\link[=hindcast.mvgam]{hindcast.mvgam()}},\n\\code{\\link[=forecast.mvgam]{forecast.mvgam()}},\n\\code{\\link[=fitted.mvgam]{fitted.mvgam()}},\n\\code{\\link[=augment.mvgam]{augment.mvgam()}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/print.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/print.mvgam.R\n\\name{print.mvgam}\n\\alias{print.mvgam}\n\\title{Print a fitted \\pkg{mvgam} object}\n\\usage{\n\\method{print}{mvgam}(x, ...)\n}\n\\arguments{\n\\item{x}{\\code{list} object returned from \\code{mvgam}}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{list} is printed on-screen\n}\n\\description{\nThis function takes a fitted \\code{mvgam} or \\code{jsdgam} object and prints\na quick summary.\n}\n\\details{\nA brief summary of the model's call is printed\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/print.mvgam_summary.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/summary.mvgam.R\n\\name{print.mvgam_summary}\n\\alias{print.mvgam_summary}\n\\title{Print method for mvgam_summary objects}\n\\usage{\n\\method{print}{mvgam_summary}(x, ...)\n}\n\\arguments{\n\\item{x}{An object of class \\code{mvgam_summary}}\n\n\\item{...}{Additional arguments (ignored)}\n}\n\\value{\nInvisibly returns the input object after printing\n}\n\\description{\nPrint method for mvgam_summary objects\n}\n"
  },
  {
    "path": "man/reexports.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/as.data.frame.mvgam.R, R/conditional_effects.R,\n%   R/forecast.mvgam.R, R/get_mvgam_priors.R, R/loo.mvgam.R,\n%   R/marginaleffects.mvgam.R, R/mcmc_plot.mvgam.R, R/mvgam_formulae.R,\n%   R/posterior_epred.mvgam.R, R/stan_utils.R, R/tidier_methods.R\n\\docType{import}\n\\name{reexports}\n\\alias{reexports}\n\\alias{as_draws}\n\\alias{as_draws_matrix}\n\\alias{as_draws_df}\n\\alias{as_draws_array}\n\\alias{as_draws_list}\n\\alias{as_draws_rvars}\n\\alias{conditional_effects}\n\\alias{forecast}\n\\alias{prior}\n\\alias{prior_}\n\\alias{set_prior}\n\\alias{prior_string}\n\\alias{loo}\n\\alias{loo_compare}\n\\alias{predictions}\n\\alias{avg_predictions}\n\\alias{plot_predictions}\n\\alias{slopes}\n\\alias{plot_slopes}\n\\alias{comparisons}\n\\alias{plot_comparisons}\n\\alias{datagrid}\n\\alias{hypotheses}\n\\alias{get_predict}\n\\alias{get_data}\n\\alias{mcmc_plot}\n\\alias{gp}\n\\alias{s}\n\\alias{te}\n\\alias{ti}\n\\alias{t2}\n\\alias{posterior_predict}\n\\alias{posterior_epred}\n\\alias{posterior_linpred}\n\\alias{stancode}\n\\alias{standata}\n\\alias{tidy}\n\\alias{augment}\n\\title{Objects exported from other packages}\n\\keyword{internal}\n\\description{\nThese objects are imported from other packages. Follow the links\nbelow to see their documentation.\n\n\\describe{\n  \\item{brms}{\\code{\\link[brms:conditional_effects.brmsfit]{conditional_effects}}, \\code{\\link[brms]{gp}}, \\code{\\link[brms:mcmc_plot.brmsfit]{mcmc_plot}}, \\code{\\link[brms:set_prior]{prior}}, \\code{\\link[brms:set_prior]{prior_}}, \\code{\\link[brms:set_prior]{prior_string}}, \\code{\\link[brms]{set_prior}}, \\code{\\link[brms]{stancode}}, \\code{\\link[brms]{standata}}}\n\n  \\item{generics}{\\code{\\link[generics]{augment}}, \\code{\\link[generics]{forecast}}, \\code{\\link[generics]{tidy}}}\n\n  \\item{insight}{\\code{\\link[insight]{get_data}}}\n\n  \\item{loo}{\\code{\\link[loo]{loo}}, \\code{\\link[loo]{loo_compare}}}\n\n  \\item{marginaleffects}{\\code{\\link[marginaleffects:predictions]{avg_predictions}}, \\code{\\link[marginaleffects]{comparisons}}, \\code{\\link[marginaleffects]{datagrid}}, \\code{\\link[marginaleffects]{get_predict}}, \\code{\\link[marginaleffects]{hypotheses}}, \\code{\\link[marginaleffects]{plot_comparisons}}, \\code{\\link[marginaleffects]{plot_predictions}}, \\code{\\link[marginaleffects]{plot_slopes}}, \\code{\\link[marginaleffects]{predictions}}, \\code{\\link[marginaleffects]{slopes}}}\n\n  \\item{mgcv}{\\code{\\link[mgcv]{s}}, \\code{\\link[mgcv]{t2}}, \\code{\\link[mgcv]{te}}, \\code{\\link[mgcv:te]{ti}}}\n\n  \\item{posterior}{\\code{\\link[posterior:draws]{as_draws}}, \\code{\\link[posterior:draws_array]{as_draws_array}}, \\code{\\link[posterior:draws_df]{as_draws_df}}, \\code{\\link[posterior:draws_list]{as_draws_list}}, \\code{\\link[posterior:draws_matrix]{as_draws_matrix}}, \\code{\\link[posterior:draws_rvars]{as_draws_rvars}}}\n\n  \\item{rstantools}{\\code{\\link[rstantools]{posterior_epred}}, \\code{\\link[rstantools]{posterior_linpred}}, \\code{\\link[rstantools]{posterior_predict}}}\n}}\n\n"
  },
  {
    "path": "man/residual_cor.jsdgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/residual_cor.R\n\\name{residual_cor.jsdgam}\n\\alias{residual_cor.jsdgam}\n\\alias{residual_cor}\n\\alias{residual_cor.mvgam}\n\\title{Extract residual correlations based on latent factors}\n\\usage{\nresidual_cor(object, ...)\n\n\\method{residual_cor}{mvgam}(\n  object,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n)\n\n\\method{residual_cor}{jsdgam}(\n  object,\n  summary = TRUE,\n  robust = FALSE,\n  probs = c(0.025, 0.975),\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} resulting from a\ncall to \\code{\\link[=jsdgam]{jsdgam()}} or a call to \\code{\\link[=mvgam]{mvgam()}} in which either\n\\code{use_lv = TRUE} or a multivariate process was used with \\code{cor = TRUE}\n(see \\code{\\link[=RW]{RW()}} and \\code{\\link[=VAR]{VAR()}} for examples)}\n\n\\item{...}{ignored}\n\n\\item{summary}{Should summary statistics be returned\ninstead of the raw values? Default is \\code{TRUE}..}\n\n\\item{robust}{If \\code{FALSE} (the default) the mean is used as a measure of\ncentral tendency. If \\code{TRUE}, the median is used instead. Only used if\n\\code{summary} is \\code{TRUE}}\n\n\\item{probs}{The percentiles to be computed by the \\code{quantile}\nfunction. Only used if \\code{summary} is \\code{TRUE}.}\n}\n\\value{\nIf \\code{summary = TRUE}, a \\code{list} of\n\\code{\\link{mvgam_residcor-class}} with the following components:\n\\item{cor, cor_lower, cor_upper}{A set of \\eqn{p \\times p} correlation\nmatrices, containing either the posterior median or mean estimate, plus\nlower and upper limits of the corresponding credible intervals supplied\nto \\code{probs}}\n\\item{sig_cor}{A \\eqn{p \\times p} correlation matrix containing only\ncorrelations whose credible interval does not contain zero. All other\ncorrelations are set to zero}\n\\item{prec, prec_lower, prec_upper}{A set of \\eqn{p \\times p} precision\nmatrices, containing either the posterior median or mean estimate, plus\nlower and upper limits of the corresponding credible intervals supplied\nto \\code{probs}}\n\\item{sig_prec}{A \\eqn{p \\times p} precision matrix containing only\nprecisions whose credible interval does not contain zero. All other\nprecisions are set to zero}\n\\item{cov}{A \\eqn{p \\times p} posterior median or mean covariance\nmatrix}\n\\item{trace}{The median/mean point estimator of the trace (sum of the\ndiagonal elements) of the residual covariance matrix \\code{cov}}\n\nIf \\code{summary = FALSE}, this function returns a \\code{list} containing the\nfollowing components:\n\\item{all_cormat}{A \\eqn{n_{draws} \\times p \\times p} \\code{array} of\nposterior residual correlation matrix draws}\n\\item{all_covmat}{A \\eqn{n_{draws} \\times p \\times p} \\code{array} of\nposterior residual covariance matrix draws}\n\\item{all_presmat}{A \\eqn{n_{draws} \\times p \\times p} \\code{array} of\nposterior residual precision matrix draws}\n\\item{all_trace}{A \\eqn{n_{draws}} \\code{vector} of posterior covariance\ntrace draws}\n}\n\\description{\nCompute residual correlation estimates from Joint Species Distribution\n(\\code{jsdgam}) or \\code{mvgam} models that either used latent factors\nor included correlated process errors directly\n}\n\\details{\nSee \\code{\\link{mvgam_residcor-class}} for a description of the quantities\nthat are computed and returned by this function, along with key references.\n}\n\\examples{\n\\dontrun{\n# Fit a JSDGAM to the portal_data captures\nmod <- jsdgam(\n  formula = captures ~\n    # Fixed effects of NDVI and mintemp, row effect as a GP of time\n    ndvi_ma12:series + mintemp:series + gp(time, k = 15),\n  factor_formula = ~ -1,\n  data = portal_data,\n  unit = time,\n  species = series,\n  family = poisson(),\n  n_lv = 2,\n  silent = 2,\n  chains = 2\n)\n\n# Plot residual correlations\nplot(\n  residual_cor(mod)\n)\n\n# Compare to a residual ordination biplot\nif(requireNamespace('ggrepel', quietly = TRUE)){\n  ordinate(mod)\n}\n\n# Not needed for general use; cleans up connections for automated testing\ncloseAllConnections()\n}\n}\n\\references{\nHui, F. K. C. (2016). boral – Bayesian Ordination and\nRegression Analysis of Multivariate Abundance Data in r. \\emph{Methods\nin Ecology and Evolution}, 7(6), 744-750.\n\\doi{10.1111/2041-210X.12514}\n}\n\\seealso{\n\\code{\\link[=jsdgam]{jsdgam()}}, \\code{\\link[=lv_correlations]{lv_correlations()}}, \\code{\\link{mvgam_residcor-class}}\n}\n"
  },
  {
    "path": "man/residuals.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/residuals.mvgam.R\n\\name{residuals.mvgam}\n\\alias{residuals.mvgam}\n\\title{Posterior draws of residuals from \\pkg{mvgam} models}\n\\usage{\n\\method{residuals}{mvgam}(object, summary = TRUE, robust = FALSE, probs = c(0.025, 0.975), ...)\n}\n\\arguments{\n\\item{object}{An object of class \\code{mvgam}}\n\n\\item{summary}{Should summary statistics be returned\ninstead of the raw values? Default is \\code{TRUE}..}\n\n\\item{robust}{If \\code{FALSE} (the default) the mean is used as\nthe measure of central tendency and the standard deviation as\nthe measure of variability. If \\code{TRUE}, the median and the\nmedian absolute deviation (MAD) are applied instead.\nOnly used if \\code{summary} is \\code{TRUE}.}\n\n\\item{probs}{The percentiles to be computed by the \\code{quantile}\nfunction. Only used if \\code{summary} is \\code{TRUE}.}\n\n\\item{...}{Ignored}\n}\n\\value{\nAn \\code{array} of randomized quantile residual values.\n\nIf \\code{summary = FALSE} the output resembles those of\n\\code{\\link{posterior_epred.mvgam}} and \\code{\\link{predict.mvgam}}.\n\nIf \\code{summary = TRUE} the output is an \\code{n_observations} x \\code{E}\nmatrix. The number of summary statistics \\code{E} is equal to \\code{2 +\n  length(probs)}. The \\code{Estimate} column contains point estimates (either\nmean or median depending on argument \\code{robust}), while the\n\\code{Est.Error} column contains uncertainty estimates (either standard\ndeviation or median absolute deviation depending on argument\n\\code{robust}). The remaining columns starting with \\code{Q} contain\nquantile estimates as specified via argument \\code{probs}.\n}\n\\description{\nThis method extracts posterior draws of Dunn-Smyth (randomized quantile)\nresiduals in the order in which the data were supplied to the model. It\nincludes additional arguments for obtaining summaries of the computed\nresiduals.\n}\n\\details{\nThis method gives residuals as Dunn-Smyth (randomized quantile)\nresiduals. Any observations that were missing (i.e. \\code{NA}) in the original\ndata will have missing values in the residuals.\n}\n\\examples{\n\\dontrun{\n# Simulate some data and fit a model\nsimdat <- sim_mvgam(n_series = 1, trend_model = AR())\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc'),\n  trend_model = AR(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Extract posterior residuals\nresids <- residuals(mod)\nstr(resids)\n\n# Or add them directly to the observed data, along with fitted values\naugment(mod, robust = FALSE, probs = c(0.25, 0.75))\n}\n\n}\n\\seealso{\n\\code{\\link{augment.mvgam}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/score.mvgam_forecast.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/score.mvgam_forecast.R\n\\name{score.mvgam_forecast}\n\\alias{score.mvgam_forecast}\n\\alias{score}\n\\title{Compute probabilistic forecast scores for \\pkg{mvgam} models}\n\\usage{\n\\method{score}{mvgam_forecast}(\n  object,\n  score = \"crps\",\n  log = FALSE,\n  weights,\n  interval_width = 0.9,\n  n_cores = 1,\n  ...\n)\n\nscore(object, ...)\n}\n\\arguments{\n\\item{object}{\\code{mvgam_forecast} object. See \\code{\\link[=forecast.mvgam]{forecast.mvgam()}}.}\n\n\\item{score}{\\code{character} specifying the type of proper scoring rule\nto use for evaluation. Options are: \\code{sis} (i.e. the Scaled Interval\nScore), \\code{energy}, \\code{variogram}, \\code{elpd} (i.e. the Expected log pointwise\nPredictive Density), \\code{drps} (i.e. the Discrete Rank Probability Score),\n\\code{crps} (the Continuous Rank Probability Score) or \\code{brier} (the latter\nof which is only applicable for \\code{bernoulli} models. Note that when\nchoosing \\code{elpd}, the supplied object must have forecasts on the \\code{link}\nscale so that expectations can be calculated prior to scoring. If\nchoosing \\code{brier}, the object must have forecasts on the \\code{expected} scale\n(i.e. probability predictions). For all other scores, forecasts should\nbe supplied on the \\code{response} scale (i.e. posterior predictions)}\n\n\\item{log}{\\code{logical}. Should the forecasts and truths be logged\nprior to scoring? This is often appropriate for comparing performance\nof models when series vary in their observation ranges. Ignored if\n\\code{score = 'brier'}}\n\n\\item{weights}{optional \\code{vector} of weights (where\n\\code{length(weights) == n_series}) for weighting pairwise correlations\nwhen evaluating the variogram score for multivariate forecasts. Useful\nfor down-weighting series that have larger magnitude observations or\nthat are of less interest when forecasting. Ignored if\n\\code{score != 'variogram'}}\n\n\\item{interval_width}{proportional value on \\verb{[0.05,0.95]} defining the\nforecast interval for calculating coverage and, if \\code{score = 'sis'}, for\ncalculating the interval score. Ignored if \\code{score = 'brier'}}\n\n\\item{n_cores}{\\code{integer} specifying number of cores for calculating\nscores in parallel}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{list} containing scores and interval coverages per\nforecast horizon. If \\code{score \\%in\\% c('drps', 'crps', 'elpd', 'brier')},\nthe list will also contain return the sum of all series-level scores\nper horizon. If \\code{score \\%in\\% c('energy','variogram')}, no\nseries-level scores are computed and the only score returned will be\nfor all series. For all scores apart from \\code{elpd} and \\code{brier}, the\n\\code{in_interval} column in each series-level slot is a binary indicator of\nwhether or not the true value was within the forecast's corresponding\nposterior empirical quantiles. Intervals are not calculated when using\n\\code{elpd} because forecasts will only contain the linear predictors\n}\n\\description{\nCompute probabilistic forecast scores for \\pkg{mvgam} models\n}\n\\examples{\n\\dontrun{\n# Simulate observations for three count-valued time series\ndata <- sim_mvgam()\n\n# Fit a dynamic model using 'newdata' to automatically produce forecasts\nmod <- mvgam(\n  y ~ 1,\n  trend_model = RW(),\n  data = data$data_train,\n  newdata = data$data_test,\n  chains = 2,\n  silent = 2\n)\n\n# Extract forecasts into a 'mvgam_forecast' object\nfc <- forecast(mod)\nplot(fc)\n\n# Compute Discrete Rank Probability Scores and 0.90 interval coverages\nfc_scores <- score(fc, score = 'drps')\nstr(fc_scores)\n\n# An example using binary data\ndata <- sim_mvgam(family = bernoulli())\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc', k = 6),\n  trend_model = AR(),\n  data = data$data_train,\n  newdata = data$data_test,\n  family = bernoulli(),\n  chains = 2,\n  silent = 2\n)\n\n# Extract forecasts on the expectation (probability) scale\nfc <- forecast(mod, type = 'expected')\nplot(fc)\n\n# Compute Brier scores\nfc_scores <- score(fc, score = 'brier')\nstr(fc_scores)\n}\n\n}\n\\references{\nGneiting, T. and Raftery, A. E. (2007). Strictly Proper\nScoring Rules, Prediction, and Estimation. \\emph{Journal of the American\nStatistical Association}, 102(477), 359-378.\n\\doi{10.1198/016214506000001437}\n}\n\\seealso{\n\\code{\\link{forecast.mvgam}}, \\code{\\link{ensemble}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/series_to_mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/series_to_mvgam.R\n\\name{series_to_mvgam}\n\\alias{series_to_mvgam}\n\\title{Convert timeseries object to format necessary for \\pkg{mvgam} models}\n\\usage{\nseries_to_mvgam(series, freq, train_prop = 0.85)\n}\n\\arguments{\n\\item{series}{\\code{\\link[xts]{xts}} or \\code{\\link[stats]{ts}} object to be\nconverted to \\code{\\link{mvgam}} format}\n\n\\item{freq}{\\code{integer}. The seasonal frequency of the series}\n\n\\item{train_prop}{\\code{numeric} stating the proportion of data to use for\ntraining. Should be between \\code{0.25} and \\code{0.95}}\n}\n\\value{\nA \\code{list} object containing outputs needed for\n\\code{\\link{mvgam}}, including 'data_train' and 'data_test'\n}\n\\description{\nThis function converts univariate or multivariate time series (\\code{xts} or\n\\code{ts} objects) to the format necessary for \\code{\\link{mvgam}}.\n}\n\\examples{\n# A ts object example\ndata(\"sunspots\")\nseries <- cbind(sunspots, sunspots)\ncolnames(series) <- c('blood', 'bone')\nhead(series)\nseries_to_mvgam(series, frequency(series), 0.85)\n\n# An xts object example\nlibrary(xts)\ndates <- seq(as.Date(\"2001-05-01\"), length = 30, by = \"quarter\")\n\ndata <- cbind(\n  c(gas = rpois(30, cumprod(1 + rnorm(30, mean = 0.01, sd = 0.001)))),\n  c(oil = rpois(30, cumprod(1 + rnorm(30, mean = 0.01, sd = 0.001))))\n)\n\nseries <- xts(x = data, order.by = dates)\ncolnames(series) <- c('gas', 'oil')\nhead(series)\nseries_to_mvgam(series, freq = 4, train_prop = 0.85)\n\n}\n"
  },
  {
    "path": "man/sim_mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/sim_mvgam.R\n\\name{sim_mvgam}\n\\alias{sim_mvgam}\n\\title{Simulate a set of time series for modelling in \\pkg{mvgam}}\n\\usage{\nsim_mvgam(\n  T = 100,\n  n_series = 3,\n  seasonality = \"shared\",\n  use_lv = FALSE,\n  n_lv = 0,\n  trend_model = RW(),\n  drift = FALSE,\n  prop_trend = 0.2,\n  trend_rel,\n  freq = 12,\n  family = poisson(),\n  phi,\n  shape,\n  sigma,\n  nu,\n  mu,\n  prop_missing = 0,\n  prop_train = 0.85\n)\n}\n\\arguments{\n\\item{T}{\\code{integer}. Number of observations (timepoints)}\n\n\\item{n_series}{\\code{integer}. Number of discrete time series}\n\n\\item{seasonality}{\\code{character}. Either \\code{shared}, meaning that\nall series share the exact same seasonal pattern, or\n\\code{hierarchical}, meaning that there is a global seasonality but\neach series' pattern can deviate slightly}\n\n\\item{use_lv}{\\code{logical}. If \\code{TRUE}, use dynamic factors to\nestimate series' latent trends in a reduced dimension format. If\n\\code{FALSE}, estimate independent latent trends for each series}\n\n\\item{n_lv}{\\code{integer}. Number of latent dynamic factors for\ngenerating the series' trends. Defaults to \\code{0}, meaning that dynamics\nare estimated independently for each series}\n\n\\item{trend_model}{\\code{character} specifying the time series dynamics\nfor the latent trend. Options are:\n\\itemize{\n\\item \\code{None} (no latent trend component; i.e. the GAM component is\nall that contributes to the linear predictor, and the observation\nprocess is the only source of error; similarly to what is estimated\nby \\code{\\link[mgcv]{gam}})\n\\item \\code{RW} (random walk with possible drift)\n\\item \\code{AR1} (with possible drift)\n\\item \\code{AR2} (with possible drift)\n\\item \\code{AR3} (with possible drift)\n\\item \\code{VAR1} (contemporaneously uncorrelated VAR1)\n\\item \\code{VAR1cor} (contemporaneously correlated VAR1)\n\\item \\code{GP} (Gaussian Process with squared exponential kernel)\n}\nSee \\link{mvgam_trends} for more details}\n\n\\item{drift}{\\code{logical}, simulate a drift term for each trend}\n\n\\item{prop_trend}{\\code{numeric}. Relative importance of the trend for\neach series. Should be between \\code{0} and \\code{1}}\n\n\\item{trend_rel}{Deprecated. Use \\code{prop_trend} instead}\n\n\\item{freq}{\\code{integer}. The seasonal frequency of the series}\n\n\\item{family}{\\code{family} specifying the exponential observation\nfamily for the series. Currently supported families are: \\code{nb()},\n\\code{poisson()}, \\code{bernoulli()}, \\code{tweedie()}, \\code{gaussian()}, \\code{betar()},\n\\code{lognormal()}, \\code{student()} and \\code{Gamma()}}\n\n\\item{phi}{\\code{vector} of dispersion parameters for the series\n(i.e. \\code{size} for \\code{nb()} or \\code{phi} for \\code{betar()}). If\n\\code{length(phi) < n_series}, the first element of \\code{phi} will be\nreplicated \\code{n_series} times. Defaults to \\code{5} for \\code{nb()} and\n\\code{tweedie()}; \\code{10} for \\code{betar()}}\n\n\\item{shape}{\\code{vector} of shape parameters for the series\n(i.e. \\code{shape} for \\code{gamma()}). If \\code{length(shape) < n_series},\nthe first element of \\code{shape} will be replicated \\code{n_series} times.\nDefaults to \\code{10}}\n\n\\item{sigma}{\\code{vector} of scale parameters for the series\n(i.e. \\code{sd} for \\code{gaussian()} or \\code{student()}, \\code{log(sd)} for\n\\code{lognormal()}). If \\code{length(sigma) < n_series}, the first element\nof \\code{sigma} will be replicated \\code{n_series} times. Defaults to\n\\code{0.5} for \\code{gaussian()} and \\code{student()}; \\code{0.2} for\n\\code{lognormal()}}\n\n\\item{nu}{\\code{vector} of degrees of freedom parameters for the series\n(i.e. \\code{nu} for \\code{student()}). If \\code{length(nu) < n_series}, the\nfirst element of \\code{nu} will be replicated \\code{n_series} times. Defaults\nto \\code{3}}\n\n\\item{mu}{\\code{vector} of location parameters for the series. If\n\\code{length(mu) < n_series}, the first element of \\code{mu} will be\nreplicated \\code{n_series} times. Defaults to small random values between\n\\code{-0.5} and \\code{0.5} on the link scale}\n\n\\item{prop_missing}{\\code{numeric} stating proportion of observations\nthat are missing. Should be between \\code{0} and \\code{0.8}, inclusive}\n\n\\item{prop_train}{\\code{numeric} stating the proportion of data to use\nfor training. Should be between \\code{0.2} and \\code{1}}\n}\n\\value{\nA \\code{list} object containing outputs needed for\n\\code{\\link{mvgam}}, including 'data_train' and 'data_test', as well\nas some additional information about the simulated seasonality and\ntrend dependencies\n}\n\\description{\nThis function simulates sets of time series data for fitting a\nmultivariate GAM that includes shared seasonality and dependence on\nState-Space latent dynamic factors. Random dependencies among series,\ni.e. correlations in their long-term trends, are included in the form of\ncorrelated loadings on the latent dynamic factors\n}\n\\examples{\n# Simulate series with observations bounded at 0 and 1 (Beta responses)\nsim_data <- sim_mvgam(\n  family = betar(),\n  trend_model = RW(),\n  prop_trend = 0.6\n)\nplot_mvgam_series(data = sim_data$data_train, series = 'all')\n\n# Now simulate series with overdispersed discrete observations\nsim_data <- sim_mvgam(\n  family = nb(),\n  trend_model = RW(),\n  prop_trend = 0.6,\n  phi = 10\n)\nplot_mvgam_series(data = sim_data$data_train, series = 'all')\n\n}\n\\references{\nClark, N. J. and Wells, K. (2022). Dynamic generalised\nadditive models (DGAMs) for forecasting discrete ecological time\nseries. \\emph{Methods in Ecology and Evolution}, 13(11), 2388-2404.\n\\doi{10.1111/2041-210X.13974}\n}\n"
  },
  {
    "path": "man/stability.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/stability.R\n\\name{stability.mvgam}\n\\alias{stability.mvgam}\n\\alias{stability}\n\\title{Calculate measures of latent VAR community stability}\n\\usage{\nstability(object, ...)\n\n\\method{stability}{mvgam}(object, ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object of class \\code{mvgam} resulting from a call\nto \\code{\\link[=mvgam]{mvgam()}} that used a Vector Autoregressive latent process model (either\nas \\code{VAR(cor = FALSE)} or \\code{VAR(cor = TRUE)})}\n\n\\item{...}{Ignored}\n}\n\\value{\nA \\code{data.frame} containing posterior draws for each stability\nmetric.\n}\n\\description{\nCompute reactivity, return rates and contributions of interactions to\nstationary forecast variance from \\pkg{mvgam} models with Vector\nAutoregressive dynamics.\n}\n\\details{\nThese measures of stability can be used to assess how important\ninter-series dependencies are to the variability of a multivariate system\nand to ask how systems are expected to respond to environmental\nperturbations. Using the formula for a latent VAR(1) as:\n\n\\deqn{\n  \\mu_t \\sim \\text{MVNormal}(A(\\mu_{t - 1}), \\Sigma)\n  }\n\nthis function will calculate the long-term stationary forecast distribution\nof the system, which has mean \\eqn{\\mu_{\\infty}} and variance\n\\eqn{\\Sigma_{\\infty}}, to then calculate the following quantities:\n\n\\itemize{\n\\item \\code{prop_int}: Proportion of the volume of the stationary forecast\ndistribution that is attributable to lagged interactions:\n\\deqn{ det(A)^2 }\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{\\\\item `prop_int_adj`: Same as `prop_int` but scaled by the number of\nseries \\eqn{p}:\n\\deqn{ det(A)^{2/p} }\n\n\\\\item `prop_int_offdiag`: Sensitivity of `prop_int` to inter-series\ninteractions (off-diagonals of \\eqn{A}):\n\\deqn{ [2~det(A) (A^{-1})^T] }\n\n\\\\item `prop_int_diag`: Sensitivity of `prop_int` to intra-series\ninteractions (diagonals of \\eqn{A}):\n\\deqn{ [2~det(A) (A^{-1})^T] }\n\n\\\\item `prop_cov_offdiag`: Sensitivity of \\eqn{\\Sigma_{\\infty}} to\ninter-series error correlations:\n\\deqn{ [2~det(\\Sigma_{\\infty}) (\\Sigma_{\\infty}^{-1})^T] }\n\n\\\\item `prop_cov_diag`: Sensitivity of \\eqn{\\Sigma_{\\infty}} to error\nvariances:\n\\deqn{ [2~det(\\Sigma_{\\infty}) (\\Sigma_{\\infty}^{-1})^T] }\n\n\\\\item `reactivity`: Degree to which the system moves away from a stable\nequilibrium following a perturbation. If \\eqn{\\sigma_{max}(A)} is the\nlargest singular value of \\eqn{A}:\n\\deqn{ \\log\\sigma_{max}(A) }\n\n\\\\item `mean_return_rate`: Asymptotic return rate of the mean of the\ntransition distribution to the stationary mean:\n\\deqn{ \\max(\\lambda_{A}) }\n\n\\\\item `var_return_rate`: Asymptotic return rate of the variance of the\ntransition distribution to the stationary variance:\n\\deqn{ \\max(\\lambda_{A \\otimes A}) }\n}\\if{html}{\\out{</div>}}\n\n}\n\nMajor advantages of using \\pkg{mvgam} to compute these metrics are that\nwell-calibrated uncertainties are available and that VAR processes are\nforced to be stationary. These properties make it simple and insightful to\ncalculate and inspect aspects of both long-term and short-term stability.\n\nYou can also inspect interactions among the time series in a latent VAR\nprocess using \\code{\\link{irf}} for impulse response functions or\n\\code{\\link{fevd}} for forecast error variance decompositions.\n}\n\\examples{\n\\dontrun{\n# Simulate some time series that follow a latent VAR(1) process\nsimdat <- sim_mvgam(\n  family = gaussian(),\n  n_series = 4,\n  trend_model = VAR(cor = TRUE),\n  prop_trend = 1\n)\n\nplot_mvgam_series(data = simdat$data_train, series = 'all')\n\n# Fit a model that uses a latent VAR(1)\nmod <- mvgam(\n  y ~ -1,\n  trend_formula = ~ 1,\n  trend_model = VAR(cor = TRUE),\n  family = gaussian(),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\n# Calculate stability metrics for this system\nmetrics <- stability(mod)\n\n# Proportion of stationary forecast distribution attributable to interactions\nhist(\n  metrics$prop_int,\n  xlim = c(0, 1),\n  xlab = 'Prop_int',\n  main = '',\n  col = '#B97C7C',\n  border = 'white'\n)\n\n# Inter- vs intra-series interaction contributions\nlayout(matrix(1:2, nrow = 2))\nhist(\n  metrics$prop_int_offdiag,\n  xlim = c(0, 1),\n  xlab = '',\n  main = 'Inter-series interactions',\n  col = '#B97C7C',\n  border = 'white'\n)\n\nhist(\n  metrics$prop_int_diag,\n  xlim = c(0, 1),\n  xlab = 'Contribution to interaction effect',\n  main = 'Intra-series interactions (density dependence)',\n  col = 'darkblue',\n  border = 'white'\n)\nlayout(1)\n\n# Inter- vs intra-series contributions to forecast variance\nlayout(matrix(1:2, nrow = 2))\nhist(\n  metrics$prop_cov_offdiag,\n  xlim = c(0, 1),\n  xlab = '',\n  main = 'Inter-series covariances',\n  col = '#B97C7C',\n  border = 'white'\n)\n\nhist(\n  metrics$prop_cov_diag,\n  xlim = c(0, 1),\n  xlab = 'Contribution to forecast variance',\n  main = 'Intra-series variances',\n  col = 'darkblue',\n  border = 'white'\n)\nlayout(1)\n\n# Reactivity: system response to perturbation\nhist(\n  metrics$reactivity,\n  main = '',\n  xlab = 'Reactivity',\n  col = '#B97C7C',\n  border = 'white',\n  xlim = c(\n    -1 * max(abs(metrics$reactivity)),\n    max(abs(metrics$reactivity))\n  )\n)\nabline(v = 0, lwd = 2.5)\n}\n\n}\n\\references{\nAR Ives, B Dennis, KL Cottingham & SR Carpenter (2003). Estimating\ncommunity stability and ecological interactions from time-series data.\n\\emph{Ecological Monographs}, 73, 301–330.\n}\n\\seealso{\n\\code{\\link{VAR}},\n\\code{\\link{irf}},\n\\code{\\link{fevd}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/summary.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/summary.mvgam.R\n\\name{summary.mvgam}\n\\alias{summary.mvgam}\n\\alias{summary.mvgam_prefit}\n\\alias{coef.mvgam}\n\\title{Summary for a fitted \\pkg{mvgam} models}\n\\usage{\n\\method{summary}{mvgam}(object, include_betas = TRUE, smooth_test = TRUE, digits = 2, ...)\n\n\\method{summary}{mvgam_prefit}(object, ...)\n\n\\method{coef}{mvgam}(object, summarise = TRUE, ...)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}}\n\n\\item{include_betas}{Logical. Print a summary that includes posterior\nsummaries of all linear predictor beta coefficients (including spline\ncoefficients)? Defaults to \\code{TRUE} but use \\code{FALSE} for a more\nconcise summary}\n\n\\item{smooth_test}{Logical. Compute estimated degrees of freedom and\napproximate p-values for smooth terms? Defaults to \\code{TRUE}, but users\nmay wish to set to \\code{FALSE} for complex models with many smooth or\nrandom effect terms}\n\n\\item{digits}{The number of significant digits for printing out the summary;\ndefaults to \\code{2}.}\n\n\\item{...}{Ignored}\n\n\\item{summarise}{\\code{logical}. Summaries of coefficients will be returned\nif \\code{TRUE}. Otherwise the full posterior distribution will be returned}\n}\n\\value{\nFor \\code{summary.mvgam}, an object of class \\code{mvgam_summary} containing:\n\\itemize{\n\\item \\code{model_spec}: Model specification details (formulas, family, dimensions)\n\\item \\code{parameters}: Parameter estimates and significance tests\n\\item \\code{diagnostics}: MCMC convergence diagnostics\n\\item \\code{sampling_info}: Sampling algorithm details\n}\n\nFor \\code{summary.mvgam_prefit}, a \\code{list} is printed on-screen showing\nthe model specifications\n\nFor \\code{coef.mvgam}, either a \\code{matrix} of posterior coefficient\ndistributions (if \\code{summarise == FALSE} or \\code{data.frame} of\ncoefficient summaries)\n}\n\\description{\nThese functions take a fitted \\code{mvgam} or \\code{jsdgam} object and\nreturn various useful summaries\n}\n\\details{\n\\code{summary.mvgam} and \\code{summary.mvgam_prefit} return brief summaries of\nthe model's call, along with posterior intervals for some of the key\nparameters in the model. Note that some smooths have extra penalties on the\nnull space, so summaries for the \\code{rho} parameters may include more\npenalty terms than the number of smooths in the original model formula.\nApproximate p-values for smooth terms are also returned, with methods used\nfor their calculation following those used for \\code{mgcv} equivalents (see\n\\code{\\link[mgcv]{summary.gam}} for details). The Estimated Degrees of\nFreedom (edf) for smooth terms is computed using either \\code{edf.type = 1} for\nmodels with no trend component, or \\code{edf.type = 0} for models with trend\ncomponents. These are described in the documentation for\n\\code{\\link[mgcv]{jagam}}. Experiments suggest these p-values tend to be\nmore conservative than those that might be returned from an equivalent model\nfit with \\code{\\link[mgcv]{summary.gam}} using \\code{method = 'REML'}\n\n\\code{coef.mvgam} returns either summaries or full posterior estimates for \\code{GAM}\ncomponent coefficients\n}\n\\examples{\n\\dontrun{\nsimdat <- sim_mvgam(seasonality = \"hierarchical\")\n\nmod <- mvgam(\n  y ~ series +\n    s(season, bs = \"cc\", k = 6) +\n    s(season, series, bs = \"fs\", k = 4),\n  data = simdat$data_train,\n  chains = 2,\n  silent = 2\n)\n\nmod_summary <- summary(mod)\nmod_summary\n}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/summary.mvgam_fevd.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_fevd-class.R\n\\name{summary.mvgam_fevd}\n\\alias{summary.mvgam_fevd}\n\\title{Posterior summary of forecast error variance decompositions}\n\\usage{\n\\method{summary}{mvgam_fevd}(object, probs = c(0.025, 0.975), ...)\n}\n\\arguments{\n\\item{object}{an object of class \\code{mvgam_fevd} obtained using the\n\\code{fevd()} function. This object will contain draws from the posterior\ndistribution of the forecast error variance decompositions.}\n\n\\item{probs}{The upper and lower percentiles to be computed by the\n\\code{quantile} function, in addition to the median}\n\n\\item{...}{ignored}\n}\n\\value{\nA long-format \\code{tibble} / \\code{data.frame} reporting the posterior median,\nupper and lower percentiles of the error variance decompositions of each\nseries at all horizons.\n}\n\\description{\nThis function takes an \\code{mvgam_fevd} object and calculates\na posterior summary of the error variance decompositions of each series,\nat all horizons\n}\n\\seealso{\n\\code{\\link{fevd}}, \\code{\\link{plot.mvgam_fevd}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/summary.mvgam_forecast.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_forecast-class.R\n\\name{summary.mvgam_forecast}\n\\alias{summary.mvgam_forecast}\n\\title{Posterior summary of hindcast and forecast objects}\n\\usage{\n\\method{summary}{mvgam_forecast}(object, probs = c(0.025, 0.975), ...)\n}\n\\arguments{\n\\item{object}{an object of class \\code{mvgam_forecast} obtained using either the\n\\code{hindcast()} or \\code{function()} function. This object will contain\ndraws from the posterior distribution of hindcasts and forecasts.}\n\n\\item{probs}{The upper and lower percentiles to be computed by the\n\\code{quantile} function, in addition to the median}\n\n\\item{...}{ignored}\n}\n\\value{\nA long-format \\code{tibble} / \\code{data.frame} reporting the posterior median,\nupper and lower percentiles of the predictions for each series at each of\nthe timepoints that were originally supplied in \\code{data} and, optionally,\nin \\code{newdata}.\n}\n\\description{\nThis function takes an \\code{mvgam_forecast} object and\ncalculates a posterior summary of the hindcast and forecast distributions\nof each series, along with any true values that were included in \\code{data}\nand \\code{newdata} if \\code{type = 'response'} was used in the call to\n\\code{hindcast()} or \\code{function()}\n}\n\\seealso{\n\\code{\\link{forecast.mvgam}}, \\code{\\link{plot.mvgam_forecast}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/summary.mvgam_irf.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/mvgam_irf-class.R\n\\name{summary.mvgam_irf}\n\\alias{summary.mvgam_irf}\n\\title{Posterior summary of impulse responses}\n\\usage{\n\\method{summary}{mvgam_irf}(object, probs = c(0.025, 0.975), ...)\n}\n\\arguments{\n\\item{object}{an object of class \\code{mvgam_irf} obtained using the\n\\code{irf()} function. This object will contain draws from the posterior\ndistribution of the impulse responses.}\n\n\\item{probs}{The upper and lower percentiles to be computed by the\n\\code{quantile} function, in addition to the median}\n\n\\item{...}{ignored}\n}\n\\value{\nA long-format \\code{tibble} / \\code{data.frame} reporting the posterior median,\nupper and lower percentiles of the impulse responses of each series to\nshocks from each of the other series at all horizons.\n}\n\\description{\nThis function takes an \\code{mvgam_irf} object and\ncalculates a posterior summary of the impulse responses of each\nseries to shocks from each of the other series, at all horizons\n}\n\\seealso{\n\\code{\\link{irf}}, \\code{\\link{plot.mvgam_irf}}\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "man/tidy.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/tidier_methods.R\n\\name{tidy.mvgam}\n\\alias{tidy.mvgam}\n\\title{Tidy an \\code{mvgam} object's parameter posteriors}\n\\usage{\n\\method{tidy}{mvgam}(x, probs = c(0.025, 0.5, 0.975), ...)\n}\n\\arguments{\n\\item{x}{An object of class \\code{mvgam}.}\n\n\\item{probs}{The desired probability levels of the parameters' posteriors.\nDefaults to \\code{c(0.025, 0.5, 0.975)}, i.e. 2.5\\%, 50\\%, and 97.5\\%.}\n\n\\item{...}{Unused, included for generic consistency only.}\n}\n\\value{\nA \\code{tibble} containing:\n\\itemize{\n\\item \"parameter\": The parameter in question.\n\\item \"type\": The component of the model that the parameter belongs to (see\ndetails).\n\\item \"mean\": The posterior mean.\n\\item \"sd\": The posterior standard deviation.\n\\item percentile(s): Any percentiles of interest from these posteriors.\n}\n}\n\\description{\nGet parameters' posterior statistics, implementing the generic \\code{tidy} from\nthe package \\pkg{broom}.\n}\n\\details{\nThe parameters are categorized by the column \"type\". For instance, the\nintercept of the observation model (i.e. the \"formula\" arg to \\code{mvgam()}) has\nthe \"type\" \"observation_beta\". The possible \"type\"s are:\n\\itemize{\n\\item observation_family_extra_param: any extra parameters for your observation\nmodel, e.g. sigma for a gaussian observation model. These parameters are\nnot directly derived from the latent trend components (contrast to mu).\n\\item observation_beta: betas from your observation model, excluding any\nsmooths. If your formula was \\code{y ~ x1 + s(x2, bs='cr')}, then your\nintercept and \\code{x1}'s beta would be categorized as this.\n\\item random_effect_group_level: Group-level random effects parameters, i.e.\nthe mean and sd of the distribution from which the specific random\nintercepts/slopes are considered to be drawn from.\n\\item random_effect_beta: betas for the individual random intercepts/slopes.\n\\item trend_model_param: parameters from your \\code{trend_model}.\n\\item trend_beta: analog of \"observation_beta\", but for any \\code{trend_formula}.\n\\item trend_random_effect_group_level: analog of\n\"random_effect_group_level\", but for any \\code{trend_formula}.\n\\item trend_random_effect_beta: analog of \"random_effect_beta\", but for any\n\\code{trend_formula}.\n}\n\nAdditionally, GP terms can be incorporated in several ways, leading to\ndifferent \"type\"s (or absence!):\n\\itemize{\n\\item \\code{s(bs = \"gp\")}: No parameters returned.\n\\item \\code{gp()} in \\code{formula}: \"type\" of \"observation_param\".\n\\item \\code{gp()} in \\code{trend_formula}: \"type\" of \"trend_formula_param\".\n\\item \\code{GP()} in \\code{trend_model}: \"type\" of \"trend_model_param\".\n}\n}\n\\examples{\n\\dontrun{\nset.seed(0)\nsimdat <- sim_mvgam(\n  T = 100,\n  n_series = 3,\n  trend_model = AR(),\n  prop_trend = 0.75,\n  family = gaussian()\n)\n\nsimdat$data_train$x <- rnorm(nrow(simdat$data_train))\nsimdat$data_train$year_fac <- factor(simdat$data_train$year)\n\nmod <- mvgam(\n  y ~ -1 + s(time, by = series, bs = 'cr', k = 20) + x,\n  trend_formula = ~ s(year_fac, bs = 're') - 1,\n  trend_model = AR(cor = TRUE),\n  family = gaussian(),\n  data = simdat$data_train,\n  silent = 2\n)\n\ntidy(mod, probs = c(0.2, 0.5, 0.8))\n}\n\n}\n\\seealso{\nOther tidiers: \n\\code{\\link{augment.mvgam}()}\n}\n\\concept{tidiers}\n"
  },
  {
    "path": "man/update.mvgam.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/update.mvgam.R\n\\name{update.mvgam}\n\\alias{update.mvgam}\n\\alias{update.jsdgam}\n\\title{Update an existing \\pkg{mvgam} model object}\n\\usage{\n\\method{update}{mvgam}(\n  object,\n  formula,\n  trend_formula,\n  knots,\n  trend_knots,\n  trend_model,\n  family,\n  share_obs_params,\n  data,\n  newdata,\n  trend_map,\n  use_lv,\n  n_lv,\n  priors,\n  chains,\n  burnin,\n  samples,\n  threads,\n  algorithm,\n  lfo = FALSE,\n  ...\n)\n\n\\method{update}{jsdgam}(\n  object,\n  formula,\n  factor_formula,\n  knots,\n  factor_knots,\n  data,\n  newdata,\n  n_lv,\n  family,\n  share_obs_params,\n  priors,\n  chains,\n  burnin,\n  samples,\n  threads,\n  algorithm,\n  lfo = FALSE,\n  ...\n)\n}\n\\arguments{\n\\item{object}{\\code{list} object returned from \\code{mvgam}. See \\code{\\link[=mvgam]{mvgam()}}}\n\n\\item{formula}{Optional new \\code{formula} object. Note, \\code{mvgam} currently does\nnot support dynamic formula updates such as removal of specific terms with\n\\code{- term}. When updating, the entire formula needs to be supplied.}\n\n\\item{trend_formula}{An optional \\code{formula} object specifying the GAM process\nmodel formula. If supplied, a linear predictor will be modelled for the\nlatent trends to capture process model evolution separately from the\nobservation model.\n\n\\strong{Important notes:}\n\\itemize{\n\\item Should not have a response variable specified on the left-hand side\n(e.g., \\code{~ season + s(year)})\n\\item Use \\code{trend} instead of \\code{series} for effects that vary across time series\n\\item Only available for \\code{RW()}, \\code{AR()} and \\code{VAR()} trend models\n\\item In \\code{nmix()} family models, sets up linear predictor for latent abundance\n\\item Consider dropping one intercept using \\code{- 1} convention to avoid\nestimation challenges\n}}\n\n\\item{knots}{An optional \\code{list} containing user specified knot values for\nbasis construction. For most bases the user simply supplies the knots to be\nused, which must match up with the \\code{k} value supplied. Different terms can\nuse different numbers of knots, unless they share a covariate.}\n\n\\item{trend_knots}{As for \\code{knots} above, this is an optional \\code{list} of knot\nvalues for smooth functions within the \\code{trend_formula}.}\n\n\\item{trend_model}{\\code{character} or \\code{function} specifying the time series dynamics\nfor the latent trend.\n\n\\strong{Available options:}\n\\itemize{\n\\item \\code{None}: No latent trend component (GAM component only, like \\code{\\link[mgcv]{gam}})\n\\item \\code{ZMVN} or \\code{ZMVN()}: Zero-Mean Multivariate Normal (Stan only)\n\\item \\code{'RW'} or \\code{RW()}: Random Walk\n\\item \\code{'AR1'}, \\code{'AR2'}, \\code{'AR3'} or \\code{AR(p = 1, 2, 3)}: Autoregressive models\n\\item \\code{'CAR1'} or \\code{CAR(p = 1)}: Continuous-time AR (Ornstein–Uhlenbeck process)\n\\item \\code{'VAR1'} or \\code{VAR()}: Vector Autoregressive (Stan only)\n\\item \\code{'PWlogistic'}, \\code{'PWlinear'} or \\code{PW()}: Piecewise trends (Stan only)\n\\item \\code{'GP'} or \\code{GP()}: Gaussian Process with squared exponential kernel (Stan only)\n}\n\n\\strong{Additional features:}\n\\itemize{\n\\item Moving average and/or correlated process error terms available for most types\n(e.g., \\code{RW(cor = TRUE)} for multivariate Random Walk)\n\\item Hierarchical correlations possible for structured data\n\\item See \\link{mvgam_trends} for details and \\code{\\link[=ZMVN]{ZMVN()}} for examples\n}}\n\n\\item{family}{\\code{family} specifying the exponential observation family for the series.\n\n\\strong{Supported families:}\n\\itemize{\n\\item \\code{gaussian()}: Real-valued data\n\\item \\code{betar()}: Proportional data on \\verb{(0,1)}\n\\item \\code{lognormal()}: Non-negative real-valued data\n\\item \\code{student_t()}: Real-valued data\n\\item \\code{Gamma()}: Non-negative real-valued data\n\\item \\code{bernoulli()}: Binary data\n\\item \\code{poisson()}: Count data (default)\n\\item \\code{nb()}: Overdispersed count data\n\\item \\code{binomial()}: Count data with imperfect detection when number of trials is known\n(use \\code{cbind()} to bind observations and trials)\n\\item \\code{beta_binomial()}: As \\code{binomial()} but allows for overdispersion\n\\item \\code{nmix()}: Count data with imperfect detection when number of trials is unknown\n(State-Space N-Mixture model with Poisson latent states and Binomial observations)\n}\n\nSee \\code{\\link{mvgam_families}} for more details.}\n\n\\item{share_obs_params}{\\code{logical}. If \\code{TRUE} and the \\code{family} has additional\nfamily-specific observation parameters (e.g., variance components, dispersion\nparameters), these will be shared across all outcome variables. Useful when\nmultiple outcomes share properties. Default is \\code{FALSE}.}\n\n\\item{data}{A \\code{dataframe} or \\code{list} containing the model response variable\nand covariates required by the GAM \\code{formula} and optional \\code{trend_formula}.\n\n\\strong{Required columns for most models:}\n\\itemize{\n\\item \\code{series}: A \\code{factor} index of the series IDs (number of levels should equal\nnumber of unique series labels)\n\\item \\code{time}: \\code{numeric} or \\code{integer} index of time points. For most dynamic trend\ntypes, time should be measured in discrete, regularly spaced intervals\n(i.e., \\code{c(1, 2, 3, ...)}). Irregular spacing is allowed for \\code{trend_model = CAR(1)},\nbut zero intervals are adjusted to \\code{1e-12} to prevent sampling errors.\n}\n\n\\strong{Special cases:}\n\\itemize{\n\\item Models with hierarchical temporal correlation (e.g., \\code{AR(gr = region, subgr = species)})\nshould NOT include a \\code{series} identifier\n\\item Models without temporal dynamics (\\code{trend_model = 'None'} or \\code{trend_model = ZMVN()})\ndon't require a \\code{time} variable\n}}\n\n\\item{newdata}{Optional \\code{dataframe} or \\code{list} of test data containing the same\nvariables as in \\code{data}. If included, observations in variable \\code{y} will be\nset to \\code{NA} when fitting the model so that posterior simulations can be obtained.}\n\n\\item{trend_map}{Optional \\code{data.frame} specifying which series should depend on\nwhich latent trends. Enables multiple series to depend on the same latent\ntrend process with different observation processes.\n\n\\strong{Required structure:}\n\\itemize{\n\\item Column \\code{series}: Single unique entry for each series (matching factor levels in data)\n\\item Column \\code{trend}: Integer values indicating which trend each series depends on\n}\n\n\\strong{Notes:}\n\\itemize{\n\\item Sets up latent factor model by enabling \\code{use_lv = TRUE}\n\\item Process model intercept is NOT automatically suppressed\n\\item Not yet supported for continuous time models (\\code{CAR()})\n}}\n\n\\item{use_lv}{\\code{logical}. If \\code{TRUE}, use dynamic factors to estimate series'\nlatent trends in a reduced dimension format. Only available for \\code{RW()},\n\\code{AR()} and \\code{GP()} trend models. Default is \\code{FALSE}.\nSee \\code{\\link{lv_correlations}} for examples.}\n\n\\item{n_lv}{\\code{integer} specifying the number of latent dynamic factors to use\nif \\code{use_lv == TRUE}. Cannot exceed \\code{n_series}. Default is\n\\code{min(2, floor(n_series / 2))}.}\n\n\\item{priors}{An optional \\code{data.frame} with prior definitions or, preferably,\na vector of \\code{brmsprior} objects (see \\code{\\link[brms]{prior}()}).\nSee \\code{\\link[=get_mvgam_priors]{get_mvgam_priors()}} and Details for more information.}\n\n\\item{chains}{\\code{integer} specifying the number of parallel chains for the model.\nIgnored for variational inference algorithms.}\n\n\\item{burnin}{\\code{integer} specifying the number of warmup iterations to tune\nsampling algorithms. Ignored for variational inference algorithms.}\n\n\\item{samples}{\\code{integer} specifying the number of post-warmup iterations for\nsampling the posterior distribution.}\n\n\\item{threads}{\\code{integer}. Experimental option for within-chain parallelisation\nin Stan using \\code{reduce_sum}. Recommended only for experienced Stan users with\nslow models. Currently works for all families except \\code{nmix()} and when using\nCmdstan backend.}\n\n\\item{algorithm}{Character string naming the estimation approach:\n\\itemize{\n\\item \\code{\"sampling\"}: MCMC (default)\n\\item \\code{\"meanfield\"}: Variational inference with factorized normal distributions\n\\item \\code{\"fullrank\"}: Variational inference with multivariate normal distribution\n\\item \\code{\"laplace\"}: Laplace approximation (cmdstanr only)\n\\item \\code{\"pathfinder\"}: Pathfinder algorithm (cmdstanr only)\n}\n\nCan be set globally via \\code{\"brms.algorithm\"} option. Limited testing suggests\n\\code{\"meanfield\"} performs best among non-MCMC approximations for dynamic GAMs.}\n\n\\item{lfo}{\\code{logical}. Indicates whether this is part of \\link{lfo_cv.mvgam} call.\nReturns lighter model version for speed. Users should leave as \\code{FALSE}.}\n\n\\item{...}{Other arguments to be passed to \\code{\\link{mvgam}} or\n\\code{\\link{jsdgam}}}\n\n\\item{factor_formula}{Optional new \\code{formula} object for the factor linear\npredictors}\n\n\\item{factor_knots}{An optional \\code{list} containing user specified knot\nvalues to be used for basis construction of any smooth terms in\n\\code{factor_formula}. For most bases the user simply supplies the knots to be\nused, which must match up with the \\code{k} value supplied (note that the\nnumber of knots is not always just \\code{k}). Different terms can use different\nnumbers of knots, unless they share a covariate}\n}\n\\value{\nA \\code{list} object of class \\code{mvgam} containing model output,\nthe text representation of the model file, the mgcv model output (for\neasily generating simulations at unsampled covariate values), Dunn-Smyth\nresiduals for each outcome variable and key information needed for other\nfunctions in the package. See \\code{\\link{mvgam-class}} for details. Use\n\\code{methods(class = \"mvgam\")} for an overview on available methods.\n\nA \\code{list} object of class \\code{mvgam} containing model output,\nthe text representation of the model file, the mgcv model output (for\neasily generating simulations at unsampled covariate values), Dunn-Smyth\nresiduals for each series and key information needed for other functions in\nthe package. See \\code{\\link{mvgam-class}} for details. Use\n\\code{methods(class = \"mvgam\")} for an overview on available methods.\n}\n\\description{\nThis function allows a previously fitted \\pkg{mvgam} model to be updated.\n}\n\\examples{\n\\dontrun{\n# Simulate some data and fit a Poisson AR1 model\nsimdat <- sim_mvgam(n_series = 1, trend_model = AR())\n\nmod <- mvgam(\n  y ~ s(season, bs = 'cc'),\n  trend_model = AR(),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  chains = 2\n)\n\nsummary(mod)\nconditional_effects(mod, type = 'link')\n\n# Update to an AR2 model\nupdated_mod <- update(\n  mod,\n  trend_model = AR(p = 2),\n  noncentred = TRUE\n)\n\nsummary(updated_mod)\nconditional_effects(updated_mod, type = 'link')\n\n# Now update to a Binomial AR1 by adding information on trials\n# requires that we supply newdata that contains the 'trials' variable\nsimdat$data_train$trials <- max(simdat$data_train$y) + 15\n\nupdated_mod <- update(\n  mod,\n  formula = cbind(y, trials) ~ s(season, bs = 'cc'),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  family = binomial()\n)\n\nsummary(updated_mod)\nconditional_effects(updated_mod, type = 'link')\n}\n\n}\n\\author{\nNicholas J Clark\n}\n"
  },
  {
    "path": "memcheck.R",
    "content": "devtools::load_all()\nlibrary(testthat)\n\n# Test the c++ functions, which can all be done using sim_mvgam()\n# and forecast()\ncapture_output(sim_mvgam(family = gaussian(), trend_model = RW()))\ncapture_output(sim_mvgam(family = gaussian(), trend_model = AR(p = 1)))\ncapture_output(sim_mvgam(family = gaussian(), trend_model = AR(p = 2)))\ncapture_output(sim_mvgam(family = gaussian(), trend_model = AR(p = 3)))\ncapture_output(sim_mvgam(family = gaussian(), trend_model = VAR()))\ncapture_output(sim_mvgam(family = gaussian(), trend_model = VAR(cor = TRUE)))\nfc <- forecast(\n  mvgam:::mvgam_example1,\n  newdata = mvgam:::mvgam_examp_dat$data_test\n)\n"
  },
  {
    "path": "misc/BeamOptions.tex",
    "content": "\\setbeamertemplate{bibliography item}[text]\n\\setbeamertemplate{caption}[numbered]\n\\usepackage{url,lmodern}\n\\usepackage{amsmath,amsfonts,amssymb,graphicx,\n  amsthm,subfigure,multirow,hyperref,textcomp,natbib}\n\\usepackage[iso,american]{isodate}\n\\usepackage{listings}\n\\usepackage[dvipsnames]{xcolor}\n\\hypersetup{colorlinks=true,urlcolor=BrickRed,linkcolor=BrickRed}\n\n\\definecolor{mygray}{gray}{0.3}\n\\setbeamertemplate{itemize item}{\\color{mygray}$\\blacktriangleright$}\n\\addtobeamertemplate{frametitle}{\\vskip 0.4in}{}\n\n\\usepackage{eso-pic}\n\\setlength{\\paperwidth}{16.5in}\n\\setlength{\\paperheight}{10.5in}\n\\setlength{\\mathindent}{5pt}\n\\usepackage{lmodern}\n\\setbeamertemplate{navigation symbols}{}\n\n\\defbeamertemplate*{footline}{infolines theme} { \\leavevmode%\n  \\hbox{%\n    \\begin{beamercolorbox}[wd=.333333\\paperwidth,ht=2.25ex,dp=1ex,center]{author\n        in head/foot}%\n      \\usebeamerfont{author in\n        head/foot}\\insertshortauthor%~~(\\insertshortinstitute)\n    \\end{beamercolorbox}%\n    \\begin{beamercolorbox}[wd=.333333\\paperwidth,ht=2.25ex,dp=1ex,center]{title\n        in head/foot}%\n      \\usebeamerfont{title in head/foot}\\insertshorttitle\n    \\end{beamercolorbox}%\n    \\begin{beamercolorbox}[wd=.333333\\paperwidth,ht=2.25ex,dp=1ex,right]{date\n        in head/foot}%\n      \\usebeamerfont{date in head/foot}\\insertshortdate{}\\hspace*{2em}\n      \\insertframenumber{} / \\inserttotalframenumber\\hspace*{2ex}\n    \\end{beamercolorbox}}%\n  \\vskip0pt%\n}\n\\newcommand\\AtPagemyUpperLeft[1]{\\AtPageLowerLeft{%\n    \\put(\\LenToUnit{0.88\\paperwidth},\\LenToUnit{0.88\\paperheight}){#1}}}\n\\AddToShipoutPictureFG{\n  \\AtPagemyUpperLeft{{\n      \\href{https://nicholasjclark.github.io/mvgam/}{\\includegraphics[scale=0.5,keepaspectratio]{mvgam_logo.png}}\n      \\hspace{0.025in}\n      \\href{https://mc-stan.org/}{\\includegraphics[scale=0.75,keepaspectratio]{stan_logo.png}}\n}}\n}%\n"
  },
  {
    "path": "misc/cache/__packages",
    "content": "knitr\nggplot2\nnlme\nmgcv\nRcpp\nbrms\nmarginaleffects\ninsight\nmvgam\n"
  },
  {
    "path": "misc/mvgam_cheatsheet-concordance.tex",
    "content": "\\Sconcordance{concordance:mvgam_cheatsheet.tex:mvgam_cheatsheet.Rnw:%\n1 7 1 50 0 1 6 3 1 1 7 1 1 1 8 95 1 4 0 34 1 %\n6 0 17 1 3 0 10 1 1 4 34 1 1 6 8 1 4 0 5 1 9 %\n0 22 1}\n"
  },
  {
    "path": "misc/mvgam_cheatsheet.Rnw",
    "content": "\\documentclass[final,9pt,fleqn]{beamer}\n\\input{BeamOptions.tex}\n\n\\setbeamertemplate{footline}{\\hfill {\\footnotesize \\href{https://creativecommons.org/licenses/by-sa/4.0/}{CC BY-SA 4.0} $\\circ$ Nicholas J. Clark $\\circ$ Learn more at \\href{https://nicholasjclark.github.io/mvgam/index.html}{https://nicholasjclark.github.io/mvgam/index.html} $\\circ$ package version $1.0.9$ $\\circ$ updated: \\today} \\hspace {0.1in} \\vspace{0.1in}}\n\n\\begin{document}\n\n<<include=FALSE>>=\nlibrary(knitr)\nopts_chunk$set(\nconcordance=TRUE\n)\n@\n\n\n\n<<setup, include=FALSE>>=\nlibrary(knitr)\noptions(replace.assign=TRUE, width=50, digits=4)\nopts_knit[[\"set\"]](progress=FALSE)\nlibrary(\"ggplot2\"); theme_set(theme_classic(base_family = 'serif'))\nlibrary(\"mvgam\")\n@\n\n<<include=FALSE, cache=TRUE>>=\nset.seed(1234)\nsimdat <- sim_mvgam(n_series = 1)\nmodel <- mvgam(y ~ s(season, bs = 'cc'),\n               trend_model = RW(),\n               data = simdat$data_train)\nfc <- forecast(model, newdata = simdat$data_test)\n@\n\n\\begin{frame}[fragile]\n  \\frametitle{{\\fontsize{41}{43} \\selectfont \\textcolor{mygray}{mvgam ::}} {\\fontsize{25}{25} \\textbf{\\textcolor{mygray}{CHEATSHEET}}}}\n\\vspace{-0.6in}\n  \\begin{columns}\n    \\begin{column}{0.02\\paperwidth} % left margin space\n    \\end{column}\n\n    \\begin{column}{0.3\\paperwidth}\n\n\\begin{block}\n\\noindent\\makebox[\\linewidth]{\\rule{0.3\\paperwidth}{0.2pt}}\n\nThe \\texttt{mvgam} package provides tools for fitting and interrogating univariate or multivariate State-Space time series models that can include nonlinear smooth functions of covariates, dynamic temporal processes and random effects. A wide variety of latent dynamic processes can be specified. The package also provides tools for interpreting effects, computing and scoring forecasts, as well as generating model code and data objects for further customisation. Models are fitted using \\texttt{Stan} for full Bayesian inference.\n\n\\end{block}\n\n\\begin{block}{{\\fontsize{21}{21} \\selectfont \\color{BrickRed} Modelling with \\texttt{\\color{Orchid} mvgam()}}}\nUsage: \\texttt{\\color{Orchid} mvgam(formula, trend\\_formula, data, trend\\_model, family, ...)}\n\n\\medskip\n\\texttt{\\color{Orchid} formula}: observation model regression formula, built off the \\texttt{mgcv} package. See \\texttt{\\color{Orchid}?mvgam\\_formulae} for more guidance\n\n\\medskip\n\\texttt{\\color{Orchid} trend\\_formula}: optional process model formula (see \\href{https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html}{the State-Space model vignette} and \\href{https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html}{the shared latent states vignette} for guidance on using trend formulae)\n\n\\medskip\n\\texttt{\\color{Orchid} data}: a \\texttt{data.frame} or \\texttt{list} containing the response variable(s) and optional predictor variables. See \\href{https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html}{the data formatting vignette} for guidance on data preparation\n\n\\medskip\n\\texttt{\\color{Orchid} trend\\_model}: optional latent dynamic process. Options include (among others):\n\\begin{itemize}\n\n\\item\\texttt{\\color{Orchid} None}: default, no dynamic process\n\n\\item\\texttt{\\color{Orchid} RW(ma = FALSE, cor = FALSE)}: random walk\n\n\\item\\texttt{\\color{Orchid} AR(p = 1, ma = FALSE, cor = FALSE)}: autoregressive\n\n\\item\\texttt{\\color{Orchid} VAR(ma = FALSE, cor = FALSE)}: vector autoregressive\n\n\\item\\texttt{\\color{Orchid} PW(growth = 'linear')}: piecewise linear\n\n\\item\\texttt{\\color{Orchid} PW(growth = 'logistic')}: piecewise logistic, with max saturation\n\n\\item\\texttt{\\color{Orchid} GP()}: squared exponential Gaussian Process\n\\end{itemize}\nFor autoregressive processes (\\texttt{\\color{Orchid} RW(), AR() or VAR()}), moving average and correlated process errors can also be specified by changing the \\texttt{\\color{Orchid} ma} and \\texttt{\\color{Orchid} cor} arguments\n\n\\medskip\n\\texttt{\\color{Orchid} family}: observation distribution. Options include (among others):\n\\begin{itemize}\n\n\\item\\texttt{\\color{Orchid} gaussian()}: Gaussian with identity link\n\n\\item\\texttt{\\color{Orchid} student-t()}: Student's T with identity link\n\n\\item\\texttt{\\color{Orchid} lognormal()}: LogNormal with identity link\n\n\\item\\texttt{\\color{Orchid} Gamma()}: Gamma with log link\n\n\\item\\texttt{\\color{Orchid} betar()}: Beta with logit link\n\n\\item\\texttt{\\color{Orchid} poisson()}: Poisson with log link\n\n\\item\\texttt{\\color{Orchid} nb()}: Negative Binomial with log link\n\\end{itemize}\n\n\\medskip\nSee \\href{https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html}{the introductory vignette} for more guidance on supported families and dynamic processes\n\n\\medskip\n\\texttt{\\color{Orchid} ...}: other arguments such as user-specified \\texttt{\\color{Orchid} priors}, \\texttt{\\color{Orchid} newdata} for generating probabilistic forecasts and options to control \\texttt{\\color{Orchid} Stan} MCMC parameters\n\n\\medskip\n\\textbf{\\color{BrickRed} Prior to modelling}, it is useful to:\n\\begin{itemize}\n\n\\item Inspect features of the data with \\texttt{\\color{Orchid} plot\\_mvgam\\_series()}\n\n\\item Ensure there are no \\texttt{\\color{Orchid} NA}'s in predictors (though \\texttt{\\color{Orchid} NA}'s are allowed in response variables). See \\href{https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html}{the data formatting vignette} for guidance on data preparation\n\n\\item Inspect default priors with \\texttt{\\color{Orchid} get\\_mvgam\\_priors()}\n\n\\item Make any necessary changes to default priors with \\texttt{\\color{Orchid} prior()}\n\n\\end{itemize}\n\n\\medskip\n\\texttt{\\color{Orchid} sim\\_mvgam()} is useful to generate simple example datasets\n<<eval=FALSE>>=\nsimdat <- sim_mvgam(n_series = 1)\nmodel <- mvgam(formula = y ~ s(season, bs = 'cc'),\n               trend_model = RW(), data = simdat$data_train)\n@\n\nUse \\texttt{\\color{Orchid} stancode(model)} to see the auto-generated \\texttt{Stan} code\n\n\\end{block}\n\\end{column}\n\n\n\\begin{column}{.03\\paperwidth}\n\\end{column}\n\n\n\\begin{column}{0.3\\paperwidth}\n\\vspace{0.52in}\n\\noindent\\makebox[\\linewidth]{\\rule{0.3\\paperwidth}{0.2pt}}\n\\begin{block}{{\\fontsize{21}{21} \\selectfont \\color{BrickRed} Diagnostics and Inference}}\n\n\\smallskip\n{{\\fontsize{11}{11} \\selectfont \\color{mygray} What effects has the model estimated?}}\n\n\\medskip\n\\texttt{\\color{Orchid} summary(model)} and \\texttt{\\color{Orchid} coef(model)}: posterior summaries and diagnostics\n\n\\medskip\n\\texttt{\\color{Orchid} fitted(model)}, \\texttt{\\color{Orchid} logLik(model)} and \\texttt{\\color{Orchid} residuals(model)}: posterior expectations, pointwise Log-Likelihoods and randomized quantile residuals\n\n\\medskip\n\\texttt{\\color{Orchid} loo(model)} and \\texttt{\\color{Orchid} loo\\_compare(model1, model2, ...)}: calculate approximate leave-one-out information criteria for model comparisons\n\n\\medskip\n\\texttt{\\color{Orchid} mcmc\\_plot(model)}: visualize posterior summaries, pairs plots and a wide range of MCMC diagnostics using functionality from the \\texttt{Bayesplot} package\n\n<<fig.width=6, fig.height=2, fig.align='center', warning=FALSE, echo=FALSE>>=\nmcmc_plot(model, variable = '(Intercept)', type = 'combo')\n@\n\n\\medskip\nUse \\texttt{\\color{Orchid} as.data.frame(model)}, \\texttt{\\color{Orchid} as.matrix(model)}, or \\texttt{\\color{Orchid} as.array(model)} to extract posterior parameter estimates. Use \\texttt{\\color{Orchid} variables(model)} to determine what parameters are available for extraction\n\n\\medskip\nThe \\texttt{S3} \\texttt{\\color{Orchid} plot()} function applied to models can visualise smooth functions (\\texttt{\\color{Orchid} type = 'smooths'}), random effects (\\texttt{\\color{Orchid} type = 're'}), conditional predictions and trend estimates (\\texttt{\\color{Orchid} type = 'forecast'} or \\texttt{\\color{Orchid} type = 'trend'}), uncertainty contributions (\\texttt{\\color{Orchid} type = 'uncertainty'}) or randomized quantile residual diagnostics (\\texttt{\\color{Orchid} type = 'residuals'}). Use \\texttt{\\color{Orchid} trend\\_effects = TRUE} to visualise effects from any process model formulae\n\n\\medskip\n\\texttt{\\color{Orchid} conditional\\_effects(model)} gives useful conditional effect plots on either the response or the link scale\n\n\\smallskip\n<<fig.width=4, fig.height=1.75, fig.align='center', warning=FALSE, echo=FALSE>>=\nconditional_effects(model)[[1]] +\n  xlim(c(1, 12.1)) +\n  theme_classic(base_size = 10,\n                base_family = 'serif')\n@\n\nFor most \\texttt{mvgam} models, functions from the \\texttt{marginaleffects} package can be used for more targeted prediction-based inference. See \\href{https://marginaleffects.com/}{The Marginal Effects Zoo} and \\href{https://ecogambler.netlify.app/blog/interpreting-gams/}{How to interpret effects from GAMs} for guidance on inspecting predictions, slopes and comparisons\n<<fig.width=4, fig.height=1.75, fig.align='center', warning=FALSE, echo=FALSE>>=\npost_contrasts <- marginaleffects::avg_comparisons(model,\n                                  variables = list(season = c(5, 11))) %>%\n  marginaleffects::posteriordraws()\n\npost_contrasts %>%\n  ggplot(aes(x = draw)) +\n  tidybayes::stat_halfeye(fill = \"#C79999\") +\n  labs(x = \"(season = 11) − (season = 5) posterior contrast\", y = \"Density\") +\n  theme_classic(base_size = 10,\n                base_family = 'serif')\n@\n\n\\end{block}\n\\end{column}\n\n\n\\begin{column}{.03\\paperwidth}\n\\end{column}\n\n\n\\begin{column}{0.3\\paperwidth}\n\\vspace{0.37in}\n\\noindent\\makebox[\\linewidth]{\\rule{0.3\\paperwidth}{0.2pt}}\n\\begin{block}{{\\fontsize{21}{21} \\selectfont \\color{BrickRed} Prediction and forecasting}}\n\n\\smallskip\n{{\\fontsize{11}{11} \\selectfont \\color{mygray} How good are model predictions?}}\n\n\\medskip\nUse \\texttt{\\color{Orchid} predict(model)} with \\texttt{\\color{Orchid} newdata} to make predictions for inference purposes. Change the \\texttt{\\color{Orchid} type} argument for different types of predictions (link scale, expectation or response scale). Or use the \\texttt{brms} package equivalents \\texttt{\\color{Orchid} posterior\\_predict(model)}, \\texttt{\\color{Orchid} posterior\\_linpred(model)} or \\texttt{\\color{Orchid} posterior\\_epred(model)}. If generating forecasts for future timepoints, use the \\texttt{\\color{Orchid} forecast()} function (see below)\n\n\\medskip\nUse \\texttt{\\color{Orchid} ppc(model)} and \\texttt{\\color{Orchid} pp\\_check(model)} to compute conditional or unconditional posterior predictive checks and compare model predictions against the true observations\n\n\\medskip\nExtract in-sample posterior predictions with \\texttt{\\color{Orchid} hindcast(model)}. If validation data exist, generate forecast predictions with \\texttt{\\color{Orchid} forecast(model, newdata = newdata)}. As above, change the \\texttt{\\color{Orchid} type} argument for predictions on different scales. Both functions generate an object of class \\texttt{mvgam\\_forecast}, that can be plotted with an \\texttt{S3} \\texttt{\\color{Orchid} plot()} function. See \\href{https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html}{the forecasting vignette} for more details about how to produce forecasts.\n\n<<fig.width=5.4, fig.height=2.5, fig.align='center', warning=FALSE, message=FALSE, results='hide',echo=FALSE>>=\n  par(family = \"serif\",\n      las = 1,\n      mar=c(3,3,2,2),\n      mgp = c(2,0.5,0),\n      bty = \"l\",\n      cex.axis = 0.9,\n      cex.lab = 0.9,\n      cex.main = 0.9,\n      xaxs = 'r',\n      yaxs = 'r',\n      pch = 16)\nplot(fc)\n@\n\n\\smallskip\nCompute probabilistic forecast scores using proper scoring rules with the \\texttt{\\color{Orchid} score()} function:\n<<eval=FALSE>>=\nfc <- forecast(model, newdata = simdat$data_test, type = 'response')\ncrps <- score(fc, score = 'crps')\ndplyr::glimpse(crps$series_1)\n@\n\n<<echo=FALSE>>=\ncrps <- score(fc, score = 'crps')\ndplyr::glimpse(crps$series_1)\n@\n\\smallskip\nAvailable proper scoring rules in the \\texttt{\\color{Orchid} score()} function include:\n\\begin{itemize}\n\n\\item \\texttt{\\color{Orchid} type = 'crps'}: Continuous Rank Probability Score (univariate)\n\\item \\texttt{\\color{Orchid} type = 'drps'}: Discrete Rank Probability Score (univariate)\n\\item \\texttt{\\color{Orchid} type = 'elpd'}: Expected Log Predictive Density (univariate)\n\\item \\texttt{\\color{Orchid} type = 'sis'}: Scaled Interval Score (univariate)\n\\item \\texttt{\\color{Orchid} type = 'energy'}: Energy Score (multivariate)\n\\item \\texttt{\\color{Orchid} type = 'variogram'}: Variogram Score (multivariate)\n\\end{itemize}\n\n\\medskip\nUse \\texttt{\\color{Orchid} lfo\\_cv(model)} for approximate leave-future-out cross-validation with an expanding window training technique (see \\href{https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262}{Bürkner et al. 2020} for details of the algorithm). This generates expected log predictive density scores at user-specified forecast horizons, which can be used to compare different models\n\n\\end{block}\n\\end{column}\n\n\\end{columns}\n\\end{frame}\n\n\\end{document}\n"
  },
  {
    "path": "misc/mvgam_cheatsheet.tex",
    "content": "\\documentclass[final,9pt,fleqn]{beamer}\\usepackage[]{graphicx}\\usepackage[]{xcolor}\n% maxwidth is the original width if it is less than linewidth\n% otherwise use linewidth (to make sure the graphics do not exceed the margin)\n\\makeatletter\n\\def\\maxwidth{ %\n  \\ifdim\\Gin@nat@width>\\linewidth\n    \\linewidth\n  \\else\n    \\Gin@nat@width\n  \\fi\n}\n\\makeatother\n\n\\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345}\n\\newcommand{\\hlnum}[1]{\\textcolor[rgb]{0.686,0.059,0.569}{#1}}%\n\\newcommand{\\hlstr}[1]{\\textcolor[rgb]{0.192,0.494,0.8}{#1}}%\n\\newcommand{\\hlcom}[1]{\\textcolor[rgb]{0.678,0.584,0.686}{\\textit{#1}}}%\n\\newcommand{\\hlopt}[1]{\\textcolor[rgb]{0,0,0}{#1}}%\n\\newcommand{\\hlstd}[1]{\\textcolor[rgb]{0.345,0.345,0.345}{#1}}%\n\\newcommand{\\hlkwa}[1]{\\textcolor[rgb]{0.161,0.373,0.58}{\\textbf{#1}}}%\n\\newcommand{\\hlkwb}[1]{\\textcolor[rgb]{0.69,0.353,0.396}{#1}}%\n\\newcommand{\\hlkwc}[1]{\\textcolor[rgb]{0.333,0.667,0.333}{#1}}%\n\\newcommand{\\hlkwd}[1]{\\textcolor[rgb]{0.737,0.353,0.396}{\\textbf{#1}}}%\n\\let\\hlipl\\hlkwb\n\n\\usepackage{framed}\n\\makeatletter\n\\newenvironment{kframe}{%\n \\def\\at@end@of@kframe{}%\n \\ifinner\\ifhmode%\n  \\def\\at@end@of@kframe{\\end{minipage}}%\n  \\begin{minipage}{\\columnwidth}%\n \\fi\\fi%\n \\def\\FrameCommand##1{\\hskip\\@totalleftmargin \\hskip-\\fboxsep\n \\colorbox{shadecolor}{##1}\\hskip-\\fboxsep\n     % There is no \\\\@totalrightmargin, so:\n     \\hskip-\\linewidth \\hskip-\\@totalleftmargin \\hskip\\columnwidth}%\n \\MakeFramed {\\advance\\hsize-\\width\n   \\@totalleftmargin\\z@ \\linewidth\\hsize\n   \\@setminipage}}%\n {\\par\\unskip\\endMakeFramed%\n \\at@end@of@kframe}\n\\makeatother\n\n\\definecolor{shadecolor}{rgb}{.97, .97, .97}\n\\definecolor{messagecolor}{rgb}{0, 0, 0}\n\\definecolor{warningcolor}{rgb}{1, 0, 1}\n\\definecolor{errorcolor}{rgb}{1, 0, 0}\n\\newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX\n\n\\usepackage{alltt}\n\\input{BeamOptions.tex}\n\n\\setbeamertemplate{footline}{\\hfill {\\footnotesize \\href{https://creativecommons.org/licenses/by-sa/4.0/}{CC BY-SA 4.0} $\\circ$ Nicholas J. Clark $\\circ$ Learn more at \\href{https://nicholasjclark.github.io/mvgam/index.html}{https://nicholasjclark.github.io/mvgam/index.html} $\\circ$ package version $1.0.9$ $\\circ$ updated: \\today} \\hspace {0.1in} \\vspace{0.1in}}\n\\IfFileExists{upquote.sty}{\\usepackage{upquote}}{}\n\\begin{document}\n\n\n\n\n\n\n\n\n\n\\begin{frame}[fragile]\n  \\frametitle{{\\fontsize{41}{43} \\selectfont \\textcolor{mygray}{mvgam ::}} {\\fontsize{25}{25} \\textbf{\\textcolor{mygray}{CHEATSHEET}}}}\n\\vspace{-0.6in}\n  \\begin{columns}\n    \\begin{column}{0.02\\paperwidth} % left margin space\n    \\end{column}\n\n    \\begin{column}{0.3\\paperwidth}\n\n\\begin{block}\n\\noindent\\makebox[\\linewidth]{\\rule{0.3\\paperwidth}{0.2pt}}\n\nThe \\texttt{mvgam} package provides tools for fitting and interrogating univariate or multivariate State-Space time series models that can include nonlinear smooth functions of covariates, dynamic temporal processes and random effects. A wide variety of latent dynamic processes can be specified. The package also provides tools for interpreting effects, computing and scoring forecasts, as well as generating model code and data objects for further customisation. Models are fitted using \\texttt{Stan} for full Bayesian inference.\n\n\\end{block}\n\n\\begin{block}{{\\fontsize{21}{21} \\selectfont \\color{BrickRed} Modelling with \\texttt{\\color{Orchid} mvgam()}}}\nUsage: \\texttt{\\color{Orchid} mvgam(formula, trend\\_formula, data, trend\\_model, family, ...)}\n\n\\medskip\n\\texttt{\\color{Orchid} formula}: observation model regression formula, built off the \\texttt{mgcv} package. See \\texttt{\\color{Orchid}?mvgam\\_formulae} for more guidance\n\n\\medskip\n\\texttt{\\color{Orchid} trend\\_formula}: optional process model formula (see \\href{https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html}{the State-Space model vignette} and \\href{https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html}{the shared latent states vignette} for guidance on using trend formulae)\n\n\\medskip\n\\texttt{\\color{Orchid} data}: a \\texttt{data.frame} or \\texttt{list} containing the response variable(s) and optional predictor variables. See \\href{https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html}{the data formatting vignette} for guidance on data preparation\n\n\\medskip\n\\texttt{\\color{Orchid} trend\\_model}: optional latent dynamic process. Options include (among others):\n\\begin{itemize}\n\n\\item\\texttt{\\color{Orchid} None}: default, no dynamic process\n\n\\item\\texttt{\\color{Orchid} RW(ma = FALSE, cor = FALSE)}: random walk\n\n\\item\\texttt{\\color{Orchid} AR(p = 1, ma = FALSE, cor = FALSE)}: autoregressive\n\n\\item\\texttt{\\color{Orchid} VAR(ma = FALSE, cor = FALSE)}: vector autoregressive\n\n\\item\\texttt{\\color{Orchid} PW(growth = 'linear')}: piecewise linear\n\n\\item\\texttt{\\color{Orchid} PW(growth = 'logistic')}: piecewise logistic, with max saturation\n\n\\item\\texttt{\\color{Orchid} GP()}: squared exponential Gaussian Process\n\\end{itemize}\nFor autoregressive processes (\\texttt{\\color{Orchid} RW(), AR() or VAR()}), moving average and correlated process errors can also be specified by changing the \\texttt{\\color{Orchid} ma} and \\texttt{\\color{Orchid} cor} arguments\n\n\\medskip\n\\texttt{\\color{Orchid} family}: observation distribution. Options include (among others):\n\\begin{itemize}\n\n\\item\\texttt{\\color{Orchid} gaussian()}: Gaussian with identity link\n\n\\item\\texttt{\\color{Orchid} student-t()}: Student's T with identity link\n\n\\item\\texttt{\\color{Orchid} lognormal()}: LogNormal with identity link\n\n\\item\\texttt{\\color{Orchid} Gamma()}: Gamma with log link\n\n\\item\\texttt{\\color{Orchid} betar()}: Beta with logit link\n\n\\item\\texttt{\\color{Orchid} poisson()}: Poisson with log link\n\n\\item\\texttt{\\color{Orchid} nb()}: Negative Binomial with log link\n\\end{itemize}\n\n\\medskip\nSee \\href{https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html}{the introductory vignette} for more guidance on supported families and dynamic processes\n\n\\medskip\n\\texttt{\\color{Orchid} ...}: other arguments such as user-specified \\texttt{\\color{Orchid} priors}, \\texttt{\\color{Orchid} newdata} for generating probabilistic forecasts and options to control \\texttt{\\color{Orchid} Stan} MCMC parameters\n\n\\medskip\n\\textbf{\\color{BrickRed} Prior to modelling}, it is useful to:\n\\begin{itemize}\n\n\\item Inspect features of the data with \\texttt{\\color{Orchid} plot\\_mvgam\\_series()}\n\n\\item Ensure there are no \\texttt{\\color{Orchid} NA}'s in predictors (though \\texttt{\\color{Orchid} NA}'s are allowed in response variables). See \\href{https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html}{the data formatting vignette} for guidance on data preparation\n\n\\item Inspect default priors with \\texttt{\\color{Orchid} get\\_mvgam\\_priors()}\n\n\\item Make any necessary changes to default priors with \\texttt{\\color{Orchid} prior()}\n\n\\end{itemize}\n\n\\medskip\n\\texttt{\\color{Orchid} sim\\_mvgam()} is useful to generate simple example datasets\n\\begin{knitrout}\n\\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\\color{fgcolor}\\begin{kframe}\n\\begin{alltt}\n\\hlstd{simdat} \\hlkwb{<-} \\hlkwd{sim_mvgam}\\hlstd{(}\\hlkwc{n_series} \\hlstd{=} \\hlnum{1}\\hlstd{)}\n\\hlstd{model} \\hlkwb{<-} \\hlkwd{mvgam}\\hlstd{(}\\hlkwc{formula} \\hlstd{= y} \\hlopt{~} \\hlkwd{s}\\hlstd{(season,} \\hlkwc{bs} \\hlstd{=} \\hlstr{'cc'}\\hlstd{),}\n               \\hlkwc{trend_model} \\hlstd{=} \\hlkwd{RW}\\hlstd{(),} \\hlkwc{data} \\hlstd{= simdat}\\hlopt{$}\\hlstd{data_train)}\n\\end{alltt}\n\\end{kframe}\n\\end{knitrout}\n\nUse \\texttt{\\color{Orchid} stancode(model)} to see the auto-generated \\texttt{Stan} code\n\n\\end{block}\n\\end{column}\n\n\n\\begin{column}{.03\\paperwidth}\n\\end{column}\n\n\n\\begin{column}{0.3\\paperwidth}\n\\vspace{0.52in}\n\\noindent\\makebox[\\linewidth]{\\rule{0.3\\paperwidth}{0.2pt}}\n\\begin{block}{{\\fontsize{21}{21} \\selectfont \\color{BrickRed} Diagnostics and Inference}}\n\n\\smallskip\n{{\\fontsize{11}{11} \\selectfont \\color{mygray} What effects has the model estimated?}}\n\n\\medskip\n\\texttt{\\color{Orchid} summary(model)} and \\texttt{\\color{Orchid} coef(model)}: posterior summaries and diagnostics\n\n\\medskip\n\\texttt{\\color{Orchid} fitted(model)}, \\texttt{\\color{Orchid} logLik(model)} and \\texttt{\\color{Orchid} residuals(model)}: posterior expectations, pointwise Log-Likelihoods and randomized quantile residuals\n\n\\medskip\n\\texttt{\\color{Orchid} loo(model)} and \\texttt{\\color{Orchid} loo\\_compare(model1, model2, ...)}: calculate approximate leave-one-out information criteria for model comparisons\n\n\\medskip\n\\texttt{\\color{Orchid} mcmc\\_plot(model)}: visualize posterior summaries, pairs plots and a wide range of MCMC diagnostics using functionality from the \\texttt{Bayesplot} package\n\n\\begin{knitrout}\n\\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\\color{fgcolor}\n\n{\\centering \\includegraphics[width=\\maxwidth]{figure/unnamed-chunk-4-1} \n\n}\n\n\n\\end{knitrout}\n\n\\medskip\nUse \\texttt{\\color{Orchid} as.data.frame(model)}, \\texttt{\\color{Orchid} as.matrix(model)}, or \\texttt{\\color{Orchid} as.array(model)} to extract posterior parameter estimates. Use \\texttt{\\color{Orchid} variables(model)} to determine what parameters are available for extraction\n\n\\medskip\nThe \\texttt{S3} \\texttt{\\color{Orchid} plot()} function applied to models can visualise smooth functions (\\texttt{\\color{Orchid} type = 'smooths'}), random effects (\\texttt{\\color{Orchid} type = 're'}), conditional predictions and trend estimates (\\texttt{\\color{Orchid} type = 'forecast'} or \\texttt{\\color{Orchid} type = 'trend'}), uncertainty contributions (\\texttt{\\color{Orchid} type = 'uncertainty'}) or randomized quantile residual diagnostics (\\texttt{\\color{Orchid} type = 'residuals'}). Use \\texttt{\\color{Orchid} trend\\_effects = TRUE} to visualise effects from any process model formulae\n\n\\medskip\n\\texttt{\\color{Orchid} conditional\\_effects(model)} gives useful conditional effect plots on either the response or the link scale\n\n\\smallskip\n\\begin{knitrout}\n\\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\\color{fgcolor}\n\n{\\centering \\includegraphics[width=\\maxwidth]{figure/unnamed-chunk-5-1} \n\n}\n\n\n\\end{knitrout}\n\nFor most \\texttt{mvgam} models, functions from the \\texttt{marginaleffects} package can be used for more targeted prediction-based inference. See \\href{https://marginaleffects.com/}{The Marginal Effects Zoo} and \\href{https://ecogambler.netlify.app/blog/interpreting-gams/}{How to interpret effects from GAMs} for guidance on inspecting predictions, slopes and comparisons\n\\begin{knitrout}\n\\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\\color{fgcolor}\n\n{\\centering \\includegraphics[width=\\maxwidth]{figure/unnamed-chunk-6-1} \n\n}\n\n\n\\end{knitrout}\n\n\\end{block}\n\\end{column}\n\n\n\\begin{column}{.03\\paperwidth}\n\\end{column}\n\n\n\\begin{column}{0.3\\paperwidth}\n\\vspace{0.37in}\n\\noindent\\makebox[\\linewidth]{\\rule{0.3\\paperwidth}{0.2pt}}\n\\begin{block}{{\\fontsize{21}{21} \\selectfont \\color{BrickRed} Prediction and forecasting}}\n\n\\smallskip\n{{\\fontsize{11}{11} \\selectfont \\color{mygray} How good are model predictions?}}\n\n\\medskip\nUse \\texttt{\\color{Orchid} predict(model)} with \\texttt{\\color{Orchid} newdata} to make predictions for inference purposes. Change the \\texttt{\\color{Orchid} type} argument for different types of predictions (link scale, expectation or response scale). Or use the \\texttt{brms} package equivalents \\texttt{\\color{Orchid} posterior\\_predict(model)}, \\texttt{\\color{Orchid} posterior\\_linpred(model)} or \\texttt{\\color{Orchid} posterior\\_epred(model)}. If generating forecasts for future timepoints, use the \\texttt{\\color{Orchid} forecast()} function (see below)\n\n\\medskip\nUse \\texttt{\\color{Orchid} ppc(model)} and \\texttt{\\color{Orchid} pp\\_check(model)} to compute conditional or unconditional posterior predictive checks and compare model predictions against the true observations\n\n\\medskip\nExtract in-sample posterior predictions with \\texttt{\\color{Orchid} hindcast(model)}. If validation data exist, generate forecast predictions with \\texttt{\\color{Orchid} forecast(model, newdata = newdata)}. As above, change the \\texttt{\\color{Orchid} type} argument for predictions on different scales. Both functions generate an object of class \\texttt{mvgam\\_forecast}, that can be plotted with an \\texttt{S3} \\texttt{\\color{Orchid} plot()} function. See \\href{https://nicholasjclark.github.io/mvgam/articles/forecast_evaluation.html}{the forecasting vignette} for more details about how to produce forecasts.\n\n\\begin{knitrout}\n\\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\\color{fgcolor}\n\n{\\centering \\includegraphics[width=\\maxwidth]{figure/unnamed-chunk-7-1} \n\n}\n\n\n\\end{knitrout}\n\n\\smallskip\nCompute probabilistic forecast scores using proper scoring rules with the \\texttt{\\color{Orchid} score()} function:\n\\begin{knitrout}\n\\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\\color{fgcolor}\\begin{kframe}\n\\begin{alltt}\n\\hlstd{fc} \\hlkwb{<-} \\hlkwd{forecast}\\hlstd{(model,} \\hlkwc{newdata} \\hlstd{= simdat}\\hlopt{$}\\hlstd{data_test,} \\hlkwc{type} \\hlstd{=} \\hlstr{'response'}\\hlstd{)}\n\\hlstd{crps} \\hlkwb{<-} \\hlkwd{score}\\hlstd{(fc,} \\hlkwc{score} \\hlstd{=} \\hlstr{'crps'}\\hlstd{)}\n\\hlstd{dplyr}\\hlopt{::}\\hlkwd{glimpse}\\hlstd{(crps}\\hlopt{$}\\hlstd{series_1)}\n\\end{alltt}\n\\end{kframe}\n\\end{knitrout}\n\n\\begin{knitrout}\n\\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\\color{fgcolor}\\begin{kframe}\n\\begin{verbatim}\n## Rows: 25\n## Columns: 5\n## $ score          <dbl> 0.2315, 0.3944, 0.7198, 0~\n## $ in_interval    <dbl> 1, 1, 1, 1, 1, 1, 1, 0, 1~\n## $ interval_width <dbl> 0.9, 0.9, 0.9, 0.9, 0.9, ~\n## $ eval_horizon   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9~\n## $ score_type     <chr> \"crps\", \"crps\", \"crps\", \"~\n\\end{verbatim}\n\\end{kframe}\n\\end{knitrout}\n\\smallskip\nAvailable proper scoring rules in the \\texttt{\\color{Orchid} score()} function include:\n\\begin{itemize}\n\n\\item \\texttt{\\color{Orchid} type = 'crps'}: Continuous Rank Probability Score (univariate)\n\\item \\texttt{\\color{Orchid} type = 'drps'}: Discrete Rank Probability Score (univariate)\n\\item \\texttt{\\color{Orchid} type = 'elpd'}: Expected Log Predictive Density (univariate)\n\\item \\texttt{\\color{Orchid} type = 'sis'}: Scaled Interval Score (univariate)\n\\item \\texttt{\\color{Orchid} type = 'energy'}: Energy Score (multivariate)\n\\item \\texttt{\\color{Orchid} type = 'variogram'}: Variogram Score (multivariate)\n\\end{itemize}\n\n\\medskip\nUse \\texttt{\\color{Orchid} lfo\\_cv(model)} for approximate leave-future-out cross-validation with an expanding window training technique (see \\href{https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262}{Bürkner et al. 2020} for details of the algorithm). This generates expected log predictive density scores at user-specified forecast horizons, which can be used to compare different models\n\n\\end{block}\n\\end{column}\n\n\\end{columns}\n\\end{frame}\n\n\\end{document}\n"
  },
  {
    "path": "pkgdown/_pkgdown.yml",
    "content": "url: https://nicholasjclark.github.io/mvgam/\n\ncode:\n  run_dont_run: true\n\nauthors:\n  Nicholas J Clark:\n    href: https://researchers.uq.edu.au/researcher/15140\n\ntemplate:\n  bootstrap: 5\n  bootswatch: pulse\n\nnavbar:\n  structure:\n    left: [intro, articles, reference, news]\n    right: [search, github]\n"
  },
  {
    "path": "pkgdown/extra.css",
    "content": "table.ref-index{\n    overflow-x: visible;\n    overflow-y: auto;\n}\n"
  },
  {
    "path": "pkgdown/extra.scss",
    "content": "$font-size-base:              0.8rem !default; // Assumes the browser default, typically `16px`\n"
  },
  {
    "path": "src/.gitignore",
    "content": "mvgam.dll\n"
  },
  {
    "path": "src/Makevars",
    "content": "PKG_CXXFLAGS = -DARMA_USE_CURRENT\nPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)\n"
  },
  {
    "path": "src/Makevars.win",
    "content": "PKG_CXXFLAGS = -DARMA_USE_CURRENT\nPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)\n"
  },
  {
    "path": "src/RcppExports.cpp",
    "content": "// Generated by using Rcpp::compileAttributes() -> do not edit by hand\n// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393\n\n#include <RcppArmadillo.h>\n#include <Rcpp.h>\n\nusing namespace Rcpp;\n\n#ifdef RCPP_USE_GLOBAL_ROSTREAM\nRcpp::Rostream<true>&  Rcpp::Rcout = Rcpp::Rcpp_cout_get();\nRcpp::Rostream<false>& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get();\n#endif\n\n// ar3_recursC\nRcpp::NumericVector ar3_recursC(double drift, double ar1, double ar2, double ar3, Rcpp::NumericVector linpreds, Rcpp::NumericVector errors, Rcpp::NumericVector last_trends, int h);\nRcppExport SEXP _mvgam_ar3_recursC(SEXP driftSEXP, SEXP ar1SEXP, SEXP ar2SEXP, SEXP ar3SEXP, SEXP linpredsSEXP, SEXP errorsSEXP, SEXP last_trendsSEXP, SEXP hSEXP) {\nBEGIN_RCPP\n    Rcpp::RObject rcpp_result_gen;\n    Rcpp::RNGScope rcpp_rngScope_gen;\n    Rcpp::traits::input_parameter< double >::type drift(driftSEXP);\n    Rcpp::traits::input_parameter< double >::type ar1(ar1SEXP);\n    Rcpp::traits::input_parameter< double >::type ar2(ar2SEXP);\n    Rcpp::traits::input_parameter< double >::type ar3(ar3SEXP);\n    Rcpp::traits::input_parameter< Rcpp::NumericVector >::type linpreds(linpredsSEXP);\n    Rcpp::traits::input_parameter< Rcpp::NumericVector >::type errors(errorsSEXP);\n    Rcpp::traits::input_parameter< Rcpp::NumericVector >::type last_trends(last_trendsSEXP);\n    Rcpp::traits::input_parameter< int >::type h(hSEXP);\n    rcpp_result_gen = Rcpp::wrap(ar3_recursC(drift, ar1, ar2, ar3, linpreds, errors, last_trends, h));\n    return rcpp_result_gen;\nEND_RCPP\n}\n// var1_recursC\narma::mat var1_recursC(arma::mat A, arma::mat linpreds, arma::mat errors, arma::rowvec drift, arma::rowvec last_trends, int h);\nRcppExport SEXP _mvgam_var1_recursC(SEXP ASEXP, SEXP linpredsSEXP, SEXP errorsSEXP, SEXP driftSEXP, SEXP last_trendsSEXP, SEXP hSEXP) {\nBEGIN_RCPP\n    Rcpp::RObject rcpp_result_gen;\n    Rcpp::RNGScope rcpp_rngScope_gen;\n    Rcpp::traits::input_parameter< arma::mat >::type A(ASEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type linpreds(linpredsSEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type errors(errorsSEXP);\n    Rcpp::traits::input_parameter< arma::rowvec >::type drift(driftSEXP);\n    Rcpp::traits::input_parameter< arma::rowvec >::type last_trends(last_trendsSEXP);\n    Rcpp::traits::input_parameter< int >::type h(hSEXP);\n    rcpp_result_gen = Rcpp::wrap(var1_recursC(A, linpreds, errors, drift, last_trends, h));\n    return rcpp_result_gen;\nEND_RCPP\n}\n// varma_recursC\narma::mat varma_recursC(arma::mat A, arma::mat A2, arma::mat A3, arma::mat theta, arma::mat linpreds, arma::mat errors, arma::rowvec drift, arma::mat last_trends, int h);\nRcppExport SEXP _mvgam_varma_recursC(SEXP ASEXP, SEXP A2SEXP, SEXP A3SEXP, SEXP thetaSEXP, SEXP linpredsSEXP, SEXP errorsSEXP, SEXP driftSEXP, SEXP last_trendsSEXP, SEXP hSEXP) {\nBEGIN_RCPP\n    Rcpp::RObject rcpp_result_gen;\n    Rcpp::RNGScope rcpp_rngScope_gen;\n    Rcpp::traits::input_parameter< arma::mat >::type A(ASEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type A2(A2SEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type A3(A3SEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type theta(thetaSEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type linpreds(linpredsSEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type errors(errorsSEXP);\n    Rcpp::traits::input_parameter< arma::rowvec >::type drift(driftSEXP);\n    Rcpp::traits::input_parameter< arma::mat >::type last_trends(last_trendsSEXP);\n    Rcpp::traits::input_parameter< int >::type h(hSEXP);\n    rcpp_result_gen = Rcpp::wrap(varma_recursC(A, A2, A3, theta, linpreds, errors, drift, last_trends, h));\n    return rcpp_result_gen;\nEND_RCPP\n}\n\nstatic const R_CallMethodDef CallEntries[] = {\n    {\"_mvgam_ar3_recursC\", (DL_FUNC) &_mvgam_ar3_recursC, 8},\n    {\"_mvgam_var1_recursC\", (DL_FUNC) &_mvgam_var1_recursC, 6},\n    {\"_mvgam_varma_recursC\", (DL_FUNC) &_mvgam_varma_recursC, 9},\n    {NULL, NULL, 0}\n};\n\nRcppExport void R_init_mvgam(DllInfo *dll) {\n    R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);\n    R_useDynamicSymbols(dll, FALSE);\n}\n"
  },
  {
    "path": "src/trend_funs.cpp",
    "content": "// [[Rcpp::depends(\"RcppArmadillo\")]]\n#include <RcppArmadillo.h>\n#include <cmath>\n#define _USE_MATH_DEFINES\n#include <math.h>\nusing namespace Rcpp;\n\n// function for recursively extending an AR3 process\n//' @noRd\n// [[Rcpp::export]]\nRcpp::NumericVector ar3_recursC(double drift, double ar1,\n                         double ar2, double ar3,\n                         Rcpp::NumericVector linpreds,\n                         Rcpp::NumericVector errors,\n                         Rcpp::NumericVector last_trends, int h) {\n\n  int T = h + 3;\n  Rcpp::NumericVector states(T);\n  states(0) = last_trends(0);\n  states(1) = last_trends(1);\n  states(2) = last_trends(2);\n\n  for(int t = 3; t < T; ++t) {\n    states(t) = drift +\n      ar1 * (states(t - 1) - linpreds(t - 1)) +\n      ar2 * (states(t - 2) - linpreds(t - 2)) +\n      ar3 * (states(t - 3) - linpreds(t - 3)) +\n      linpreds(t)  +\n      errors(t);\n  }\n  return states[Rcpp::Range(3, T-1)];\n}\n\n// function for recursively extending a VAR1 process\n//' @noRd\n// [[Rcpp::export]]\narma::mat var1_recursC(arma::mat A,\n                       arma::mat linpreds,\n                       arma::mat errors,\n                       arma::rowvec drift,\n                       arma::rowvec last_trends,\n                       int h) {\n\n  int T = h + 1;\n  int n_series = A.n_rows;\n  arma::mat states(T, n_series);\n  states.row(0) = last_trends;\n  for (int t = 1; t < T; t++) {\n    states.row(t) = (states.row(t-1) - linpreds.row(t-1)) * trans(A) +\n                     linpreds.row(t) + drift + errors.row(t);\n  }\n  return states.rows(1, h);\n}\n\n// function for recursively extending a VARMA(1-3,0-1) process\n//' @noRd\n// [[Rcpp::export]]\narma::mat varma_recursC(\n    arma::mat A,\n    arma::mat A2,\n    arma::mat A3,\n    arma::mat theta,\n    arma::mat linpreds,\n    arma::mat errors,\n    arma::rowvec drift,\n    arma::mat last_trends,\n    int h) {\n\n   // total number of timepoints\n   int T = h + 3;\n\n   // total number of series\n   int n_series = A.n_rows;\n\n   // states\n   arma::mat states(T, n_series);\n\n   // initialise states\n   states.row(0) = last_trends.row(0);\n   states.row(1) = last_trends.row(1);\n   states.row(2) = last_trends.row(2);\n\n   // VARMA(3,1) process\n   for (int t = 3; t < T; t++) {\n     states.row(t) =\n       // autoregressive means\n       (states.row(t-1) - linpreds.row(t-1)) * trans(A) +\n       (states.row(t-2) - linpreds.row(t-2)) * trans(A2) +\n       (states.row(t-3) - linpreds.row(t-3)) * trans(A3) +\n\n       // moving averages\n       errors.row(t-1) * trans(theta) +\n\n       // linear predictor contributions\n       linpreds.row(t) +\n\n       // drift terms\n       drift +\n\n       // stochastic errors\n       errors.row(t);\n   }\n   return states.rows(3, T-1);\n }\n"
  },
  {
    "path": "tests/local/setup_tests_local.R",
    "content": "# Setup models for tests locally\nlibrary(\"testthat\")\nlibrary(\"mvgam\")\nset.seed(123)\n\nexpect_match2 <- function(object, regexp) {\n  any(grepl(regexp, object, fixed = TRUE))\n}\n\nexpect_range <- function(object, lower = -Inf, upper = Inf, ...) {\n  testthat::expect_true(all(object >= lower & object <= upper), ...)\n}\n\nexpect_ggplot <- function(object, ...) {\n  testthat::expect_true(is(object, \"ggplot\"), ...)\n}\n\n\nSM <- suppressMessages\nSW <- suppressWarnings\n\ncontext(\"local tests\")\n"
  },
  {
    "path": "tests/local/tests-models1.R",
    "content": "source(\"setup_tests_local.R\")\n\n#### Simulated data to test post-processing ####\ngaus_data <- sim_mvgam(\n  family = gaussian(),\n  T = 60,\n  trend_model = 'AR1',\n  seasonality = 'shared',\n  mu = c(-1, 0, 1),\n  prop_trend = 0.5,\n  prop_missing = 0.2\n)\npois_data <- sim_mvgam(\n  family = poisson(),\n  trend_model = AR(),\n  prop_trend = 0.5,\n  mu = c(1, 3, 5),\n  T = 60\n)\nbeta_data <- sim_mvgam(\n  family = betar(),\n  trend_model = GP(),\n  mu = c(-1.5, 0, 1.5),\n  prop_trend = 0.75,\n  T = 60\n)\n\n#### Simple models, trying meanfield and sampling ####\ngaus_ar <- mvgam(\n  y ~\n    s(series, bs = 're') +\n    s(season, bs = 'cc', k = 5) -\n    1,\n  trend_model = AR(),\n  data = gaus_data$data_train,\n  family = gaussian(),\n  algorithm = 'meanfield',\n  samples = 200\n)\ngaus_arfc <- mvgam(\n  y ~\n    s(series, bs = 're') +\n    s(season, bs = 'cc', k = 5) -\n    1,\n  trend_model = AR(),\n  data = gaus_data$data_train,\n  newdata = gaus_data$data_test,\n  family = gaussian(),\n  algorithm = 'meanfield',\n  samples = 200\n)\npois_ar <- mvgam(\n  y ~ series,\n  trend_formula = ~ s(season, bs = 'cc', k = 5),\n  trend_model = AR(),\n  data = pois_data$data_train,\n  family = poisson(),\n  samples = 200\n)\npois_arfc <- mvgam(\n  y ~ series,\n  trend_formula = ~ s(season, bs = 'cc', k = 5),\n  trend_model = AR(),\n  data = pois_data$data_train,\n  newdata = pois_data$data_test,\n  family = poisson(),\n  samples = 200\n)\nbeta_gp <- mvgam(\n  y ~ s(series, bs = 're'),\n  trend_formula = ~ gp(time, by = trend),\n  data = beta_data$data_train,\n  family = betar(),\n  priors = prior(normal(0, 0.1), class = ar1),\n  trend_model = AR(),\n  samples = 200\n)\n\n#### Tests for the simple models ####\ntest_that(\"lfo_cv working properly\", {\n  lfcv <- lfo_cv(gaus_arfc, min_t = 42)\n  expect_true(inherits(lfcv, 'mvgam_lfo'))\n  expect_true(all.equal(lfcv$eval_timepoints, c(43, 44)))\n})\n\ntest_that('mvgam poisson forecasts agree with Stan', {\n  # Forecasts made from within Stan should broadly agree with forecasts\n  # made from forecast()\n  score_stan <- plot_mvgam_fc(\n    pois_arfc,\n    series = 1,\n    newdata = gaus_data$data_test,\n    return_score = TRUE\n  )\n  score_mvgam <- plot_mvgam_fc(\n    pois_ar,\n    series = 1,\n    newdata = gaus_data$data_test,\n    return_score = TRUE\n  )\n  expect_equal(score_mvgam$score, score_stan$score, tolerance = 3)\n})\n\ntest_that(\"loo working properly\", {\n  loomod <- SW(loo(pois_arfc))\n  expect_true(inherits(loomod, 'psis_loo'))\n\n  loomod <- SW(loo(gaus_arfc))\n  expect_true(inherits(loomod, 'psis_loo'))\n})\n\ntest_that(\"gp model gives correct predictions\", {\n  p <- conditional_effects(beta_gp)\n  expect_true(inherits(p, 'mvgam_conditional_effects'))\n  expect_ggplot(conditional_effects(beta_gp)[[1]])\n  expect_ggplot(conditional_effects(beta_gp)[[2]])\n\n  post_modes <- coef(beta_gp)[, 2]\n  expect_true(post_modes[2] < post_modes[3])\n  expect_true(post_modes[3] < post_modes[4])\n\n  ar <- colMeans(as.matrix(beta_gp, variable = \"ar1\", regex = TRUE))\n  expect_range(ar[1], -0.15, 0.15)\n  expect_range(ar[2], -0.15, 0.15)\n  expect_range(ar[3], -0.15, 0.15)\n\n  expect_equal(dim(fitted(beta_gp)), c(NROW(beta_data$data_train), 4))\n})\n\n#### A continuous time AR example ####\nsim_corcar1 = function(n = 120, phi = 0.5, sigma = 1, sigma_obs = 0.75) {\n  # Sample irregularly spaced time intervals\n  time_dis <- c(0, runif(n - 1, -0.1, 1))\n  time_dis[time_dis < 0] <- 0\n  time_dis <- time_dis * 5\n\n  # Set up the latent dynamic process\n  x <- vector(length = n)\n  x[1] <- -0.3\n  for (i in 2:n) {\n    # zero-distances will cause problems in sampling, so mvgam uses a\n    # minimum threshold; this simulation function emulates that process\n    if (time_dis[i] == 0) {\n      x[i] <- rnorm(1, mean = (phi^1e-12) * x[i - 1], sd = sigma)\n    } else {\n      x[i] <- rnorm(1, mean = (phi^time_dis[i]) * x[i - 1], sd = sigma)\n    }\n  }\n\n  # Add 12-month seasonality\n  cov1 <- sin(2 * pi * (1:n) / 12)\n  cov2 <- cos(2 * pi * (1:n) / 12)\n  beta1 <- runif(1, 0.3, 0.7)\n  beta2 <- runif(1, 0.2, 0.5)\n  seasonality <- beta1 * cov1 + beta2 * cov2\n\n  # Take Gaussian observations with error and return\n  data.frame(\n    y = rnorm(n, mean = x + seasonality, sd = sigma),\n    season = rep(1:12, 20)[1:n],\n    time = cumsum(time_dis)\n  )\n}\n\n# Sample two time series\ndat <- rbind(\n  dplyr::bind_cols(\n    sim_corcar1(phi = 0.65, sigma_obs = 0.55),\n    data.frame(series = 'series1')\n  ),\n  dplyr::bind_cols(\n    sim_corcar1(phi = 0.8, sigma_obs = 0.35),\n    data.frame(series = 'series2')\n  )\n) %>%\n  dplyr::mutate(series = as.factor(series))\n\ntest_that(\"CAR model runs properly\", {\n  # mvgam with CAR(1) trends and series-level seasonal smooths\n  mod <- mvgam(\n    formula = y ~ s(season, bs = 'cc', k = 5, by = series),\n    trend_model = CAR(),\n    data = dat,\n    family = gaussian(),\n    samples = 200\n  )\n  expect_true(inherits(mod, 'mvgam'))\n\n  p <- conditional_effects(mod)\n  expect_true(inherits(p, 'mvgam_conditional_effects'))\n  expect_ggplot(conditional_effects(mod)[[1]])\n\n  ar <- colMeans(as.matrix(mod, variable = \"ar1\", regex = TRUE))\n  expect_range(ar[1], 0.35, 0.75)\n  expect_range(ar[1], 0.55, 0.95)\n\n  expect_equal(dim(fitted(mod)), c(NROW(dat), 4))\n\n  # State-space formulation should also work\n  mod <- mvgam(\n    formula = y ~ 1,\n    trend_formula = ~ s(season, bs = 'cc', k = 5, by = trend),\n    trend_model = CAR(),\n    data = dat,\n    family = gaussian()\n  )\n  expect_true(inherits(mod, 'mvgam'))\n\n  p <- conditional_effects(mod)\n  expect_true(inherits(p, 'mvgam_conditional_effects'))\n  expect_ggplot(conditional_effects(mod)[[1]])\n\n  ar <- colMeans(as.matrix(mod, variable = \"ar1\", regex = TRUE))\n  expect_range(ar[1], 0.35, 0.75)\n  expect_range(ar[1], 0.55, 0.95)\n\n  expect_equal(dim(fitted(mod)), c(NROW(dat), 4))\n})\n\n#### A monotonic smooth example ####\n# 'by' terms that produce a different smooth for each level of the 'by'\n# factor\nset.seed(123123)\nx <- runif(80) * 4 - 1\nx <- sort(x)\n\n# Two different monotonic smooths, one for each factor level\nf <- exp(4 * x) / (1 + exp(4 * x))\nf2 <- exp(3.5 * x) / (1 + exp(3 * x))\nfac <- c(rep('a', 80), rep('b', 80))\ny <- c(f + rnorm(80) * 0.1, f2 + rnorm(80) * 0.2)\n\n# Gather all data into a data.frame, including the factor 'by' variable\nmod_data <- data.frame(y, x, fac = as.factor(fac))\nmod_data$time <- 1:NROW(mod_data)\n\ntest_that(\"monotonic smooths behave properly\", {\n  # Fit a model with different smooths per factor level\n  mod <- mvgam(\n    y ~ s(x, bs = 'moi', by = fac, k = 8),\n    data = mod_data,\n    family = gaussian(),\n    samples = 200\n  )\n\n  expect_true(inherits(mod$mgcv_model$smooth[[1]], 'moi.smooth'))\n  expect_ggplot(SM(pp_check(mod)))\n\n  # First derivatives (on link scale) should never be\n  # negative for either factor level\n  derivs <- slopes(mod, variables = 'x', by = c('x', 'fac'), type = 'link')\n  expect_true(all(derivs$estimate > 0))\n})\n"
  },
  {
    "path": "tests/mvgam_examples.R",
    "content": "# Small mvgam examples for testing post-fitting functions such as\n# predict, forecast, hindcast etc...\ntestthat::skip_on_cran()\nlibrary(mvgam)\nmvgam_examp_dat <- list(\n  data_train = structure(\n    list(\n      y = c(\n        -1.6435760529886,\n        0.0576506632876403,\n        -0.398982741359959,\n        0.166263635072232,\n        NA,\n        -0.178792865387502,\n        0.0378992006898741,\n        -0.46704324582468,\n        -0.20005752901963,\n        NA,\n        -0.7648331324566,\n        -1.95818875683478,\n        -0.489141832766607,\n        NA,\n        -0.781926449502298,\n        -0.173065622618926,\n        NA,\n        -0.431888938737423,\n        -1.33563987611521,\n        -0.30668079493666,\n        -1.59343527302515,\n        -2.08089938293457\n      ),\n      season = c(\n        1L,\n        1L,\n        2L,\n        2L,\n        3L,\n        3L,\n        4L,\n        4L,\n        5L,\n        5L,\n        6L,\n        6L,\n        7L,\n        7L,\n        8L,\n        8L,\n        9L,\n        9L,\n        10L,\n        10L,\n        11L,\n        11L\n      ),\n      year = c(\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L\n      ),\n      series = structure(\n        c(\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L,\n          1L,\n          2L\n        ),\n        levels = c(\"series_1\", \"series_2\"),\n        class = \"factor\"\n      ),\n      time = c(\n        1L,\n        1L,\n        2L,\n        2L,\n        3L,\n        3L,\n        4L,\n        4L,\n        5L,\n        5L,\n        6L,\n        6L,\n        7L,\n        7L,\n        8L,\n        8L,\n        9L,\n        9L,\n        10L,\n        10L,\n        11L,\n        11L\n      )\n    ),\n    class = \"data.frame\",\n    row.names = c(NA, -22L)\n  ),\n  data_test = structure(\n    list(\n      y = c(\n        -0.825903793273796,\n        NA,\n        -0.409364591883054,\n        -0.801934825421605,\n        NA,\n        0.993612304219531,\n        0.465708559827663,\n        -0.268653159692507\n      ),\n      season = c(12L, 12L, 1L, 1L, 2L, 2L, 3L, 3L),\n      year = c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L),\n      series = structure(\n        c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L),\n        levels = c(\"series_1\", \"series_2\"),\n        class = \"factor\"\n      ),\n      time = c(12L, 12L, 13L, 13L, 14L, 14L, 15L, 15L)\n    ),\n    class = \"data.frame\",\n    row.names = c(NA, -8L)\n  )\n)\n\n# Univariate process without trend_formula\nmvgam_example1 <- mvgam(\n  y ~ s(season, k = 4),\n  trend_model = RW(),\n  family = gaussian(),\n  data = mvgam_examp_dat$data_train,\n  burnin = 50,\n  samples = 5,\n  chains = 1,\n  backend = 'rstan'\n)\n\n# Univariate process with trend_formula, trend_map and correlated process errors\ntrend_map <- data.frame(\n  series = unique(mvgam_examp_dat$data_train$series),\n  trend = c(1, 1)\n)\nmvgam_example2 <- mvgam(\n  y ~ 1,\n  trend_formula = ~ s(season, k = 4),\n  trend_model = RW(cor = TRUE),\n  trend_map = trend_map,\n  family = gaussian(),\n  data = mvgam_examp_dat$data_train,\n  burnin = 50,\n  samples = 5,\n  chains = 1,\n  backend = 'rstan'\n)\n\n# Multivariate process without trend_formula\nmvgam_example3 <- mvgam(\n  y ~ s(season, k = 4),\n  trend_model = VAR(cor = TRUE),\n  family = gaussian(),\n  data = mvgam_examp_dat$data_train,\n  burnin = 50,\n  samples = 5,\n  chains = 1,\n  backend = 'rstan',\n  lfo = TRUE\n)\n\n# GP dynamic factors (use list format to ensure it works in tests)\nlist_data <- list()\nfor (i in 1:NCOL(mvgam_examp_dat$data_train)) {\n  list_data[[i]] <- mvgam_examp_dat$data_train[, i]\n}\nnames(list_data) <- colnames(mvgam_examp_dat$data_train)\nmvgam_example4 <- mvgam(\n  y ~ series + s(season, k = 4),\n  trend_model = GP(),\n  family = gaussian(),\n  use_lv = TRUE,\n  n_lv = 2,\n  data = list_data,\n  burnin = 50,\n  samples = 5,\n  chains = 1,\n  backend = 'rstan',\n  lfo = TRUE\n)\n\n# Save examples as internal data\nusethis::use_data(\n  mvgam_examp_dat,\n  mvgam_example1,\n  mvgam_example2,\n  mvgam_example3,\n  mvgam_example4,\n  internal = TRUE,\n  overwrite = TRUE,\n  compress = 'xz'\n)\n"
  },
  {
    "path": "tests/testthat/_snaps/tidier_methods.md",
    "content": "# `tidy()` snapshot value of `mvgam_example1`\n\n    {\n      \"type\": \"list\",\n      \"attributes\": {\n        \"names\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"parameter\", \"type\", \"mean\", \"sd\", \"2.5%\", \"50%\", \"97.5%\"]\n        },\n        \"row.names\": {\n          \"type\": \"integer\",\n          \"attributes\": {},\n          \"value\": [1, 2, 3, 4, 5]\n        },\n        \"class\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"tbl_df\", \"tbl\", \"data.frame\"]\n        }\n      },\n      \"value\": [\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"sigma_obs[1]\", \"sigma_obs[2]\", \"(Intercept)\", \"sigma[1]\", \"sigma[2]\"]\n        },\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"observation_family_extra_param\", \"observation_family_extra_param\", \"observation_beta\", \"trend_model_param\", \"trend_model_param\"]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.73, 0.22, -2.4, 0.53, 1]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.24, 0.081, 0.064, 0.18, 0.24]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.5, 0.14, -2.4, 0.39, 0.69]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.7, 0.2, -2.4, 0.45, 0.96]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [1, 0.33, -2.3, 0.79, 1.3]\n        }\n      ]\n    }\n\n# `tidy()` snapshot value of `mvgam_example2`\n\n    {\n      \"type\": \"list\",\n      \"attributes\": {\n        \"names\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"parameter\", \"type\", \"mean\", \"sd\", \"2.5%\", \"50%\", \"97.5%\"]\n        },\n        \"row.names\": {\n          \"type\": \"integer\",\n          \"attributes\": {},\n          \"value\": [1, 2, 3, 4, 5]\n        },\n        \"class\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"tbl_df\", \"tbl\", \"data.frame\"]\n        }\n      },\n      \"value\": [\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"sigma_obs[1]\", \"sigma_obs[2]\", \"(Intercept)\", \"Sigma[1,1]\", \"(Intercept)_trend\"]\n        },\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"observation_family_extra_param\", \"observation_family_extra_param\", \"observation_beta\", \"trend_model_param\", \"trend_beta\"]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.52, 0.87, -1, 0.61, 0.23]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.12, 0.19, 0.31, 0.28, 0.74]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.34, 0.65, -1.3, 0.27, -0.7]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.57, 0.81, -1.1, 0.53, 0.14]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.61, 1.1, -0.56, 0.91, 1.2]\n        }\n      ]\n    }\n\n# `tidy()` snapshot value of `mvgam_example3`\n\n    {\n      \"type\": \"list\",\n      \"attributes\": {\n        \"names\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"parameter\", \"type\", \"mean\", \"sd\", \"2.5%\", \"50%\", \"97.5%\"]\n        },\n        \"row.names\": {\n          \"type\": \"integer\",\n          \"attributes\": {},\n          \"value\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n        },\n        \"class\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"tbl_df\", \"tbl\", \"data.frame\"]\n        }\n      },\n      \"value\": [\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"sigma_obs[1]\", \"sigma_obs[2]\", \"(Intercept)\", \"A[1,1]\", \"A[2,1]\", \"A[1,2]\", \"A[2,2]\", \"Sigma[1,1]\", \"Sigma[2,1]\", \"Sigma[1,2]\", \"Sigma[2,2]\"]\n        },\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"observation_family_extra_param\", \"observation_family_extra_param\", \"observation_beta\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\"]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.41, 0.55, -0.78, 0.47, -0.28, -0.044, 0.32, 0.17, -0.0057, -0.0057, 0.71]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.064, 0.23, 0.19, 0.35, 0.42, 0.17, 0.51, 0.061, 0.2, 0.2, 0.73]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.34, 0.3, -0.96, 0.061, -0.78, -0.29, -0.25, 0.094, -0.31, -0.31, 0.16]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.4, 0.51, -0.88, 0.55, -0.37, -0.017, 0.66, 0.17, 0.086, 0.086, 0.5]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.5, 0.87, -0.52, 0.82, 0.24, 0.13, 0.71, 0.25, 0.14, 0.14, 1.8]\n        }\n      ]\n    }\n\n# `tidy()` snapshot value of `mvgam_example4`\n\n    {\n      \"type\": \"list\",\n      \"attributes\": {\n        \"names\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"parameter\", \"type\", \"mean\", \"sd\", \"2.5%\", \"50%\", \"97.5%\"]\n        },\n        \"row.names\": {\n          \"type\": \"integer\",\n          \"attributes\": {},\n          \"value\": [1, 2, 3, 4, 5, 6, 7, 8]\n        },\n        \"class\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"tbl_df\", \"tbl\", \"data.frame\"]\n        }\n      },\n      \"value\": [\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"sigma_obs[1]\", \"sigma_obs[2]\", \"(Intercept)\", \"seriesseries_2\", \"rho_gp[1]\", \"rho_gp[2]\", \"alpha_gp[1]\", \"alpha_gp[2]\"]\n        },\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"observation_family_extra_param\", \"observation_family_extra_param\", \"observation_beta\", \"observation_beta\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\"]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.73, 0.86, -0.99, 0.51, 12, 7.7, 0.25, 0.25]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.18, 0.12, 0.14, 0.15, 7.3, 5.6, 0, 0]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.51, 0.8, -1.1, 0.38, 7.6, 3.4, 0.25, 0.25]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.75, 0.82, -1, 0.45, 9.2, 4.7, 0.25, 0.25]\n        },\n        {\n          \"type\": \"double\",\n          \"attributes\": {},\n          \"value\": [0.93, 1, -0.84, 0.7, 24, 16, 0.25, 0.25]\n        }\n      ]\n    }\n\n# `tidy()` snapshot value of `mvgam_example6`\n\n    {\n      \"type\": \"list\",\n      \"attributes\": {\n        \"names\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"parameter\", \"type\"]\n        },\n        \"row.names\": {\n          \"type\": \"integer\",\n          \"attributes\": {},\n          \"value\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]\n        },\n        \"class\": {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"tbl_df\", \"tbl\", \"data.frame\"]\n        }\n      },\n      \"value\": [\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"(Intercept)\", \"speciesspecies_2\", \"speciesspecies_3\", \"speciesspecies_4\", \"ar1[1]\", \"ar1[2]\", \"ar1[3]\", \"ar1[4]\", \"ar1[5]\", \"ar1[6]\", \"ar1[7]\", \"ar1[8]\", \"ar1[9]\", \"ar1[10]\", \"ar1[11]\", \"ar1[12]\", \"alpha_cor\", \"Sigma_1[1,1]\", \"Sigma_1[2,1]\", \"Sigma_1[3,1]\", \"Sigma_1[4,1]\", \"Sigma_1[1,2]\", \"Sigma_1[2,2]\", \"Sigma_1[3,2]\", \"Sigma_1[4,2]\", \"Sigma_1[1,3]\", \"Sigma_1[2,3]\", \"Sigma_1[3,3]\", \"Sigma_1[4,3]\", \"Sigma_1[1,4]\", \"Sigma_1[2,4]\", \"Sigma_1[3,4]\", \"Sigma_1[4,4]\", \"Sigma_2[1,1]\", \"Sigma_2[2,1]\", \"Sigma_2[3,1]\", \"Sigma_2[4,1]\", \"Sigma_2[1,2]\", \"Sigma_2[2,2]\", \"Sigma_2[3,2]\", \"Sigma_2[4,2]\", \"Sigma_2[1,3]\", \"Sigma_2[2,3]\", \"Sigma_2[3,3]\", \"Sigma_2[4,3]\", \"Sigma_2[1,4]\", \"Sigma_2[2,4]\", \"Sigma_2[3,4]\", \"Sigma_2[4,4]\", \"Sigma_3[1,1]\", \"Sigma_3[2,1]\", \"Sigma_3[3,1]\", \"Sigma_3[4,1]\", \"Sigma_3[1,2]\", \"Sigma_3[2,2]\", \"Sigma_3[3,2]\", \"Sigma_3[4,2]\", \"Sigma_3[1,3]\", \"Sigma_3[2,3]\", \"Sigma_3[3,3]\", \"Sigma_3[4,3]\", \"Sigma_3[1,4]\", \"Sigma_3[2,4]\", \"Sigma_3[3,4]\", \"Sigma_3[4,4]\"]\n        },\n        {\n          \"type\": \"character\",\n          \"attributes\": {},\n          \"value\": [\"observation_beta\", \"observation_beta\", \"observation_beta\", \"observation_beta\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\", \"trend_model_param\"]\n        }\n      ]\n    }\n\n"
  },
  {
    "path": "tests/testthat/setup.R",
    "content": "# Setup models for tests\nlibrary(\"testthat\")\nlibrary(\"mvgam\")\n\nexpect_match2 <- function(object, regexp) {\n  any(grepl(regexp, object, fixed = TRUE))\n}\n\nexpect_character <- function(object, ...) {\n  testthat::expect_true(is(object, \"character\"), ...)\n}\n\nexpect_list <- function(object, ...) {\n  testthat::expect_true(is(object, \"list\"), ...)\n}\n\nexpect_ggplot <- function(object, ...) {\n  testthat::expect_true(is(object, \"ggplot\"), ...)\n}\n\nexpect_loo <- function(object, ...) {\n  testthat::expect_true(is(object, \"psis_loo\"), ...)\n}\n\nexpect_range <- function(object, lower = -Inf, upper = Inf, ...) {\n  testthat::expect_true(all(object >= lower & object <= upper), ...)\n}\n\nSM <- suppressMessages\nSW <- suppressWarnings\n\nset.seed(100)\nbeta_data <- sim_mvgam(\n  family = betar(),\n  trend_model = 'GP',\n  trend_rel = 0.5,\n  T = 60\n)\ngaus_data <- sim_mvgam(\n  family = gaussian(),\n  T = 60,\n  trend_model = 'AR1',\n  seasonality = 'shared',\n  mu = c(-1, 0, 1),\n  trend_rel = 0.5,\n  prop_missing = 0.2\n)\n"
  },
  {
    "path": "tests/testthat/test-RW.R",
    "content": "context(\"RW,AR,VAR,CAR\")\n\nskip_on_cran()\n\ntest_that(\"ma and cor options should work for trends other than VAR\", {\n  test <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc') -\n      1,\n    trend_model = AR(p = 1, ma = TRUE),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(test, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'vector<lower=-1,upper=1>[n_series]theta;',\n    gsub(' ', '', test$model_file),\n    fixed = TRUE\n  )))\n  expect_true(attr(test$model_data, 'trend_model') == 'AR1')\n\n  # Correlation works\n  test <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc') -\n      1,\n    trend_model = AR(p = 1, cor = TRUE),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(test, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'error[i]~multi_normal_cholesky(trend_zeros,L_Sigma);',\n    gsub(' ', '', test$model_file),\n    fixed = TRUE\n  )))\n  expect_true(attr(test$model_data, 'trend_model') == 'AR1')\n\n  test <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc') -\n      1,\n    trend_model = RW(ma = TRUE),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(test, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'vector<lower=-1,upper=1>[n_series]theta;',\n    gsub(' ', '', test$model_file),\n    fixed = TRUE\n  )))\n  expect_true(attr(test$model_data, 'trend_model') == 'RW')\n\n  test <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc') -\n      1,\n    trend_model = RW(cor = TRUE),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(test, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'error[i]~multi_normal_cholesky(trend_zeros,L_Sigma);',\n    gsub(' ', '', test$model_file),\n    fixed = TRUE\n  )))\n  expect_true(attr(test$model_data, 'trend_model') == 'RW')\n})\n\ntest_that(\"VARMAs are set up correctly\", {\n  var <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc') -\n      1,\n    trend_model = VAR(),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(var, 'mvgam_prefit'))\n\n  var <- SW(mvgam(\n    y ~\n      s(series, bs = 're') +\n      gp(time, c = 5 / 4, k = 20) -\n      1,\n    trend_model = VAR(),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  ))\n  expect_true(inherits(var, 'mvgam_prefit'))\n\n  varma <- SW(mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc') -\n      1,\n    trend_model = 'VARMA',\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  ))\n\n  expect_true(any(grepl(\n    '// unconstrained ma inverse partial autocorrelations',\n    varma$model_file,\n    fixed = TRUE\n  )))\n\n  varma <- mvgam(\n    y ~ s(series, bs = 're'),\n    trend_formula = ~ gp(time, by = trend, c = 5 / 4, k = 15),\n    trend_model = VAR(ma = TRUE),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  expect_true(any(grepl(\n    '// unconstrained ma inverse partial autocorrelations',\n    varma$model_file,\n    fixed = TRUE\n  )))\n})\n\ntest_that(\"hierarchical cors are set up correctly\", {\n  # Simulate hierarchical data\n  simdat1 <- sim_mvgam(\n    trend_model = VAR(cor = TRUE),\n    prop_trend = 0.95,\n    n_series = 3,\n    mu = c(1, 2, 3)\n  )\n  simdat2 <- sim_mvgam(\n    trend_model = VAR(cor = TRUE),\n    prop_trend = 0.95,\n    n_series = 3,\n    mu = c(1, 2, 3)\n  )\n  simdat3 <- sim_mvgam(\n    trend_model = VAR(cor = TRUE),\n    prop_trend = 0.95,\n    n_series = 3,\n    mu = c(1, 2, 3)\n  )\n  all_dat <- rbind(\n    simdat1$data_train %>%\n      dplyr::mutate(region = 'qld'),\n    simdat2$data_train %>%\n      dplyr::mutate(region = 'nsw'),\n    simdat3$data_train %>%\n      dplyr::mutate(region = 'vic')\n  ) %>%\n    dplyr::mutate(\n      species = gsub('series', 'species', series),\n      species = as.factor(species),\n      region = as.factor(region)\n    ) %>%\n    dplyr::arrange(series, time) %>%\n    dplyr::select(-series)\n\n  # Check that all model types can be constructed\n\n  # Random Walk\n  mod <- mvgam(\n    formula = y ~ species,\n    trend_model = RW(gr = region, subgr = species),\n    data = all_dat,\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// hierarchical process error correlations',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  mod <- mvgam(\n    formula = y ~ -1,\n    trend_formula = ~species,\n    trend_model = RW(gr = region, subgr = species),\n    data = all_dat,\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// hierarchical process error correlations',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # AR\n  mod <- mvgam(\n    formula = y ~ species,\n    trend_model = AR(gr = region, subgr = species, p = 2),\n    data = all_dat,\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// hierarchical process error correlations',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  mod <- mvgam(\n    formula = y ~ -1,\n    trend_formula = ~species,\n    trend_model = AR(gr = region, subgr = species, p = 3),\n    data = all_dat,\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// hierarchical process error correlations',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # VAR\n  mod <- mvgam(\n    formula = y ~ species,\n    trend_model = VAR(gr = region, subgr = species),\n    data = all_dat,\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// derived group-level VAR covariance matrices',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  mod <- mvgam(\n    formula = y ~ -1,\n    trend_formula = ~species,\n    trend_model = VAR(gr = region, subgr = species),\n    data = all_dat,\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'Sigma[group_inds[g], group_inds[g]] = multiply_lower_tri_self_transpose(L_Sigma_group[g]);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// derived group-level VAR covariance matrices',\n    mod$model_file,\n    fixed = TRUE\n  )))\n})\n\ntest_that(\"site variable must be numeric for ZMVN\", {\n  site_dat <- data.frame(\n    site = as.character(rep(1:10, 4)),\n    species = as.factor(c(sort(rep(letters[1:4], 9)), 'q', 'q', 'q', 'q')),\n    y = rpois(40, 3)\n  )\n\n  trend_model <- ZMVN(unit = site, subgr = species)\n  expect_error(\n    mvgam:::validate_series_time(data = site_dat, trend_model = trend_model),\n    'Variable \"site\" must be either numeric or integer type'\n  )\n})\n\ntest_that(\"Each subgroup must exist within each site for ZMVN\", {\n  site_dat <- data.frame(\n    site = rep(1:10, 4),\n    species = as.factor(c(sort(rep(letters[1:4], 9)), 'q', 'q', 'q', 'q')),\n    y = rpois(40, 3)\n  )\n\n  trend_model <- ZMVN(unit = site, subgr = species)\n  expect_error(\n    mvgam:::validate_series_time(data = site_dat, trend_model = trend_model),\n    'One or more series in data is missing observations for one or more timepoints'\n  )\n\n  # Should work if all species were recorded in all sites (even if NA)\n  site_dat <- data.frame(\n    site = rep(1:10, 4),\n    species = as.factor(c(sort(rep(letters[1:4], 10)))),\n    y = c(NA, rpois(39, 3))\n  )\n\n  trend_model <- ZMVN(unit = site, subgr = species)\n  expect_no_error(mvgam:::validate_series_time(\n    data = site_dat,\n    trend_model = trend_model\n  ))\n\n  mod <- mvgam(\n    formula = y ~ species,\n    trend_model = ZMVN(unit = site, subgr = species),\n    data = site_dat,\n    run_model = FALSE\n  )\n  expect_equal(attr(mod$obs_data, 'implicit_vars'), c('series', 'time'))\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'trend_raw[i] ~ multi_normal_cholesky(trend_zeros, L_Sigma);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'L_Sigma = diag_pre_multiply(sigma, L_Omega);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  mod <- mvgam(\n    formula = y ~ -1,\n    trend_formula = ~species,\n    trend_model = ZMVN(unit = site, subgr = species),\n    data = site_dat,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'LV_raw[i] ~ multi_normal_cholesky(trend_mus[ytimes_trend[i, 1 : n_lv]]',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'L_Sigma = diag_pre_multiply(sigma, L_Omega);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n})\n\n\n# Replicate CAR1 example\n# Function to simulate CAR1 data with seasonality\nsim_corcar1 = function(n = 120, phi = 0.5, sigma = 1, sigma_obs = 0.75) {\n  # Sample irregularly spaced time intervals\n  time_dis <- c(1, runif(n - 1, 0, 5))\n\n  # Set up the latent dynamic process\n  x <- vector(length = n)\n  x[1] <- -0.3\n  for (i in 2:n) {\n    # zero-distances will cause problems in sampling, so mvgam uses a\n    # minimum threshold; this simulation function emulates that process\n    if (time_dis[i] == 0) {\n      x[i] <- rnorm(\n        1,\n        mean = (phi^1e-3) * x[i - 1],\n        sd = sigma * (1 - phi^(2 * 1e-3)) / (1 - phi^2)\n      )\n    } else {\n      x[i] <- rnorm(\n        1,\n        mean = (phi^time_dis[i]) * x[i - 1],\n        sd = sigma * (1 - phi^(2 * time_dis[i])) / (1 - phi^2)\n      )\n    }\n  }\n\n  # Add 12-month seasonality\n  cov1 <- sin(2 * pi * (1:n) / 12)\n  cov2 <- cos(2 * pi * (1:n) / 12)\n  beta1 <- runif(1, 0.3, 0.7)\n  beta2 <- runif(1, 0.2, 0.5)\n  seasonality <- beta1 * cov1 + beta2 * cov2\n\n  # Take Gaussian observations with error and return\n  data.frame(\n    y = rnorm(n, mean = x + seasonality, sd = sigma),\n    season = rep(1:12, 20)[1:n],\n    time = cumsum(time_dis)\n  )\n}\n\n# Sample two time series\ndat <- rbind(\n  dplyr::bind_cols(\n    sim_corcar1(phi = 0.65, sigma_obs = 0.55),\n    data.frame(series = 'series1')\n  ),\n  dplyr::bind_cols(\n    sim_corcar1(phi = 0.8, sigma_obs = 0.35),\n    data.frame(series = 'series2')\n  )\n) %>%\n  dplyr::mutate(series = as.factor(series))\n\ndat_train <- dat %>%\n  dplyr::group_by(series) %>%\n  dplyr::arrange(time) %>%\n  dplyr::slice_head(n = 110) %>%\n  dplyr::ungroup()\ndat_test <- dat %>%\n  dplyr::group_by(series) %>%\n  dplyr::arrange(time) %>%\n  dplyr::slice_tail(n = 10) %>%\n  dplyr::ungroup()\n\ntest_that(\"CAR1 sets up correctly\", {\n  # mvgam with CAR(1) trends and series-level seasonal smooths\n  mod <- mvgam(\n    formula = y ~ s(season, bs = 'cc', k = 5, by = series),\n    trend_model = CAR(),\n    noncentred = FALSE,\n    data = dat_train,\n    family = gaussian(),\n    run_model = FALSE,\n    backend = 'cmdstanr'\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(exists('time_dis', mod$model_data))\n  expect_true(exists('index..time..index', mod$obs_data))\n  expect_true(attr(mod$model_data, 'trend_model') == 'CAR1')\n  expect_true(any(grepl(\n    'vector<lower=0,upper=1>[n_series]ar1;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # Will work for regularly-spaced data as well\n  mod <- mvgam(\n    formula = y ~ s(season, bs = 'cc', k = 5, by = series),\n    trend_model = CAR(),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(exists('time_dis', mod$model_data))\n  expect_true(all.equal(\n    mean(mod$model_data$time_dis[2:NROW(mod$model_data$time_dis), ]),\n    max(mod$model_data$time_dis[2:NROW(mod$model_data$time_dis), ]),\n    min(mod$model_data$time_dis[2:NROW(mod$model_data$time_dis), ]),\n    1L\n  ))\n  expect_true(exists('index..time..index', mod$obs_data))\n  expect_true(attr(mod$model_data, 'trend_model') == 'CAR1')\n})\n"
  },
  {
    "path": "tests/testthat/test-backends.R",
    "content": "context(\"backends\")\n\nskip_on_cran()\n\ntest_that(\"variationals are converted to stanfit appropriately\", {\n  # dat <- data.frame(y = rnorm(100, 0, 1),\n  #                   series = as.factor('series1'))\n  # # mod <- SM(mvgam(y ~ 1,\n  # #              data = dat,\n  # #              family = gaussian(),\n  # #              algorithm = 'meanfield',\n  # #              silent = 2))\n  # # expect_true(inherits(mod, 'mvgam'))\n  #\n  # mod <- SM(mvgam(y ~ 1,\n  #              data = dat,\n  #              family = gaussian(),\n  #              algorithm = 'fullrank',\n  #              silent = 2))\n  # expect_true(inherits(mod, 'mvgam'))\n  #\n  # mod <- SM(mvgam(y ~ 1,\n  #              data = dat,\n  #              family = gaussian(),\n  #              algorithm = 'laplace',\n  #              silent = 2))\n  # expect_true(inherits(mod, 'mvgam'))\n})\n"
  },
  {
    "path": "tests/testthat/test-binomial.R",
    "content": "context(\"binomial\")\n\n# Simulations take a bit of time to set up\nskip_on_cran()\n\n# Simulate two time series of Binomial trials\ntrials <- sample(c(20:25), 50, replace = TRUE)\nx <- rnorm(50)\ndetprob1 <- plogis(-0.5 + 0.9 * x)\ndetprob2 <- plogis(-0.1 - 0.7 * x)\ndat <- rbind(\n  data.frame(\n    y = rbinom(n = 50, size = trials, prob = detprob1),\n    time = 1:50,\n    series = 'series1',\n    x = x,\n    ntrials = trials\n  ),\n  data.frame(\n    y = rbinom(n = 50, size = trials, prob = detprob2),\n    time = 1:50,\n    series = 'series2',\n    x = x,\n    ntrials = trials\n  )\n) %>%\n  dplyr::mutate(series = as.factor(series)) %>%\n  dplyr::arrange(time, series)\n\n# Throw in some NAs\ndat$y[c(1, 5, 9)] <- NA\n\n# Training and testing splits\ndat_train <- dat %>%\n  dplyr::filter(time <= 40)\ndat_test <- dat %>%\n  dplyr::filter(time > 40)\n\ntest_that(\"cbind() syntax required for binomial()\", {\n  # Initial warning should be issued when calling binomial or beta-binomial\n  expect_warning(mvgam(\n    formula = cbind(y, ntrials) ~\n      s(series, bs = 're') +\n      gp(x, by = series, c = 5 / 4, k = 5),\n    family = binomial(),\n    data = dat_train,\n    run_model = FALSE\n  ))\n\n  expect_error(\n    mvgam(\n      y ~ series + s(x, by = series),\n      family = binomial(),\n      data = dat_train,\n      run_model = FALSE\n    ),\n    'Binomial family requires cbind() syntax in the formula left-hand side',\n    fixed = TRUE\n  )\n\n  # Should work if correctly specified\n  mod <- mvgam(\n    cbind(y, ntrials) ~\n      s(series, bs = 're') +\n      gp(x, by = series, c = 5 / 4, k = 5),\n    family = binomial(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl('flat_ys ~ binomial(', mod$model_file, fixed = TRUE)))\n\n  # Also with a trend_formula\n  mod <- mvgam(\n    cbind(y, ntrials) ~ series,\n    trend_formula = ~ s(x, by = trend),\n    family = binomial(),\n    trend_model = AR(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl('flat_ys ~ binomial(', mod$model_file, fixed = TRUE)))\n\n  # Also with no predictors\n  mod <- mvgam(\n    cbind(y, ntrials) ~ 1,\n    family = binomial(),\n    trend_model = AR(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl('flat_ys ~ binomial(', mod$model_file, fixed = TRUE)))\n})\n\ntest_that(\"binomial() post-processing works\", {\n  mod <- SW(mvgam(\n    cbind(y, ntrials) ~ series,\n    trend_formula = ~ s(x, by = trend),\n    family = binomial(),\n    trend_model = AR(),\n    noncentred = TRUE,\n    data = dat_train,\n    burnin = 500,\n    samples = 200,\n    chains = 2,\n    silent = 2\n  ))\n  expect_no_error(capture_output(summary(mod)))\n  expect_no_error(capture_output(code(mod)))\n  expect_no_error(capture_output(print(mod)))\n\n  preds <- predict(mod, summary = FALSE, type = 'response')\n  expect_true(NCOL(preds) == NROW(dat_train))\n  expect_true(all(preds >= 0L))\n\n  preds <- predict(mod, newdata = dat_test, summary = FALSE)\n  expect_true(NCOL(preds) == NROW(dat_test))\n\n  expect_no_error(ppc(mod))\n  expect_no_error(ppc(mod, type = 'density'))\n  expect_no_error(ppc(mod, type = 'mean'))\n  expect_no_error(ppc(mod, type = 'pit'))\n  expect_no_error(ppc(mod, type = 'cdf'))\n  expect_no_error(ppc(mod, type = 'rootogram'))\n  expect_no_error(plot(mod, type = 'residuals'))\n\n  expect_no_error(plot_mvgam_series(object = mod))\n  expect_no_error(plot_mvgam_series(object = mod, series = 'all'))\n\n  expect_no_error(plot(mod, type = 'forecast'))\n  expect_no_error(plot(mod, type = 'forecast', newdata = dat_test))\n  expect_no_error(plot(mod, type = 'trend'))\n  expect_no_error(plot(mod, type = 'trend', realisations = TRUE))\n  expect_no_error(plot(mod, type = 'trend', newdata = dat_test))\n  expect_true(inherits(hindcast(mod), 'mvgam_forecast'))\n  fc <- forecast(mod, newdata = dat_test)\n  expect_true(inherits(fc, 'mvgam_forecast'))\n  expect_no_error(plot(fc))\n  expect_no_error(plot(fc, realisations = TRUE))\n  expect_list(score(fc, score = 'drps'))\n  expect_error(\n    score(fc, score = 'brier'),\n    'cannot evaluate brier scores unless probability predictions are supplied. Use \"type == expected\" when forecasting instead'\n  )\n  fc <- forecast(mod, newdata = dat_test, type = 'expected')\n  expect_error(\n    score(fc, score = 'brier'),\n    'brier score only applicable for Bernoulli forecasts'\n  )\n\n  expect_no_error(SW(plot(mod, type = 'smooths', trend_effects = TRUE)))\n  expect_no_error(plot(\n    mod,\n    type = 'smooths',\n    realisations = TRUE,\n    trend_effects = TRUE\n  ))\n  expect_no_error(plot(\n    mod,\n    type = 'smooths',\n    residuals = TRUE,\n    trend_effects = TRUE\n  ))\n  expect_no_error(plot(mod, type = 're', trend_effects = TRUE))\n  expect_no_error(plot(mod, type = 'pterms'))\n\n  expect_true(inherits(\n    SM(conditional_effects(mod)),\n    'mvgam_conditional_effects'\n  ))\n  expect_true(inherits(\n    SM(conditional_effects(mod, type = 'link')),\n    'mvgam_conditional_effects'\n  ))\n  options(mc.cores = 1)\n  expect_loo(SW(loo(mod)))\n\n  dat_test2 <- dat_test\n  dat_test2$ntrials <- NULL\n  expect_error(\n    plot(mod, type = 'trend', newdata = dat_test2),\n    'Variable ntrials not found in newdata'\n  )\n  expect_error(\n    forecast(mod, newdata = dat_test2),\n    'Variable ntrials not found in newdata'\n  )\n\n  mod <- SW(mvgam(\n    cbind(y, ntrials) ~ series,\n    trend_formula = ~ s(x, by = trend),\n    family = binomial(),\n    trend_model = AR(),\n    noncentred = TRUE,\n    data = dat_train,\n    newdata = dat_test,\n    burnin = 200,\n    samples = 200,\n    chains = 2,\n    silent = 2\n  ))\n  fc <- forecast(mod)\n  expect_true(inherits(fc, 'mvgam_forecast'))\n  expect_error(plot_mvgam_uncertainty(mod))\n  expect_error(stability(mod))\n})\n\n# All tests should apply to beta_binomial as well\ntest_that(\"cbind() syntax required for beta_binomial()\", {\n  expect_error(\n    SW(mvgam(\n      y ~ series + s(x, by = series),\n      family = beta_binomial(),\n      data = dat_train,\n      run_model = FALSE\n    )),\n    'Binomial family requires cbind() syntax in the formula left-hand side',\n    fixed = TRUE\n  )\n\n  # Should work if correctly specified\n  mod <- mvgam(\n    cbind(y, ntrials) ~\n      s(series, bs = 're') +\n      gp(x, by = series, c = 5 / 4, k = 5),\n    family = beta_binomial(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'flat_ys ~ beta_binomial(',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Also with a trend_formula\n  mod <- mvgam(\n    cbind(y, ntrials) ~ series,\n    trend_formula = ~ s(x, by = trend),\n    family = beta_binomial(),\n    trend_model = AR(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'flat_ys ~ beta_binomial(',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Also with no predictors and with a prior on phi\n  mod <- mvgam(\n    cbind(y, ntrials) ~ 0,\n    family = beta_binomial(),\n    priors = prior(normal(0, 3), class = phi),\n    trend_model = AR(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl('beta_binomial(', mod$model_file, fixed = TRUE)))\n  expect_true(any(grepl(\"b[1] = 0;\", mod$model_file, fixed = TRUE)))\n  expect_true(any(grepl(\"phi ~ normal(0, 3);\", mod$model_file, fixed = TRUE)))\n})\n\ntest_that(\"trials variable must be in data for binomial()\", {\n  expect_error(\n    mvgam(\n      cbind(y, mytrials) ~ series + s(x, by = series),\n      family = binomial(),\n      data = dat_train,\n      run_model = FALSE\n    ),\n    'variable mytrials not found in data',\n    fixed = TRUE\n  )\n})\n\n# Simulate two time series of Bernoulli draws\nx <- rnorm(50)\ndetprob1 <- plogis(-0.5 + 0.9 * x)\ndetprob2 <- plogis(-0.1 - 0.7 * x)\ndat <- rbind(\n  data.frame(\n    y = rbinom(n = 50, size = 1, prob = detprob1),\n    time = 1:50,\n    series = 'series1',\n    x = x\n  ),\n  data.frame(\n    y = rbinom(n = 50, size = 1, prob = detprob2),\n    time = 1:50,\n    series = 'series2',\n    x = x\n  )\n) %>%\n  dplyr::mutate(series = as.factor(series)) %>%\n  dplyr::arrange(time, series)\n\n# Throw in some NAs\ndat$y[c(1, 5, 9)] <- NA\n\n# Training and testing splits\ndat_train <- dat %>%\n  dplyr::filter(time <= 40)\ndat_test <- dat %>%\n  dplyr::filter(time > 40)\n\ntest_that(\"bernoulli() behaves appropriately\", {\n  expect_error(\n    mvgam(\n      y ~ series + s(x, by = series),\n      family = bernoulli(),\n      data = gaus_data$data_train,\n      run_model = FALSE\n    ),\n    'y values must be 0 <= y <= 1',\n    fixed = TRUE\n  )\n\n  mod <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      gp(x, by = series, c = 5 / 4, k = 5),\n    family = bernoulli(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'flat_ys ~ bernoulli_logit_glm(',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Also with a trend_formula\n  mod <- mvgam(\n    y ~ series,\n    trend_formula = ~ gp(x, by = trend, c = 5 / 4, k = 5),\n    trend_model = AR(),\n    family = bernoulli(),\n    data = dat_train,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'flat_ys ~ bernoulli_logit_glm(',\n    mod$model_file,\n    fixed = TRUE\n  )))\n})\n\ntest_that(\"bernoulli() post-processing works\", {\n  mod <- SW(mvgam(\n    y ~\n      s(series, bs = 're') +\n      gp(x, by = series, c = 5 / 4, k = 5),\n    trend_model = AR(),\n    priors = prior(normal(0, 0.1), class = ar1),\n    noncentred = TRUE,\n    family = bernoulli(),\n    data = dat_train,\n    burnin = 200,\n    samples = 200,\n    chains = 2,\n    silent = 2\n  ))\n\n  expect_no_error(capture_output(summary(mod)))\n  expect_no_error(capture_output(print(mod)))\n\n  preds <- predict(mod, summary = FALSE, type = 'response')\n  expect_true(NCOL(preds) == NROW(dat_train))\n  expect_true(all(preds >= 0L))\n\n  preds <- predict(mod, newdata = dat_test, summary = FALSE)\n  expect_true(NCOL(preds) == NROW(dat_test))\n\n  expect_no_error(ppc(mod))\n  expect_no_error(ppc(mod, type = 'density'))\n  expect_no_error(ppc(mod, type = 'pit'))\n  expect_no_error(ppc(mod, type = 'cdf'))\n\n  expect_no_error(plot(mod, type = 'residuals'))\n\n  expect_no_error(plot_mvgam_series(object = mod, lines = FALSE))\n  expect_no_error(plot_mvgam_series(object = mod, series = 'all'))\n\n  expect_no_error(plot(mod, type = 'forecast'))\n  expect_no_error(plot(mod, type = 'forecast', newdata = dat_test))\n  expect_no_error(plot(mod, type = 'trend'))\n  expect_no_error(plot(mod, type = 'trend', newdata = dat_test))\n  expect_true(inherits(hindcast(mod), 'mvgam_forecast'))\n  expect_true(inherits(hindcast(mod, type = 'expected'), 'mvgam_forecast'))\n\n  expect_no_error(plot(mod, type = 're'))\n  expect_no_error(plot(mod, type = 'smooths'))\n  expect_no_error(plot(mod, type = 'smooths', realisations = TRUE))\n  expect_no_error(plot(mod, type = 'smooths', residuals = TRUE))\n\n  expect_true(inherits(\n    SM(conditional_effects(mod)),\n    'mvgam_conditional_effects'\n  ))\n  expect_true(inherits(\n    SM(conditional_effects(mod, type = 'link')),\n    'mvgam_conditional_effects'\n  ))\n\n  options(mc.cores = 1)\n  expect_loo(SW(loo(mod)))\n})\n"
  },
  {
    "path": "tests/testthat/test-dynamic.R",
    "content": "context(\"dynamic\")\n\nskip_on_cran()\n\ntest_that(\"dynamic to gp spline is working properly\", {\n  expect_match(\n    attr(\n      terms(mvgam:::interpret_mvgam(\n        formula = y ~ dynamic(covariate, rho = 1, stationary = FALSE),\n        N = 100,\n        family = gaussian()\n      )),\n      'term.labels'\n    ),\n    's(time, by = covariate, bs = \"gp\", m = c(2, 1, 2), k = 50)',\n    fixed = TRUE\n  )\n\n  # k will decrease as rho increases\n  expect_match(\n    attr(\n      terms(mvgam:::interpret_mvgam(\n        formula = y ~ dynamic(covariate, rho = 11),\n        N = 100,\n        family = gaussian()\n      )),\n      'term.labels'\n    ),\n    's(time, by = covariate, bs = \"gp\", m = c(-2, 11, 2), k = 11)',\n    fixed = TRUE\n  )\n\n  # k will be fixed at N if N <= 8\n  expect_match(\n    attr(\n      terms(mvgam:::interpret_mvgam(\n        formula = y ~ dynamic(covariate, rho = 5),\n        N = 7,\n        family = gaussian()\n      )),\n      'term.labels'\n    ),\n    's(time, by = covariate, bs = \"gp\", m = c(-2, 5, 2), k = 7)',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"dynamic to gp Hilbert is working properly\", {\n  expect_match(\n    attr(\n      terms(mvgam:::interpret_mvgam(\n        formula = y ~ dynamic(covariate),\n        N = 100,\n        family = gaussian()\n      )),\n      'term.labels'\n    ),\n    'gp(time, by = covariate, c = 5/4, k = 40, scale = TRUE)',\n    fixed = TRUE\n  )\n\n  # k should come across just fine\n  expect_match(\n    attr(\n      terms(mvgam:::interpret_mvgam(\n        formula = y ~ dynamic(covariate, k = 17),\n        N = 100,\n        family = gaussian()\n      )),\n      'term.labels'\n    ),\n    'gp(time, by = covariate, c = 5/4, k = 17, scale = TRUE)',\n    fixed = TRUE\n  )\n\n  # k will be fixed at N-1 if N <= 8\n  expect_match(\n    attr(\n      terms(mvgam:::interpret_mvgam(\n        formula = y ~ dynamic(covariate),\n        N = 7,\n        family = gaussian()\n      )),\n      'term.labels'\n    ),\n    'gp(time, by = covariate, c = 5/4, k = 6, scale = TRUE)',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"rho argument must be positive numeric\", {\n  data = data.frame(\n    out = rnorm(100),\n    temp = rnorm(100),\n    time = 1:100,\n    series = as.factor('series1')\n  )\n  expect_error(\n    mod <- mvgam(\n      formula = out ~ dynamic(temp, rho = -1),\n      data = data,\n      family = gaussian(),\n      run_model = FALSE\n    ),\n    'Argument \"rho\" in dynamic() must be a positive value',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"rho argument cannot be larger than N - 1\", {\n  data = data.frame(\n    out = rnorm(100),\n    temp = rnorm(100),\n    time = 1:100,\n    series = as.factor('series1')\n  )\n  expect_error(\n    mod <- mvgam(\n      formula = out ~ dynamic(temp, rho = 110),\n      data = data,\n      family = gaussian(),\n      run_model = FALSE\n    ),\n    'Argument \"rho\" in dynamic() cannot be larger than (max(time) - 1)',\n    fixed = TRUE\n  )\n\n  expect_error(\n    mvgam:::interpret_mvgam(\n      formula = y ~ dynamic(covariate, rho = 120),\n      N = 100,\n      family = gaussian()\n    ),\n    'Argument \"rho\" in dynamic() cannot be larger than (max(time) - 1)',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"dynamic to spline works for trend_formulas\", {\n  beta_data$data_train$random <- rnorm(NROW(beta_data$data_train))\n  mod <- mvgam(\n    y ~ dynamic(random, rho = 5),\n    trend_formula = ~ dynamic(random, rho = 15),\n    trend_model = RW(),\n    data = beta_data$data_train,\n    family = betar(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n\n  # trend_idx should be in the model file and in the model data\n  expect_true(any(grepl('trend_idx', mod$model_file)))\n  expect_true(!is.null(mod$model_data$trend_idx1))\n})\n\ntest_that(\"dynamic to Hilbert works for trend_formulas\", {\n  beta_data$data_train$random <- rnorm(NROW(beta_data$data_train))\n  mod <- suppressWarnings(mvgam(\n    y ~ dynamic(random),\n    trend_formula = ~ dynamic(random, k = 22),\n    trend_model = RW(),\n    data = beta_data$data_train,\n    family = betar(),\n    run_model = FALSE,\n    autoformat = FALSE\n  ))\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(code(mod))\n\n  # Model file should have prior lines for observationgp terms\n  expect_true(any(grepl(\n    '// prior for gp(time):random...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    \"b[b_idx_gp_time_byrandom] = sqrt(spd_gp_exp_quad(\",\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Model file should have prior lines for trend gp terms\n  expect_true(any(grepl(\n    '// prior for gp(time):random_trend...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    \"b_trend[b_trend_idx_gp_time_byrandom] = sqrt(spd_gp_exp_quad(\",\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Observation-level Gp data structures should be in the model_data\n  expect_true(\"l_gp_time_byrandom\" %in% names(mod$model_data))\n  expect_true(\"b_idx_gp_time_byrandom\" %in% names(mod$model_data))\n  expect_true(\"k_gp_time_byrandom\" %in% names(mod$model_data))\n\n  # Trend-level Gp data structures should be in the model_data\n  expect_true(\"l_gp_trend_time_byrandom\" %in% names(mod$model_data))\n  expect_true(\"b_trend_idx_gp_time_byrandom\" %in% names(mod$model_data))\n  expect_true(\"k_gp_trend_time_byrandom\" %in% names(mod$model_data))\n})\n"
  },
  {
    "path": "tests/testthat/test-example_processing.R",
    "content": "context(\"example post-processing\")\n\n# Skip example testing as they are a bit time-consuming\nskip_on_cran()\ntest_that(\"fitted() gives correct dimensions\", {\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(fitted(mvgam:::mvgam_example1))\n  )\n\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(fitted(mvgam:::mvgam_example2))\n  )\n\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(fitted(mvgam:::mvgam_example3))\n  )\n\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(fitted(mvgam:::mvgam_example4))\n  )\n})\n\ntest_that(\"residuals() gives correct dimensions\", {\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(residuals(mvgam:::mvgam_example1))\n  )\n\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(residuals(mvgam:::mvgam_example2))\n  )\n\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(residuals(mvgam:::mvgam_example3))\n  )\n\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train),\n    NROW(residuals(mvgam:::mvgam_example4, robust = TRUE))\n  )\n})\n\ntest_that(\"stability() gives correct outputs\", {\n  metrics <- stability(mvgam:::mvgam_example3)\n  expect_range(metrics$prop_int_offdiag, lower = 0, upper = 1)\n  expect_range(metrics$prop_int_diag, lower = 0, upper = 1)\n  expect_range(metrics$prop_cov_offdiag, lower = 0, upper = 1)\n  expect_range(metrics$prop_cov_diag, lower = 0, upper = 1)\n})\n\ntest_that(\"irf() gives correct outputs\", {\n  irfs <- irf(mvgam:::mvgam_example3, h = 12)\n  expect_true(length(irfs) == 5)\n  expect_true(NROW(irfs[[1]]$process_1) == 12)\n  expect_no_error(plot(irfs))\n\n  irfs <- irf(\n    mvgam:::mvgam_example3,\n    h = 6,\n    cumulative = TRUE,\n    orthogonal = TRUE\n  )\n  expect_true(length(irfs) == 5)\n  expect_true(NROW(irfs[[1]]$process_1) == 6)\n  expect_no_error(plot(irfs))\n  expect_s3_class(summary(irfs), 'tbl_df')\n  expect_error(\n    summary(irfs, probs = c(1)),\n    \"argument 'probs' must be a vector of length 2\"\n  )\n})\n\ntest_that(\"fevd() gives correct outputs\", {\n  fevds <- fevd(mvgam:::mvgam_example3, h = 12)\n  expect_true(length(fevds) == 5)\n  expect_true(NROW(fevds[[1]]$process_1) == 12)\n  expect_no_error(plot(fevds))\n})\n\ntest_that(\"variable extraction works correctly\", {\n  expect_true(inherits(\n    as.matrix(mvgam:::mvgam_example4, 'rho_gp', regex = TRUE),\n    'matrix'\n  ))\n  expect_true(inherits(\n    as_draws(mvgam:::mvgam_example4, 'rho_gp', regex = TRUE),\n    'draws'\n  ))\n  expect_true(inherits(\n    as_draws(mvgam:::mvgam_example1, 'obs_params', regex = TRUE),\n    'draws'\n  ))\n  expect_true(inherits(\n    as_draws_df(mvgam:::mvgam_example1, 'obs_params', regex = TRUE),\n    'draws'\n  ))\n  expect_true(inherits(\n    as_draws_matrix(mvgam:::mvgam_example4, 'obs_params'),\n    'draws'\n  ))\n  expect_true(inherits(\n    as_draws_matrix(mvgam:::mvgam_example4, 'trend_params'),\n    'draws'\n  ))\n  expect_true(inherits(as_draws_list(mvgam:::mvgam_example2, 'betas'), 'draws'))\n  expect_true(inherits(\n    as_draws_rvars(mvgam:::mvgam_example2, 'trend_betas'),\n    'draws'\n  ))\n})\n\ntest_that(\"hindcast() works correctly\", {\n  hc <- hindcast(mvgam:::mvgam_example1)\n  expect_true(inherits(hc$hindcasts, 'list'))\n  expect_true(inherits(summary(hc), 'data.frame'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train) /\n      NCOL(mvgam:::mvgam_example1$ytimes),\n    NCOL(hc$hindcasts$series_1)\n  )\n\n  hc <- hindcast(mvgam:::mvgam_example1, type = 'expected')\n  expect_true(inherits(hc$hindcasts, 'list'))\n  expect_true(inherits(summary(hc), 'data.frame'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train) /\n      NCOL(mvgam:::mvgam_example1$ytimes),\n    NCOL(hc$hindcasts$series_1)\n  )\n\n  hc <- hindcast(mvgam:::mvgam_example4)\n  expect_true(inherits(hc$hindcasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train) /\n      NCOL(mvgam:::mvgam_example4$ytimes),\n    NCOL(hc$hindcasts$series_1)\n  )\n\n  hc <- hindcast(mvgam:::mvgam_example4, type = 'expected')\n  expect_true(inherits(hc$hindcasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train) /\n      NCOL(mvgam:::mvgam_example4$ytimes),\n    NCOL(hc$hindcasts$series_1)\n  )\n\n  hc <- hindcast(mvgam:::mvgam_example3, type = 'trend')\n  expect_true(inherits(hc$hindcasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_train) /\n      NCOL(mvgam:::mvgam_example3$ytimes),\n    NCOL(hc$hindcasts$series_1)\n  )\n})\n\ntest_that(\"predict() works correctly\", {\n  expect_equal(\n    dim(predict(\n      mvgam:::mvgam_example1,\n      type = 'expected',\n      process_error = FALSE\n    )),\n    dim(predict(\n      mvgam:::mvgam_example2,\n      type = 'expected',\n      process_error = FALSE\n    ))\n  )\n\n  expect_equal(\n    dim(predict(\n      mvgam:::mvgam_example1,\n      type = 'expected',\n      process_error = TRUE\n    )),\n    dim(predict(\n      mvgam:::mvgam_example2,\n      type = 'expected',\n      process_error = TRUE\n    ))\n  )\n\n  expect_equal(\n    dim(posterior_linpred(\n      mvgam:::mvgam_example1,\n      type = 'expected',\n      process_error = FALSE\n    )),\n    dim(posterior_linpred(\n      mvgam:::mvgam_example2,\n      type = 'expected',\n      process_error = FALSE\n    ))\n  )\n\n  expect_equal(\n    dim(posterior_linpred(\n      mvgam:::mvgam_example1,\n      type = 'expected',\n      process_error = FALSE,\n      ndraws = 33\n    )),\n    dim(posterior_linpred(\n      mvgam:::mvgam_example2,\n      type = 'expected',\n      process_error = FALSE,\n      ndraws = 33\n    ))\n  )\n\n  expect_equal(\n    dim(predict(\n      mvgam:::mvgam_example3,\n      type = 'expected',\n      process_error = FALSE\n    )),\n    dim(predict(\n      mvgam:::mvgam_example4,\n      type = 'expected',\n      process_error = FALSE\n    ))\n  )\n\n  expect_equal(\n    NROW(predict(\n      mvgam:::mvgam_example1,\n      newdata = mvgam:::mvgam_examp_dat$data_test,\n      process_error = FALSE\n    )),\n    NROW(mvgam:::mvgam_examp_dat$data_test)\n  )\n  expect_equal(\n    NROW(predict(\n      mvgam:::mvgam_example3,\n      newdata = mvgam:::mvgam_examp_dat$data_test,\n      process_error = TRUE\n    )),\n    NROW(mvgam:::mvgam_examp_dat$data_test)\n  )\n\n  expect_equal(\n    dim(predict(\n      mvgam:::mvgam_example1,\n      newdata = mvgam:::mvgam_examp_dat$data_test,\n      process_error = FALSE\n    )),\n    dim(predict(\n      mvgam:::mvgam_example2,\n      newdata = mvgam:::mvgam_examp_dat$data_test,\n      process_error = FALSE\n    ))\n  )\n\n  expect_error(\n    predict(mvgam:::mvgam_example1, newdata = data.frame(time = 1)),\n    \"the following required variables are missing from newdata:\\n season, series\"\n  )\n\n  expect_error(\n    predict(mvgam:::mvgam_example2, newdata = data.frame(season = 1)),\n    \"the following required variables are missing from newdata:\\n time, series\"\n  )\n})\n\ntest_that(\"mcmc_plot() works correctly\", {\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example1))\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example2))\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example3))\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example4))\n\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example1, variable = 'trend_params'))\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example2, variable = 'trend_params'))\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example3, variable = 'trend_params'))\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example4, variable = 'trend_params'))\n})\n\ntest_that(\"marginaleffects works correctly\", {\n  expect_ggplot(marginaleffects::plot_slopes(\n    mvgam:::mvgam_example1,\n    variables = 'season',\n    condition = 'season',\n    type = 'link'\n  ))\n  expect_ggplot(marginaleffects::plot_slopes(\n    mvgam:::mvgam_example2,\n    variables = 'season',\n    condition = 'season',\n    type = 'link'\n  ))\n  expect_ggplot(marginaleffects::plot_slopes(\n    mvgam:::mvgam_example3,\n    variables = 'season',\n    condition = 'season',\n    type = 'link'\n  ))\n  expect_ggplot(marginaleffects::plot_slopes(\n    mvgam:::mvgam_example4,\n    variables = 'season',\n    condition = 'season',\n    type = 'link'\n  ))\n\n  expect_ggplot(marginaleffects::plot_predictions(\n    mvgam:::mvgam_example1,\n    condition = 'season',\n    type = 'link'\n  ))\n  expect_ggplot(marginaleffects::plot_predictions(\n    mvgam:::mvgam_example2,\n    condition = 'season',\n    type = 'link'\n  ))\n  expect_ggplot(marginaleffects::plot_predictions(\n    mvgam:::mvgam_example3,\n    condition = 'season',\n    type = 'link'\n  ))\n  expect_ggplot(marginaleffects::plot_predictions(\n    mvgam:::mvgam_example4,\n    condition = 'season',\n    type = 'link'\n  ))\n})\n\ntest_that(\"plot_mvgam... functions work properly\", {\n  expect_no_error(plot_mvgam_fc(mvgam:::mvgam_example1))\n  expect_no_error(plot_mvgam_fc(mvgam:::mvgam_example2))\n  expect_no_error(plot(mvgam:::mvgam_example4, type = 'forecast'))\n  expect_no_error(SW(plot(mvgam:::mvgam_example3, type = 'smooths')))\n  expect_no_error(SW(plot(\n    mvgam:::mvgam_example3,\n    type = 'smooths',\n    realisations = TRUE\n  )))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example1,\n    smooth = 1,\n    derivatives = TRUE\n  ))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example1,\n    smooth = 1,\n    residuals = TRUE\n  ))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example1,\n    smooth = 1,\n    realisations = TRUE\n  ))\n  expect_error(plot_mvgam_smooth(mvgam:::mvgam_example2, smooth = 1))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example2,\n    smooth = 1,\n    trend_effects = TRUE\n  ))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example2,\n    smooth = 1,\n    derivatives = TRUE,\n    trend_effects = TRUE\n  ))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example2,\n    derivatives = TRUE,\n    residuals = TRUE,\n    trend_effects = TRUE\n  ))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example1,\n    realisations = TRUE\n  ))\n  expect_no_error(plot_mvgam_smooth(\n    mvgam:::mvgam_example4,\n    realisations = TRUE,\n    newdata = mvgam:::mvgam_examp_dat$data_test\n  ))\n  expect_message(\n    plot(mvgam:::mvgam_example3, type = 'pterms'),\n    'No parametric terms in model formula'\n  )\n  expect_message(plot(mvgam:::mvgam_example1, type = 're'))\n  expect_error(plot(mvgam:::mvgam_example1, type = 'factors'))\n  expect_no_error(plot(mvgam:::mvgam_example4, type = 'factors'))\n  expect_ggplot(plot_mvgam_trend(mvgam:::mvgam_example1))\n  expect_ggplot(plot_mvgam_trend(mvgam:::mvgam_example4))\n  expect_ggplot(plot_mvgam_trend(mvgam:::mvgam_example4, derivatives = TRUE))\n  expect_ggplot(plot_mvgam_trend(\n    mvgam:::mvgam_example1,\n    realisations = TRUE,\n    n_realisations = 2\n  ))\n  expect_ggplot(plot_mvgam_trend(mvgam:::mvgam_example3, derivatives = TRUE))\n  expect_ggplot(plot_mvgam_trend(\n    mvgam:::mvgam_example2,\n    realisations = TRUE,\n    n_realisations = 2\n  ))\n  expect_ggplot(plot_mvgam_series(object = mvgam:::mvgam_example4))\n  expect_ggplot(\n    SW(pp_check(\n      object = mvgam:::mvgam_example1,\n      x = \"season\",\n      type = \"resid_ribbon\",\n      ndraws = 3\n    ))\n  )\n  expect_ggplot(\n    SW(pp_check(\n      object = mvgam:::mvgam_example2,\n      x = \"season\",\n      type = \"resid_ribbon\",\n      ndraws = 3\n    ))\n  )\n  expect_ggplot(\n    SW(pp_check(\n      object = mvgam:::mvgam_example2,\n      x = \"season\",\n      group = \"series\",\n      type = \"resid_ribbon_grouped\",\n      ndraws = 3\n    ))\n  )\n})\n\ntest_that(\"dynamic factor investigations work\", {\n  lvcors <- lv_correlations(mvgam:::mvgam_example4)\n  expect_true(inherits(lvcors, 'list'))\n  expect_true(all.equal(\n    dim(lvcors$mean_correlations),\n    c(\n      nlevels(mvgam:::mvgam_example4$obs_data$series),\n      nlevels(mvgam:::mvgam_example4$obs_data$series)\n    )\n  ))\n  expect_true(mvgam:::mvgam_example4$use_lv)\n  expect_no_error(plot_mvgam_factors(mvgam:::mvgam_example4))\n  facconts <- plot_mvgam_factors(mvgam:::mvgam_example4, plot = FALSE)\n  expect_true(inherits(facconts, 'data.frame'))\n  expect_true(inherits(facconts, 'tbl_df'))\n\n  lvcors <- residual_cor(mvgam:::mvgam_example4)\n  expect_true(inherits(lvcors, \"mvgam_residcor\"))\n  expect_no_error(plot(lvcors))\n\n  lvcors <- residual_cor(mvgam:::mvgam_example2)\n  expect_true(inherits(lvcors, \"mvgam_residcor\"))\n  expect_equal(rep(1, 4), as.vector(lvcors$cor))\n\n  expect_error(\n    residual_cor(mvgam:::mvgam_example1),\n    'Cannot compute residual correlations if no latent factors or correlated process errors were modelled'\n  )\n})\n\ntest_that(\"evaluate() functions working\", {\n  mod <- mvgam:::mvgam_example1\n  out <- eval_mvgam(mod, fc_horizon = 6, n_samples = 100, n_cores = 1)\n  expect_true(inherits(out, 'list'))\n  expect_true(all(names(out) == levels(mod$obs_data$series)))\n  expect_true(NROW(out[[1]]) == 6)\n\n  mod <- mvgam:::mvgam_example3\n  out <- eval_mvgam(mod, fc_horizon = 2, n_samples = 100, n_cores = 1)\n  expect_true(inherits(out, 'list'))\n  expect_true(all(names(out) == levels(mod$obs_data$series)))\n  expect_true(NROW(out[[1]]) == 2)\n\n  mod <- mvgam:::mvgam_example4\n  out <- eval_mvgam(mod, fc_horizon = 2, n_samples = 100, n_cores = 1)\n  expect_true(inherits(out, 'list'))\n  expect_true(all(names(out) == levels(mod$obs_data$series)))\n  expect_true(NROW(out[[1]]) == 2)\n\n  expect_no_error(compare_mvgams(\n    mvgam:::mvgam_example2,\n    mvgam:::mvgam_example4,\n    n_samples = 100,\n    n_evaluations = 2,\n    n_cores = 1\n  ))\n})\n\ntest_that(\"lfo_cv() working\", {\n  lfs <- SW(lfo_cv(\n    mvgam:::mvgam_example1,\n    min_t = 8,\n    fc_horizon = 1,\n    silent = 2\n  ))\n  expect_true(inherits(lfs, 'mvgam_lfo'))\n  expect_ggplot(SW(plot(lfs)))\n\n  lfs <- SW(lfo_cv(\n    mvgam:::mvgam_example4,\n    min_t = 8,\n    fc_horizon = 1,\n    silent = 2\n  ))\n  expect_true(inherits(lfs, 'mvgam_lfo'))\n  expect_ggplot(SW(plot(lfs)))\n})\n\ntest_that(\"forecast() works correctly\", {\n  fc <- forecast(\n    mvgam:::mvgam_example1,\n    newdata = mvgam:::mvgam_examp_dat$data_test\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  fc_summary <- summary(fc)\n  expect_true(inherits(fc_summary, 'data.frame'))\n  expect_equal(\n    NROW(fc_summary),\n    NROW(rbind(\n      mvgam:::mvgam_examp_dat$data_train,\n      mvgam:::mvgam_examp_dat$data_test\n    ))\n  )\n\n  expect_equal(\n    c(\n      mvgam:::mvgam_examp_dat$data_train$y[\n        which(mvgam:::mvgam_examp_dat$data_train$series == 'series_2')\n      ],\n      mvgam:::mvgam_examp_dat$data_test$y[\n        which(mvgam:::mvgam_examp_dat$data_test$series == 'series_2')\n      ]\n    ),\n    fc_summary$truth[\n      which(fc_summary$series == 'series_2')\n    ]\n  )\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example1$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n\n  sc <- score(fc)\n  expect_true(inherits(sc, 'list'))\n  expect_true(all.equal(\n    names(sc),\n    c(levels(mvgam:::mvgam_examp_dat$data_test$series), 'all_series')\n  ))\n  expect_error(score(fc, score = 'elpd'))\n  expect_no_error(score(fc, score = 'energy'))\n  expect_no_error(score(fc, score = 'variogram'))\n  expect_no_error(score(fc, score = 'sis'))\n\n  fc <- forecast(\n    mvgam:::mvgam_example1,\n    newdata = mvgam:::mvgam_examp_dat$data_test,\n    type = 'expected'\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example1$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n\n  fc <- forecast(\n    mvgam:::mvgam_example2,\n    newdata = mvgam:::mvgam_examp_dat$data_test,\n    type = 'link'\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example2$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n  sc <- score(fc, score = 'elpd')\n  expect_true(inherits(sc, 'list'))\n  expect_true(all.equal(\n    names(sc),\n    c(levels(mvgam:::mvgam_examp_dat$data_test$series), 'all_series')\n  ))\n\n  fc <- forecast(\n    mvgam:::mvgam_example2,\n    newdata = mvgam:::mvgam_examp_dat$data_test,\n    type = 'expected'\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example2$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n\n  fc <- forecast(\n    mvgam:::mvgam_example3,\n    newdata = mvgam:::mvgam_examp_dat$data_test\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example3$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n\n  fc <- forecast(\n    mvgam:::mvgam_example3,\n    newdata = mvgam:::mvgam_examp_dat$data_test,\n    type = 'expected'\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example3$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n\n  fc <- forecast(\n    mvgam:::mvgam_example4,\n    newdata = mvgam:::mvgam_examp_dat$data_test\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  expect_no_error(plot(fc))\n  expect_no_error(plot(fc, hide_xlabels = TRUE))\n  expect_no_error(plot(fc, ylab = 'banana'))\n  expect_no_error(plot(fc, realisations = TRUE, n_realisations = 3))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example4$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n\n  fc <- forecast(\n    mvgam:::mvgam_example4,\n    newdata = mvgam:::mvgam_examp_dat$data_test,\n    type = 'expected'\n  )\n  expect_true(inherits(fc$hindcasts, 'list'))\n  expect_true(inherits(fc$forecasts, 'list'))\n  expect_no_error(plot(fc, hide_xlabels = TRUE))\n  expect_no_error(plot(fc, ylab = 'banana'))\n  expect_no_error(plot(fc, realisations = TRUE, n_realisations = 2))\n  expect_equal(\n    NROW(mvgam:::mvgam_examp_dat$data_test) /\n      NCOL(mvgam:::mvgam_example4$ytimes),\n    NCOL(fc$forecasts$series_1),\n    length(fc$test_observations$series_1)\n  )\n})\n\ntest_that(\"loo() works correctly\", {\n  options(mc.cores = 1)\n  expect_loo(SW(loo(mvgam:::mvgam_example1)))\n  expect_loo(SW(loo(mvgam:::mvgam_example2)))\n  expect_loo(SW(loo(mvgam:::mvgam_example3)))\n  expect_loo(SW(loo(mvgam:::mvgam_example4)))\n\n  p <- SW(loo_compare(\n    mvgam:::mvgam_example1,\n    mvgam:::mvgam_example2,\n    model_names = c('banana')\n  ))\n  expect_true(inherits(p, 'compare.loo'))\n\n  p <- SW(loo_compare(\n    mvgam:::mvgam_example1,\n    mvgam:::mvgam_example2,\n    mvgam:::mvgam_example3,\n    mvgam:::mvgam_example4\n  ))\n  expect_true(inherits(p, 'compare.loo'))\n})\n\ntest_that(\"how_to_cite() works correctly\", {\n  description <- how_to_cite(mvgam:::mvgam_example3)\n  expect_true(\n    grepl('To encourage stability', description$methods_text)\n  )\n\n  description <- how_to_cite(mvgam:::mvgam_example4)\n  expect_true(\n    grepl('Gaussian Process functional', description$methods_text)\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-families.R",
    "content": "context(\"Tests for family functions\")\n\ntest_that(\"distributions work correctly\", {\n  fam <- tweedie()\n  expect_true(inherits(fam, 'family'))\n  expect_true(inherits(fam, 'extended.family'))\n  expect_true(fam$link == 'log')\n\n  fam <- student_t()\n  expect_true(inherits(fam, 'family'))\n  expect_true(inherits(fam, 'extended.family'))\n  expect_true(fam$link == 'identity')\n\n  fam <- nmix()\n  expect_true(inherits(fam, 'family'))\n  expect_true(inherits(fam, 'extended.family'))\n  expect_true(fam$link == 'log')\n})\n\ntest_that(\"nmix predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'nmix'\n  betas <- rnorm(10)\n  latent_lambdas <- runif(10, 2, 5)\n  cap <- rep(12, 10)\n  family_pars <- list()\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = latent_lambdas,\n      cap = cap,\n      type = 'link',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = latent_lambdas,\n      cap = cap,\n      type = 'expected',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  detects <- mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = latent_lambdas,\n    cap = cap,\n    type = 'detection',\n    family_pars = family_pars\n  )\n  expect_true(all(detects > 0) & all(detects < 1))\n\n  truth <- rpois(10, 6)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = latent_lambdas,\n    cap = cap,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  # Test that the residual calculation is working\n  preds <- runif(10, 0.1, 10)\n  N <- rpois(10, 20)\n  p <- runif(10, 0.3, 0.6)\n  resids <- mvgam:::ds_resids_nmix(\n    truth = truth,\n    fitted = 1,\n    draw = 1,\n    N = as.vector(N),\n    p = as.vector(p)\n  )\n  expect_true(all(!is.na(resids)))\n})\n\ntest_that(\"beta predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'beta'\n  betas <- rnorm(10)\n  family_pars <- list(phi = rep(1, 10))\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'variance',\n    family_pars = family_pars\n  ))\n  expecteds <- mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'expected',\n    family_pars = family_pars\n  )\n\n  expect_true(all(expecteds >= 0) & all(expecteds <= 1))\n\n  preds <- mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'response',\n    family_pars = family_pars\n  )\n  expect_true(all(preds >= 0) & all(preds <= 1))\n\n  truth <- runif(10, 0.01, 0.99)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  preds <- runif(10, 0.01, 0.99)\n  resids <- mvgam:::ds_resids_beta(\n    truth = truth,\n    fitted = as.vector(preds),\n    draw = 1,\n    precision = rep(1, 10)\n  )\n  expect_true(all(!is.na(resids)))\n})\n\ntest_that(\"beta-binomial predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'beta_binomial'\n  betas <- rnorm(10)\n  family_pars <- list(phi = rep(1, 10), trials = rep(20, 10))\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'variance',\n    family_pars = family_pars\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'expected',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'response',\n      family_pars = family_pars\n    ) >=\n      0\n  ))\n\n  truth <- rpois(10, 8)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  p <- runif(10, 0.3, 0.6)\n  resids <- mvgam:::ds_resids_beta_binomial(\n    truth = truth,\n    fitted = p,\n    draw = 1,\n    N = rep(20, 10),\n    phi = rep(1, 10)\n  )\n  expect_true(all(!is.na(resids)))\n})\n\ntest_that(\"negative binomial predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'negative binomial'\n  betas <- rnorm(10)\n  family_pars <- list(phi = rep(1, 10))\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'variance',\n    family_pars = family_pars\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'expected',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'response',\n      family_pars = family_pars\n    ) >=\n      0\n  ))\n\n  truth <- rpois(10, 8)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  preds <- rpois(10, 8)\n  resids <- mvgam:::ds_resids_nb(\n    truth = truth,\n    fitted = preds,\n    draw = 1,\n    size = rep(1, 10)\n  )\n  expect_true(all(!is.na(resids)))\n})\n\ntest_that(\"lognormal predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'lognormal'\n  betas <- rnorm(10)\n  family_pars <- list(sigma_obs = 1)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'variance',\n    family_pars = family_pars\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'expected',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'response',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  truth <- runif(10, 0.1, 20)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  preds <- runif(10, 0.1, 20)\n  resids <- mvgam:::ds_resids_lnorm(\n    truth = truth,\n    fitted = preds,\n    draw = 1,\n    sigma = rep(1, 10)\n  )\n  expect_true(all(!is.na(resids)))\n})\n\ntest_that(\"gamma predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'Gamma'\n  betas <- rnorm(10)\n  family_pars <- list(shape = 1)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'variance',\n    family_pars = family_pars\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'expected',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  expect_true(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'response',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  truth <- runif(10, 0.1, 20)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  preds <- runif(10, 0.1, 20)\n  resids <- mvgam:::ds_resids_gamma(\n    truth = truth,\n    fitted = preds,\n    draw = 1,\n    shape = rep(1, 10)\n  )\n  expect_true(all(!is.na(resids)))\n})\n\ntest_that(\"student-t predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'student'\n  betas <- rnorm(10)\n  family_pars <- list(sigma_obs = 1, nu = 3)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'variance',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'expected',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'response',\n    family_pars = family_pars\n  ))\n\n  truth <- rnorm(10)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  preds <- rnorm(10)\n  resids <- mvgam:::ds_resids_student(\n    truth = truth,\n    fitted = preds,\n    draw = 1,\n    sigma = rep(1, 10),\n    nu = rep(5, 10)\n  )\n  expect_true(all(!is.na(resids)))\n})\n\ntest_that(\"tweedie predictions work correctly\", {\n  set.seed(1)\n  Xp <- matrix(rnorm(100), ncol = 10, nrow = 10)\n  attr(Xp, 'model.offset') <- 0\n  family <- 'tweedie'\n  betas <- rnorm(10)\n  family_pars <- list(phi = 1)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'variance',\n    family_pars = family_pars\n  ))\n\n  expect_no_error(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'expected',\n      family_pars = family_pars\n    ) >\n      0\n  ))\n\n  expect_no_error(all(\n    mvgam:::mvgam_predict(\n      Xp = Xp,\n      family = family,\n      betas = betas,\n      latent_lambdas = NULL,\n      cap = NULL,\n      type = 'response',\n      family_pars = family_pars\n    ) >=\n      0\n  ))\n\n  truth <- rpois(10, 5)\n  expect_no_error(mvgam:::mvgam_predict(\n    Xp = Xp,\n    family = family,\n    betas = betas,\n    latent_lambdas = NULL,\n    cap = NULL,\n    type = 'link',\n    density = TRUE,\n    truth = truth,\n    family_pars = family_pars\n  ))\n\n  preds <- rpois(10, 5)\n  resids <- mvgam:::ds_resids_tw(truth = truth, fitted = preds, draw = 1)\n  expect_true(all(!is.na(resids)))\n})\n\n# Skip actual model setups on CRAN as they take some time\ntest_that(\"family setups work correctly\", {\n  skip_on_cran()\n  simdat <- sim_mvgam(family = poisson())\n  mod <- mvgam(\n    y ~ -1,\n    trend_model = PW(),\n    data = simdat$data_train,\n    family = poisson(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(capture_output(print(mod)))\n\n  simdat <- sim_mvgam(family = nb(), n_lv = 2)\n  mod <- mvgam(\n    y ~ -1,\n    trend_model = PW(),\n    data = simdat$data_train,\n    family = nb(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(capture_output(print(mod)))\n\n  simdat <- sim_mvgam(family = lognormal(), trend_model = VAR())\n  mod <- mvgam(\n    y ~ -1,\n    trend_model = PW(),\n    data = simdat$data_train,\n    family = lognormal(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(capture_output(print(mod)))\n\n  simdat <- sim_mvgam(family = bernoulli(), trend_model = VAR(cor = TRUE))\n  mod <- mvgam(\n    y ~ -1,\n    trend_model = PW(),\n    data = simdat$data_train,\n    family = bernoulli(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(capture_output(print(mod)))\n\n  simdat <- sim_mvgam(family = student_t(), trend_model = GP())\n  mod <- mvgam(\n    y ~ -1,\n    trend_model = PW(),\n    data = simdat$data_train,\n    family = student_t(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(capture_output(print(mod)))\n\n  simdat <- sim_mvgam(\n    family = Gamma(),\n    seasonality = 'shared',\n    trend_model = AR(p = 3)\n  )\n  mod <- mvgam(\n    y ~ -1,\n    trend_model = PW(),\n    data = simdat$data_train,\n    family = Gamma(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(capture_output(print(mod)))\n\n  simdat <- sim_mvgam(\n    family = betar(),\n    seasonality = 'hierarchical',\n    trend_model = AR(p = 2)\n  )\n  mod <- mvgam(\n    y ~ -1,\n    trend_model = PW(),\n    data = simdat$data_train,\n    family = betar(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_no_error(capture_output(print(mod)))\n})\n"
  },
  {
    "path": "tests/testthat/test-gp.R",
    "content": "context(\"gp\")\n\nskip_on_cran()\n\ntest_that(\"gp_to_s is working properly for unidimensional gps\", {\n  # All true gp() terms should be changed to s() with k = k+1\n  formula <- y ~\n    s(series) +\n    gp(banana, k = 3, scale = FALSE) +\n    infect:you +\n    gp(hardcourt, k = 3)\n  dat <- data.frame(\n    y = rnorm(10),\n    series = rnorm(10),\n    banana = rnorm(10),\n    infect = rnorm(10),\n    you = rnorm(10),\n    hardcourt = rnorm(10),\n    gp = rnorm(10)\n  )\n\n  # Check that the brms_mock formula is correctly remade\n  gp_atts <- mvgam:::get_gp_attributes(formula, data = dat, family = gaussian())\n\n  # scale should be passed; gr is always false and cmc is always true\n  expect_true(identical(\n    attr(terms(attr(gp_atts, 'gp_formula')), 'term.labels')[1],\n    \"gp(banana, k = 3, cov = \\\"exp_quad\\\", iso = TRUE, scale = FALSE, c = 1.25, gr = FALSE, cmc = TRUE)\"\n  ))\n\n  expect_true(identical(\n    attr(terms(attr(gp_atts, 'gp_formula')), 'term.labels')[2],\n    \"gp(hardcourt, k = 3, cov = \\\"exp_quad\\\", iso = TRUE, scale = TRUE, c = 1.25, gr = FALSE, cmc = TRUE)\"\n  ))\n\n  expect_equal(\n    attr(\n      terms(\n        mvgam:::gp_to_s(formula, data = dat, family = gaussian()),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    ),\n    attr(\n      terms(\n        formula(\n          y ~\n            s(series) +\n            s(banana, k = 4) +\n            infect:you +\n            s(hardcourt, k = 4)\n        ),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    )\n  )\n\n  # Characters that match to 'gp' should not be changed\n  formula <- y ~ gp(hardcourt, k = 3) + s(gp, k = 3)\n  expect_equal(\n    attr(\n      terms(\n        mvgam:::gp_to_s(formula, data = dat, family = gaussian()),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    ),\n    attr(\n      terms(formula(y ~ s(hardcourt, k = 4) + s(gp, k = 3)), keep.order = TRUE),\n      'term.labels'\n    )\n  )\n})\n\ntest_that(\"gp_to_s is working properly for multidimensional gps\", {\n  # All true gp() terms should be changed to s() with k = k+1\n  formula <- y ~\n    s(series) +\n    gp(banana, hardcourt, k = 3, iso = FALSE, c = 1.33, cov = 'matern52') +\n    infect:you\n  dat <- data.frame(\n    y = rnorm(10),\n    series = rnorm(10),\n    banana = rnorm(10),\n    infect = rnorm(10),\n    you = rnorm(10),\n    hardcourt = rnorm(10),\n    gp = rnorm(10)\n  )\n  gp_atts <- mvgam:::get_gp_attributes(formula, data = dat, family = gaussian())\n\n  expect_true(identical(\n    attr(terms(attr(gp_atts, 'gp_formula')), 'term.labels')[1],\n    \"gp(banana, hardcourt, k = 3, cov = \\\"matern52\\\", iso = FALSE, scale = TRUE, c = 1.33, gr = FALSE, cmc = TRUE)\"\n  ))\n\n  expect_equal(\n    attr(\n      terms(\n        mvgam:::gp_to_s(formula, data = dat, family = gaussian()),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    ),\n    attr(\n      terms(\n        formula(\n          y ~\n            s(series) +\n            ti(banana, hardcourt, k = 3, mc = c(0, 0)) +\n            infect:you\n        ),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    )\n  )\n})\n\ntest_that(\"unidimensional gp for observation models working properly\", {\n  gaus_data$data_train$y[is.na(gaus_data$data_train$y)] <- 0\n  mod <- mvgam(\n    formula = y ~\n      s(series, bs = 're') +\n      gp(time, by = series, k = 10, c = 5 / 4) +\n      year:season,\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n\n  expect_true(\n    any(grepl(\n      'b[b_idx_gp_time_byseriesseries_3] = sqrt(spd_gp_exp_quad(l_gp_time_byseriesseries_3',\n      mod$model_file,\n      fixed = TRUE\n    ))\n  )\n\n  # Gp data structures should be in the model_data\n  expect_true(\"l_gp_time_byseriesseries_1\" %in% names(mod$model_data))\n  expect_true(\"b_idx_gp_time_byseriesseries_1\" %in% names(mod$model_data))\n  expect_true(\"k_gp_time_byseriesseries_1\" %in% names(mod$model_data))\n\n  # These should match to the eigenvalues and eigenfunctions created by\n  # a similar brms call\n  brms_dat <- suppressWarnings(brms::make_standata(\n    y ~\n      s(series, bs = 're') +\n      gp(time, by = series, k = 10, c = 5 / 4) +\n      year:season,\n    data = gaus_data$data_train,\n    family = gaussian()\n  ))\n  # Eigenvalues should be identical\n  expect_true(all.equal(\n    as.vector(brms_dat$slambda_1_1),\n    as.vector(mod$model_data$l_gp_time_byseriesseries_1)\n  ))\n\n  # Eigenfunctions will be nearly identical\n  row_s1 <- which(\n    gaus_data$data_train$series == 'series_1' &\n      !is.na(gaus_data$data_train$y)\n  )\n  col_s1 <- grep(\n    'gp(time):seriesseries_1',\n    names(coef(mod$mgcv_model)),\n    fixed = TRUE\n  )\n\n  expect_true(identical(\n    dim(brms_dat$Xgp_1_1),\n    dim(mod$model_data$X[row_s1, col_s1])\n  ))\n\n  expect_true(all(\n    unlist(\n      lapply(seq_len(NCOL(brms_dat$Xgp_1_1)), function(x) {\n        cor(brms_dat$Xgp_1_1[, x], mod$model_data$X[row_s1, col_s1][, x])\n      }),\n      use.names = FALSE\n    ) >\n      0.99\n  ))\n\n  # The mgcv model formula should contain s() in place of gp()\n  expect_equal(\n    attr(terms(mod$mgcv_model$formula, keep.order = TRUE), 'term.labels'),\n    attr(\n      terms(\n        formula(\n          y ~\n            s(time, by = series, k = 11) +\n            year:season +\n            s(series, bs = \"re\")\n        ),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    )\n  )\n})\n\ntest_that(\"multidimensional gp for observation models working properly\", {\n  gaus_data$data_train$y[is.na(gaus_data$data_train$y)] <- 0\n  mod <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      gp(time, year, k = 4, cov = 'matern32'),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n\n  expect_true(\n    any(grepl(\n      'b[b_idx_gp_timeby_year_] = sqrt(spd_gp_matern32(l_gp_timeby_year_',\n      mod$model_file,\n      fixed = TRUE\n    ))\n  )\n\n  # Gp data structures should be in the model_data\n  expect_true(\"l_gp_timeby_year_\" %in% names(mod$model_data))\n  expect_true(\"b_idx_gp_timeby_year_\" %in% names(mod$model_data))\n  expect_true(\"k_gp_timeby_year_\" %in% names(mod$model_data))\n\n  # These should match to the eigenvalues and eigenfunctions created by\n  # a similar brms call\n  brms_dat <- suppressWarnings(brms::make_standata(\n    y ~\n      s(series, bs = 're') +\n      gp(time, year, k = 4, gr = FALSE),\n    data = gaus_data$data_train,\n    family = gaussian()\n  ))\n\n  # Eigenvalues should be identical\n  expect_true(all.equal(brms_dat$slambda_1, mod$model_data$l_gp_timeby_year_))\n\n  # Eigenfunctions will be nearly identical\n  col_s1 <- grep('gp(time,year)', names(coef(mod$mgcv_model)), fixed = TRUE)\n\n  expect_true(identical(dim(brms_dat$Xgp_1), dim(mod$model_data$X[, col_s1])))\n\n  expect_true(all(\n    unlist(\n      lapply(seq_len(NCOL(brms_dat$Xgp_1)), function(x) {\n        cor(brms_dat$Xgp_1[, x], mod$model_data$X[, col_s1][, x])\n      }),\n      use.names = FALSE\n    ) >\n      0.99\n  ))\n\n  # The mgcv model formula should contain s() in place of gp()\n  expect_equal(\n    attr(terms(mod$mgcv_model$formula, keep.order = TRUE), 'term.labels'),\n    attr(\n      terms(\n        formula(\n          y ~\n            ti(time, year, k = 4, mc = c(0, 0)) +\n            s(series, bs = \"re\")\n        ),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    )\n  )\n})\n\ntest_that(\"noncentring with gp terms working properly\", {\n  mod <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc', k = 8) +\n      gp(time, by = series, k = 10),\n    trend_model = RW(),\n    data = gaus_data$data_train,\n    newdata = gaus_data$data_test,\n    family = gaussian(),\n    noncentred = TRUE,\n    run_model = FALSE\n  )\n\n  # Model file should have the non-centred trend parameterisation now\n  expect_true(\n    any(grepl(\n      trimws(\"trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"trend[2 : n, s] += trend[1 : (n - 1), s];\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  # Gp data structures should be in the model_data\n  expect_true(\"l_gp_time_byseriesseries_1\" %in% names(mod$model_data))\n  expect_true(\"b_idx_gp_time_byseriesseries_1\" %in% names(mod$model_data))\n  expect_true(\"k_gp_time_byseriesseries_1\" %in% names(mod$model_data))\n})\n\ntest_that(\"unidimensional gp for process models working properly\", {\n  mod <- mvgam(\n    y ~ s(series, bs = 're'),\n    trend_formula = ~ gp(time, by = trend, k = 10) +\n      year:season,\n    data = beta_data$data_train,\n    family = betar(),\n    trend_model = AR(),\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n\n  # Model file should have prior lines for gp terms\n  expect_true(any(grepl(\n    '// prior for gp(time):trendtrend1_trend...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  expect_true(any(grepl(\n    \"b_trend[b_trend_idx_gp_time_bytrendtrend1] = sqrt(spd_gp_exp_quad(\",\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Gp data structures should be in the model_data\n  expect_true(\"l_gp_trend_time_bytrendtrend1\" %in% names(mod$model_data))\n  expect_true(\"b_trend_idx_gp_time_bytrendtrend1\" %in% names(mod$model_data))\n  expect_true(\"k_gp_trend_time_bytrendtrend1\" %in% names(mod$model_data))\n\n  # These should match to the eigenvalues and eigenfunctions created by\n  # a similar brms call\n  brms_dat <- suppressWarnings(brms::make_standata(\n    y ~ gp(time, by = series, k = 10, c = 5 / 4),\n    data = beta_data$data_train,\n    family = gaussian()\n  ))\n  # Eigenvalues should be identical\n  expect_true(all.equal(\n    as.vector(brms_dat$slambda_1_1),\n    as.vector(mod$model_data$l_gp_trend_time_bytrendtrend1)\n  ))\n\n  # Eigenfunctions will be nearly identical\n  row_s1 <- mod$model_data$ytimes_trend[, 1]\n  col_s1 <- grep(\n    'gp(time):trendtrend1',\n    names(coef(mod$trend_mgcv_model)),\n    fixed = TRUE\n  )\n\n  expect_true(identical(\n    dim(brms_dat$Xgp_1_1),\n    dim(mod$model_data$X_trend[row_s1, col_s1])\n  ))\n\n  expect_true(\n    max(abs(\n      brms_dat$Xgp_1_1 -\n        mod$model_data$X_trend[row_s1, col_s1]\n    )) <\n      0.01\n  )\n\n  # The mgcv model formula should contain s() in place of gp()\n  expect_equal(\n    attr(terms(mod$trend_mgcv_model$formula, keep.order = TRUE), 'term.labels'),\n    attr(\n      terms(\n        formula(\n          y ~\n            s(time, by = series, k = 11) +\n            year:season\n        ),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    )\n  )\n})\n\ntest_that(\"multidimensional gp for process models working properly\", {\n  mod <- mvgam(\n    y ~ s(series, bs = 're'),\n    trend_formula = ~ gp(time, season, k = 10, iso = FALSE),\n    data = beta_data$data_train,\n    family = betar(),\n    trend_model = AR(),\n    run_model = FALSE,\n    autoformat = FALSE\n  )\n\n  # Model file should have prior lines for gp terms\n  expect_true(any(grepl(\n    '// prior for gp(time,season)_trend...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  expect_true(any(grepl(\n    \"b_trend[b_trend_idx_gp_timeby_season_] = sqrt(spd_gp_exp_quad(\",\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  expect_true(any(grepl(\n    \"array[1] vector<lower=0>[2] rho_gp_trend_timeby_season_;\",\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  expect_true(any(grepl(\n    \"rho_gp_trend_timeby_season_[1][1] ~ inv_gamma\",\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  expect_true(any(grepl(\n    \"rho_gp_trend_timeby_season_[1][2] ~ inv_gamma\",\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Gp data structures should be in the model_data\n  expect_true(\"l_gp_trend_timeby_season_\" %in% names(mod$model_data))\n  expect_true(\"b_trend_idx_gp_timeby_season_\" %in% names(mod$model_data))\n  expect_true(\"k_gp_trend_timeby_season_\" %in% names(mod$model_data))\n\n  # These should match to the eigenvalues and eigenfunctions created by\n  # a similar brms call\n  brms_dat <- suppressWarnings(brms::make_standata(\n    y ~ gp(time, season, k = 10, c = 5 / 4, cmc = TRUE, gr = FALSE),\n    data = beta_data$data_train,\n    family = gaussian()\n  ))\n  # Eigenvalues should be identical\n  expect_true(all.equal(\n    brms_dat$slambda_1,\n    mod$model_data$l_gp_trend_timeby_season_\n  ))\n\n  # Eigenfunctions will be nearly identical\n  col_s1 <- grep(\n    'gp(time,season)',\n    names(coef(mod$trend_mgcv_model)),\n    fixed = TRUE\n  )\n\n  expect_true(identical(\n    dim(brms_dat$Xgp_1),\n    dim(mod$model_data$X_trend[, col_s1])\n  ))\n\n  expect_true(all(\n    unlist(\n      lapply(seq_len(NCOL(brms_dat$Xgp_1)), function(x) {\n        cor(brms_dat$Xgp_1[, x], mod$model_data$X_trend[, col_s1][, x])\n      }),\n      use.names = FALSE\n    ) >\n      0.99\n  ))\n\n  # The mgcv model formula should contain s() in place of gp()\n  expect_equal(\n    attr(terms(mod$trend_mgcv_model$formula, keep.order = TRUE), 'term.labels'),\n    attr(\n      terms(\n        formula(y ~ ti(time, season, k = 10, mc = c(0, 0))),\n        keep.order = TRUE\n      ),\n      'term.labels'\n    )\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-jsdgam.R",
    "content": "context(\"jsdgam\")\n\n# Reconstruct the spider data from mvabund\nspiderdat <- structure(\n  list(\n    abundance = c(\n      25L,\n      0L,\n      15L,\n      2L,\n      1L,\n      0L,\n      2L,\n      0L,\n      1L,\n      3L,\n      15L,\n      16L,\n      3L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      7L,\n      17L,\n      11L,\n      9L,\n      3L,\n      29L,\n      15L,\n      10L,\n      2L,\n      20L,\n      6L,\n      20L,\n      6L,\n      7L,\n      11L,\n      1L,\n      0L,\n      1L,\n      13L,\n      43L,\n      2L,\n      0L,\n      3L,\n      0L,\n      1L,\n      1L,\n      2L,\n      1L,\n      0L,\n      0L,\n      0L,\n      1L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      2L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      1L,\n      2L,\n      0L,\n      1L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      16L,\n      15L,\n      20L,\n      9L,\n      6L,\n      11L,\n      14L,\n      0L,\n      0L,\n      2L,\n      1L,\n      2L,\n      6L,\n      12L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      2L,\n      1L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      4L,\n      7L,\n      5L,\n      0L,\n      18L,\n      4L,\n      1L,\n      4L,\n      30L,\n      9L,\n      24L,\n      9L,\n      6L,\n      16L,\n      7L,\n      0L,\n      0L,\n      1L,\n      0L,\n      18L,\n      4L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      2L,\n      0L,\n      0L,\n      0L,\n      0L,\n      1L,\n      1L,\n      1L,\n      1L,\n      0L,\n      1L,\n      55L,\n      0L,\n      0L,\n      0L,\n      0L,\n      1L,\n      3L,\n      6L,\n      6L,\n      2L,\n      5L,\n      12L,\n      13L,\n      16L,\n      0L,\n      2L,\n      0L,\n      1L,\n      0L,\n      0L,\n      0L,\n      60L,\n      1L,\n      29L,\n      7L,\n      2L,\n      11L,\n      30L,\n      2L,\n      26L,\n      22L,\n      95L,\n      96L,\n      24L,\n      14L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      1L,\n      2L,\n      6L,\n      3L,\n      11L,\n      0L,\n      1L,\n      6L,\n      12L,\n      15L,\n      18L,\n      29L,\n      135L,\n      27L,\n      89L,\n      2L,\n      1L,\n      0L,\n      0L,\n      1L,\n      53L,\n      15L,\n      0L,\n      2L,\n      0L,\n      0L,\n      1L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      6L,\n      0L,\n      0L,\n      0L,\n      45L,\n      37L,\n      45L,\n      94L,\n      76L,\n      24L,\n      105L,\n      1L,\n      1L,\n      0L,\n      1L,\n      8L,\n      72L,\n      72L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      1L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      0L,\n      57L,\n      65L,\n      66L,\n      86L,\n      91L,\n      63L,\n      118L,\n      30L,\n      2L,\n      1L,\n      4L,\n      13L,\n      97L,\n      94L,\n      25L,\n      28L,\n      23L,\n      25L,\n      22L,\n      22L,\n      18L,\n      1L,\n      1L,\n      0L,\n      16L,\n      1L,\n      0L,\n      2L,\n      4L,\n      9L,\n      1L,\n      25L,\n      17L,\n      34L,\n      16L,\n      3L,\n      0L,\n      0L,\n      0L,\n      0L,\n      22L,\n      32L,\n      3L,\n      4L,\n      2L,\n      0L,\n      3L,\n      2L,\n      2L,\n      0L,\n      0L,\n      0L,\n      6L,\n      0L,\n      0L,\n      0L\n    ),\n    taxon = structure(\n      c(\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        1L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        2L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        3L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        4L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        5L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        6L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        7L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        8L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        9L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        10L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        11L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L,\n        12L\n      ),\n      levels = c(\n        \"Alopacce\",\n        \"Alopcune\",\n        \"Alopfabr\",\n        \"Arctlute\",\n        \"Arctperi\",\n        \"Auloalbi\",\n        \"Pardlugu\",\n        \"Pardmont\",\n        \"Pardnigr\",\n        \"Pardpull\",\n        \"Trocterr\",\n        \"Zoraspin\"\n      ),\n      class = \"factor\"\n    ),\n    site = c(\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L,\n      1L,\n      2L,\n      3L,\n      4L,\n      5L,\n      6L,\n      7L,\n      8L,\n      9L,\n      10L,\n      11L,\n      12L,\n      13L,\n      14L,\n      15L,\n      16L,\n      17L,\n      18L,\n      19L,\n      20L,\n      21L,\n      22L,\n      23L,\n      24L,\n      25L,\n      26L,\n      27L,\n      28L\n    ),\n    soil.dry = c(\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555,\n      2.3321,\n      3.0493,\n      2.5572,\n      2.6741,\n      3.0155,\n      3.381,\n      3.1781,\n      2.6247,\n      2.4849,\n      2.1972,\n      2.2192,\n      2.2925,\n      3.5175,\n      3.0865,\n      3.2696,\n      3.0301,\n      3.3322,\n      3.1224,\n      2.9232,\n      3.1091,\n      2.9755,\n      1.2528,\n      1.1939,\n      1.6487,\n      1.8245,\n      0.9933,\n      0.9555,\n      0.9555\n    ),\n    bare.sand = c(\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2.3979,\n      0,\n      0,\n      0,\n      3.9318,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3.2581,\n      3.0445,\n      3.2581,\n      3.5835,\n      4.5109,\n      2.3979,\n      3.434\n    ),\n    fallen.leaves = c(\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      0,\n      0,\n      3.434,\n      0,\n      4.2627,\n      0,\n      0,\n      0,\n      0,\n      1.7918,\n      0,\n      4.3944,\n      4.6052,\n      4.4543,\n      4.3944,\n      4.5109,\n      4.5951,\n      4.5643,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0\n    ),\n    moss = c(\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136,\n      3.0445,\n      1.0986,\n      2.3979,\n      2.3979,\n      0,\n      2.3979,\n      0.6931,\n      1.0986,\n      4.3307,\n      3.434,\n      4.1109,\n      3.8286,\n      0.6931,\n      1.7918,\n      0.6931,\n      0.6931,\n      0.6931,\n      0,\n      1.6094,\n      0.6931,\n      0.6931,\n      4.3307,\n      4.0254,\n      4.0254,\n      1.0986,\n      1.7918,\n      3.8286,\n      3.7136\n    ),\n    herb.layer = c(\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434,\n      4.4543,\n      4.5643,\n      4.6052,\n      4.6151,\n      4.6151,\n      3.434,\n      4.6151,\n      3.434,\n      3.2581,\n      3.0445,\n      3.7136,\n      4.0254,\n      4.5109,\n      4.5643,\n      3.0445,\n      0.6931,\n      3.0445,\n      3.0445,\n      1.6094,\n      0.6931,\n      1.7918,\n      0.6931,\n      3.2581,\n      3.0445,\n      4.1109,\n      1.7918,\n      3.434,\n      3.434\n    ),\n    reflection = c(\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889,\n      3.912,\n      1.6094,\n      3.6889,\n      2.9957,\n      2.3026,\n      0.6931,\n      2.3026,\n      0.6931,\n      3.4012,\n      3.6889,\n      3.6889,\n      3.6889,\n      3.4012,\n      1.0986,\n      0.6931,\n      0,\n      1.0986,\n      1.0986,\n      0,\n      0,\n      0,\n      3.912,\n      4.0943,\n      4.0073,\n      2.3026,\n      4.382,\n      3.6889,\n      3.6889\n    )\n  ),\n  row.names = c(NA, -336L),\n  class = \"data.frame\"\n)\n\ntest_that(\"family must be correctly specified\", {\n  expect_error(\n    mod <- jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      data = spiderdat,\n      unit = site,\n      species = taxon,\n      n_lv = 3,\n      family = 'banana'\n    ),\n    'family not recognized'\n  )\n})\n\ntest_that(\"response variable must be specified\", {\n  expect_error(\n    jsdgam(\n      formula = ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n          s(taxon, bs = 're', by = reflection)\n      ,\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      data = spiderdat,\n      unit = site,\n      species = taxon,\n      n_lv = 3,\n      family = nb()\n    ),\n    'Not sure how to deal with this response variable specification'\n  )\n})\n\ntest_that(\"unit must exist in data\", {\n  expect_error(\n    jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      data = spiderdat,\n      unit = banana,\n      species = taxon,\n      n_lv = 3,\n      family = nb()\n    ),\n    'Variable \"banana\" not found in data'\n  )\n})\n\n\ntest_that(\"species must exist in data\", {\n  expect_error(\n    jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      data = spiderdat,\n      unit = site,\n      species = banana,\n      n_lv = 3,\n      family = nb()\n    ),\n    'Variable \"banana\" not found in data'\n  )\n})\n\ntest_that(\"species must be a factor in data\", {\n  spiderdat$taxon <- as.numeric(spiderdat$taxon)\n  expect_error(\n    jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      data = spiderdat,\n      unit = site,\n      species = taxon,\n      n_lv = 3,\n      family = nb()\n    ),\n    'Variable \"taxon\" must be a factor type'\n  )\n})\n\ntest_that(\"unit must be a numeric / integer in data\", {\n  spiderdat$site <- as.factor(spiderdat$site)\n  expect_error(\n    jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      data = spiderdat,\n      unit = site,\n      species = taxon,\n      n_lv = 3,\n      family = nb()\n    ),\n    'Variable \"site\" must be either numeric or integer type'\n  )\n})\n\ntest_that(\"n_lv must be <= number of species\", {\n  expect_error(\n    jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      data = spiderdat,\n      unit = site,\n      species = taxon,\n      n_lv = 15,\n      family = nb()\n    ),\n    'Number of factors must be <= number of levels in species'\n  )\n})\n\ntest_that(\"knots must be a list\", {\n  expect_error(\n    jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1,\n      # supplying knots as a vector should fail\n      factor_knots = seq(\n        min(spiderdat$soil.dry),\n        max(spiderdat$soil.dry),\n        length.out = 4\n      ),\n      data = spiderdat,\n      unit = site,\n      species = taxon,\n      n_lv = 3,\n      family = nb(),\n      run_model = FALSE\n    ),\n    'all \"knot\" arguments must be supplied as lists'\n  )\n})\n\ntest_that(\"errors about knot lengths should be propagated from mgcv\", {\n  expect_error(\n    jsdgam(\n      formula = abundance ~\n        # Environmental model includes species-level intercepts\n        # and random slopes for a linear effect of reflection\n        s(taxon, bs = 're') +\n        s(taxon, bs = 're', by = reflection),\n      # Each factor estimates a different, possibly nonlinear effect of soil.dry\n      factor_formula = ~ s(soil.dry, k = 5, by = trend, bs = 'cr') - 1,\n      # knot length should be 5 for this CR basis\n      factor_knots = list(\n        soil.dry = seq(\n          min(spiderdat$soil.dry),\n          max(spiderdat$soil.dry),\n          length.out = 4\n        )\n      ),\n      data = spiderdat,\n      unit = site,\n      species = taxon,\n      n_lv = 3,\n      family = nb(),\n      run_model = FALSE\n    ),\n    'number of supplied knots != k for a cr smooth'\n  )\n})\n\ntest_that(\"get_mvgam_priors accepts factor_formula\", {\n  expect_no_error(get_mvgam_priors(\n    formula = abundance ~\n      # Environmental model includes species-level intercepts\n      # and random slopes for a linear effect of reflection\n      s(taxon, bs = 're') +\n      s(taxon, bs = 're', by = reflection),\n    # Each factor estimates a different, possibly nonlinear effect of soil.dry\n    factor_formula = ~ s(soil.dry, k = 5, by = trend, bs = 'cr') - 1,\n    data = spiderdat,\n    unit = site,\n    species = taxon,\n    n_lv = 3,\n    trend_model = 'None'\n  ))\n})\n\n# Skip the next test as it should actually initiate the model, and may take a few seconds\nskip_on_cran()\ntest_that(\"jsdgam should initiate correctly\", {\n  mod <- jsdgam(\n    formula = abundance ~\n      # Environmental model includes species-level intercepts\n      # and random slopes for a linear effect of reflection\n      s(taxon, bs = 're') +\n      s(taxon, bs = 're', by = reflection),\n    # Each factor estimates a different, possibly nonlinear effect of soil.dry\n    factor_formula = ~ s(soil.dry, k = 5, bs = 'cr', by = trend) - 1,\n    # supplying knots should also work if k matches length(knots)\n    factor_knots = list(\n      soil.dry = seq(\n        min(spiderdat$soil.dry),\n        max(spiderdat$soil.dry),\n        length.out = 5\n      )\n    ),\n    data = spiderdat,\n    unit = site,\n    species = taxon,\n    n_lv = 3,\n    family = nb(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(identical(\n    attr(mod$trend_mgcv_model, 'knots'),\n    list(\n      soil.dry = seq(\n        min(spiderdat$soil.dry),\n        max(spiderdat$soil.dry),\n        length.out = 5\n      )\n    )\n  ))\n  expect_true(is.null(attr(mod$mgcv_model, 'knots')))\n  expect_true(any(grepl(\n    '// raw latent factors (with linear predictors)',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'matrix[n_series, n_lv] lv_coefs = rep_matrix(0, n_series, n_lv);',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(attr(mod$model_data, 'trend_model') == 'None')\n  expect_true(inherits(\n    attr(mod$model_data, 'prepped_trend_model'),\n    'mvgam_trend'\n  ))\n  expect_true(attr(mod$model_data, 'prepped_trend_model')$subgr == 'taxon')\n  expect_true(attr(mod$model_data, 'prepped_trend_model')$trend_model == 'ZMVN')\n})\n\ntest_that(\"jsdgam post-processing works correctly\", {\n  # Run a short one to ensure post-processing and update work correctly\n  mod <- SM(jsdgam(\n    formula = abundance ~\n      # Environmental model includes species-level intercepts\n      # and random slopes for a linear effect of reflection\n      s(taxon, bs = 're') +\n      s(taxon, bs = 're', by = reflection),\n    # Each factor estimates a different, possibly nonlinear effect of soil.dry\n    factor_formula = ~ s(soil.dry, k = 5, bs = 'cr', by = trend) - 1,\n    # supplying knots should also work if k matches length(knots)\n    factor_knots = list(\n      soil.dry = seq(\n        min(spiderdat$soil.dry),\n        max(spiderdat$soil.dry),\n        length.out = 5\n      )\n    ),\n    data = spiderdat %>%\n      dplyr::filter(site < 7),\n    unit = site,\n    species = taxon,\n    n_lv = 2,\n    family = nb(),\n    run_model = TRUE,\n    residuals = FALSE,\n    chains = 2,\n    silent = 2\n  ))\n  expect_true(inherits(mod, 'jsdgam'))\n  expect_true(is.null(mod$resids))\n\n  # Calculate residual correlations to ensure it works\n  post_cors <- residual_cor(mod, summary = FALSE)\n  expect_equal(dim(post_cors$all_cormat)[1], 1000L)\n  expect_equal(dim(post_cors$all_cormat)[2], nlevels(spiderdat$taxon))\n  expect_true(all(post_cors$all_cormat <= 1))\n  expect_true(all(post_cors$all_cormat >= -1))\n\n  post_cors <- residual_cor(mod, summary = TRUE)\n  expect_equal(dim(post_cors$cor)[1], nlevels(spiderdat$taxon))\n  expect_ggplot(plot(post_cors))\n\n  # Ensure ordination works\n  expect_ggplot(ordinate(mod))\n  expect_ggplot(ordinate(mod, biplot = FALSE))\n  expect_ggplot(ordinate(mod, label_sites = FALSE))\n})\n"
  },
  {
    "path": "tests/testthat/test-marginaleffects.R",
    "content": "context(\"marginaleffects\")\n\nskip_on_cran()\n\ntest_that(\"data_grid gives expected output structure\", {\n  # Dataframe example\n  simdat <- sim_mvgam(\n    n_series = 3,\n    prop_trend = 1,\n    trend_model = GP(),\n    mu = 1.5\n  )\n\n  out <- SW(mvgam:::data_grid(\n    season = unique,\n    year = mean,\n    newdata = simdat$data_test\n  ))\n  expect_true(all(out$year == mean(simdat$data_test$year)))\n\n  myfunc = function(x) {\n    c(\n      mean(x, na.rm = TRUE),\n      max(x, na.rm = TRUE) + 22.4,\n      min(x, na.rm = TRUE) - 11.7\n    )\n  }\n  out <- mvgam:::data_grid(time = myfunc, newdata = simdat$data_test)\n  expect_true(NROW(out) == 3)\n\n  # A list example\n  out <- mvgam:::data_grid(\n    season = fivenum,\n    year = mean,\n    newdata = mvgam:::mvgam_example4$obs_data\n  )\n  expect_true(all.equal(names(out), names(mvgam:::mvgam_example4$obs_data)))\n  expect_true(all(out$year == mean(mvgam:::mvgam_example4$obs_data$year)))\n})\n\ntest_that(\"get_data gives expected output structure\", {\n  plot_data <- insight::get_data(mvgam:::mvgam_example2)\n  obs_data <- mvgam:::mvgam_example2$obs_data\n\n  # get_data should give the exact same data used for modelling, including\n  # any NAs in the outcome variable\n  expect_true(identical(\n    data.frame(\n      y = plot_data$y,\n      season = plot_data$season,\n      series = plot_data$series\n    ),\n    data.frame(\n      y = obs_data$y,\n      season = obs_data$season,\n      series = obs_data$series\n    )\n  ))\n})\n\ntest_that(\"get_predict gives expected output structure\", {\n  preds <- marginaleffects::get_predict(\n    mvgam:::mvgam_example4,\n    newdata = mvgam:::mvgam_example4$obs_data\n  )\n  expect_equal(NROW(preds), length(mvgam:::mvgam_example4$obs_data$y))\n\n  preds <- marginaleffects::get_predict(\n    mvgam:::mvgam_example2,\n    newdata = mvgam:::mvgam_example2$obs_data\n  )\n  expect_equal(NROW(preds), NROW(mvgam:::mvgam_example2$obs_data))\n})\n\ntest_that(\"averages give expected output structures\", {\n  ems <- marginaleffects::avg_predictions(\n    mvgam:::mvgam_example3\n  )\n  expect_equal(NROW(ems), 1)\n  expect_true(all(c(\"estimate\", \"conf.low\", \"conf.high\") %in% colnames(ems)))\n\n  ems <- marginaleffects::avg_predictions(\n    mvgam:::mvgam_example4,\n    variables = list(season = c(1, 6, 12))\n  )\n  expect_equal(NROW(ems), 3)\n  expect_true(all(\n    c(\"season\", \"estimate\", \"conf.low\", \"conf.high\") %in% colnames(ems)\n  ))\n\n  ems <- marginaleffects::avg_predictions(\n    mvgam:::mvgam_example4,\n    variables = list(season = c(1, 6, 12))\n  )\n  expect_equal(NROW(ems), 3)\n  expect_true(all(\n    c(\"season\", \"estimate\", \"conf.low\", \"conf.high\") %in% colnames(ems)\n  ))\n\n  ems <- marginaleffects::predictions(\n    mvgam:::mvgam_example2,\n    by = 'series'\n  )\n  expect_equal(NROW(ems), nlevels(mvgam:::mvgam_example3$obs_data$series))\n})\n\ntest_that(\"comparisons give expected output structures\", {\n  cmp <- marginaleffects::comparisons(\n    mvgam:::mvgam_example2,\n    variables = 'series',\n    by = 'time'\n  )\n  expect_equal(levels(as.factor(cmp$contrast)), c(\"series_2 - series_1\"))\n\n  cmp <- marginaleffects::comparisons(\n    mvgam:::mvgam_example2,\n    variables = list(series = 'pairwise'),\n    by = 'time'\n  )\n  expect_equal(levels(as.factor(cmp$contrast)), c(\"series_2 - series_1\"))\n\n  cmp <- marginaleffects::comparisons(\n    mvgam:::mvgam_example2,\n    newdata = marginaleffects::datagrid(time = c(1, 6, 9), series = unique),\n    variables = list(series = 'pairwise'),\n    by = 'time'\n  )\n  expect_equal(levels(as.factor(cmp$contrast)), c(\"series_2 - series_1\"))\n  expect_equal(NROW(cmp), 3)\n  expect_equal(unique(cmp$time), c(1, 6, 9))\n})\n"
  },
  {
    "path": "tests/testthat/test-monotonic.R",
    "content": "context(\"monotonic\")\n\n# Simulations are a bit time-consuming\nskip_on_cran()\n\n# Simulate data from a monotonically increasing function\nset.seed(123123)\nx <- runif(80) * 4 - 1\nx <- sort(x)\nf <- exp(4 * x) / (1 + exp(4 * x))\ny <- f + rnorm(80) * 0.1\nmod_data <- data.frame(y = y, x = x, z = rnorm(80), time = 1:80)\n\ntest_that(\"k must be an even integer for s(bs = 'moi')\", {\n  expect_error(\n    mvgam(y ~ s(x, bs = 'moi', k = 11), data = mod_data, family = gaussian()),\n    \"Argument 'k(bs = 'moi')'  must be an even integer\",\n    fixed = TRUE\n  )\n\n  expect_error(\n    mvgam(y ~ s(x, bs = 'moi', k = 1), data = mod_data, family = gaussian()),\n    \"Basis dimension is too small\",\n    fixed = TRUE\n  )\n})\n\ntest_that(\"monotonic only works for one dimensional smooths\", {\n  expect_error(\n    mvgam(\n      y ~ s(x, z, bs = 'moi', k = 10),\n      data = mod_data,\n      family = gaussian()\n    ),\n    \"Monotonic basis only handles 1D smooths\",\n    fixed = TRUE\n  )\n})\n\ntest_that(\"monotonic for observation models working properly\", {\n  mod <- mvgam(\n    y ~ z + s(x, bs = 'moi', k = 18),\n    data = mod_data,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  # Monotonic indices should be in the model_data\n  expect_true(\"b_idx_s_x_\" %in% names(mod$model_data))\n\n  # The smooth should be an MOI class\n  expect_true(inherits(mod$mgcv_model$smooth[[1]], 'moi.smooth'))\n\n  # The coefficients should be fixed to be non-negative\n  expect_true(any(grepl(\n    'b[b_idx_s_x_] = abs(b_raw[b_idx_s_x_]) * 1;',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Repeat a check for decreasing functions\n  mod <- mvgam(\n    y ~ z + s(x, bs = 'mod', k = 18),\n    data = mod_data,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  # The smooth should be an MOD class\n  expect_true(inherits(mod$mgcv_model$smooth[[1]], 'mod.smooth'))\n\n  # The coefficients should be fixed to be non-positive\n  expect_true(any(grepl(\n    'b[b_idx_s_x_] = abs(b_raw[b_idx_s_x_]) * -1;',\n    mod$model_file,\n    fixed = TRUE\n  )))\n})\n\ntest_that(\"monotonic for process models working properly\", {\n  mod <- mvgam(\n    y ~ 0,\n    trend_formula = ~ z + s(x, bs = 'moi', k = 18),\n    trend_model = RW(),\n    data = mod_data,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  # Monotonic indices should be in the model_data\n  expect_true(\"b_trend_idx_s_x_\" %in% names(mod$model_data))\n\n  # The smooth should be an MOI class\n  expect_true(inherits(mod$trend_mgcv_model$smooth[[1]], 'moi.smooth'))\n\n  # The coefficients should be fixed to be non-negative\n  expect_true(any(grepl(\n    'b_trend[b_trend_idx_s_x_] = abs(b_raw_trend[b_trend_idx_s_x_]) * 1;',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # And for decreasing\n  mod <- mvgam(\n    y ~ 0,\n    trend_formula = ~ z + s(x, bs = 'mod', k = 18),\n    trend_model = RW(),\n    data = mod_data,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  # The smooth should be an MOD class\n  expect_true(inherits(mod$trend_mgcv_model$smooth[[1]], 'mod.smooth'))\n\n  # The coefficients should be fixed to be non-positive\n  expect_true(any(grepl(\n    'b_trend[b_trend_idx_s_x_] = abs(b_raw_trend[b_trend_idx_s_x_]) * -1;',\n    mod$model_file,\n    fixed = TRUE\n  )))\n})\n"
  },
  {
    "path": "tests/testthat/test-mvgam-methods.R",
    "content": "context(\"class methods\")\n\ntest_that(\"inverse links working\", {\n  expect_true(is(mvgam:::family_invlinks('gaussian'), 'function'))\n  expect_true(is(mvgam:::family_invlinks('Gamma'), 'function'))\n  expect_true(is(mvgam:::family_invlinks('beta_binomial'), 'function'))\n})\n\ntest_that(\"series_to_mvgam working\", {\n  data(\"sunspots\")\n  series <- cbind(sunspots, sunspots)\n  colnames(series) <- c('blood', 'bone')\n  expect_true(inherits(\n    series_to_mvgam(series, frequency(series), 0.85),\n    'list'\n  ))\n\n  # An xts object example\n  dates <- seq(as.Date(\"2001-05-01\"), length = 30, by = \"quarter\")\n  data <- cbind(\n    c(gas = rpois(30, cumprod(1 + rnorm(30, mean = 0.01, sd = 0.001)))),\n    c(oil = rpois(30, cumprod(1 + rnorm(30, mean = 0.01, sd = 0.001))))\n  )\n  series <- xts::xts(x = data, order.by = dates)\n  colnames(series) <- c('gas', 'oil')\n  expect_list(series_to_mvgam(series, freq = 4, train_prop = 0.85))\n})\n\ntest_that(\"stancode and standata working properly\", {\n  simdat <- sim_mvgam()\n  mod <- mvgam(\n    y ~\n      s(season) +\n      s(time, by = series),\n    family = poisson(),\n    data = simdat$data_train,\n    run_model = FALSE\n  )\n\n  expect_character(stancode(mod))\n\n  expect_list(standata(mod))\n})\n\n# Skip remaining time-consuming tests on CRAN\nskip_on_cran()\n\ntest_that(\"add_residuals working properly\", {\n  mod <- mvgam:::mvgam_example1\n  oldresids <- mod$resids\n  mod <- add_residuals(mod)\n\n  expect_true(all(unlist(lapply(seq_along(oldresids), function(x) {\n    all.equal(dim(oldresids[[x]]), dim(mod$resids[[x]]))\n  }))))\n})\n\ntest_that(\"mcmc diagnostics working properly\", {\n  expect_true(inherits(nuts_params(mvgam:::mvgam_example1), 'data.frame'))\n  expect_true(inherits(nuts_params(mvgam:::mvgam_example2), 'data.frame'))\n\n  expect_true(inherits(rhat(mvgam:::mvgam_example1), 'numeric'))\n  expect_true(inherits(rhat(mvgam:::mvgam_example4), 'numeric'))\n\n  expect_true(inherits(SW(neff_ratio(mvgam:::mvgam_example1)), 'numeric'))\n  expect_true(inherits(SW(neff_ratio(mvgam:::mvgam_example4)), 'numeric'))\n})\n\ntest_that(\"compute_edf working properly\", {\n  mod <- mvgam:::mvgam_example1\n  expect_no_error(capture_output(mvgam:::compute_edf(\n    mod$mgcv_model,\n    mod,\n    'rho',\n    'sigma_raw',\n    conservative = FALSE\n  )))\n\n  mod <- mvgam:::mvgam_example4\n  expect_no_error(capture_output(mvgam:::compute_edf(\n    mod$trend_mgcv_model,\n    mod,\n    'rho_trend',\n    'sigma_raw_trend',\n    conservative = TRUE\n  )))\n})\n\ntest_that(\"conditional_effects works properly\", {\n  effects <- conditional_effects(mvgam:::mvgam_example1)\n  lapply(effects, expect_ggplot)\n\n  effects <- conditional_effects(mvgam:::mvgam_example2)\n  lapply(effects, expect_ggplot)\n\n  effects <- conditional_effects(mvgam:::mvgam_example3)\n  lapply(effects, expect_ggplot)\n\n  effects <- conditional_effects(mvgam:::mvgam_example4)\n  lapply(effects, expect_ggplot)\n})\n\ntest_that(\"mcmc_plot works properly\", {\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example1, type = \"dens\"))\n  expect_ggplot(mcmc_plot(\n    mvgam:::mvgam_example1,\n    type = \"scatter\",\n    variable = variables(mvgam:::mvgam_example1)$observation_betas[2:3, 1]\n  ))\n  expect_error(\n    mcmc_plot(mvgam:::mvgam_example1, type = \"density\"),\n    \"Invalid plot type\"\n  )\n  expect_ggplot(SW(mcmc_plot(mvgam:::mvgam_example2, type = \"neff\")))\n  expect_silent(p <- mcmc_plot(mvgam:::mvgam_example3, type = \"areas\"))\n  expect_error(\n    mcmc_plot(mvgam:::mvgam_example3, type = \"hex\"),\n    \"Exactly 2 parameters must be selected\"\n  )\n  expect_ggplot(mcmc_plot(mvgam:::mvgam_example4))\n  expect_no_error(SW(pairs(mvgam:::mvgam_example2)))\n  expect_no_error(SW(pairs(\n    mvgam:::mvgam_example4,\n    variable = c('sigma'),\n    regex = TRUE\n  )))\n})\n\ntest_that(\"pp_check and ppc work properly\", {\n  expect_ggplot(SW(SM(pp_check(mvgam:::mvgam_example1))))\n  expect_ggplot(SW(SM(pp_check(\n    mvgam:::mvgam_example1,\n    newdata = mvgam:::mvgam_example1$obs_data[1:10, ]\n  ))))\n  expect_ggplot(SW(SM(pp_check(mvgam:::mvgam_example2, \"stat\", ndraws = 5))))\n  expect_ggplot(SW(SM(pp_check(mvgam:::mvgam_example3, \"error_binned\"))))\n  expect_ggplot(SW(SM(pp_check(\n    mvgam:::mvgam_example3,\n    \"resid_hist\",\n    ndraws = 5\n  ))))\n  expect_ggplot(SW(SM(pp_check(\n    mvgam:::mvgam_example1,\n    ndraws = 5,\n    type = 'resid_hist_grouped',\n    group = 'series'\n  ))))\n  pp <- SW(SM(pp_check(\n    object = mvgam:::mvgam_example4,\n    type = \"ribbon_grouped\",\n    group = \"series\",\n    x = \"season\"\n  )))\n  expect_ggplot(pp)\n  pp <- SW(SM(pp_check(\n    mvgam:::mvgam_example2,\n    type = \"violin_grouped\",\n    group = \"season\",\n    newdata = mvgam:::mvgam_example2$obs_data[1:10, ]\n  )))\n  expect_ggplot(pp)\n  expect_ggplot(SW(SM(pp_check(mvgam:::mvgam_example4, prefix = \"ppd\"))))\n\n  expect_no_error(ppc(mvgam:::mvgam_example4))\n  expect_error(ppc(mvgam:::mvgam_example1, type = 'banana'))\n  expect_no_error(ppc(mvgam:::mvgam_example1, type = 'hist'))\n  expect_error(\n    ppc(mvgam:::mvgam_example3, type = 'rootogram'),\n    'Rootograms not supported for checking non-count data'\n  )\n})\n\ntest_that(\"model.frame gives expected output structure\", {\n  mod_data <- model.frame(mvgam:::mvgam_example1)\n\n  # model.frame should give the exact same data used for modelling, including\n  # any NAs in the outcome variable\n  expect_true(identical(\n    data.frame(y = mod_data$y, season = mod_data$season),\n    data.frame(\n      y = mvgam:::mvgam_example1$obs_data$y,\n      season = mvgam:::mvgam_example1$obs_data$season\n    )\n  ))\n\n  # The setup mgcv model should have the same number of observations, but with\n  # these NAs imputed\n  mod_data <- model.frame(mvgam:::mvgam_example1$mgcv_model)\n  expect_equal(NROW(mod_data), NROW(mvgam:::mvgam_example1$obs_data))\n  expect_false(any(is.na(mod_data)))\n})\n\ntest_that(\"as.data.frame and friends have resonable outputs\", {\n  out <- as.data.frame(mvgam:::mvgam_example4, variable = 'betas')\n  expect_s3_class(out, \"data.frame\")\n  expect_equal(\n    names(out),\n    c(\n      \"(Intercept)\",\n      \"seriesseries_2\",\n      \"s(season).1\",\n      \"s(season).2\",\n      \"s(season).3\"\n    )\n  )\n\n  out <- as.data.frame(mvgam:::mvgam_example4, variable = 'trend_params')\n  expect_s3_class(out, \"data.frame\")\n  expect_equal(names(out)[1], \"alpha_gp[1]\")\n\n  out <- as.data.frame(mvgam:::mvgam_example4, variable = 'obs_params')\n  expect_s3_class(out, \"data.frame\")\n  expect_equal(names(out), c(\"sigma_obs[1]\", \"sigma_obs[2]\"))\n\n  out <- as.matrix(mvgam:::mvgam_example2, variable = 'obs_params')\n  expect_true(inherits(out, \"matrix\"))\n  expect_equal(dimnames(out)[[2]], c(\"sigma_obs[1]\", \"sigma_obs[2]\"))\n})\n\ntest_that(\"coef has resonable outputs\", {\n  out <- coef(mvgam:::mvgam_example1)\n  expect_equal(\n    rownames(out),\n    c(\"(Intercept)\", \"s(season).1\", \"s(season).2\", \"s(season).3\")\n  )\n  expect_equal(dim(out), c(4, 5))\n})\n\ntest_that(\"logLik has reasonable ouputs\", {\n  liks <- logLik(mvgam:::mvgam_example4)\n  expect_equal(dim(liks), c(5, NROW(mvgam:::mvgam_example2$obs_data)))\n  # NAs in observations should propagate for likelihood calculations\n  expect_true(all(is.na(liks[, which(is.na(\n    mvgam:::mvgam_example2$obs_data$y\n  ))])))\n})\n\ntest_that(\"predict has reasonable outputs\", {\n  newdat1 <- data.frame(series = 'series_1')\n  expect_error(\n    predict(mvgam_example1, newdata = newdat1),\n    \"the following required variables are missing from newdata:\\n season\"\n  )\n\n  newdat2 <- data.frame(series = factor('series_1'), time = 1)\n  expect_error(\n    predict(mvgam_example1, newdata = newdat2),\n    \"the following required variables are missing from newdata:\\n season\"\n  )\n\n  newdat3 <- list(series = factor('series_1'), time = 1)\n  expect_error(\n    predict(mvgam_example4, newdata = newdat3),\n    \"the following required variables are missing from newdata:\\n season\"\n  )\n\n  gaus_preds <- predict(mvgam:::mvgam_example4, type = 'link', summary = FALSE)\n  expect_equal(dim(gaus_preds), c(5, NROW(mvgam:::mvgam_example2$obs_data)))\n\n  gaus_preds <- predict(\n    mvgam:::mvgam_example3,\n    type = 'response',\n    summary = FALSE\n  )\n  expect_equal(dim(gaus_preds), c(5, NROW(mvgam:::mvgam_example3$obs_data)))\n\n  expect_error(\n    predict(mvgam:::mvgam_example1, type = 'latent_N'),\n    '\"latent_N\" type only available for N-mixture models',\n    fixed = TRUE\n  )\n\n  preds <- predict(mvgam:::mvgam_example3, type = 'terms')\n  expect_true(inherits(preds, 'list'))\n  expect_true(all.equal(names(preds$obs_effects), c('fit', 'se.fit')))\n  expect_true(is.null(preds$process_effects))\n\n  preds <- predict(mvgam:::mvgam_example2, type = 'terms')\n  expect_true(inherits(preds, 'list'))\n  expect_true(length(preds$obs_effects) == 0)\n  expect_true(!is.null(preds$process_effects))\n\n  preds <- predict(mvgam:::mvgam_example4, type = 'terms', summary = FALSE)\n  expect_true(inherits(preds, 'list'))\n  expect_true(is.matrix(preds$obs_effects[[1]]))\n})\n\ntest_that(\"get_predict has reasonable outputs\", {\n  gaus_preds <- predict(\n    mvgam:::mvgam_example1,\n    type = 'link',\n    process_error = FALSE,\n    summary = FALSE\n  )\n  meffects_preds <- get_predict(\n    mvgam:::mvgam_example1,\n    newdata = mvgam:::mvgam_example1$obs_data,\n    type = 'link'\n  )\n  expect_true(NROW(meffects_preds) == NCOL(gaus_preds))\n  expect_true(identical(meffects_preds$estimate, apply(gaus_preds, 2, median)))\n})\n\ntest_that(\"hindcast has reasonable outputs\", {\n  expect_error(\n    forecast(mvgam:::mvgam_example2),\n    'newdata must be supplied to compute forecasts'\n  )\n  hc <- hindcast(mvgam:::mvgam_example1)\n  expect_s3_class(hc, 'mvgam_forecast')\n  expect_true(is.null(hc$forecasts))\n  expect_equal(\n    dim(hc$hindcasts[[1]]),\n    c(\n      5,\n      NROW(mvgam:::mvgam_example2$obs_data) /\n        nlevels(mvgam:::mvgam_example2$obs_data$series)\n    )\n  )\n  expect_equal(\n    hc$train_observations[[1]],\n    mvgam:::mvgam_example2$obs_data$y[\n      which(mvgam:::mvgam_example2$obs_data$series == 'series_1')\n    ]\n  )\n})\n\ntest_that(\"plot_mvgam_resids gives reasonable outputs\", {\n  expect_ggplot(plot_mvgam_resids(mvgam:::mvgam_example1))\n  expect_ggplot(plot_mvgam_resids(mvgam:::mvgam_example2))\n})\n\ntest_that(\"plot_mvgam_resids handles NA residuals without error\", {\n  # mvgam_example1 has NAs in residuals from missing observations;\n  # quantile() calls must use na.rm = TRUE to avoid errors\n  mod <- mvgam:::mvgam_example1\n  expect_true(anyNA(mod$resids[[1]]))\n  expect_ggplot(plot_mvgam_resids(mod, series = 1))\n})\n\ntest_that(\"residuals method returns NAs for missing observations\", {\n  mod <- mvgam:::mvgam_example1\n  resids <- residuals(mod)\n\n  # Residuals should be NaN where observations were missing\n  na_obs <- which(is.na(mod$obs_data$y))\n  expect_true(length(na_obs) > 0)\n  expect_true(all(is.nan(resids[na_obs, \"Estimate\"])))\n})\n\ntest_that(\"plot_mvgam_series gives reasonable outputs\", {\n  simdat <- sim_mvgam()\n  expect_ggplot(plot_mvgam_series(\n    data = simdat$data_train,\n    newdata = simdat$data_test\n  ))\n  expect_ggplot(plot_mvgam_series(\n    data = simdat$data_train,\n    newdata = simdat$data_test,\n    series = 'all'\n  ))\n  expect_ggplot(plot_mvgam_series(\n    data = simdat$data_train,\n    newdata = simdat$data_test,\n    lines = FALSE\n  ))\n  expect_ggplot(plot_mvgam_series(\n    data = simdat$data_train,\n    newdata = simdat$data_test,\n    lines = FALSE,\n    series = 'all'\n  ))\n\n  # Should also work for list data\n  dat_train <- list()\n  for (i in 1:NCOL(simdat$data_train)) {\n    dat_train[[i]] <- simdat$data_train[, i]\n  }\n  names(dat_train) <- colnames(simdat$data_train)\n\n  dat_test <- list()\n  for (i in 1:NCOL(simdat$data_test)) {\n    dat_test[[i]] <- simdat$data_test[, i]\n  }\n  names(dat_test) <- colnames(simdat$data_test)\n\n  expect_ggplot(plot_mvgam_series(data = dat_train))\n  expect_ggplot(plot_mvgam_series(data = dat_train, newdata = dat_test))\n  expect_ggplot(plot_mvgam_series(\n    data = dat_train,\n    newdata = dat_test,\n    series = 'all'\n  ))\n  expect_ggplot(plot_mvgam_series(\n    data = dat_train,\n    newdata = dat_test,\n    lines = FALSE\n  ))\n  expect_ggplot(plot_mvgam_series(\n    data = dat_train,\n    newdata = dat_test,\n    lines = FALSE,\n    series = 'all'\n  ))\n\n  # And for mvgam objects\n  expect_ggplot(plot_mvgam_series(object = mvgam:::mvgam_example1, series = 1))\n  expect_no_error(SW(plot(mvgam:::mvgam_example1, type = 'series')))\n})\n\ntest_that(\"forecast and ensemble have reasonable outputs\", {\n  set.seed(1234)\n  mvgam_examp_dat <- sim_mvgam(\n    family = gaussian(),\n    T = 40,\n    prop_missing = 0.1,\n    n_series = 2\n  )\n  newdat <- mvgam_examp_dat$data_test\n  fc <- forecast(object = mvgam:::mvgam_example4, newdata = newdat)\n  expect_s3_class(fc, 'mvgam_forecast')\n  expect_equal(\n    dim(fc$forecasts[[1]]),\n    c(\n      5,\n      NROW(newdat) /\n        nlevels(newdat$series)\n    )\n  )\n  expect_equal(\n    fc$test_observations[[1]],\n    newdat$y[which(newdat$series == 'series_1')]\n  )\n\n  # Check that ensemble.mvgam_forecast works\n  fc2 <- forecast(object = mvgam:::mvgam_example3, newdata = newdat)\n\n  fc_ens <- ensemble(fc, fc2, ndraws = 3000)\n  expect_equal(\n    dim(fc_ens$forecasts[[1]]),\n    c(\n      3000,\n      NROW(newdat) /\n        nlevels(newdat$series)\n    )\n  )\n  expect_equal(\n    fc_ens$test_observations[[1]],\n    newdat$y[which(newdat$series == 'series_1')]\n  )\n\n  fc_ens <- ensemble(fc, fc2, ndraws = 19)\n  expect_equal(\n    dim(fc_ens$forecasts[[1]]),\n    c(\n      19,\n      NROW(newdat) /\n        nlevels(newdat$series)\n    )\n  )\n\n  # ndraws must be positive integer\n  expect_error(ensemble(fc, fc2, ndraws = 0))\n})\n\ntest_that(\"ensemble gives equal pooling\", {\n  set.seed(1234)\n  mvgam_examp_dat <- sim_mvgam(\n    family = gaussian(),\n    T = 40,\n    prop_missing = 0.1,\n    n_series = 2\n  )\n  newdat <- mvgam_examp_dat$data_test\n  fc <- forecast(object = mvgam:::mvgam_example4, newdata = newdat)\n  fc2 <- forecast(object = mvgam:::mvgam_example3, newdata = newdat)\n\n  # Replace casts with dummy data\n  fc$hindcasts = lapply(\n    fc$hindcasts,\n    \\(series_hcs) matrix(4, 1, ncol(series_hcs))\n  )\n  fc2$hindcasts = lapply(\n    fc2$hindcasts,\n    \\(series_hcs) matrix(5, 10, ncol(series_hcs))\n  )\n  fc$forecasts = lapply(\n    fc$forecasts,\n    \\(series_fcs) matrix(1, 1, ncol(series_fcs))\n  )\n  fc2$forecasts = lapply(\n    fc2$forecasts,\n    \\(series_fcs) matrix(2, 10, ncol(series_fcs))\n  )\n\n  n_draws <- 500\n  fc_ens <- ensemble(fc, fc2, ndraws = n_draws)\n\n  # Expect that roughly 50% of hindcasts should be a 4 and 50% a 5\n  four_props <- unlist(\n    lapply(seq_along(fc_ens$hindcasts), function(x) {\n      length(which(fc_ens$hindcasts[[x]] == 4)) / length(fc_ens$hindcasts[[x]])\n    }),\n    use.names = FALSE\n  )\n  expect_equal(four_props, rep(0.5, 2), tolerance = 0.03)\n\n  # Expect that roughly 50% of forecasts should be a 1 and 50% a 2\n  two_props <- unlist(\n    lapply(seq_along(fc_ens$hindcasts), function(x) {\n      length(which(fc_ens$forecasts[[x]] == 2)) / length(fc_ens$forecasts[[x]])\n    }),\n    use.names = FALSE\n  )\n  expect_equal(two_props, rep(0.5, 2), tolerance = 0.03)\n})\n"
  },
  {
    "path": "tests/testthat/test-mvgam.R",
    "content": "context(\"mvgam\")\n\ntest_that(\"family must be correctly specified\", {\n  expect_error(\n    mod <- mvgam(\n      y ~ s(season),\n      trend_model = AR(),\n      data = beta_data$data_train,\n      family = 'besta',\n      run_model = FALSE\n    ),\n    'family not recognized'\n  )\n})\n\ntest_that(\"response variable must be specified\", {\n  expect_error(\n    mod <- mvgam(\n      ~ s(season),\n      trend_model = AR(),\n      data = beta_data$data_train,\n      family = betar(),\n      run_model = FALSE\n    ),\n    'response variable is missing from formula'\n  )\n})\n\ntest_that(\"drift deprecation message works\", {\n  expect_message(\n    mvgam(\n      y ~\n        s(series, bs = 're') +\n        s(season, bs = 'cc', k = 8) +\n        s(time, bs = 'moi', k = 8),\n      trend_model = RW(ma = TRUE),\n      drift = TRUE,\n      data = gaus_data$data_train,\n      newdata = gaus_data$data_test,\n      family = gaussian(),\n      run_model = FALSE\n    ),\n    'The \"drift\" argument is deprecated; use fixed effects of \"time\" instead'\n  )\n})\n\ntest_that(\"id to link smooths not allowed yet\", {\n  expect_error(\n    mod <- mvgam(\n      y ~\n        s(time, id = 1) +\n        s(time, by = series, id = 1),\n      data = beta_data$data_train,\n      family = betar(),\n      run_model = FALSE\n    ),\n    'smooth terms with the \"id\" argument not yet supported by mvgam'\n  )\n})\n\ntest_that(\"response variable must follow family-specific restrictions\", {\n  expect_error(\n    mod <- mvgam(\n      y ~ s(season),\n      trend_model = AR(),\n      data = gaus_data$data_train,\n      family = lognormal(),\n      run_model = FALSE\n    ),\n    'Values <= 0 not allowed for lognormal responses'\n  )\n\n  expect_error(\n    mod <- mvgam(\n      y ~ s(season),\n      trend_model = AR(),\n      data = gaus_data$data_train,\n      family = poisson(),\n      run_model = FALSE\n    ),\n    'Values < 0 not allowed for count family responses'\n  )\n})\n\ntest_that(\"trend_model must be correctly specified\", {\n  expect_error(SW(\n    mod <- mvgam(\n      y ~ s(season),\n      trend_model = 'AR11',\n      data = beta_data$data_train,\n      family = betar(),\n      run_model = FALSE\n    )\n  ))\n})\n\ntest_that(\"outcome variable must be present in data\", {\n  data = data.frame(out = rnorm(100), temp = rnorm(100), time = 1:100)\n  expect_error(\n    mod <- mvgam(\n      formula = y ~ dynamic(temp, rho = 20),\n      data = data,\n      family = gaussian(),\n      run_model = FALSE\n    ),\n    'variable y not found in data'\n  )\n})\n\ntest_that(\"series levels must match unique entries in series\", {\n  levels(beta_data$data_train$series) <- paste0('series_', 1:6)\n  expect_error(mvgam(\n    y ~ s(season),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    newdata = beta_data$data_test,\n    family = betar(),\n    run_model = FALSE\n  ))\n})\n\ntest_that(\"missing values not allowed in predictors\", {\n  # Include missing vals in training data\n  simdat <- sim_mvgam()\n  simdat$data_train$season[4] <- NA\n  expect_error(mvgam(\n    y ~ s(season),\n    trend_model = GP(),\n    data = simdat$data_train,\n    newdata = simdat$data_test,\n    run_model = FALSE\n  ))\n\n  # Include missing vals in testing data\n  simdat <- sim_mvgam()\n  simdat$data_test$season[4] <- NA\n  expect_error(mvgam(\n    y ~ s(season),\n    data = simdat$data_train,\n    newdata = simdat$data_test,\n    run_model = FALSE\n  ))\n})\n\ntest_that(\"all series must have observations for all unique timepoints\", {\n  data <- sim_mvgam()\n  data$data_train <- data$data_train[-2, ]\n  expect_error(\n    mod <- mvgam(\n      y ~ s(season),\n      trend_model = AR(),\n      data = data$data_train,\n      family = poisson(),\n      run_model = FALSE\n    ),\n    'One or more series in data is missing observations for one or more timepoints'\n  )\n\n  data <- sim_mvgam()\n  data$data_test <- data$data_test[-2, ]\n  expect_error(\n    mod <- mvgam(\n      y ~ s(season),\n      trend_model = AR(),\n      data = data$data_train,\n      newdata = data$data_test,\n      family = poisson(),\n      run_model = FALSE\n    ),\n    'One or more series in newdata is missing observations for one or more timepoints'\n  )\n})\n\ntest_that(\"rho argument must be positive numeric\", {\n  data = data.frame(out = rnorm(100), temp = rnorm(100), time = 1:100)\n  expect_error(\n    mod <- mvgam(\n      formula = out ~ dynamic(temp, rho = -1),\n      data = data,\n      family = gaussian(),\n      run_model = FALSE\n    ),\n    'Argument \"rho\" in dynamic() must be a positive value',\n    fixed = TRUE\n  )\n})\n\n# Skip remaining tests on CRAN as they are slightly time-consuming\nskip_on_cran()\n\ntest_that(\"JAGS setups should work\", {\n  # JAGS setup should work, whether installed or not\n  simdat <- sim_mvgam()\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = RW(),\n    data = simdat$data_train,\n    family = poisson(),\n    use_stan = FALSE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(mod$drift == FALSE)\n\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = AR(),\n    data = simdat$data_train,\n    family = poisson(),\n    use_stan = FALSE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(mod$drift == FALSE)\n\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = AR(p = 2),\n    data = simdat$data_train,\n    family = poisson(),\n    use_stan = FALSE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(mod$drift == FALSE)\n\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = AR(),\n    data = simdat$data_train,\n    family = nb(),\n    use_stan = FALSE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(mod$drift == FALSE)\n\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = AR(p = 3),\n    data = simdat$data_train,\n    family = nb(),\n    use_stan = FALSE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(mod$drift == FALSE)\n\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = AR(p = 3),\n    data = simdat$data_train,\n    family = gaussian(),\n    use_stan = FALSE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(mod$drift == FALSE)\n\n  expect_true(inherits(\n    get_mvgam_priors(\n      y ~ s(season),\n      trend_model = 'RW',\n      data = simdat$data_train,\n      family = gaussian(),\n      use_stan = FALSE\n    ),\n    'data.frame'\n  ))\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = RW(),\n    data = simdat$data_train,\n    family = gaussian(),\n    use_stan = FALSE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(mod$drift == FALSE)\n})\n\ntest_that(\"implicit_vars are added correctly\", {\n  simdat <- sim_mvgam(n_series = 1)\n  no_series <- simdat$data_train\n  no_series$series <- NULL\n\n  mod <- mvgam(y ~ s(season, bs = 'cc'), data = no_series, run_model = FALSE)\n  expect_equal('series', attr(mod$obs_data, 'implicit_vars'))\n\n  mod <- SM(mvgam(\n    y ~ 1,\n    trend_formula = ~ s(season),\n    data = no_series,\n    run_model = FALSE\n  ))\n  expect_equal('series', attr(mod$obs_data, 'implicit_vars'))\n\n  no_series$time <- NULL\n  mod <- mvgam(y ~ s(season, bs = 'cc'), data = no_series, run_model = FALSE)\n  expect_equal(c('series', 'time'), attr(mod$obs_data, 'implicit_vars'))\n})\n\ntest_that(\"trend = 'None' works for State Space\", {\n  mod <- mvgam(\n    y ~ s(series, bs = 're'),\n    trend_formula = ~ s(season, bs = 'cc', k = 8) +\n      s(time, bs = 'moi', k = 8),\n    trend_model = 'None',\n    data = gaus_data$data_train,\n    newdata = gaus_data$data_test,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n\n  expect_true(any(grepl(\n    trimws(\"LV[i, j] ~ normal(trend_mus[ytimes_trend[i, j]], sigma[j]);\"),\n    trimws(mod$model_file),\n    fixed = TRUE\n  )))\n\n  expect_true(any(grepl(\n    trimws(\"trend[i, s] = dot_product(Z[s,  : ], LV[i,  : ]);\"),\n    trimws(mod$model_file),\n    fixed = TRUE\n  )))\n})\n\ntest_that(\"noncentring working properly for a range of models\", {\n  # First check messages\n  expect_message(\n    mvgam(\n      y ~\n        s(series, bs = 're') +\n        s(season, bs = 'cc', k = 8) +\n        s(time, bs = 'moi', k = 8),\n      trend_model = RW(ma = TRUE),\n      data = gaus_data$data_train,\n      newdata = gaus_data$data_test,\n      family = gaussian(),\n      noncentred = TRUE,\n      run_model = FALSE\n    ),\n    'Non-centering of trends currently not available for this model'\n  )\n\n  expect_message(\n    mvgam(\n      y ~\n        s(series, bs = 're') +\n        s(season, bs = 'cc', k = 8) +\n        s(time, bs = 'moi', k = 8),\n      trend_model = RW(cor = TRUE),\n      data = gaus_data$data_train,\n      newdata = gaus_data$data_test,\n      family = gaussian(),\n      noncentred = TRUE,\n      run_model = FALSE\n    ),\n    'Non-centering of trends currently not available for this model'\n  )\n\n  expect_message(\n    mvgam(\n      y ~\n        s(series, bs = 're') +\n        s(season, bs = 'cc', k = 8) +\n        s(time, bs = 'moi', k = 8),\n      trend_model = AR(p = 2, cor = TRUE),\n      data = gaus_data$data_train,\n      newdata = gaus_data$data_test,\n      family = gaussian(),\n      noncentred = TRUE,\n      run_model = FALSE\n    ),\n    'Non-centering of trends currently not available for this model'\n  )\n\n  expect_message(\n    mvgam(\n      y ~\n        s(series, bs = 're') +\n        s(season, bs = 'cc', k = 8) +\n        s(season, series, bs = 'sz'),\n      trend_model = VAR(),\n      data = gaus_data$data_train,\n      newdata = gaus_data$data_test,\n      family = gaussian(),\n      noncentred = TRUE,\n      run_model = FALSE\n    ),\n    'Non-centering of trends currently not available for this model'\n  )\n\n  # Now check that the non-centering is incorporated properly\n  mod <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc', k = 8) +\n      s(time, bs = 'moi', k = 8),\n    trend_model = RW(),\n    data = gaus_data$data_train,\n    newdata = gaus_data$data_test,\n    family = gaussian(),\n    noncentred = TRUE,\n    run_model = FALSE\n  )\n\n  # Model file should have the non-centred trend parameterisation now\n  expect_true(\n    any(grepl(\n      trimws(\"trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"trend[2 : n, s] += trend[1 : (n - 1), s];\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"to_vector(trend_raw) ~ std_normal();\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"b[b_idx_s_time_] = abs(b_raw[b_idx_s_time_]) * 1;\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  mod <- mvgam(\n    y ~\n      s(series, bs = 're') +\n      s(season, bs = 'cc', k = 8) +\n      s(season, series, bs = 'sz'),\n    trend_model = AR(p = 3),\n    priors = c(\n      prior(beta(2, 2), class = ar1, lb = 0, ub = 1),\n      prior(exponential(3.466), class = sigma)\n    ),\n    data = gaus_data$data_train,\n    newdata = gaus_data$data_test,\n    family = gaussian(),\n    noncentred = TRUE,\n    run_model = FALSE\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"ar1 ~ beta(2, 2);\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"sigma ~ exponential(3.466);\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"trend = trend_raw .* rep_matrix(sigma', rows(trend_raw));\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"trend[2, s] += ar1[s] * trend[1, s];\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"trend[3, s] += ar1[s] * trend[2, s] + ar2[s] * trend[1, s];\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n\n  expect_true(\n    any(grepl(\n      trimws(\"to_vector(trend_raw) ~ std_normal();\"),\n      trimws(mod$model_file),\n      fixed = TRUE\n    ))\n  )\n})\n\ntest_that(\"prior_only works\", {\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = AR(p = 2),\n    data = gaus_data$data_train,\n    prior_simulation = TRUE,\n    family = gaussian(),\n    threads = 2,\n    run_model = FALSE\n  )\n  expect_no_error(capture_output(code(mod)))\n  expect_true(!any(grepl('likelihood functions', mod$model_file, fixed = TRUE)))\n  expect_true(!any(grepl('flat_ys ~ ', mod$model_file, fixed = TRUE)))\n\n  mod <- mvgam(\n    y ~ 1,\n    trend_formula = ~ s(season) + s(trend, bs = 're'),\n    trend_model = VAR(ma = TRUE),\n    data = gaus_data$data_train,\n    prior_simulation = TRUE,\n    family = gaussian(),\n    threads = 2,\n    run_model = FALSE\n  )\n  expect_no_error(capture_output(code(mod)))\n  expect_true(!any(grepl('likelihood functions', mod$model_file, fixed = TRUE)))\n  expect_true(!any(grepl('flat_ys ~ ', mod$model_file, fixed = TRUE)))\n  mod <- mvgam(\n    y ~ 1,\n    trend_formula = ~ s(season) + s(trend, bs = 're'),\n    trend_model = CAR(),\n    data = gaus_data$data_train,\n    prior_simulation = TRUE,\n    family = gaussian(),\n    threads = 2,\n    run_model = FALSE\n  )\n  expect_no_error(capture_output(code(mod)))\n  expect_true(!any(grepl('likelihood functions', mod$model_file, fixed = TRUE)))\n  expect_true(!any(grepl('flat_ys ~ ', mod$model_file, fixed = TRUE)))\n\n  # trend_map not yet allowed for CAR1 dynamics\n  trend_map <- data.frame(\n    series = unique(gaus_data$data_train$series),\n    trend = c(1, 1, 2)\n  )\n  expect_error(\n    mvgam(\n      y ~ 1,\n      trend_formula = ~ s(season) + s(trend, bs = 're'),\n      trend_model = CAR(),\n      trend_map = trend_map,\n      data = gaus_data$data_train,\n      prior_simulation = TRUE,\n      family = gaussian(),\n      threads = 2,\n      run_model = FALSE\n    ),\n    'cannot yet use trend mapping for CAR1 dynamics'\n  )\n\n  mod <- mvgam(\n    y ~ s(season),\n    trend_model = AR(p = 3),\n    data = beta_data$data_train,\n    prior_simulation = TRUE,\n    family = betar(),\n    run_model = FALSE\n  )\n  expect_no_error(capture_output(code(mod)))\n  expect_true(!any(grepl('likelihood functions', mod$model_file, fixed = TRUE)))\n  expect_true(!any(grepl('flat_ys ~ ', mod$model_file, fixed = TRUE)))\n\n  mod <- mvgam(\n    y ~ 1,\n    trend_formula = ~ s(season) + s(trend, bs = 're'),\n    trend_model = AR(cor = TRUE, ma = TRUE),\n    data = beta_data$data_train,\n    prior_simulation = TRUE,\n    family = betar(),\n    run_model = FALSE\n  )\n  expect_no_error(capture_output(code(mod)))\n  expect_true(!any(grepl('likelihood functions', mod$model_file, fixed = TRUE)))\n  expect_true(!any(grepl('flat_ys ~ ', mod$model_file, fixed = TRUE)))\n})\n\ntest_that(\"time not required in data if this is a no trend model\", {\n  data <- data.frame(out = rnorm(100), temp = rnorm(100))\n  mod <- mvgam(\n    formula = out ~ dynamic(temp, rho = 20),\n    data = data,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_equal(attr(mod$obs_data, 'implicit_vars'), c('series', 'time'))\n})\n\ntest_that(\"median coefs should be stored in the mgcv object\", {\n  expect_true(identical(\n    unname(coef(mvgam:::mvgam_example2$mgcv_model)),\n    coef(mvgam:::mvgam_example2)[, 2]\n  ))\n})\n\ntest_that(\"empty obs formula is allowed, even if no trend_formula\", {\n  mod <- mvgam(\n    formula = y ~ -1,\n    trend_model = AR(),\n    data_train = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n})\n\ntest_that(\"empty obs formula allowed if trend_formula supplied\", {\n  mod <- mvgam(\n    formula = y ~ -1,\n    trend_formula = ~ s(season),\n    trend_model = AR(),\n    data = gaus_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  # Check that the intercept coefficient is correctly fixed at zero\n  expect_true(any(grepl(\n    '// (Intercept) fixed at zero',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl('b[1] = 0;', mod$model_file, fixed = TRUE)))\n})\n\ntest_that(\"share_obs_params working\", {\n  # Standard beta\n  mod <- mvgam(\n    y ~ s(season, by = series),\n    trend_model = RW(cor = TRUE),\n    family = betar(),\n    data = beta_data$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>phi;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'phi_vec[1:n,s]=rep_vector(phi,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # State-space beta\n  mod <- mvgam(\n    y ~ -1,\n    trend_formula = ~ s(season, by = trend),\n    trend_model = RW(cor = TRUE),\n    family = betar(),\n    data = beta_data$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>phi;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'phi_vec[1:n,s]=rep_vector(phi,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # Standard gaussian\n  mod <- mvgam(\n    y ~ s(season, by = series),\n    trend_model = RW(cor = TRUE),\n    family = gaussian(),\n    data = gaus_data$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>sigma_obs;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'sigma_obs_vec[1:n,s]=rep_vector(sigma_obs,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # State-space gaussian\n  mod <- mvgam(\n    y ~ -1,\n    trend_formula = ~ s(season, by = trend) + s(trend, bs = 're'),\n    trend_model = RW(cor = TRUE),\n    family = gaussian(),\n    data = gaus_data$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>sigma_obs;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'sigma_obs_vec[1:n,s]=rep_vector(sigma_obs,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # Standard student\n  mod <- mvgam(\n    y ~ s(season, by = series),\n    trend_model = RW(cor = TRUE),\n    family = student_t(),\n    data = gaus_data$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>sigma_obs;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'sigma_obs_vec[1:n,s]=rep_vector(sigma_obs,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # State-space student\n  mod <- mvgam(\n    y ~ -1,\n    trend_formula = ~ s(season, by = trend),\n    trend_model = RW(cor = TRUE),\n    family = student_t(),\n    data = gaus_data$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>sigma_obs;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'sigma_obs_vec[1:n,s]=rep_vector(sigma_obs,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # Standard lognormal\n  simdat <- sim_mvgam(family = Gamma())\n  mod <- mvgam(\n    y ~ s(season, by = series),\n    trend_model = RW(cor = TRUE),\n    family = lognormal(),\n    data = simdat$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>sigma_obs;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'sigma_obs_vec[1:n,s]=rep_vector(sigma_obs,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # State-space lognormal\n  mod <- mvgam(\n    y ~ -1,\n    trend_formula = ~ s(season, by = trend),\n    trend_model = RW(cor = TRUE),\n    family = lognormal(),\n    data = simdat$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>sigma_obs;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'sigma_obs_vec[1:n,s]=rep_vector(sigma_obs,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  # Standard Gamma\n  mod <- mvgam(\n    y ~ s(season, by = series),\n    trend_model = RW(cor = TRUE),\n    family = Gamma(),\n    data = simdat$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>shape;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'shape_vec[1:n,s]=rep_vector(shape,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # State-space Gamma\n  mod <- mvgam(\n    y ~ -1,\n    trend_formula = ~ s(season, by = trend),\n    trend_model = RW(cor = TRUE),\n    family = Gamma(),\n    data = simdat$data_train,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(any(grepl(\n    'real<lower=0>shape;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'shape_vec[1:n,s]=rep_vector(shape,n);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n})\n\ntest_that(\"trend_map is behaving propoerly\", {\n  sim <- sim_mvgam(n_series = 3)\n  mod_data <- sim$data_train\n  trend_map <- data.frame(series = unique(mod_data$series), trend = c(1, 1, 2))\n  mod_map <- mvgam(\n    y ~ s(season, bs = 'cc'),\n    trend_map = trend_map,\n    trend_model = AR(),\n    data = mod_data,\n    run_model = FALSE\n  )\n\n  expect_true(identical(\n    mod_map$model_data$Z,\n    matrix(c(1, 0, 1, 0, 0, 1), ncol = 2, byrow = TRUE)\n  ))\n  expect_true(mod_map$use_lv)\n\n  # Ill-specified trend_map\n  trend_map <- data.frame(\n    series = c('series_1', 'series_1', 'series_2'),\n    trend = c(1, 1, 2)\n  )\n  expect_error(\n    mvgam(\n      y ~ s(season, bs = 'cc'),\n      trend_map = trend_map,\n      trend_model = AR(),\n      data = mod_data,\n      run_model = FALSE\n    ),\n    'Argument \"trend_map\" must have an entry for every unique time series in \"data\"',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"models with only random effects should work without error\", {\n  sim <- sim_mvgam(n_series = 3)\n  mod_data <- sim$data_train\n  mod_map <- mvgam(y ~ s(series, bs = 're'), data = mod_data, run_model = FALSE)\n  expect_true(inherits(mod_map, 'mvgam_prefit'))\n})\n\ntest_that(\"models with only fs smooths should work without error\", {\n  sim <- sim_mvgam(n_series = 3)\n  mod_data <- sim$data_train\n  mod_map <- mvgam(\n    y ~ s(season, series, bs = 'fs'),\n    data = mod_data,\n    run_model = FALSE\n  )\n  expect_true(inherits(mod_map, 'mvgam_prefit'))\n})\n\ntest_that(\"trend_formula setup is working properly\", {\n  sim <- sim_mvgam(n_series = 3)\n  mod_data <- sim$data_train\n  mod_map <- mvgam(\n    y ~ s(series, bs = 're'),\n    trend_formula = ~ s(season, bs = 'cc'),\n    trend_model = AR(),\n    data = mod_data,\n    run_model = FALSE\n  )\n  expect_true(identical(\n    mod_map$model_data$Z,\n    matrix(c(1, 0, 0, 0, 1, 0, 0, 0, 1), nrow = 3, byrow = TRUE)\n  ))\n  expect_true(mod_map$use_lv)\n  expect_true(!is.null(mod_map$trend_mgcv_model))\n  expect_equal(\n    colnames(model.frame(mod_map, trend_effects = TRUE)),\n    c('trend_y', 'season')\n  )\n\n  expect_equal(colnames(get_data(mod_map)), c('y', 'series', 'time', 'season'))\n\n  expect_error(\n    mvgam(\n      y ~ 1,\n      trend_formula = 1 ~\n        s(series, bs = 're') +\n        s(season, bs = 'cc'),\n      trend_model = AR(),\n      data = mod_data,\n      run_model = FALSE\n    ),\n    'Argument \"trend_formula\" should not have a left-hand side',\n    fixed = TRUE\n  )\n\n  expect_error(\n    mvgam(\n      y ~ 1,\n      trend_formula = ~ s(series, bs = 're') + s(season, bs = 'cc'),\n      trend_model = AR(),\n      data = mod_data,\n      run_model = FALSE\n    ),\n    'Argument \"trend_formula\" should not have the identifier \"series\" in it.\\nUse \"trend\" instead for varying effects',\n    fixed = TRUE\n  )\n})\n\n# Check that parametric effect priors are properly incorporated in the\n# model for a wide variety of model forms\ntest_that(\"parametric effect priors correctly incorporated in models\", {\n  mod_data <- mvgam:::mvgam_examp_dat\n  mod_data$data_train$x1 <-\n    rnorm(NROW(mod_data$data_train))\n  mod_data$data_train$x2 <-\n    rnorm(NROW(mod_data$data_train))\n  mod_data$data_train$x3 <-\n    rnorm(NROW(mod_data$data_train))\n\n  # Observation formula; no trend\n  mod <- mvgam(\n    y ~ s(season) + series:x1 + series:x2 + series:x3,\n    trend_model = 'None',\n    data = mod_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  expect_true(any(grepl(\n    '// prior for seriesseries_2:x1...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// prior for (Intercept)...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  para_names <- paste0(paste0(\n    '// prior for seriesseries_',\n    1:2,\n    paste0(':x', 1:3, '...')\n  ))\n  for (i in seq_along(para_names)) {\n    expect_true(any(grepl(para_names[i], mod$model_file, fixed = TRUE)))\n  }\n\n  priors <- get_mvgam_priors(\n    y ~ s(season) + series:x1 + series:x2 + series:x3,\n    trend_model = 'None',\n    data = mod_data$data_train,\n    family = gaussian()\n  )\n  expect_true(any(grepl('seriesseries_1:x2', priors$param_name)))\n  expect_true(any(grepl('seriesseries_2:x3', priors$param_name)))\n\n  # Observation formula; complex trend\n  mod <- mvgam(\n    y ~ s(season) + series:x1 + series:x2 + series:x3,\n    trend_model = VAR(ma = TRUE),\n    data = mod_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  expect_true(any(grepl(\n    '// prior for seriesseries_2:x1...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    '// prior for (Intercept)...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  para_names <- paste0(paste0(\n    '// prior for seriesseries_',\n    1:2,\n    paste0(':x', 1:3, '...')\n  ))\n  for (i in seq_along(para_names)) {\n    expect_true(any(grepl(para_names[i], mod$model_file, fixed = TRUE)))\n  }\n\n  priors <- get_mvgam_priors(\n    y ~ s(season) + series:x1 + series:x2 + series:x3,\n    trend_model = VAR(ma = TRUE),\n    data = mod_data$data_train,\n    family = gaussian()\n  )\n  expect_true(any(grepl('seriesseries_1:x2', priors$param_name)))\n  expect_true(any(grepl('seriesseries_2:x3', priors$param_name)))\n\n  # Trend formula; RW\n  mod <- mvgam(\n    y ~ 1,\n    trend_formula = ~ s(season) + trend:x1 + trend:x2 + trend:x3,\n    trend_model = RW(),\n    data = mod_data$data_train,\n    noncentred = TRUE,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  expect_true(any(grepl(\n    '// prior for (Intercept)...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  para_names <- paste0(paste0(\n    '// prior for trendtrend',\n    1:2,\n    paste0(':x', 1:3, '_trend...')\n  ))\n  for (i in seq_along(para_names)) {\n    expect_true(any(grepl(para_names[i], mod$model_file, fixed = TRUE)))\n  }\n\n  priors <- get_mvgam_priors(\n    y ~ 1,\n    trend_formula = ~ s(season) + trend:x1 + trend:x2 + trend:x3,\n    trend_model = RW(),\n    data = mod_data$data_train,\n    family = gaussian()\n  )\n  expect_true(any(grepl('trendtrend1:x1_trend', priors$param_name)))\n  expect_true(any(grepl('trendtrend2:x3_trend', priors$param_name)))\n\n  # Trend formula; VARMA\n  mod <- mvgam(\n    y ~ 1,\n    trend_formula = ~ s(season) + trend:x1 + trend:x2 + trend:x3,\n    trend_model = VAR(ma = TRUE),\n    data = mod_data$data_train,\n    family = gaussian(),\n    run_model = FALSE\n  )\n\n  expect_true(any(grepl(\n    '// prior for (Intercept)...',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  para_names <- paste0(paste0(\n    '// prior for trendtrend',\n    1:2,\n    paste0(':x', 1:3, '_trend...')\n  ))\n  for (i in seq_along(para_names)) {\n    expect_true(any(grepl(para_names[i], mod$model_file, fixed = TRUE)))\n  }\n\n  priors <- get_mvgam_priors(\n    y ~ 1,\n    trend_formula = ~ s(season) + trend:x1 + trend:x2 + trend:x3,\n    trend_model = RW(),\n    data = mod_data$data_train,\n    family = gaussian()\n  )\n  expect_true(any(grepl('trendtrend1:x1_trend', priors$param_name)))\n  expect_true(any(grepl('trendtrend2:x3_trend', priors$param_name)))\n})\n"
  },
  {
    "path": "tests/testthat/test-mvgam_priors.R",
    "content": "context(\"mvgam_priors\")\n\ntest_that(\"drift deprecation message works\", {\n  expect_message(\n    get_mvgam_priors(\n      y ~\n        s(series, bs = 're') +\n        s(season, bs = 'cc', k = 8) +\n        s(time, bs = 'moi', k = 8),\n      trend_model = RW(ma = TRUE),\n      drift = TRUE,\n      data = gaus_data$data_train,\n      family = gaussian()\n    ),\n    'The \"drift\" argument is deprecated; use fixed effects of \"time\" instead'\n  )\n})\n\n# Generating this many model skeletons takes time; CRAN will complain\nskip_on_cran()\n\ntest_that(\"get_mvgam_priors works for a variety of ma and cor trends\", {\n  priors <- get_mvgam_priors(\n    y ~ s(season, k = 7),\n    trend_model = RW(),\n    family = gaussian(),\n    data = mvgam:::mvgam_examp_dat$data_train\n  )\n  expect_true(inherits(priors, 'data.frame'))\n\n  priors <- get_mvgam_priors(\n    y ~ s(season, k = 7),\n    trend_model = RW(),\n    family = gaussian(),\n    data = mvgam:::mvgam_examp_dat$data_train\n  )\n  expect_true(inherits(priors, 'data.frame'))\n\n  priors <- get_mvgam_priors(\n    y ~ s(season, k = 7),\n    trend_model = RW(ma = TRUE),\n    family = gaussian(),\n    data = mvgam:::mvgam_examp_dat$data_train\n  )\n  expect_true(inherits(priors, 'data.frame'))\n\n  priors <- get_mvgam_priors(\n    y ~ s(season, k = 7),\n    trend_model = AR(p = 2, ma = TRUE, cor = TRUE),\n    family = gaussian(),\n    data = mvgam:::mvgam_examp_dat$data_train\n  )\n  expect_true(inherits(priors, 'data.frame'))\n\n  priors <- get_mvgam_priors(\n    y ~ 1,\n    trend_formula = ~ s(season, k = 7),\n    trend_model = RW(ma = TRUE, cor = TRUE),\n    family = gaussian(),\n    data = mvgam:::mvgam_examp_dat$data_train\n  )\n  expect_true(inherits(priors, 'data.frame'))\n})\n\n\ntest_that(\"get_mvgam_priors finds all classes for which priors can be specified\", {\n  beta_data$data_train$cov <- rnorm(NROW(beta_data$data_train))\n  beta_data$data_train$cov2 <- rnorm(NROW(beta_data$data_train))\n\n  expect_equal(\n    get_mvgam_priors(\n      y ~\n        s(season) +\n        cov +\n        cov2 +\n        cov * cov2,\n      data = beta_data$data_train,\n      family = betar()\n    )$param_info,\n\n    c(\n      \"(Intercept)\",\n      \"cov fixed effect\",\n      \"cov2 fixed effect\",\n      \"cov:cov2 fixed effect\",\n      \"s(season) smooth parameters\",\n      \"Beta precision parameter\"\n    )\n  )\n})\n\ntest_that(\"family must be correctly specified\", {\n  expect_error(\n    get_mvgam_priors(\n      y ~ s(season),\n      trend_model = AR(),\n      data = beta_data$data_train,\n      family = 'besta'\n    ),\n    'family not recognized'\n  )\n})\n\ntest_that(\"trend_model must be correctly specified\", {\n  expect_error(get_mvgam_priors(\n    y ~ s(season),\n    trend_model = 'AR11',\n    data = beta_data$data_train,\n    family = betar()\n  ))\n})\n\ntest_that(\"response variable must follow family-specific restrictions\", {\n  expect_error(\n    get_mvgam_priors(\n      y ~ s(season),\n      trend_model = AR(),\n      data = gaus_data$data_train,\n      family = lognormal()\n    ),\n    'Values <= 0 not allowed for lognormal responses'\n  )\n\n  expect_error(\n    get_mvgam_priors(\n      y ~ s(season),\n      trend_model = AR(),\n      data = gaus_data$data_train,\n      family = poisson()\n    ),\n    'Values < 0 not allowed for count family responses'\n  )\n})\n\ntest_that(\"default intercept prior should match brms implementation\", {\n  simdat <- sim_mvgam(family = gaussian(), mu = 500)\n  def_prior <- get_mvgam_priors(\n    y ~ s(season),\n    trend_model = AR(),\n    data = simdat$data_train,\n    family = gaussian()\n  )$prior[1]\n\n  expect_equal(\n    trimws(strsplit(def_prior, \"[~]\")[[1]][2]),\n    paste0(\n      brms::get_prior(\n        y ~ 1,\n        data = data.frame(y = simdat$data_train$y),\n        family = gaussian()\n      )$prior[1],\n      ';'\n    )\n  )\n\n  # Now try Student\n  def_prior <- get_mvgam_priors(\n    y ~ s(season),\n    trend_model = AR(),\n    data = simdat$data_train,\n    family = student_t()\n  )$prior[1]\n\n  expect_equal(\n    trimws(strsplit(def_prior, \"[~]\")[[1]][2]),\n    paste0(\n      brms::get_prior(\n        y ~ 1,\n        data = data.frame(y = simdat$data_train$y),\n        family = student_t()\n      )$prior[1],\n      ';'\n    )\n  )\n\n  # Now Poisson\n  simdat <- sim_mvgam(family = poisson(), mu = 0)\n  def_prior <- get_mvgam_priors(\n    y ~ s(season),\n    trend_model = AR(),\n    data = simdat$data_train,\n    family = poisson()\n  )$prior[1]\n\n  expect_equal(\n    trimws(strsplit(def_prior, \"[~]\")[[1]][2]),\n    paste0(\n      brms::get_prior(\n        y ~ 1,\n        data = data.frame(y = simdat$data_train$y),\n        family = poisson()\n      )$prior[1],\n      ';'\n    )\n  )\n\n  # Now Beta\n  simdat <- sim_mvgam(family = betar(), mu = 0)\n  def_prior <- get_mvgam_priors(\n    y ~ s(season),\n    trend_model = AR(),\n    data = simdat$data_train,\n    family = betar()\n  )$prior[1]\n\n  expect_equal(\n    trimws(strsplit(def_prior, \"[~]\")[[1]][2]),\n    paste0(\n      brms::get_prior(\n        y ~ 1,\n        data = data.frame(y = simdat$data_train$y),\n        family = brms::Beta()\n      )$prior[1],\n      ';'\n    )\n  )\n\n  # Now Negative Binomial\n  simdat <- sim_mvgam(family = nb(), mu = 0)\n  def_prior <- get_mvgam_priors(\n    y ~ s(season),\n    trend_model = AR(),\n    data = simdat$data_train,\n    family = nb()\n  )$prior[1]\n\n  expect_equal(\n    trimws(strsplit(def_prior, \"[~]\")[[1]][2]),\n    paste0(\n      brms::get_prior(\n        y ~ 1,\n        data = data.frame(y = simdat$data_train$y),\n        family = brms::negbinomial()\n      )$prior[1],\n      ';'\n    )\n  )\n})\n\ntest_that(\"specified priors appear in the Stan code\", {\n  priors <- get_mvgam_priors(\n    formula = y ~ s(season, bs = 'cc'),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    family = betar()\n  )\n  priors$prior[3] <- \"alpha_gp ~ normal(-1, 0.75);\"\n  stancode <- mvgam(\n    y ~ s(season, bs = 'cc'),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    family = betar(),\n    priors = priors,\n    run_model = FALSE\n  )$model_file\n  expect_true(expect_match2(\n    gsub(' ', '', stancode),\n    'alpha_gp~normal(-1,0.75);'\n  ))\n\n  # Now the same using brms functionality\n  priors <- prior(normal(-1, 0.75), class = alpha_gp)\n  stancode <- mvgam(\n    y ~ s(season, bs = 'cc'),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    family = betar(),\n    priors = priors,\n    run_model = FALSE\n  )$model_file\n  expect_true(expect_match2(stancode, 'alpha_gp ~ normal(-1, 0.75);'))\n  expect_true(expect_match2(\n    gsub(' ', '', stancode),\n    'vector<lower=0>[n_series]alpha_gp;'\n  ))\n})\n\ntest_that(\"specified trend_formula priors appear in the Stan code\", {\n  priors <- get_mvgam_priors(\n    formula = y ~ 1,\n    trend_formula = ~ s(season, bs = 'cc') +\n      year,\n    trend_model = AR(),\n    data = beta_data$data_train,\n    family = betar()\n  )\n  priors$prior[5] <- \"year_trend ~ uniform(-2, 1);\"\n\n  stancode <- mvgam(\n    formula = y ~ 1,\n    trend_formula = ~ s(season, bs = 'cc') +\n      year,\n    trend_model = AR(),\n    data = beta_data$data_train,\n    family = betar(),\n    priors = priors,\n    run_model = FALSE\n  )$model_file\n  expect_true(expect_match2(\n    gsub(' ', '', stancode),\n    'b_raw_trend[1]~uniform(-2,1);'\n  ))\n})\n\n\ntest_that(\"priors on parametric effects behave correctly\", {\n  priors <- get_mvgam_priors(\n    formula = y ~ s(season, bs = 'cc'),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    family = betar()\n  )\n  priors$prior[1] <- \"(Intercept) ~ normal(-1, 0.75);\"\n  stancode <- mvgam(\n    y ~ s(season, bs = 'cc'),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    family = betar(),\n    priors = priors,\n    run_model = FALSE\n  )$model_file\n  expect_true(expect_match2(\n    gsub(' ', '', stancode),\n    'b_raw[1]~normal(-1,0.75);'\n  ))\n\n  # Now the same using brms functionality\n  priors <- prior(normal(-1, 0.75), class = Intercept)\n  stancode <- mvgam(\n    formula = y ~ s(season, bs = 'cc'),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    family = betar(),\n    priors = priors,\n    run_model = FALSE\n  )$model_file\n  expect_true(expect_match2(\n    gsub(' ', '', stancode),\n    'b_raw[1]~normal(-1,0.75);'\n  ))\n\n  # Bounds not allowed on parametric effect priors yet\n  priors <- prior(normal(-1, 0.75), class = `Intercept`, lb = 0)\n  expect_warning(mvgam(\n    formula = y ~ s(season, bs = 'cc'),\n    trend_model = GP(),\n    data = beta_data$data_train,\n    family = betar(),\n    priors = priors,\n    run_model = FALSE\n  ))\n})\n\n\ntest_that(\"priors on gp() effects work properly\", {\n  dat <- sim_mvgam()\n\n  priors <- c(\n    prior(normal(0, 0.5), class = `alpha_gp(time):seriesseries_1`, ub = 1),\n    prior(normal(5, 1.3), class = `rho_gp_trend(season)[1]`, ub = 50)\n  )\n\n  expect_warning(\n    mvgam(\n      formula = y ~ gp(time, by = series, scale = FALSE, k = 10),\n      trend_formula = ~ gp(season, scale = FALSE, k = 10),\n      trend_model = AR(),\n      data = dat$data_train,\n      run_model = FALSE,\n      priors = priors\n    ),\n    'bounds cannot currently be changed for gp parameters'\n  )\n\n  priors <- c(\n    prior(normal(0, 0.5), class = `alpha_gp(time):seriesseries_1`),\n    prior(normal(5, 1.3), class = `rho_gp_trend(season)[1]`)\n  )\n\n  mod <- mvgam(\n    formula = y ~ gp(time, by = series, scale = FALSE, k = 10),\n    trend_formula = ~ gp(season, scale = FALSE, k = 10),\n    trend_model = AR(),\n    data = dat$data_train,\n    run_model = FALSE,\n    priors = priors\n  )\n\n  # Observation model priors working\n  expect_true(any(grepl(\n    'alpha_gp_time_byseriesseries_1~normal(0,0.5);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # Process model priors working\n  expect_true(any(grepl(\n    'rho_gp_trend_season_[1]~normal(5,1.3);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n\n  # A quick test of multidimensional gp priors\n  dat <- mgcv::gamSim(1, n = 30, scale = 2)\n\n  mod <- mvgam(\n    y ~ gp(x1, x2, cov = \"matern32\", k = 10, iso = FALSE, scale = FALSE),\n    data = dat,\n    family = gaussian(),\n    priors = c(\n      prior(exponential(2.5), class = `alpha_gp(x1, x2)`),\n      prior(normal(0.5, 1), class = `rho_gp(x1, x2)[1][1]`),\n      prior(normal(0.75, 2), class = `rho_gp(x1, x2)[1][2]`)\n    ),\n    run_model = FALSE\n  )\n\n  expect_true(any(grepl(\n    'alpha_gp_x1by_x2_~exponential(2.5);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'rho_gp_x1by_x2_[1][1]~normal(0.5,1);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(any(grepl(\n    'rho_gp_x1by_x2_[1][2]~normal(0.75,2);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n})\n"
  },
  {
    "path": "tests/testthat/test-nmixture.R",
    "content": "context(\"n_mixture\")\n\n# Simulations take a bit of time to set up\nskip_on_cran()\n\nset.seed(100)\npoisdat <- sim_mvgam()\n\ntest_that(\"only count data allowed for nmixtures\", {\n  gaus_data$data_train$cap <- 100\n  expect_error(\n    mvgam(\n      y ~ s(season),\n      trend_formula = ~trend,\n      family = nmix(),\n      data = gaus_data$data_train\n    ),\n    'Values < 0 not allowed for count family responses',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"cap must be supplied in data\", {\n  expect_error(\n    get_mvgam_priors(\n      formula = y ~ s(season),\n      trend_formula = ~ s(season) +\n        trend,\n      trend_model = 'None',\n      family = nmix(),\n      data = poisdat$data_train\n    ),\n    'Max abundances must be supplied as a variable named \"cap\" for N-mixture models',\n    fixed = TRUE\n  )\n\n  poisdat$data_train$cap <- rpois(NROW(poisdat$data_train), lambda = 5) +\n    max(poisdat$data_train$y, na.rm = TRUE)\n  expect_error(\n    mvgam(\n      formula = y ~ s(season),\n      trend_formula = ~ s(season) +\n        trend,\n      trend_model = 'None',\n      family = nmix(),\n      data = poisdat$data_train,\n      newdata = poisdat$data_test\n    ),\n    '\"data\" and \"newdata\" have different numbers of columns',\n    fixed = TRUE\n  )\n\n  poisdat$data_test$emu <- 50\n  expect_error(\n    mvgam(\n      formula = y ~ s(season),\n      trend_formula = ~ s(season) +\n        trend,\n      trend_model = 'None',\n      family = nmix(),\n      data = poisdat$data_train,\n      newdata = poisdat$data_test\n    ),\n    'Max abundances must be supplied in test data as a variable named \"cap\" for N-mixture models',\n    fixed = TRUE\n  )\n})\n\npoisdat$data_train$cap <- rpois(NROW(poisdat$data_train), lambda = 5) +\n  max(poisdat$data_train$y, na.rm = TRUE)\npoisdat$data_test$cap <- rpois(NROW(poisdat$data_test), lambda = 5) +\n  max(poisdat$data_test$y, na.rm = TRUE)\n\ntest_that(\"latent process intercept is allowed in nmixtures\", {\n  prior_df <- get_mvgam_priors(\n    formula = y ~ s(season),\n    trend_formula = ~ s(season) +\n      trend,\n    trend_model = 'None',\n    family = nmix(),\n    data = poisdat$data_train\n  )\n  expect_true(any(grepl(\n    '(Intercept)_trend',\n    prior_df$param_name,\n    fixed = TRUE\n  )))\n\n  mod <- mvgam(\n    formula = y ~ s(season),\n    trend_formula = ~ s(season) +\n      trend,\n    trend_model = 'None',\n    family = nmix(),\n    data = poisdat$data_train,\n    newdata = poisdat$data_test,\n    priors = prior(std_normal(), class = '(Intercept)_trend'),\n    run_model = FALSE\n  )\n  expect_true(any(grepl('(Intercept)_trend', mod$model_file, fixed = TRUE)))\n  expect_true(any(grepl(\n    'b_raw_trend[1] ~ std_normal();',\n    mod$model_file,\n    fixed = TRUE\n  )))\n\n  # Can also test that 'cap' is properly included in model_data\n  # The caps should be arranged by series and then by time\n  train_cap = poisdat$data_train %>%\n    dplyr::arrange(series, time) %>%\n    dplyr::pull(cap)\n  test_cap = poisdat$data_test %>%\n    dplyr::arrange(series, time) %>%\n    dplyr::pull(cap)\n  expect_true(all(mod$model_data$cap == c(train_cap, test_cap)))\n})\n\n# Check that the model fits and post-processing works using the\n# example from the families man page\ntest_that(\"nmix() post-processing works\", {\n  set.seed(0)\n  data.frame(\n    site = 1,\n    # five replicates per year; six years\n    replicate = rep(1:5, 6),\n    time = sort(rep(1:6, 5)),\n    species = 'sp_1',\n    # true abundance declines nonlinearly\n    truth = c(\n      rep(28, 5),\n      rep(26, 5),\n      rep(23, 5),\n      rep(16, 5),\n      rep(14, 5),\n      rep(14, 5)\n    ),\n    # observations are taken with detection prob = 0.7\n    obs = c(\n      rbinom(5, 28, 0.7),\n      rbinom(5, 26, 0.7),\n      rbinom(5, 23, 0.7),\n      rbinom(5, 15, 0.7),\n      rbinom(5, 14, 0.7),\n      rbinom(5, 14, 0.7)\n    )\n  ) %>%\n    # add 'series' information, which is an identifier of site, replicate and species\n    dplyr::mutate(\n      series = paste0('site_', site, '_', species, '_rep_', replicate),\n      time = as.numeric(time),\n      # add a 'cap' variable that defines the maximum latent N to\n      # marginalize over when estimating latent abundance; in other words\n      # how large do we realistically think the true abundance could be?\n      cap = 100\n    ) %>%\n    dplyr::select(-replicate) -> testdat\n\n  # Now add another species that has a different temporal trend and a smaller\n  # detection probability (0.45 for this species)\n  testdat = testdat %>%\n    dplyr::bind_rows(\n      data.frame(\n        site = 1,\n        replicate = rep(1:5, 6),\n        time = sort(rep(1:6, 5)),\n        species = 'sp_2',\n        truth = c(\n          rep(4, 5),\n          rep(7, 5),\n          rep(15, 5),\n          rep(16, 5),\n          rep(19, 5),\n          rep(18, 5)\n        ),\n        obs = c(\n          rbinom(5, 4, 0.45),\n          rbinom(5, 7, 0.45),\n          rbinom(5, 15, 0.45),\n          rbinom(5, 16, 0.45),\n          rbinom(5, 19, 0.45),\n          rbinom(5, 18, 0.45)\n        )\n      ) %>%\n        dplyr::mutate(\n          series = paste0('site_', site, '_', species, '_rep_', replicate),\n          time = as.numeric(time),\n          cap = 50\n        ) %>%\n        dplyr::select(-replicate)\n    )\n\n  # series identifiers\n  testdat$species <- factor(testdat$species, levels = unique(testdat$species))\n  testdat$series <- factor(testdat$series, levels = unique(testdat$series))\n\n  # The trend_map to state how replicates are structured\n  testdat %>%\n    # each unique combination of site*species is a separate process\n    dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n    dplyr::select(trend, series) %>%\n    dplyr::distinct() -> trend_map\n\n  # Fit a model\n  mod <- SW(mvgam(\n    # the observation formula sets up linear predictors for\n    # detection probability on the logit scale\n    formula = obs ~ species - 1,\n\n    # the trend_formula sets up the linear predictors for\n    # the latent abundance processes on the log scale\n    trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n    # the trend_map takes care of the mapping\n    trend_map = trend_map,\n\n    # nmix() family and data\n    family = nmix(),\n    data = testdat,\n\n    # priors can be set in the usual way\n    priors = c(\n      prior(std_normal(), class = b),\n      prior(normal(1, 1.5), class = Intercept_trend)\n    ),\n    samples = 300,\n    residuals = FALSE,\n    chains = 2,\n    silent = 2\n  ))\n\n  expect_no_error(capture_output(summary(mod)))\n  expect_no_error(capture_output(plot(mod, type = 'pterms')))\n  expect_no_error(capture_output(plot(\n    mod,\n    type = 'pterms',\n    trend_effects = TRUE\n  )))\n  expect_no_error(capture_output(print(mod)))\n  expect_true(inherits(hindcast(mod), 'mvgam_forecast'))\n  expect_true(inherits(hindcast(mod, type = 'latent_N'), 'mvgam_forecast'))\n  expect_true(inherits(hindcast(mod, type = 'detection'), 'mvgam_forecast'))\n\n  preds <- predict(mod, summary = FALSE, type = 'response')\n  expect_true(NCOL(preds) == NROW(testdat))\n  expect_true(all(preds >= 0L))\n\n  preds <- predict(mod, summary = FALSE, type = 'detection')\n  expect_true(NCOL(preds) == NROW(testdat))\n  expect_true(all(preds <= 1L & preds >= 0L))\n\n  preds <- predict(mod, summary = FALSE, type = 'latent_N')\n  expect_true(NCOL(preds) == NROW(testdat))\n  expect_true(all(preds >= 0L))\n\n  expect_no_error(plot(mod, type = 'smooths', trend_effects = TRUE))\n  expect_no_error(plot(\n    mod,\n    type = 'smooths',\n    realisations = TRUE,\n    trend_effects = TRUE\n  ))\n  expect_no_error(plot(\n    mod,\n    type = 'smooths',\n    residuals = TRUE,\n    trend_effects = TRUE\n  ))\n  options(mc.cores = 1)\n  expect_loo(SW(loo(mod)))\n})\n"
  },
  {
    "path": "tests/testthat/test-offset.R",
    "content": "context(\"offsets\")\n\nskip_on_cran()\n\ntest_that(\"offset incorporated into link-level linpred for beta\", {\n  beta_data$data_train$pop <- as.numeric(beta_data$data_train$series) + 0.5\n  beta_data$data_test$pop <- as.numeric(beta_data$data_test$series) + 0.5\n  testmod <- mvgam(\n    y ~\n      s(season, bs = 'cc') +\n      offset(pop) +\n      s(series, bs = 're'),\n    trend_model = 'GP',\n    data = beta_data$data_train,\n    family = betar(),\n    run_model = FALSE\n  )\n  stancode <- testmod$model_file\n\n  # Offset should be recorded in the mgcv model\n  expect_true(!is.null(attr(testmod$mgcv_model$terms, 'offset')))\n\n  # Offset should be in the linpred calculation\n  expect_true(expect_match2(stancode, 'eta = X * b + off_set;'))\n\n  # Offset should be inv_logit in the model declaration\n  expect_true(expect_match2(\n    stancode,\n    '* append_row(b, 1.0) + off_set[obs_ind])'\n  ))\n\n  # Offset should be provided in 'data'\n  expect_true(expect_match2(stancode, 'vector[total_obs] off_set;'))\n\n  # Data for the offset vector should also be incorporated\n  # in model_data\n  expect_true(!is.null(testmod$model_data$off_set))\n})\n\ntest_that(\"offset incorporated into link-level linpred for NB\", {\n  data = data.frame(\n    out = rpois(100, lambda = 5),\n    pop = rnorm(100),\n    time = 1:100\n  )\n  testmod <- mvgam(\n    out ~\n      1 +\n      offset(pop),\n    trend_model = 'GP',\n    data = data,\n    family = nb(),\n    run_model = FALSE\n  )\n  stancode <- testmod$model_file\n\n  # Offset should be recorded in the mgcv model\n  expect_true(!is.null(attr(testmod$mgcv_model$terms, 'offset')))\n\n  # Offset should be in the linpred calculation\n  expect_true(expect_match2(stancode, 'eta = X * b + off_set;'))\n\n  # Offset should be exponentiated in the model declaration\n  expect_true(expect_match2(\n    stancode,\n    '* append_row(b, 1.0) + off_set[obs_ind])'\n  ))\n\n  # Offset should be provided in 'data'\n  expect_true(expect_match2(stancode, 'vector[total_obs] off_set;'))\n\n  # Data for the offset vector should also be incorporated\n  # in model_data\n  expect_true(!is.null(testmod$model_data$off_set))\n})\n\n\ntest_that(\"offset not allowed in trend_formula\", {\n  data = data.frame(\n    out = rpois(100, lambda = 5),\n    x = rnorm(100),\n    pop = rnorm(100),\n    time = 1:100\n  )\n  expect_error(\n    mvgam(\n      out ~ 1,\n      trend_formula = ~ x + offset(pop),\n      trend_model = 'AR1',\n      data = data,\n      family = nb(),\n      run_model = FALSE\n    ),\n    'Offsets not allowed in argument \"trend_formula\"'\n  )\n})\n\ntest_that(\"offset works when no intercept is provided\", {\n  simdat <- sim_mvgam()\n  simdat$data_train$offset <- rep(log(100), NROW(simdat$data_train))\n  mod <- mvgam(\n    formula = y ~ offset(offset) - 1,\n    trend_formula = ~ s(season),\n    trend_model = RW(),\n    data = simdat$data_train,\n    run_model = FALSE\n  )\n  stancode <- mod$model_file\n\n  # Offset should be recorded in the mgcv model\n  expect_true(!is.null(attr(mod$mgcv_model$terms, 'offset')))\n\n  # Offset should be in the linpred calculation\n  expect_true(expect_match2(stancode, 'eta = X * b + off_set;'))\n\n  # Offset should be provided in 'data'\n  expect_true(expect_match2(stancode, 'vector[total_obs] off_set;'))\n\n  # Offset should be in model_data\n  expect_true(!is.null(mod$model_data$off_set))\n})\n"
  },
  {
    "path": "tests/testthat/test-piecewise.R",
    "content": "context(\"piecewise\")\n# Simulate data from a piecewise logistic trend\nts <- mvgam:::piecewise_logistic(\n  t = 1:100,\n  cap = 8.5,\n  deltas = extraDistr::rlaplace(10, 0, 0.025),\n  k = 0.075,\n  m = 0,\n  changepoint_ts = sample(1:100, 10)\n)\ny <- rnorm(100, ts, 0.75)\n\n# Don't put 'cap' variable in dataframe\ndf <- data.frame(\n  y = y,\n  time = 1:100,\n  series = as.factor('series1'),\n  #cap = 8.75,\n  fake = rnorm(100)\n)\n\ntest_that(\"logistic should error if cap is missing\", {\n  expect_error(\n    mvgam(\n      formula = y ~ 0,\n      data = df,\n      trend_model = PW(growth = 'logistic', n_changepoints = 10),\n      # priors = prior(normal(2, 5), class = k_trend),\n      family = gaussian(),\n      run_model = TRUE,\n      return_model_data = TRUE\n    ),\n    'Capacities must be supplied as a variable named \"cap\" for logistic growth'\n  )\n})\n\n# Now include some missing values in 'cap'\ndf <- data.frame(\n  y = y,\n  time = 1:100,\n  series = as.factor('series1'),\n  cap = sample(c(8.75, NA), 100, TRUE),\n  fake = rnorm(100)\n)\n\ntest_that(\"logistic should error if cap has NAs\", {\n  expect_error(\n    mvgam(\n      formula = y ~ 0,\n      data = df,\n      trend_model = PW(growth = 'logistic', n_changepoints = 10),\n      priors = prior(normal(2, 5), class = k_trend),\n      family = gaussian(),\n      run_model = TRUE,\n      return_model_data = TRUE\n    ),\n    'Missing values found for some \"cap\" terms'\n  )\n})\n\n# Missing values can also happen when transforming to the link scale\ny <- rpois(100, ts + 5)\ndf <- data.frame(\n  y = y,\n  time = 1:100,\n  series = as.factor('series1'),\n  cap = -1,\n  fake = rnorm(100)\n)\n\ntest_that(\"logistic should error if cap has NAs after link transformation\", {\n  expect_error(\n    mvgam(\n      formula = y ~ 0,\n      data = df,\n      trend_model = PW(growth = 'logistic', n_changepoints = 10),\n      family = poisson(),\n      run_model = TRUE,\n      return_model_data = TRUE\n    ),\n    paste0(\n      'Missing or infinite values found for some \"cap\" terms\\n',\n      'after transforming to the log link scale'\n    )\n  )\n})\n\n# Make sure cap is in the right order\ny <- rpois(100, ts + 5)\ndf <- rbind(\n  data.frame(\n    y = y,\n    time = 1:100,\n    series = as.factor('series1'),\n    cap = y + 20,\n    fake = rnorm(100)\n  ),\n  data.frame(\n    y = y + 2,\n    time = 1:100,\n    series = as.factor('series2'),\n    cap = y + 22,\n    fake = rnorm(100)\n  )\n)\n\ntest_that(\"logistic caps should be included in the correct order\", {\n  skip_on_cran()\n  mod <- mvgam(\n    formula = y ~ 0,\n    data = df,\n    trend_model = PW(growth = 'logistic', n_changepoints = 10),\n    family = poisson(),\n    run_model = FALSE,\n    return_model_data = TRUE\n  )\n\n  # caps should now be logged and in a matrix [1:n_timepoints, 1:n_series]\n  expect_true(all(\n    mod$model_data$cap ==\n      log(cbind(\n        df %>%\n          dplyr::filter(series == 'series1') %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(cap),\n        df %>%\n          dplyr::filter(series == 'series2') %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(cap)\n      ))\n  ))\n\n  # Should also work for list data\n  df_list <- list(\n    series = df$series,\n    time = df$time,\n    cap = df$cap,\n    y = df$y,\n    fake = df$fake\n  )\n\n  mod <- mvgam(\n    formula = y ~ 0,\n    data = df_list,\n    trend_model = PW(growth = 'logistic', n_changepoints = 10),\n    family = poisson(),\n    run_model = FALSE,\n    return_model_data = TRUE\n  )\n\n  # caps should now be logged and in a matrix [1:n_timepoints, 1:n_series]\n  expect_true(all(\n    mod$model_data$cap ==\n      log(cbind(\n        df %>%\n          dplyr::filter(series == 'series1') %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(cap),\n        df %>%\n          dplyr::filter(series == 'series2') %>%\n          dplyr::arrange(time) %>%\n          dplyr::pull(cap)\n      ))\n  ))\n})\n\ntest_that(\"piecewise models fit and forecast without error\", {\n  skip_on_cran()\n  # Example of logistic growth with possible changepoints\n  # Simple logistic growth model\n  dNt = function(r, N, k) {\n    r * N * (k - N)\n  }\n\n  # Iterate growth through time\n  Nt = function(r, N, t, k) {\n    for (i in 1:(t - 1)) {\n      # population at next time step is current population + growth,\n      # but we introduce several 'shocks' as changepoints\n      if (i %in% c(5, 15, 25, 41, 45, 60, 80)) {\n        N[i + 1] <- max(1, N[i] + dNt(r + runif(1, -0.1, 0.1), N[i], k))\n      } else {\n        N[i + 1] <- max(1, N[i] + dNt(r, N[i], k))\n      }\n    }\n    N\n  }\n\n  # Simulate expected values\n  set.seed(555)\n  expected <- Nt(0.004, 2, 100, 30)\n\n  # Take Poisson draws\n  y <- rpois(100, expected)\n\n  # Assemble data into dataframe and model. We set a\n  # fixed carrying capacity of 35 for this example, but note that\n  # this value is not required to be fixed at each timepoint\n  mod_data <- data.frame(\n    y = y,\n    time = 1:100,\n    cap = 35,\n    series = as.factor('series_1')\n  )\n  dat_train <- mod_data %>%\n    dplyr::filter(time <= 90)\n  dat_test <- mod_data %>%\n    dplyr::filter(time > 90)\n\n  # The intercept is nonidentifiable when using piecewise\n  # trends because the trend functions have their own offset\n  # parameters 'm'; it is recommended to always drop intercepts\n  # when using these trend models\n  mod <- mvgam(\n    y ~ 0,\n    trend_model = PW(growth = 'logistic'),\n    family = poisson(),\n    data = dat_train,\n    chains = 2,\n    silent = 2\n  )\n  expect_no_error(capture_output(how_to_cite(mod)))\n\n  # Compute and plot forecasts\n  fc <- forecast(mod, newdata = dat_test, type = 'trend')\n  expect_no_error(capture_output(plot(fc)))\n\n  # Should also work for piecewise linear\n  mod <- SW(mvgam(\n    y ~ 0,\n    trend_model = PW(growth = 'linear', n_changepoints = 5),\n    family = poisson(),\n    data = dat_train,\n    chains = 2,\n    silent = 2\n  ))\n  # Compute and plot forecasts\n  fc <- forecast(mod, newdata = dat_test, type = 'trend')\n  expect_no_error(capture_output(plot(fc)))\n})\n"
  },
  {
    "path": "tests/testthat/test-sim_mvgam.R",
    "content": "context(\"sim_mvgam\")\n\n#### Test basic error and warning messages ####\ntest_that(\"family must be correctly specified\", {\n  expect_error(\n    sim_mvgam(family = 'bogan', trend_model = 'RW', trend_rel = 0.5),\n    'family not recognized'\n  )\n})\n\ntest_that(\"trend_model must be correctly specified\", {\n  expect_error(sim_mvgam(\n    family = gaussian(),\n    trend_model = 'AR4',\n    trend_rel = 0.5\n  ))\n})\n\ntest_that(\"trend_rel must be a valid proportion\", {\n  expect_error(\n    sim_mvgam(family = gaussian(), trend_model = 'AR2', trend_rel = -0.1),\n    \"Argument 'trend_rel' must be a proportion ranging from 0 to 1, inclusive\"\n  )\n})\n\ntest_that(\"n_lv must be a positive integer\", {\n  expect_error(\n    sim_mvgam(\n      family = gaussian(),\n      trend_model = 'AR2',\n      trend_rel = 0.4,\n      n_lv = 0.5\n    ),\n    \"Argument 'n_lv' must be a positive integer\"\n  )\n})\n\ntest_that(\"run sim AR and VAR functions for memory checks\", {\n  expect_no_error(capture_output(sim_mvgam(\n    family = gaussian(),\n    trend_model = RW()\n  )))\n  expect_no_error(capture_output(sim_mvgam(\n    family = gaussian(),\n    trend_model = AR(p = 1)\n  )))\n  expect_no_error(capture_output(sim_mvgam(\n    family = gaussian(),\n    trend_model = AR(p = 2)\n  )))\n  expect_no_error(capture_output(sim_mvgam(\n    family = gaussian(),\n    trend_model = AR(p = 3)\n  )))\n  expect_no_error(capture_output(sim_mvgam(\n    family = gaussian(),\n    trend_model = VAR()\n  )))\n  expect_no_error(capture_output(sim_mvgam(\n    family = gaussian(),\n    trend_model = VAR(cor = TRUE)\n  )))\n})\n"
  },
  {
    "path": "tests/testthat/test-summary-structure.R",
    "content": "context(\"summary structure\")\n\ntest_that(\"summary.mvgam returns structured object\", {\n  # Test with internal example object\n  summary_obj <- summary(mvgam:::mvgam_example1)\n\n  # Check class\n  expect_s3_class(summary_obj, \"mvgam_summary\")\n  expect_s3_class(summary_obj, \"list\")\n\n  # Check structure\n  expect_named(\n    summary_obj,\n    c(\"model_spec\", \"parameters\", \"diagnostics\", \"sampling_info\")\n  )\n\n  # Check that each component is a list\n  expect_type(summary_obj$model_spec, \"list\")\n  expect_type(summary_obj$parameters, \"list\")\n  expect_type(summary_obj$diagnostics, \"list\")\n  expect_type(summary_obj$sampling_info, \"list\")\n\n  # Check that model_spec has expected components\n  expect_named(\n    summary_obj$model_spec,\n    c(\n      \"formulas\",\n      \"family\",\n      \"link\",\n      \"trend_model\",\n      \"upper_bounds\",\n      \"latent_variables\",\n      \"dimensions\",\n      \"is_jsdgam\"\n    )\n  )\n})\n\ntest_that(\"print.mvgam_summary works\", {\n  summary_obj <- summary(mvgam:::mvgam_example1)\n\n  # Should print without error\n  expect_no_error(capture_output(print(summary_obj)))\n\n  # Should return object invisibly\n  result <- capture_output(returned_obj <- print(summary_obj))\n  expect_identical(summary_obj, returned_obj)\n})\n\ntest_that(\"summary can be saved and reloaded\", {\n  summary_obj <- summary(mvgam:::mvgam_example1)\n\n  # Save to temporary file\n  temp_file <- tempfile(fileext = \".rds\")\n  saveRDS(summary_obj, temp_file)\n\n  # Reload\n  reloaded_obj <- readRDS(temp_file)\n\n  # Should be identical\n  expect_identical(summary_obj, reloaded_obj)\n\n  # Should still print correctly\n  expect_no_error(capture_output(print(reloaded_obj)))\n\n  # Clean up\n  unlink(temp_file)\n})\n"
  },
  {
    "path": "tests/testthat/test-tidier_methods.R",
    "content": "context(\"tidier methods\")\n\n# `tidy()` tests\ntest_that(\"`tidy()` snapshot value of `mvgam_example1`\", {\n  local_edition(3)\n  expect_snapshot_value(tidy.mvgam(mvgam_example1), style = \"json2\")\n})\n\ntest_that(\"`tidy()` snapshot value of `mvgam_example2`\", {\n  local_edition(3)\n  expect_snapshot_value(tidy.mvgam(mvgam_example2), style = \"json2\")\n})\n\ntest_that(\"`tidy()` snapshot value of `mvgam_example3`\", {\n  local_edition(3)\n  expect_snapshot_value(tidy.mvgam(mvgam_example3), style = \"json2\")\n})\n\ntest_that(\"`tidy()` snapshot value of `mvgam_example4`\", {\n  local_edition(3)\n  expect_snapshot_value(tidy.mvgam(mvgam_example4), style = \"json2\")\n})\n\ntest_that(\"`tidy()` snapshot value of `mvgam_example6`\", {\n  local_edition(3)\n  testthat::skip_on_cran()\n\n  # Hierarchical dynamics example adapted from RW documentation example.\n  # The difference is that this uses 4 species rather than 3.\n  simdat1 <- sim_mvgam(\n    trend_model = VAR(cor = TRUE),\n    prop_trend = 0.95,\n    n_series = 4,\n    mu = c(1, 2, 3, 4)\n  )\n  simdat2 <- sim_mvgam(\n    trend_model = VAR(cor = TRUE),\n    prop_trend = 0.95,\n    n_series = 4,\n    mu = c(1, 2, 3, 4)\n  )\n  simdat3 <- sim_mvgam(\n    trend_model = VAR(cor = TRUE),\n    prop_trend = 0.95,\n    n_series = 4,\n    mu = c(1, 2, 3, 4)\n  )\n\n  simdat_all <- rbind(\n    simdat1$data_train %>%\n      dplyr::mutate(region = 'qld'),\n    simdat2$data_train %>%\n      dplyr::mutate(region = 'nsw'),\n    simdat3$data_train %>%\n      dplyr::mutate(region = 'vic')\n  ) %>%\n    dplyr::mutate(\n      species = gsub('series', 'species', series),\n      species = as.factor(species),\n      region = as.factor(region)\n    ) %>%\n    dplyr::arrange(series, time) %>%\n    dplyr::select(-series)\n\n  mvgam_example6 <- suppressWarnings(mvgam(\n    formula = y ~ species,\n    trend_model = AR(gr = region, subgr = species),\n    data = simdat_all,\n    silent = 2\n  ))\n\n  tidyout = tidy.mvgam(mvgam_example6)\n\n  expect_equal(dim(tidyout), c(65, 7))\n  expect_equal(\n    colnames(tidyout),\n    c(\"parameter\", \"type\", \"mean\", \"sd\", \"2.5%\", \"50%\", \"97.5%\")\n  )\n  expect_snapshot_value(tidyout[c(\"parameter\", \"type\")], style = \"json2\")\n})\n\n# `augment()` tests\ntest_that(\"augment doesn't error\", {\n  expect_no_error(augment(mvgam:::mvgam_example1))\n  expect_no_error(augment(mvgam:::mvgam_example4))\n})\n\ntest_that(\"augment returns correct types\", {\n  out1 <- augment(mvgam:::mvgam_example1)\n  out4 <- augment(mvgam:::mvgam_example4)\n\n  expect_equal(class(out1)[[1]], \"tbl_df\")\n  expect_equal(class(out4), \"list\")\n\n  # Lengths of augment output and of obs data should be equal\n  expect_equal(NROW(out1), NROW(mvgam:::mvgam_example1$obs_data))\n  expect_equal(length(out4$y), length(mvgam:::mvgam_example4$obs_data$y))\n\n  # NAs in obs data should equal NAs in residuals\n  expect_true(all(\n    which(is.na(mvgam:::mvgam_example1$obs_data$y)) %in%\n      which(is.na(out1$.resid))\n  ))\n})\n"
  },
  {
    "path": "tests/testthat/test-update.R",
    "content": "context(\"update.mvgam\")\n\nskip_on_cran()\n\ntest_that(\"update() working correctly\", {\n  # Can update trend_model\n  mod <- update(\n    mvgam:::mvgam_example1,\n    trend_model = AR(p = 2),\n    control = list(max_treedepth = 11),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(attr(mod$model_data, 'trend_model') == 'AR2')\n  expect_true(any(grepl(\n    'ar2~std_normal();',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(mod$call == mvgam:::mvgam_example1$call)\n\n  # Update trend_model and formula\n  mod <- update(\n    mvgam:::mvgam_example1,\n    formula = y ~ s(season, k = 6) - 1,\n    trend_model = PW(),\n    run_model = FALSE\n  )\n  expect_true(inherits(mod, 'mvgam_prefit'))\n  expect_true(attr(mod$model_data, 'trend_model') == 'PWlinear')\n  expect_true(any(grepl(\n    'to_vector(delta_trend)~double_exponential(0,changepoint_scale);',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n  expect_true(mod$call != mvgam:::mvgam_example1$call)\n  expect_true(rlang::f_rhs(mod$call) == 's(season, k = 6) - 1')\n\n  # Errors should pass from mvgam()\n  expect_error(\n    update(\n      mvgam:::mvgam_example1,\n      formula = y ~ s(season, k = 6) - 1,\n      trend_model = PW(growth = 'logistic'),\n      run_model = FALSE\n    ),\n    'Capacities must be supplied as a variable named \"cap\" for logistic growth'\n  )\n\n  # Update to include shared observation params\n  mod <- update(\n    mvgam:::mvgam_example1,\n    share_obs_params = TRUE,\n    run_model = FALSE\n  )\n  expect_true(any(grepl(\n    'real<lower=0>sigma_obs;',\n    gsub(' ', '', mod$model_file),\n    fixed = TRUE\n  )))\n})\n\ntest_that(\"update() passes original knots correctly\", {\n  # Simulate some data and fit a Poisson AR1 model\n  simdat <- sim_mvgam(n_series = 1, trend_model = AR())\n  mod <- SM(mvgam(\n    y ~ s(season, bs = 'cc'),\n    knots = list(season = c(0.5, 12.5)),\n    trend_model = AR(),\n    noncentred = TRUE,\n    data = simdat$data_train,\n    chains = 2,\n    silent = 2\n  ))\n  expect_true(identical(\n    attr(mod$mgcv_model, 'knots'),\n    list(season = c(0.5, 12.5))\n  ))\n\n  # Update to an AR2 model\n  updated_mod <- update(\n    mod,\n    trend_model = AR(p = 2),\n    noncentred = TRUE,\n    run_model = FALSE\n  )\n  expect_true(identical(\n    attr(updated_mod$mgcv_model, 'knots'),\n    list(season = c(0.5, 12.5))\n  ))\n})\n"
  },
  {
    "path": "tests/testthat.R",
    "content": "library(testthat)\nlibrary(mvgam)\n\ntest_check(\"mvgam\")\n"
  },
  {
    "path": "vignettes/data_in_mvgam.Rmd",
    "content": "---\ntitle: \"Formatting data for use in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Formatting data for use in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThis vignette gives an example of how to take raw data and format it for use in `mvgam`. This is not an exhaustive example, as data can be recorded and stored in a variety of ways, which requires different approaches to wrangle the data into the necessary format for `mvgam`. For full details on the basic `mvgam` functionality, please see [the introductory vignette](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html) and [the growing set of walk through video tutorials on `mvgam` applications](https://www.youtube.com/playlist?list=PLzFHNoUxkCvsFIg6zqogylUfPpaxau_a3&si=lyg7qUrMLbD-tHCB).\n\n## Required *tidy* data format\nManipulating the data into a 'long' format (i.e. *tidy* format) is necessary for modelling in `mvgam`. By 'long' format, we mean that each `series x time` observation needs to have its own entry in the `dataframe` or `list` object that we wish to pass as data for to the two primary modelling functions, `mvgam()` and `jsdgam()`. A simple example can be viewed by simulating data using the `sim_mvgam()` function. See `?sim_mvgam` for more details\n```{r}\nsimdat <- sim_mvgam(\n  n_series = 4, \n  T = 24, \n  prop_missing = 0.2\n)\nhead(simdat$data_train, 16)\n```\n\n### `series` as a `factor` variable\nNotice how we have four different time series in these simulated data, and we have identified the series-level indicator as a `factor` variable.\n```{r}\nclass(simdat$data_train$series)\nlevels(simdat$data_train$series)\n```\n\nIt is important that the number of levels matches the number of unique series in the data to ensure indexing across series works properly in the underlying modelling functions. Several of the main workhorse functions in the package (including `mvgam()` and `get_mvgam_priors()`) will give an error if this is not the case, but it may be worth checking anyway:\n```{r}\nall(levels(simdat$data_train$series) %in% \n      unique(simdat$data_train$series))\n```\n\nNote that you can technically supply data that does not have a `series` indicator, and the package will generally assume that you are only using a single time series. There are exceptions to this, for example if you have grouped data and would like to estimate hierarchical dependencies (see an example of hierarchical process error correlations in the `?AR` documentation) or if you would like to set up a Joint Species Distribution Model (JSDM) using a Zero-Mean Multivariate Gaussian distribution for the latent residuals (see examples in the `?ZMVN` documentation).\n\n### A single outcome variable\nYou may also have notices that we do not spread the `numeric / integer`-classed outcome variable into different columns. Rather, there is only a single column for the outcome variable, labelled `y` in these simulated data (though the outcome does not have to be labelled `y`). This is another important requirement in `mvgam`, but it shouldn't be too unfamiliar to `R` users who frequently use modelling packages such as `lme4`, `mgcv`, `brms` or the many other regression modelling packages out there. The advantage of this format is that it is now very easy to specify effects that vary among time series:\n```{r}\nsummary(glm(\n  y ~ series + time,\n  data = simdat$data_train,\n  family = poisson()\n))\n```\n\n```{r}\nsummary(mgcv::gam(\n  y ~ series + s(time, by = series),\n  data = simdat$data_train,\n  family = poisson()\n))\n```\n\nDepending on the observation families you plan to use when building models, there may be some restrictions that need to be satisfied within the outcome variable. For example, a Beta regression can only handle proportional data, so values `>= 1` or `<= 0` are not allowed. Likewise, a Poisson regression can only handle non-negative integers. Most regression functions in `R` will assume the user knows all of this and so will not issue any warnings or errors if you choose the wrong distribution, but often this ends up leading to some unhelpful error from an optimizer that is difficult to interpret and diagnose. `mvgam` will attempt to provide some errors if you do something that is simply not allowed. For example, we can simulate data from a zero-centred Gaussian distribution (ensuring that some of our values will be `< 1`) and attempt a Beta regression in `mvgam` using the `betar` family:\n```{r}\ngauss_dat <- data.frame(\n  outcome = rnorm(10),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\ngauss_dat\n```\n\nA call to `gam()` using the `mgcv` package leads to a model that actually fits (though it does give an unhelpful warning message):\n```{r}\nmgcv::gam(outcome ~ time,\n  family = betar(),\n  data = gauss_dat\n)\n```\n\nBut the same call to `mvgam()` gives us something more useful:\n```{r error=TRUE}\nmvgam(outcome ~ time,\n  family = betar(),\n  data = gauss_dat\n)\n```\n\nPlease see `?mvgam_families` for more information on the types of responses that the package can handle and their restrictions\n\n### A `time` variable\nThe other requirement for most models that can be fit in `mvgam` is a `numeric / integer`-classed variable labelled `time`. This ensures the modelling software knows how to arrange the time series when building models. This setup still allows us to formulate multivariate time series models. If you plan to use any of the autoregressive dynamic trend functions available in `mvgam` (see `?mvgam_trends` for details of available dynamic processes), you will need to ensure your time series are entered with a fixed sampling interval (i.e. the time between timesteps 1 and 2 should be the same as the time between timesteps 2 and 3, etc...). But note that you can have missing observations for some (or all) series. `mvgam()` will check this for you, but again it is useful to ensure you have no missing timepoint x series combinations in your data. You can generally do this with a simple `dplyr` call:\n```{r}\n# A function to ensure all timepoints within a sequence are identical\nall_times_avail <- function(time, min_time, max_time) {\n  identical(\n    as.numeric(sort(time)),\n    as.numeric(seq.int(from = min_time, to = max_time))\n  )\n}\n\n# Get min and max times from the data\nmin_time <- min(simdat$data_train$time)\nmax_time <- max(simdat$data_train$time)\n\n# Check that all times are recorded for each series\ndata.frame(\n  series = simdat$data_train$series,\n  time = simdat$data_train$time\n) %>%\n  dplyr::group_by(series) %>%\n  dplyr::summarise(all_there = all_times_avail(\n    time,\n    min_time,\n    max_time\n  )) -> checked_times\nif (any(checked_times$all_there == FALSE)) {\n  warning(\"One or more series in is missing observations for one or more timepoints\")\n} else {\n  cat(\"All series have observations at all timepoints :)\")\n}\n```\n\nNote that models which use dynamic components will assume that smaller values of `time` are *older* (i.e. `time = 1` came *before* `time = 2`, etc...)\n\n### Irregular sampling intervals?\nMost `mvgam` dynamic trend models expect `time` to be measured in discrete, evenly-spaced intervals (i.e. one measurement per week, or one per year, for example; though missing values are allowed). But please note that irregularly sampled time intervals are allowed, in which case the `CAR()` trend model (continuous time autoregressive) is appropriate. You can see an example of this kind of model in the **Examples** section in `?CAR`. You can also use `trend_model = 'None'` (the default in `mvgam()`) and instead use a Gaussian Process to model temporal variation for irregularly-sampled time series. See the `?brms::gp` for details. But to reiterate the point from above, if you do not have time series data (or don't want to estimate latent temporal dynamics) but you would like to estimate correlated latent residuals among multivariate outcomes, you can set up models that use `trend_model = ZMVN(...)` without the need for a `time` variable (see `?ZMVN` for details).\n\n## Checking data with `get_mvgam_priors()`\nThe `get_mvgam_priors()` function is designed to return information about the parameters in a model whose prior distributions can be modified by the user. But in doing so, it will perform a series of checks to ensure the data are formatted properly. It can therefore be very useful to new users for ensuring there isn't anything strange going on in the data setup. For example, we can replicate the steps taken above (to check factor levels and timepoint x series combinations) with a single call to `get_mvgam_priors()`. Here we first simulate some data in which some of the timepoints in the `time` variable are not included in the data:\n```{r}\nbad_times <- data.frame(\n  time = seq(1, 16, by = 2),\n  series = factor(\"series_1\"),\n  outcome = rnorm(8)\n)\nbad_times\n```\n\nNext we call `get_mvgam_priors()` by simply specifying an intercept-only model, which is enough to trigger all the checks:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = bad_times,\n  family = gaussian()\n)\n```\n\nThis error is useful as it tells us where the problem is. There are many ways to fill in missing timepoints, so the correct way will have to be left up to the user. But if you don't have any covariates, it should be pretty easy using `expand.grid()`:\n```{r}\nbad_times %>%\n  dplyr::right_join(expand.grid(\n    time = seq(\n      min(bad_times$time),\n      max(bad_times$time)\n    ),\n    series = factor(unique(bad_times$series),\n      levels = levels(bad_times$series)\n    )\n  )) %>%\n  dplyr::arrange(time) -> good_times\ngood_times\n```\n\nNow the call to `get_mvgam_priors()`, using our filled in data, should work:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = good_times,\n  family = gaussian()\n)\n```\n\nThis function should also pick up on misaligned factor levels for the `series` variable. We can check this by again simulating, this time adding an additional factor level that is not included in the data:\n```{r}\nbad_levels <- data.frame(\n  time = 1:8,\n  series = factor(\"series_1\",\n    levels = c(\n      \"series_1\",\n      \"series_2\"\n    )\n  ),\n  outcome = rnorm(8)\n)\n\nlevels(bad_levels$series)\n```\n\nAnother call to `get_mvgam_priors()` brings up a useful error:\n```{r error = TRUE}\nget_mvgam_priors(outcome ~ 1,\n  data = bad_levels,\n  family = gaussian()\n)\n```\n\nFollowing the message's advice tells us there is a level for `series_2` in the `series` variable, but there are no observations for this series in the data:\n```{r}\nsetdiff(levels(bad_levels$series), \n        unique(bad_levels$series))\n```\n\nRe-assigning the levels fixes the issue:\n```{r}\nbad_levels %>%\n  dplyr::mutate(series = droplevels(series)) -> good_levels\nlevels(good_levels$series)\n```\n\n```{r error = TRUE}\nget_mvgam_priors(\n  outcome ~ 1,\n  data = good_levels,\n  family = gaussian()\n)\n```\n\n### Covariates with no `NA`s\nCovariates can be used in models just as you would when using `mgcv` (see `?formula.gam` for details of the formula syntax). But although the outcome variable can have `NA`s, covariates cannot. Most regression software will silently drop any raws in the model matrix that have `NA`s, which is not helpful when debugging. Both the `mvgam()` and `get_mvgam_priors()` functions will run some simple checks for you, and hopefully will return useful errors if it finds in missing values:\n```{r}\nmiss_dat <- data.frame(\n  outcome = rnorm(10),\n  cov = c(NA, rnorm(9)),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\nmiss_dat\n```\n\n```{r error = TRUE}\nget_mvgam_priors(\n  outcome ~ cov,\n  data = miss_dat,\n  family = gaussian()\n)\n```\n\nJust like with the `mgcv` package, `mvgam` can also accept data as a `list` object. This is useful if you want to set up linear functional predictors or even distributed lag predictors. The checks run by `mvgam` should still work on these data. Here we change the `cov` predictor to be a `matrix`:\n```{r}\nmiss_dat <- list(\n  outcome = rnorm(10),\n  series = factor(\"series1\",\n    levels = \"series1\"\n  ),\n  time = 1:10\n)\nmiss_dat$cov <- matrix(rnorm(50), ncol = 5, nrow = 10)\nmiss_dat$cov[2, 3] <- NA\n```\n\nA call to `get_mvgam_priors()` returns the same error:\n```{r error=TRUE}\nget_mvgam_priors(\n  outcome ~ cov,\n  data = miss_dat,\n  family = gaussian()\n)\n```\n\n## Plotting with `plot_mvgam_series()`\nPlotting the data is a useful way to ensure everything looks ok, once you've gone throug the above checks on factor levels and timepoint x series combinations. The `plot_mvgam_series()` function will take supplied data and plot either a series of line plots (if you choose `series = 'all'`) or a set of plots to describe the distribution for a single time series. For example, to plot all of the time series in our data, and highlight a single series in each plot, we can use:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = \"all\"\n)\n```\n\nOr we can look more closely at the distribution for the first time series:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  y = \"y\",\n  series = 1\n)\n```\n\nIf you have split your data into training and testing folds (i.e. for forecast evaluation), you can include the test data in your plots:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  y = \"y\",\n  series = 1\n)\n```\n\n## Example with NEON tick data\nTo give one example of how data can be reformatted for `mvgam` modelling, we will use observations from the National Ecological Observatory Network (NEON) tick drag cloth samples. *Ixodes scapularis* is a widespread tick species capable of transmitting a diversity of parasites to animals and humans, many of which are zoonotic. Due to the medical and ecological importance of this tick species, a common goal is to understand factors that influence their abundances. The NEON field team carries out standardised [long-term monitoring of tick abundances as well as other important indicators of ecological change](https://www.neonscience.org/data-collection/ticks){target=\"_blank\"}. Nymphal abundance of *I. scapularis* is routinely recorded across NEON plots using a field sampling method called drag cloth sampling, which is a common method for sampling ticks in the landscape. Field researchers sample ticks by dragging a large cloth behind themselves through terrain that is suspected of harboring ticks, usually working in a grid-like pattern. The sites have been sampled since 2014, resulting in a rich dataset of nymph abundance time series. These tick time series show strong seasonality and incorporate many of the challenging features associated with ecological data including overdispersion, high proportions of missingness and irregular sampling in time, making them useful for exploring the utility of dynamic GAMs. \n  \nWe begin by loading NEON tick data for the years 2014 - 2021, which were downloaded from NEON and prepared as described in [Clark & Wells 2022](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.13974){target=\"_blank\"}. You can read a bit about the data using the call `?all_neon_tick_data`\n```{r}\ndata(\"all_neon_tick_data\")\nstr(dplyr::ungroup(all_neon_tick_data))\n```\n\nFor this exercise, we will use the `epiWeek` variable as an index of seasonality, and we will only work with observations from a few sampling plots (labelled in the `plotID` column):\n```{r}\nplotIDs <- c(\n  \"SCBI_013\", \"SCBI_002\",\n  \"SERC_001\", \"SERC_005\",\n  \"SERC_006\", \"SERC_012\",\n  \"BLAN_012\", \"BLAN_005\"\n)\n```\n\nNow we can select the target species we want (*I. scapularis*), filter to the correct plot IDs and convert the `epiWeek` variable from `character` to `numeric`:\n```{r}\nmodel_dat <- all_neon_tick_data %>%\n  dplyr::ungroup() %>%\n  dplyr::mutate(target = ixodes_scapularis) %>%\n  dplyr::filter(plotID %in% plotIDs) %>%\n  dplyr::select(Year, epiWeek, plotID, target) %>%\n  dplyr::mutate(epiWeek = as.numeric(epiWeek))\n```\n\nNow is the tricky part: we need to fill in missing observations with `NA`s. The tick data are sparse in that field observers do not go out and sample in each possible `epiWeek`. So there are many particular weeks in which observations are not included in the data. But we can use `expand.grid()` again to take care of this:\n```{r}\nmodel_dat %>%\n  # Create all possible combos of plotID, Year and epiWeek;\n  # missing outcomes will be filled in as NA\n  dplyr::full_join(expand.grid(\n    plotID = unique(model_dat$plotID),\n    Year = unique(model_dat$Year),\n    epiWeek = seq(1, 52)\n  )) %>%\n  # left_join back to original data so plotID and siteID will\n  # match up, in case you need the siteID for anything else later on\n  dplyr::left_join(all_neon_tick_data %>%\n    dplyr::select(siteID, plotID) %>%\n    dplyr::distinct()) -> model_dat\n```\n\nCreate the `series` variable needed for `mvgam` modelling:\n```{r}\nmodel_dat %>%\n  dplyr::mutate(\n    series = plotID,\n    y = target\n  ) %>%\n  dplyr::mutate(\n    siteID = factor(siteID),\n    series = factor(series)\n  ) %>%\n  dplyr::select(-target, -plotID) %>%\n  dplyr::arrange(Year, epiWeek, series) -> model_dat\n```\n\nNow create the `time` variable, which needs to track `Year` and `epiWeek` for each unique series. The `n` function from `dplyr` is often useful if generating a `time` index for grouped dataframes:\n```{r}\nmodel_dat %>%\n  dplyr::ungroup() %>%\n  dplyr::group_by(series) %>%\n  dplyr::arrange(Year, epiWeek) %>%\n  dplyr::mutate(time = seq(1, dplyr::n())) %>%\n  dplyr::ungroup() -> model_dat\n```\n\nCheck factor levels for the `series`:\n```{r}\nlevels(model_dat$series)\n```\n\nThis looks good, as does a more rigorous check using `get_mvgam_priors()`:\n```{r error=TRUE}\nget_mvgam_priors(\n  y ~ 1,\n  data = model_dat,\n  family = poisson()\n)\n```\n\nWe can also set up a model in `mvgam()` but use `run_model = FALSE` to further ensure all of the necessary steps for creating the modelling code and objects will run. It is recommended that you use the `cmdstanr` backend if possible, as the auto-formatting options available in this package are very useful for checking the package-generated `Stan` code for any inefficiencies that can be fixed to lead to sampling performance improvements:\n```{r}\ntestmod <- mvgam(\n  y ~ s(epiWeek, by = series, bs = \"cc\") +\n    s(series, bs = \"re\"),\n  trend_model = AR(),\n  data = model_dat,\n  backend = \"cmdstanr\",\n  run_model = FALSE\n)\n```\n\nThis call runs without issue, and the resulting object now contains the model code and data objects that are needed to initiate sampling:\n```{r}\nstr(testmod$model_data)\n```\n\n```{r}\nstancode(testmod)\n```\n\n## Further reading\nThe following papers and resources offer useful material about Dynamic GAMs and how they can be applied in practice:\n  \nClark, Nicholas J. and Wells, K. [Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series](https://doi.org/10.1111/2041-210X.13974). *Methods in Ecology and Evolution*. (2023): 14, 771-784.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nde Sousa, Heitor C., et al. [Severe fire regimes decrease resilience of ectothermic populations](https://doi.org/10.1111/1365-2656.14188). *Journal of Animal Ecology* (2024): 93(11), 1656-1669.  \n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant.](https://doi.org/10.1016/j.csda.2022.107659) *Computational Statistics & Data Analysis* (2023): 179, 107659.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.\n  \nZhu, L., et al. [Responses of a widespread pest insect to extreme high temperatures are stage-dependent and divergent among seasonal cohorts](https://doi.org/10.1111/1365-2435.14711). *Functional Ecology* (2025): 39, 165–180. https://doi.org/10.1111/1365-2435.14711\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "vignettes/forecast_evaluation.Rmd",
    "content": "---\ntitle: \"Forecasting and forecast evaluation in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Forecasting and forecast evaluation in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to produce probabilistic forecasts and to evaluate those forecasts using a variety of proper scoring rules.\n\n## Simulating discrete time series\nWe begin by simulating some data to show how forecasts are computed and evaluated in `mvgam`. The `sim_mvgam()` function can be used to simulate series that come from a variety of response distributions as well as seasonal patterns and/or dynamic temporal patterns. Here we simulate a collection of three time count-valued series. These series all share the same seasonal pattern but have different temporal dynamics. By setting `trend_model = GP()` and `prop_trend = 0.75`, we are generating time series that have smooth underlying temporal trends (evolving as Gaussian Processes with squared exponential kernel) and moderate seasonal patterns. The observations are Poisson-distributed and we allow 10% of observations to be missing.\n```{r}\nset.seed(1)\nsimdat <- sim_mvgam(\n  T = 100,\n  n_series = 3,\n  mu = 2,\n  trend_model = GP(),\n  prop_trend = 0.75,\n  family = poisson(),\n  prop_missing = 0.10\n)\n```\n\nThe returned object is a `list` containing training and testing data (`sim_mvgam()` automatically splits the data into these folds for us) together with some other information about the data generating process that was used to simulate the data\n```{r}\nstr(simdat)\n```\n\nEach series in this case has a shared seasonal pattern. The resulting time series are similar to what we might encounter when dealing with count-valued data that can take small counts:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  series = \"all\"\n)\n```\n\nFor individual series, we can plot the training and testing data, as well as some more specific features of the observed data:\n```{r, fig.alt = \"Plotting time series features for GAM models in mvgam\"}\nplot_mvgam_series(\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  series = 1\n)\n```\n\n### Modelling dynamics with splines\nThe first model we will fit uses a shared cyclic spline to capture the repeated seasonality, as well as series-specific splines of time to capture the long-term dynamics. We allow the temporal splines to be fairly complex so they can capture as much of the temporal variation as possible:\n```{r include=FALSE}\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  newdata = simdat$data_test\n)\n```\n\n```{r eval=FALSE}\nmod1 <- mvgam(\n  y ~ s(season, bs = \"cc\", k = 8) +\n    s(time, by = series, bs = \"cr\", k = 20),\n  knots = list(season = c(0.5, 12.5)),\n  trend_model = \"None\",\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\nThe model fits without issue:\n```{r}\nsummary(mod1, include_betas = FALSE)\n```\n\nAnd we can plot the conditional effects of the splines (on the link scale) to see that they are estimated to be highly nonlinear\n```{r, fig.alt = \"Plotting GAM smooth functions using mvgam\"}\nconditional_effects(mod1, type = \"link\")\n```\n\n### Modelling dynamics with a correlated AR1\nBefore showing how to produce and evaluate forecasts, we will fit a second model to these data so the two models can be compared. This model is equivalent to the above, except we now use a correlated AR(1) process to model series-specific dynamics. See `?AR` for more details.\n```{r include=FALSE, message=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n```\n\n```{r eval=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  silent = 1\n)\n```\n\nThe summary for this model now contains information on the autoregressive and process error parameters for each time series:\n```{r}\nsummary(mod2, include_betas = FALSE)\n```\n\nWe can plot the posteriors for these parameters, and for any other parameter for that matter, using `bayesplot` routines. First the autoregressive parameters:\n```{r, fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"}\nmcmc_plot(mod2, variable = \"ar\", regex = TRUE, type = \"areas\")\n```\n\nAnd now the variance ($\\sigma$) parameters:\n```{r, fig.alt = \"Summarising latent Gaussian Process parameters in mvgam\"}\nmcmc_plot(mod2, variable = \"sigma\", regex = TRUE, type = \"areas\")\n```\n\nWe can again plot the conditional seasonal effect:\n```{r, fig.alt = \"Plotting latent Gaussian Process effects in mvgam and marginaleffects\"}\nconditional_effects(mod2, type = \"link\")\n```\n\nThe estimates for the seasonal component are fairly similar for the two models, but below we will see if they produce similar forecasts\n\n## Forecasting with the `forecast()` function\nProbabilistic forecasts can be computed in two main ways in `mvgam`. The first is to take a model that was fit only to training data (as we did above in the two example models) and produce temporal predictions from the posterior predictive distribution by feeding `newdata` to the `forecast()` function. It is crucial that any `newdata` fed to the `forecast()` function follows on sequentially from the data that was used to fit the model (this is not internally checked by the package because it might be a headache to do so when data are not supplied in a specific time-order). When calling the `forecast()` function, you have the option to generate different kinds of predictions (i.e. predicting on the link scale, response scale or to produce expectations; see `?forecast.mvgam` for details). We will use the default and produce forecasts on the response scale, which is the most common way to evaluate forecast distributions\n```{r}\nfc_mod1 <- forecast(mod1, newdata = simdat$data_test)\nfc_mod2 <- forecast(mod2, newdata = simdat$data_test)\n```\n\nThe objects we have created are of class `mvgam_forecast`, which contain information on hindcast distributions, forecast distributions and true observations for each series in the data:\n```{r}\nstr(fc_mod1)\n```\n\nWe can plot the forecasts for some series from each model using the `S3 plot` method for objects of this class:\n```{r}\nplot(fc_mod1, series = 1)\nplot(fc_mod2, series = 1)\n\nplot(fc_mod1, series = 2)\nplot(fc_mod2, series = 2)\n```\n\nClearly the two models do not produce equivalent forecasts. We will come back to scoring these forecasts in a moment.\n\n## Forecasting with `newdata` in `mvgam()`\nThe second way we can produce forecasts in `mvgam` is to feed the testing data directly to the `mvgam()` function as `newdata`. This will include the testing data as missing observations so that they are automatically predicted from the posterior predictive distribution using the `generated quantities` block in `Stan`. As an example, we can refit `mod2` but include the testing data for automatic forecasts:\n```{r include=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod2 <- mvgam(y ~ 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 8) - 1,\n  trend_knots = list(season = c(0.5, 12.5)),\n  trend_model = AR(cor = TRUE),\n  noncentred = TRUE,\n  data = simdat$data_train,\n  newdata = simdat$data_test,\n  silent = 2\n)\n```\n\nBecause the model already contains a forecast distribution, we do not need to feed `newdata` to the `forecast()` function:\n```{r}\nfc_mod2 <- forecast(mod2)\n```\n\nThe forecasts will be nearly identical to those calculated previously:\n```{r warning=FALSE, fig.alt = \"Plotting posterior forecast distributions using mvgam and R\"}\nplot(fc_mod2, series = 1)\n```\n\n## Scoring forecast distributions\nA primary purpose of the `mvgam_forecast` class is to readily allow forecast evaluations for each series in the data, using a variety of possible scoring functions. See `?mvgam::score.mvgam_forecast` to view the types of scores that are available. A useful scoring metric is the Continuous Rank Probability Score (CRPS). A CRPS value is similar to what we might get if we calculated a weighted absolute error using the full forecast distribution.\n```{r warning=FALSE}\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\nstr(crps_mod1)\ncrps_mod1$series_1\n```\n\nThe returned list contains a `data.frame` for each series in the data that shows the CRPS score for each evaluation in the testing data, along with some other useful information about the fit of the forecast distribution. In particular, we are given a logical value (1s and 0s) telling us whether the true value was within a pre-specified credible interval (i.e. the coverage of the forecast distribution). The default interval width is 0.9, so we would hope that the values in the `in_interval` column take a 1 approximately 90% of the time. This value can be changed if you wish to compute different coverages, say using a 60% interval:\n```{r warning=FALSE}\ncrps_mod1 <- score(fc_mod1, score = \"crps\", interval_width = 0.6)\ncrps_mod1$series_1\n```\n\nWe can also compare forecasts against out of sample observations using the [Expected Log Predictive Density (ELPD; also known as the log score)](https://link.springer.com/article/10.1007/s11222-016-9696-4){target=\"_blank\"}. The ELPD is a strictly proper scoring rule that can be applied to any distributional forecast, but to compute it we need predictions on the link scale rather than on the outcome scale. This is where it is advantageous to change the type of prediction we can get using the `forecast()` function:\n```{r}\nlink_mod1 <- forecast(mod1, newdata = simdat$data_test, type = \"link\")\nscore(link_mod1, score = \"elpd\")$series_1\n```\n\nFinally, when we have multiple time series it may also make sense to use a multivariate proper scoring rule. `mvgam` offers two such options: the Energy score and the Variogram score. The first penalizes forecast distributions that are less well calibrated against the truth, while the second penalizes forecasts that do not capture the observed true correlation structure. Which score to use depends on your goals, but both are very easy to compute:\n```{r}\nenergy_mod2 <- score(fc_mod2, score = \"energy\")\nstr(energy_mod2)\n```\n\nThe returned object still provides information on interval coverage for each individual series, but there is only a single score per horizon now (which is provided in the `all_series` slot):\n```{r}\nenergy_mod2$all_series\n```\n\nYou can use your score(s) of choice to compare different models. For example, we can compute and plot the difference in CRPS scores for each series in data. Here, a negative value means the AR(1) model (`mod2`) is better, while a positive value means the spline model (`mod1`) is better.\n```{r}\ncrps_mod1 <- score(fc_mod1, score = \"crps\")\ncrps_mod2 <- score(fc_mod2, score = \"crps\")\n\ndiff_scores <- crps_mod2$series_1$score -\n  crps_mod1$series_1$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n\n\ndiff_scores <- crps_mod2$series_2$score -\n  crps_mod1$series_2$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n\ndiff_scores <- crps_mod2$series_3$score -\n  crps_mod1$series_3$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])\n)\nabline(h = 0, lty = \"dashed\", lwd = 2)\nar1_better <- length(which(diff_scores < 0))\ntitle(main = paste0(\n  \"AR(1) better in \",\n  ar1_better,\n  \" of \",\n  length(diff_scores),\n  \" evaluations\",\n  \"\\nMean difference = \",\n  round(mean(diff_scores, na.rm = TRUE), 2)\n))\n```\n\nThe correlated AR(1) model consistently gives better forecasts, and the difference between scores tends to grow as the forecast horizon increases. This is not unexpected given the way that splines linearly extrapolate outside the range of training data\n\n## Further reading\nThe following papers and resources offer useful material about Bayesian forecasting and proper scoring rules:\n  \nClark N.J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ* 13:e18929 (2025) https://doi.org/10.7717/peerj.18929  \n  \nHyndman, Rob J., and George Athanasopoulos. [Forecasting: principles and practice](https://otexts.com/fpp3/distaccuracy.html). *OTexts*, (2018).\n  \nGneiting, Tilmann, and Adrian E. Raftery. [Strictly proper scoring rules, prediction, and estimation](https://www.tandfonline.com/doi/abs/10.1198/016214506000001437) *Journal of the American statistical Association* 102.477 (2007) 359-378.  \n  \nSimonis, Juniper L., et al. [Evaluating probabilistic ecological forecasts](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecy.3431) *Ecology* 102.8 (2021) e03431.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "vignettes/mvgam_overview.Rmd",
    "content": "---\ntitle: \"Overview of the mvgam package\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Overview of the mvgam package}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to give a general overview of the `mvgam` package and its primary functions.\n\n## Dynamic GAMs\n`mvgam` is designed to propagate unobserved temporal processes to capture latent dynamics in the observed time series. This works in a state-space format, with the temporal *trend* evolving independently of the observation process. An introduction to the package and some worked examples are also shown in this seminar: [Ecological Forecasting with Dynamic Generalized Additive Models](https://www.youtube.com/watch?v=0zZopLlomsQ){target=\"_blank\"}. Briefly, assume $\\tilde{\\boldsymbol{y}}_{i,t}$ is the conditional expectation of response variable $\\boldsymbol{i}$ at time $\\boldsymbol{t}$. Assuming $\\boldsymbol{y_i}$ is drawn from an exponential distribution with an invertible link function, the linear predictor for a multivariate Dynamic GAM can be written as:\n\n$$for~i~in~1:N_{series}~...$$\n$$for~t~in~1:N_{timepoints}~...$$\n\n$$g^{-1}(\\tilde{\\boldsymbol{y}}_{i,t})=\\alpha_{i}+\\sum\\limits_{j=1}^J\\boldsymbol{s}_{i,j,t}\\boldsymbol{x}_{j,t}+\\boldsymbol{Z}\\boldsymbol{z}_{k,t}\\,,$$\nHere $\\alpha$ are the unknown intercepts, the $\\boldsymbol{s}$'s are unknown smooth functions of covariates ($\\boldsymbol{x}$'s), which can potentially vary among the response series, and $\\boldsymbol{z}$ are dynamic latent processes. Each smooth function $\\boldsymbol{s_j}$ is composed of basis expansions whose coefficients, which must be estimated, control the functional relationship between $\\boldsymbol{x}_{j}$ and $g^{-1}(\\tilde{\\boldsymbol{y}})$. The size of the basis expansion limits the smooth’s potential complexity. A larger set of basis functions allows greater flexibility. For more information on GAMs and how they can smooth through data, see [this blogpost on how to interpret nonlinear effects from Generalized Additive Models](https://ecogambler.netlify.app/blog/interpreting-gams/){target=\"_blank\"}. Latent processes are captured with $\\boldsymbol{Z}\\boldsymbol{z}_{i,t}$, where $\\boldsymbol{Z}$ is an $i~by~k$ matrix of loading coefficients (which can be fixed or a combination of fixed and freely estimated parameters) and $\\boldsymbol{z}_{k,t}$ are a set of $K$ latent factors that can also include their own GAM linear predictors (see the [State-Space models vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html)), the [N-mixtures vignette](https://nicholasjclark.github.io/mvgam/articles/nmixtures.html) and the example in [`jsdgam`](https://nicholasjclark.github.io/mvgam/reference/jsdgam.html) to get an idea of how flexible these processes can be.\n  \nSeveral advantages of GAMs are that they can model a diversity of response families, including discrete distributions (i.e. Poisson, Negative Binomial, Gamma) that accommodate common ecological features such as zero-inflation or overdispersion, and that they can be formulated to include hierarchical smoothing for multivariate responses. `mvgam` supports a number of different observation families, which are summarized below:\n\n## Supported observation families\n\n|Distribution      | Function        | Support                                           | Extra parameter(s)   |\n|:----------------:|:---------------:| :------------------------------------------------:|:--------------------:|\n|Gaussian (identity link)         | `gaussian()`    | Real values in $(-\\infty, \\infty)$                | $\\sigma$             |\n|Student's T (identity link)      | `student-t()`   | Heavy-tailed real values in $(-\\infty, \\infty)$   | $\\sigma$, $\\nu$      |\n|LogNormal (identity link)        | `lognormal()`   | Positive real values in $[0, \\infty)$             | $\\sigma$             |\n|Gamma (log link)             | `Gamma()`       | Positive real values in $[0, \\infty)$             | $\\alpha$             |\n|Beta (logit link)              | `betar()`       | Real values (proportional) in $[0,1]$             | $\\phi$               |\n|Bernoulli (logit link)         | `bernoulli()`   | Binary data in ${0,1}$                          | -                    |\n|Poisson (log link)           | `poisson()`     | Non-negative integers in $(0,1,2,...)$            | -                    |\n|Negative Binomial2 (log link)| `nb()`          | Non-negative integers in $(0,1,2,...)$            | $\\phi$               |\n|Binomial (logit link)           | `binomial()` | Non-negative integers in $(0,1,2,...)$            | -                    |\n|Beta-Binomial (logit link)      | `beta_binomial()` | Non-negative integers in $(0,1,2,...)$       | $\\phi$                   |\n|Poisson Binomial N-mixture (log link)| `nmix()`  | Non-negative integers in $(0,1,2,...)$            | -               |\n\nFor all supported observation families, any extra parameters that need to be estimated (i.e. the $\\sigma$ in a Gaussian model or the $\\phi$ in a Negative Binomial model) are by default estimated independently for each series. However, users can opt to force all series to share extra observation parameters using `share_obs_params = TRUE` in `mvgam()`. Note that default link functions cannot currently be changed.\n\n## Supported temporal dynamic processes\nAs stated above, the latent processes can take a wide variety of forms, some of which can be multivariate to allow the different observational variables to interact or be correlated. When using the `mvgam()` function, the user chooses between different process models with the `trend_model` argument. Available process models are described in detail below.\n\n### Correlated multivariate processes\nIf more than one observational unit (usually referred to as 'series') is included in `data` $(N_{series} > 1)$, use `trend_model = ZMVN()` to set up a model where the outcomes for different observational units may be correlated according to:\n\n\\begin{align*}\nz_{t} & \\sim \\text{MVNormal}(0, \\Sigma) \\end{align*}\n\nThe covariance matrix $\\Sigma$ will capture potentially correlated process errors. It is parameterised using a Cholesky factorization, which requires priors on the series-level variances $\\sigma$ and on the strength of correlations using `Stan`'s `lkj_corr_cholesky` distribution. Note that this `trend_model` does not assume that measurements occur over *time*, as users can specify what variable in the `data` represents the unit of analysis (i.e. outcomes could be counts of different *species* across different *sites* or *regions*, for example; see [`?ZMVN()](https://nicholasjclark.github.io/mvgam/reference/ZMVN.html) for guidelines).\n\n### Independent Random Walks\nUse `trend_model = 'RW'` or `trend_model = RW()` to set up a model where each series in `data` has independent latent temporal dynamics of the form:\n\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(z_{i,t-1}, \\sigma_i) \\end{align*}\n\nProcess error parameters $\\sigma$ are modeled independently for each series. If a moving average process is required, use `trend_model = RW(ma = TRUE)` to set up the following:\n\n\\begin{align*}\nz_{i,t} & = z_{i,t-1} + \\theta_i * error_{i,t-1} + error_{i,t} \\\\\nerror_{i,t} & \\sim \\text{Normal}(0, \\sigma_i) \\end{align*}\n\nMoving average coefficients $\\theta$ are independently estimated for each series and will be forced to be stationary by default $(abs(\\theta)<1)$. Only moving averages of order $q=1$ are currently allowed. \n\n### Multivariate Random Walks\nIf more than one series is included in `data` $(N_{series} > 1)$, a multivariate Random Walk can be set up using `trend_model = RW(cor = TRUE)`, resulting in the following:\n\n\\begin{align*}\nz_{t} & \\sim \\text{MVNormal}(z_{t-1}, \\Sigma) \\end{align*}\n\nWhere the latent process estimate $z_t$ now takes the form of a vector. The covariance matrix $\\Sigma$ will capture contemporaneously correlated process errors. It is parameterised using a Cholesky factorization, which requires priors on the series-level variances $\\sigma$ and on the strength of correlations using `Stan`'s `lkj_corr_cholesky` distribution.\n\nMoving average terms can also be included for multivariate random walks, in which case the moving average coefficients $\\theta$ will be parameterised as an $N_{series} * N_{series}$ matrix\n\n### Autoregressive processes\nAutoregressive models up to $p=3$, in which the autoregressive coefficients are estimated independently for each series, can be used by specifying `trend_model = 'AR1'`, `trend_model = 'AR2'`, `trend_model = 'AR3'`, or `trend_model = AR(p = 1, 2, or 3)`. For example, a univariate AR(1) model takes the form:\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(ar1_i * z_{i,t-1}, \\sigma_i) \\end{align*}\n\n\nAll options are the same as for Random Walks, but additional options will be available for placing priors on the autoregressive coefficients. By default, these coefficients will not be forced into stationarity, but users can impose this restriction by changing the upper and lower bounds on their priors. See `?get_mvgam_priors` for more details.\n\n### Vector Autoregressive processes\nA Vector Autoregression of order $p=1$ can be specified if $N_{series} > 1$ using `trend_model = 'VAR1'` or `trend_model = VAR()`. A VAR(1) model takes the form:\n\n\\begin{align*}\nz_{t} & \\sim \\text{Normal}(A * z_{t-1}, \\Sigma) \\end{align*}\n\nWhere $A$ is an $N_{series} * N_{series}$ matrix of autoregressive coefficients in which the diagonals capture lagged self-dependence (i.e. the effect of a process at time $t$ on its own estimate at time $t+1$), while off-diagonals capture lagged cross-dependence (i.e. the effect of a process at time $t$ on the process for another series at time $t+1$). By default, the covariance matrix $\\Sigma$ will assume no process error covariance by fixing the off-diagonals to $0$. To allow for correlated errors, use `trend_model = 'VAR1cor'` or `trend_model = VAR(cor = TRUE)`. A moving average of order $q=1$ can also be included using `trend_model = VAR(ma = TRUE, cor = TRUE)`.\n\nNote that for all VAR models, stationarity of the process is enforced with a structured prior distribution that is described in detail in [Heaps 2022](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648)\n  \nHeaps, Sarah E. \"[Enforcing stationarity through the prior in vector autoregressions.](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648)\" *Journal of Computational and Graphical Statistics* 32.1 (2023): 74-83.\n\n### Hierarchical processes\nSeveral of the above-mentioned `trend_model` options can be modified to account for grouping structures in `data` by setting up hierarchical latent processes. If an optional grouping variable (`gr`; which must be a `factor` in the supplied `data`) exists, users can model hierarchical residual correlation structures. where the residual correlations for a specific level of `gr` are modelled hierarchically:\n\n\\begin{align*}\n\\Omega_{group} & = \\alpha_{cor}\\Omega_{global} + (1 - \\alpha_{cor})\\Omega_{group, local} \\end{align*}\n\n\nwhere $\\Omega_{global}$ is a *global* correlation matrix, $\\Omega_{group, local}$ is a *local deviation* correlation matrix and $\\alpha_{cor}$ is a weighting parameter controlling how strongly the local correlation matrix $\\Omega_{group}$ (i.e. the derived correlation matrix that will be used for each level of the grouping factor `gr`) is shrunk towards the global correlation matrix $\\Omega_{global}$  (larger values of $\\alpha_{cor}$ indicate a greater degree of shrinkage, i.e. a greater degree of partial pooling). This option is valuable for many types of designs where the same observational units (i.e. *financial assets* or *species*, for example) are measured in different strata (i.e. *regions*, *countries* or *experimental units*, for example). Currently hierarchical correlations can be included for `AR()`, `VAR()` or `ZMVN()` `trend_model` options.\n\n### Gaussian Processes\nThe final option for modelling temporal dynamics is to use a Gaussian Process with squared exponential kernel. These are set up independently for each series (there is currently no multivariate GP option), using `trend_model = 'GP'`. The dynamics for each latent process are modelled as:\n\n\\begin{align*}\nz & \\sim \\text{MVNormal}(0, \\Sigma_{error}) \\\\\n\\Sigma_{error}[t_i, t_j] & = \\alpha^2 * exp(-0.5 * ((|t_i - t_j| / \\rho))^2) \\end{align*}\n\nThe latent dynamic process evolves from a complex, high-dimensional Multivariate Normal distribution which depends on $\\rho$ (often called the length scale parameter) to control how quickly the correlations between the model's errors decay as a function of time. For these models, covariance decays exponentially fast with the squared distance (in time) between the observations. The functions also depend on a parameter $\\alpha$, which controls the marginal variability of the temporal function at all points; in other words it controls how much the GP term contributes to the linear predictor. `mvgam` capitalizes on some advances that allow GPs to be approximated using Hilbert space basis functions, which [considerably speed up computation at little cost to accuracy or prediction performance](https://link.springer.com/article/10.1007/s11222-022-10167-2){target=\"_blank\"}.\n\n### Piecewise logistic and linear trends\nModeling growth for many types of time series is often similar to modeling population growth in natural ecosystems, where there series exhibits nonlinear growth that saturates at some particular carrying capacity. The logistic trend model available in {`mvgam`} allows for a time-varying capacity $C(t)$ as well as a non-constant growth rate. Changes in the base growth rate $k$ are incorporated by explicitly defining changepoints throughout the training period where the growth rate is allowed to vary. The changepoint vector $a$ is represented as a vector of `1`s and `0`s, and the rate of growth at time $t$ is represented as $k+a(t)^T\\delta$. Potential changepoints are selected uniformly across the training period, and the number of changepoints, as well as the flexibility of the potential rate changes at these changepoints, can be controlled using `trend_model = PW()`. The full piecewise logistic growth model is then:\n\n\\begin{align*}\nz_t & = \\frac{C_t}{1 + \\exp(-(k+a(t)^T\\delta)(t-(m+a(t)^T\\gamma)))}  \\end{align*}\n\nFor time series that do not appear to exhibit saturating growth, a piece-wise constant rate of growth can often provide a useful trend model. The piecewise linear trend is defined as:\n\n\\begin{align*}\nz_t & = (k+a(t)^T\\delta)t + (m+a(t)^T\\gamma)  \\end{align*}\n\nIn both trend models, $m$ is an offset parameter that controls the trend intercept. Because of this parameter, it is not recommended that you include an intercept in your observation formula because this will not be identifiable. You can read about the full description of piecewise linear and logistic trends [in this paper by Taylor and Letham](https://www.tandfonline.com/doi/abs/10.1080/00031305.2017.1380080){target=\"_blank\"}. \n\nSean J. Taylor and Benjamin Letham. \"[Forecasting at scale.](https://www.tandfonline.com/doi/full/10.1080/00031305.2017.1380080)\" *The American Statistician* 72.1 (2018): 37-45.\n\n### Continuous time AR(1) processes\nMost trend models in the `mvgam()` function expect time to be measured in regularly-spaced, discrete intervals (i.e. one measurement per week, or one per year for example). But some time series are taken at irregular intervals and we'd like to model autoregressive properties of these. The `trend_model = CAR()` can be useful to set up these models, which currently only support autoregressive processes of order `1`. The evolution of the latent dynamic process follows the form:\n\n\\begin{align*}\nz_{i,t} & \\sim \\text{Normal}(ar1_i^{distance} * z_{i,t-1}, \\sigma_i) \\end{align*}\n\nWhere $distance$ is a vector of non-negative measurements of the time differences between successive observations. These models are perhaps more widely known as Ornstein–Uhlenbeck processes. See the **Examples** section in `?CAR` for an illustration of how to set these models up. \n\n## Regression formulae\n`mvgam` supports an observation model regression formula, built off the `mgcv` package, as well as an optional process model regression formula. The formulae supplied to `mvgam()` are exactly like those supplied to `glm()` except that smooth terms, `s()`,\n`te()`, `ti()` and `t2()`, time-varying effects using `dynamic()`, monotonically increasing (using `s(x, bs = 'moi')`) or decreasing splines (using `s(x, bs = 'mod')`; see `?smooth.construct.moi.smooth.spec` for details), as well as Gaussian Process functions using `gp()`, can be added to the right hand side (and `.` is not supported in `mvgam` formulae). See `?mvgam_formulae` for more guidance.\n  \nFor setting up State-Space models, the optional process model formula can be used (see [the State-Space model vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html) and [the shared latent states vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html) for guidance on using trend formulae).\n\n## Example time series data\nThe 'portal_data' object contains time series of rodent captures from the Portal Project, [a long-term monitoring study based near the town of Portal, Arizona](https://portal.weecology.org/){target=\"_blank\"}. Researchers have been operating a standardized set of baited traps within 24 experimental plots at this site since the 1970's. Sampling follows the lunar monthly cycle, with observations occurring on average about 28 days apart. However, missing observations do occur due to difficulties accessing the site (weather events, COVID disruptions etc...). You can read about the full sampling protocol [in this preprint by Ernest et al on the Biorxiv](https://www.biorxiv.org/content/10.1101/332783v3.full){target=\"_blank\"}. \n```{r Access time series data}\ndata(\"portal_data\")\n```\n\nAs the data come pre-loaded with the `mvgam` package, you can read a little about it in the help page using `?portal_data`. Before working with data, it is important to inspect how the data are structured, first using `head()`:\n```{r Inspect data format and structure}\nhead(portal_data)\n```\n\nBut the `glimpse()` function in `dplyr` is also useful for understanding how variables are structured\n```{r}\ndplyr::glimpse(portal_data)\n```\n\nWe will focus analyses on the time series of captures for one specific rodent species, the Desert Pocket Mouse *Chaetodipus penicillatus*. This species is interesting in that it goes into a kind of \"hibernation\" during the colder months, leading to very low captures during the winter period\n\n## Manipulating data for modelling\n\nManipulating the data into a 'long' format is necessary for modelling in `mvgam`. By 'long' format, we mean that each `series x time` observation needs to have its own entry in the `dataframe` or `list` object that we wish to use as data for modelling. A simple example can be viewed by simulating data using the `sim_mvgam()` function. See `?sim_mvgam` for more details\n```{r}\ndata <- sim_mvgam(n_series = 4, T = 24)\nhead(data$data_train, 12)\n```\n\nNotice how we have four different time series in these simulated data, but we do not spread the outcome values into different columns. Rather, there is only a single column for the outcome variable, labelled `y` in these simulated data. We also must supply a variable labelled `time` to ensure the modelling software knows how to arrange the time series when building models. This setup still allows us to formulate multivariate time series models, as you can see in the [State-Space vignette](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html). Below are the steps needed to shape our `portal_data` object into the correct form. First, we create a `time` variable, select the column representing counts of our target species (`PP`), and select appropriate variables that we can use as predictors\n```{r Wrangle data for modelling}\nportal_data %>%\n  # Filter the data to only contain captures of the 'PP' \n  dplyr::filter(series == 'PP') %>%\n  droplevels() %>%\n  dplyr::mutate(count = captures) %>%\n  # Add a 'year' variable\n  dplyr::mutate(year = sort(rep(1:8, 12))[time]) %>%\n  # Select the variables of interest to keep in the model_data\n  dplyr::select(series, year, time, count, mintemp, ndvi_ma12) -> model_data\n```\n\nThe data now contain six variables:  \n  `series`, a factor indexing which time series each observation belongs to  \n  `year`, the year of sampling  \n  `time`, the indicator of which time step each observation belongs to  \n  `count`, the response variable representing the number of captures of the species `PP` in each sampling observation  \n  `mintemp`, the monthly average minimum temperature at each time step  \n  `ndvi_ma12`, a 12-month moving average of the monthly Normalized Difference Vegetation Index at each time step  \n\nNow check the data structure again\n```{r}\nhead(model_data)\n```\n\n```{r}\ndplyr::glimpse(model_data)\n```\n\nYou can also summarize multiple variables, which is helpful to search for data ranges and identify missing values\n```{r Summarise variables}\nsummary(model_data)\n```\n\nWe have some `NA`s in our response variable `count`. These observations will generally be thrown out by most modelling packages in \\R. But as you will see when we work through the tutorials, `mvgam` keeps these in the data so that predictions can be automatically returned for the full dataset. The time series and some of its descriptive features can be plotted using `plot_mvgam_series()`:\n```{r}\nplot_mvgam_series(data = model_data, series = 1, y = \"count\")\n```\n\n## GLMs with temporal random effects\nOur first task will be to fit a Generalized Linear Model (GLM) that can adequately capture the features of our `count` observations (integer data, lower bound at zero, missing values) while also attempting to model temporal variation. We are almost ready to fit our first model, which will be a GLM with Poisson observations, a log link function and random (hierarchical) intercepts for `year`. This will allow us to capture our prior belief that, although each year is unique, having been sampled from the same population of effects, all years are connected and thus might contain valuable information about one another. This will be done by capitalizing on the partial pooling properties of hierarchical models. Hierarchical (also known as random) effects offer many advantages when modelling data with grouping structures (i.e. multiple species, locations, years etc...). The ability to incorporate these in time series models is a huge advantage over traditional models such as ARIMA or Exponential Smoothing. But before we fit the model, we will need to convert `year` to a factor so that we can use a random effect basis in `mvgam`. See `?smooth.terms` and\n`?smooth.construct.re.smooth.spec` for details about the `re` basis construction that is used by both `mvgam` and `mgcv`\n```{r}\nmodel_data %>%\n  # Create a 'year_fac' factor version of 'year'\n  dplyr::mutate(year_fac = factor(year)) -> model_data\n```\n\nPreview the dataset to ensure year is now a factor with a unique factor level for each year in the data\n```{r}\ndplyr::glimpse(model_data)\nlevels(model_data$year_fac)\n```\n\nWe are now ready for our first `mvgam` model. The syntax will be familiar to users who have previously built models with `mgcv`. But for a refresher, see `?formula.gam` and the examples in `?gam`. Random effects can be specified using the `s` wrapper with the `re` basis. Note that we can also suppress the primary intercept using the usual `R` formula syntax `- 1`. `mvgam` has a number of possible observation families that can be used, see `?mvgam_families` for more information. We will use `Stan` as the fitting engine, which deploys Hamiltonian Monte Carlo (HMC) for full Bayesian inference. By default, 4 HMC chains will be run using a warmup of 500 iterations and collecting 500 posterior samples from each chain. The package will also aim to use the `Cmdstan` backend when possible, so it is recommended that users have an up-to-date installation of `Cmdstan` and the associated `cmdstanr` interface on their machines (note that you can set the backend yourself using the `backend` argument: see `?mvgam` for details). Interested users should consult the [`Stan` user's guide](https://mc-stan.org/docs/stan-users-guide/index.html){target=\"_blank\"} for more information about the software and the enormous variety of models that can be tackled with HMC.\n```{r model1, include=FALSE, results='hide'}\nmodel1 <- mvgam(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel1 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n```\n\nThe model can be described mathematically for each timepoint $t$ as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = \\beta_{year[year_t]} \\\\\n\\beta_{year} & \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\end{align*}\n\nWhere the $\\beta_{year}$ effects are drawn from a *population* distribution that is parameterized by a common mean $(\\mu_{year})$ and variance $(\\sigma_{year})$. Priors on most of the model parameters can be interrogated and changed using similar functionality to the options available in `brms`. For example, the default priors on $(\\mu_{year})$ and $(\\sigma_{year})$ can be viewed using the following code:\n```{r}\nget_mvgam_priors(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = model_data\n)\n```\n\nSee examples in `?get_mvgam_priors` to find out different ways that priors can be altered.\nOnce the model has finished, the first step is to inspect the `summary()` to ensure no major diagnostic warnings have been produced and to quickly summarise posterior distributions for key parameters\n```{r}\nsummary(model1)\n```\n\nThe diagnostic messages at the bottom of the summary show that the HMC sampler did not encounter any problems or difficult posterior spaces. This is a good sign. Posterior distributions for model parameters can be extracted in any way that an object of class `brmsfit` can (see `?mvgam::mvgam_draws` for details). For example, we can extract the coefficients related to the GAM linear predictor (i.e. the $\\beta$'s) into a `data.frame` using:\n```{r Extract coefficient posteriors}\nbeta_post <- as.data.frame(model1, variable = \"betas\")\ndplyr::glimpse(beta_post)\n```\n\nWith any model fitted in `mvgam`, the underlying `Stan` code can be viewed using the `stancode()` function:\n```{r}\nstancode(model1)\n```\n\n### Plotting effects and residuals\n\nNow for interrogating the model. We can get some sense of the variation in yearly intercepts from the summary above, but it is easier to understand them using targeted plots. Plot posterior distributions of the temporal random effects using `plot.mvgam()` with `type = 're'`. See `?plot.mvgam` for more details about the types of plots that can be produced from fitted `mvgam` objects\n```{r Plot random effect estimates}\nplot(model1, type = \"re\")\n```\n\n### `bayesplot` support\nWe can also capitalize on most of the useful MCMC plotting functions from the `bayesplot` package to visualize posterior distributions and diagnostics (see `?mvgam::mcmc_plot.mvgam` for details):\n```{r}\nmcmc_plot(\n  object = model1,\n  variable = \"betas\",\n  type = \"areas\"\n)\n```\n\nWe can also use the wide range of posterior checking functions available in `bayesplot` (see `?mvgam::ppc_check.mvgam` for details):\n```{r}\npp_check(object = model1)\n```\n\nThere is clearly some variation in these yearly intercept estimates. But how do these translate into time-varying predictions? To understand this, we can plot posterior hindcasts from this model for the training period using `plot.mvgam()` with `type = 'forecast'`\n```{r Plot posterior hindcasts}\nplot(model1, type = \"forecast\")\n```\n\nIf you wish to extract these hindcasts for other downstream analyses, the `hindcast()` function can be used. This will return a list object of class `mvgam_forecast`. In the `hindcasts` slot, a matrix of posterior retrodictions will be returned for each series in the data (only one series in our example): \n```{r Extract posterior hindcast}\nhc <- hindcast(model1)\nstr(hc)\n```\n\nYou can also extract these hindcasts on the linear predictor scale, which in this case is the log scale (our Poisson GLM used a log link function). Sometimes this can be useful for asking more targeted questions about drivers of variation:\n```{r Extract hindcasts on the linear predictor scale}\nhc <- hindcast(model1, type = \"link\")\nrange(hc$hindcasts$PP)\n```\n\nIn any regression analysis, a key question is whether the residuals show any patterns that can be indicative of un-modelled sources of variation. For GLMs, we can use a modified residual called the [Dunn-Smyth, or randomized quantile, residual](https://www.jstor.org/stable/1390802){target=\"_blank\"}. Inspect Dunn-Smyth residuals from the model using `plot.mvgam()` with `type = 'residuals'`\n```{r Plot posterior residuals}\nplot(model1, type = \"residuals\")\n```\n\n## Automatic forecasting for new data\nThese temporal random effects do not have a sense of \"time\". Because of this, each yearly random intercept is not restricted in some way to be similar to the previous yearly intercept. This drawback becomes evident when we predict for a new year. To do this, we can repeat the exercise above but this time will split the data into training and testing sets before re-running the model. We can then supply the test set as `newdata`. For splitting, we will make use of the `filter()` function from `dplyr`\n```{r}\nmodel_data %>%\n  dplyr::filter(time <= 70) -> data_train\nmodel_data %>%\n  dplyr::filter(time > 70) -> data_test\n```\n\n```{r include=FALSE, message=FALSE, warning=FALSE}\nmodel1b <- mvgam(count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel1b <- mvgam(\n  count ~ s(year_fac, bs = \"re\") - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nWe can view the test data in the forecast plot to see that the predictions do not capture the temporal variation in the test set\n```{r Plotting predictions against test data}\nplot(model1b, type = \"forecast\", newdata = data_test)\n```\n\nAs with the `hindcast()` function, we can use the `forecast()` function to automatically extract the posterior distributions for these predictions. This also returns an object of class `mvgam_forecast`, but now it will contain both the hindcasts and forecasts for each series in the data:\n```{r Extract posterior forecasts}\nfc <- forecast(model1b)\nstr(fc)\n```\n\n## Adding predictors as \"fixed\" effects\nAny users familiar with GLMs will know that we nearly always wish to include predictor variables that may explain some of the variation in our observations. Predictors are easily incorporated into GLMs / GAMs. Here, we will update the model from above by including a parametric (fixed) effect of `ndvi_ma12` as a linear predictor:\n```{r model2, include=FALSE, message=FALSE, warning=FALSE}\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel2 <- mvgam(\n  count ~ s(year_fac, bs = \"re\") +\n    ndvi_ma12 - 1,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = \\beta_{year[year_t]} + \\beta_{ndvi} * \\boldsymbol{ndvi}_t \\\\\n\\beta_{year} & \\sim \\text{Normal}(\\mu_{year}, \\sigma_{year}) \\\\\n\\beta_{ndvi} & \\sim \\text{Normal}(0, 1) \\end{align*}\n\nWhere the $\\beta_{year}$ effects are the same as before but we now have another predictor $(\\beta_{ndvi})$ that applies to the `ndvi_ma12` value at each timepoint $t$. Inspect the summary of this model\n\n```{r, class.output=\"scroll-300\"}\nsummary(model2)\n```\n\nRather than printing the summary each time, we can also quickly look at the posterior empirical quantiles for the fixed effect of `ndvi` (and other linear predictor coefficients) using `coef`: \n```{r Posterior quantiles of model coefficients}\ncoef(model2)\n```\n\nLook at the estimated effect of `ndvi` using using a histogram. This can be done by first extracting the posterior coefficients:\n```{r}\nbeta_post <- as.data.frame(model2, variable = \"betas\")\ndplyr::glimpse(beta_post)\n```\n\nThe posterior distribution for the effect of `ndvi_ma12` is stored in the `ndvi_ma12` column. A quick histogram confirms our inference that `log(counts)` respond positively to increases in `ndvi`:\n```{r Histogram of NDVI effects}\nhist(beta_post$ndvi_ma12,\n  xlim = c(\n    -1 * max(abs(beta_post$ndvi_ma12)),\n    max(abs(beta_post$ndvi))\n  ),\n  col = \"darkred\",\n  border = \"white\",\n  xlab = expression(beta[NDVI]),\n  ylab = \"\",\n  yaxt = \"n\",\n  main = \"\",\n  lwd = 2\n)\nabline(v = 0, lwd = 2.5)\n```\n\n### `marginaleffects` support\nGiven our model used a nonlinear link function (log link in this example), it can still be difficult to fully understand what relationship our model is estimating between a predictor and the response. Fortunately, the `marginaleffects` package makes this relatively straightforward. Objects of class `mvgam` can be used with `marginaleffects` to inspect contrasts, scenario-based predictions, conditional and marginal effects, all on the outcome scale. Like `brms`, `mvgam` has the simple `conditional_effects()` function to make quick and informative plots for main effects, which rely on `marginaleffects` support. This will likely be your go-to function for quickly understanding patterns from fitted `mvgam` models\n```{r warning=FALSE}\nconditional_effects(model2)\n```\n\n## Adding predictors as smooths\n\nSmooth functions, using penalized splines, are a major feature of `mvgam`. Nonlinear splines are commonly viewed as variations of random effects in which the coefficients that control the shape of the spline are drawn from a joint, penalized distribution. This strategy is very often used in ecological time series analysis to capture smooth temporal variation in the processes we seek to study. When we construct smoothing splines, the workhorse package `mgcv` will calculate a set of basis functions that will collectively control the shape and complexity of the resulting spline. It is often helpful to visualize these basis functions to get a better sense of how splines work. We'll create a set of 6 basis functions to represent possible variation in the effect of `time` on our outcome.In addition to constructing the basis functions, `mgcv` also creates a penalty matrix $S$, which contains **known** coefficients that work to constrain the wiggliness of the resulting smooth function. When fitting a GAM to data, we must estimate the smoothing parameters ($\\lambda$) that will penalize these matrices, resulting in constrained basis coefficients and smoother functions that are less likely to overfit the data. This is the key to fitting GAMs in a Bayesian framework, as we can jointly estimate the $\\lambda$'s using informative priors to prevent overfitting and expand the complexity of models we can tackle. To see this in practice, we can now fit a model that replaces the yearly random effects with a smooth function of `time`. We will need a reasonably complex function (large `k`) to try and accommodate the temporal variation in our observations. Following some [useful advice by Gavin Simpson](https://fromthebottomoftheheap.net/2020/06/03/extrapolating-with-gams/){target=\"_blank\"}, we will use a b-spline basis for the temporal smooth. Because we no longer have intercepts for each year, we also retain the primary intercept term in this model (there is no `-1` in the formula now):\n```{r model3, include=FALSE, message=FALSE, warning=FALSE}\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel3 <- mvgam(\n  count ~ s(time, bs = \"bs\", k = 15) +\n    ndvi_ma12,\n  family = poisson(),\n  data = data_train,\n  newdata = data_test\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = f(\\boldsymbol{time})_t + \\beta_{ndvi} * \\boldsymbol{ndvi}_t  \\\\\nf(\\boldsymbol{time}) & = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} & \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\\\\n\\beta_{ndvi} & \\sim \\text{Normal}(0, 1) \\end{align*}\n\n\nWhere the smooth function $f_{time}$ is built by summing across a set of weighted basis functions. The basis functions $(b)$ are constructed using a thin plate regression basis in `mgcv`. The weights $(\\beta_{smooth})$ are drawn from a penalized multivariate normal distribution where the precision matrix $(\\Omega$) is multiplied by a smoothing penalty $(\\lambda)$. If $\\lambda$ becomes large, this acts to *squeeze* the covariances among the weights $(\\beta_{smooth})$, leading to a less wiggly spline. Note that sometimes there are multiple smoothing penalties that contribute to the covariance matrix, but I am only showing one here for simplicity. View the summary as before\n```{r}\nsummary(model3)\n```\n\nThe summary above now contains posterior estimates for the smoothing parameters as well as the basis coefficients for the nonlinear effect of `time`. We can visualize `conditional_effects` as before:\n```{r warning=FALSE}\nconditional_effects(model3, type = \"link\")\n```\n\nInspect the underlying `Stan` code to gain some idea of how the spline is being penalized:\n```{r, class.output=\"scroll-300\"}\nstancode(model3)\n```\n\nThe line below `// prior for s(time)...` shows how the spline basis coefficients are drawn from a zero-centred multivariate normal distribution. The precision matrix $S$ is penalized by two different smoothing parameters (the $\\lambda$'s) to enforce smoothness and reduce overfitting\n\n## Latent dynamics in `mvgam`\n\nForecasts from the above model are not ideal:\n```{r}\nplot(model3, type = \"forecast\", newdata = data_test)\n```\n\nWhy is this happening? The forecasts are driven almost entirely by variation in the temporal spline, which is extrapolating linearly *forever* beyond the edge of the training data. Any slight wiggles near the end of the training set will result in wildly different forecasts. To visualize this, we can plot the extrapolated temporal functions into the out-of-sample test set for the two models. Here are the extrapolated functions for the first model, with 15 basis functions:\n```{r Plot extrapolated temporal functions using newdata}\nplot_mvgam_smooth(\n  model3,\n  smooth = \"s(time)\",\n  # pass newdata to the plot function to generate\n  # predictions of the temporal smooth to the end of the\n  # testing period\n  newdata = data.frame(\n    time = 1:max(data_test$time),\n    ndvi_ma12 = 0\n  )\n)\nabline(v = max(data_train$time), lty = \"dashed\", lwd = 2)\n```\n\nThis model is not doing well. Clearly we need to somehow account for the strong temporal autocorrelation when modelling these data without using a smooth function of `time`. Now onto another prominent feature of `mvgam`: the ability to include (possibly latent) autocorrelated residuals in regression models. To do so, we use the `trend_model` argument (see `?mvgam_trends` for details of different dynamic trend models that are supported). This model will use a separate sub-model for latent residuals that evolve as an AR1 process (i.e. the error in the current time point is a function of the error in the previous time point, plus some stochastic noise). We also include a smooth function of `ndvi_ma12` in this model, rather than the parametric term that was used above, to showcase that `mvgam` can include combinations of smooths and dynamic components:\n```{r model4, include=FALSE}\nmodel4 <- mvgam(count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR(),\n  parallel = FALSE\n)\n```\n\n```{r eval=FALSE}\nmodel4 <- mvgam(\n  count ~ s(ndvi_ma12, k = 6),\n  family = poisson(),\n  data = data_train,\n  newdata = data_test,\n  trend_model = AR()\n)\n```\n\nThe model can be described mathematically as follows:\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Poisson}(\\lambda_t) \\\\\nlog(\\lambda_t) & = f(\\boldsymbol{ndvi})_t + z_t \\\\\nz_t & \\sim \\text{Normal}(ar1 * z_{t-1}, \\sigma_{error}) \\\\\nar1 & \\sim \\text{Normal}(0, 1)[-1, 1] \\\\\n\\sigma_{error} & \\sim \\text{Exponential}(2) \\\\\nf(\\boldsymbol{ndvi}) & = \\sum_{k=1}^{K}b * \\beta_{smooth} \\\\\n\\beta_{smooth} & \\sim \\text{MVNormal}(0, (\\Omega * \\lambda)^{-1}) \\end{align*}\n\nHere the term $z_t$ captures autocorrelated latent residuals, which are modelled using an AR1 process. You can also notice that this model is estimating autocorrelated errors for the full time period, even though some of these time points have missing observations. This is useful for getting more realistic estimates of the residual autocorrelation parameters. Summarise the model to see how it now returns posterior summaries for the latent AR1 process:\n```{r Summarise the mvgam autocorrelated error model, class.output=\"scroll-300\"}\nsummary(model4)\n```\n\nView posterior hindcasts / forecasts and compare against the out of sample test data\n```{r}\nplot(model4, type = \"forecast\", newdata = data_test)\n```\n\nThe trend is evolving as an AR1 process, which we can also view:\n```{r}\nplot(model4, type = \"trend\", newdata = data_test)\n```\n\nIn-sample model performance can be interrogated using leave-one-out cross-validation utilities from the `loo` package (a higher value is preferred for this metric):\n```{r}\nloo_compare(model3, model4)\n```\n\nThe higher estimated log predictive density (ELPD) value for the dynamic model suggests it provides a better fit to the in-sample data. \n\nThough it should be obvious that this model provides better forecasts, we can quantify forecast performance for models 3 and 4 using the `forecast` and `score` functions. Here we will compare models based on their Discrete Ranked Probability Scores (a lower value is preferred for this metric)\n```{r}\nfc_mod3 <- forecast(model3)\nfc_mod4 <- forecast(model4)\nscore_mod3 <- score(fc_mod3, score = \"drps\")\nscore_mod4 <- score(fc_mod4, score = \"drps\")\nsum(score_mod4$PP$score, na.rm = TRUE) - \n  sum(score_mod3$PP$score, na.rm = TRUE)\n```\n\nA strongly negative value here suggests the score for the dynamic model (model 4) is much smaller than the score for the model with a smooth function of time (model 3)\n\n## Further reading\nThe following papers and resources offer useful material about Dynamic GAMs and how they can be applied in practice:\n  \nClark, Nicholas J. and Wells, K. [Dynamic Generalized Additive Models (DGAMs) for forecasting discrete ecological time series](https://doi.org/10.1111/2041-210X.13974). *Methods in Ecology and Evolution*. (2023): 14, 771-784.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nde Sousa, Heitor C., et al. [Severe fire regimes decrease resilience of ectothermic populations](https://doi.org/10.1111/1365-2656.14188). *Journal of Animal Ecology* (2024): 93(11), 1656-1669.  \n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant.](https://doi.org/10.1016/j.csda.2022.107659) *Computational Statistics & Data Analysis* (2023): 179, 107659.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.\n  \nZhu, L., et al. [Responses of a widespread pest insect to extreme high temperatures are stage-dependent and divergent among seasonal cohorts](https://doi.org/10.1111/1365-2435.14711). *Functional Ecology* (2025): 39, 165–180. https://doi.org/10.1111/1365-2435.14711\n  \n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "vignettes/nmixtures.Rmd",
    "content": "---\ntitle: \"N-mixtures in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n  toc: yes\nvignette: >\n  %\\VignetteIndexEntry{N-mixtures in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\nlibrary(dplyr)\n# A custom ggplot2 theme\ntheme_set(theme_classic(base_size = 12, base_family = \"serif\") +\n  theme(\n    axis.line.x.bottom = element_line(\n      colour = \"black\",\n      size = 1\n    ),\n    axis.line.y.left = element_line(\n      colour = \"black\",\n      size = 1\n    )\n  ))\noptions(\n  ggplot2.discrete.colour = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  ),\n  ggplot2.discrete.fill = c(\n    \"#A25050\",\n    \"#00008b\",\n    \"darkred\",\n    \"#010048\"\n  )\n)\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to fit and interrogate N-mixture models for population abundance counts made with imperfect detection.\n\n## N-mixture models\nAn N-mixture model is a fairly recent addition to the ecological modeller's toolkit that is designed to make inferences about variation in the abundance of species when observations are imperfect ([Royle 2004](https://onlinelibrary.wiley.com/doi/10.1111/j.0006-341X.2004.00142.x){target=\"_blank\"}). Briefly, assume $\\boldsymbol{Y_{i,r}}$ is the number of individuals recorded at site $i$ during replicate sampling observation $r$ (recorded as a non-negative integer). If multiple replicate surveys are done within a short enough period to satisfy the assumption that the population remained closed (i.e. there was no substantial change in true population size between replicate surveys), we can account for the fact that observations aren't perfect. This is done by assuming that these replicate observations are Binomial random variables that are parameterized by the true \"latent\" abundance $N$ and a detection probability $p$:\n\n\\begin{align*}\n\\boldsymbol{Y_{i,r}} & \\sim \\text{Binomial}(N_i, p_r) \\\\\nN_{i} & \\sim \\text{Poisson}(\\lambda_i)  \\end{align*}\n\nUsing a set of linear predictors, we can estimate effects of covariates $\\boldsymbol{X}$ on the expected latent abundance (with a log link for $\\lambda$) and, jointly, effects of possibly different covariates (call them $\\boldsymbol{Q}$) on detection probability (with a logit link for $p$):\n\n\\begin{align*}\nlog(\\lambda) & = \\beta \\boldsymbol{X} \\\\\nlogit(p) & = \\gamma \\boldsymbol{Q}\\end{align*}\n\n`mvgam` can handle this type of model because it is designed to propagate unobserved temporal processes that evolve independently of the observation process in a State-space format. This setup adapts well to N-mixture models because they can be thought of as State-space models in which the latent state is a discrete variable representing the \"true\" but unknown population size. This is very convenient because we can incorporate any of the package's diverse effect types (i.e. multidimensional splines, time-varying effects, monotonic effects, random effects etc...) into the linear predictors. All that is required for this to work is a marginalization trick that allows `Stan`'s sampling algorithms to handle discrete parameters (see more about how this method of \"integrating out\" discrete parameters works in [this nice blog post by Maxwell Joseph](https://mbjoseph.github.io/posts/2020-04-28-a-step-by-step-guide-to-marginalizing-over-discrete-parameters-for-ecologists-using-stan/){target=\"_blank\"}). \n  \nThe family `nmix()` is used to set up N-mixture models in `mvgam`, but we still need to do a little bit of data wrangling to ensure the data are set up in the correct format (this is especially true when we have more than one replicate survey per time period). The most important aspects are: (1) how we set up the observation `series` and `trend_map` arguments to ensure replicate surveys are mapped to the correct latent abundance model and (2) the inclusion of a `cap` variable that defines the maximum possible integer value to use for each observation when estimating latent abundance. The two examples below give a reasonable overview of how this can be done. \n\n## Example 1: a two-species system with nonlinear trends\nFirst we will use a simple simulation in which multiple replicate observations are taken at each timepoint for two different species. The simulation produces observations at a single site over six years, with five replicate surveys per year. Each species is simulated to have different nonlinear temporal trends and different detection probabilities. For now, detection probability is fixed (i.e. it does not change over time or in association with any covariates). Notice that we add the `cap` variable, which does not need to be static, to define the maximum possible value that we think the latent abundance could be for each timepoint. This simply needs to be large enough that we get a reasonable idea of which latent N values are most likely, without adding too much computational cost:\n\n```{r}\nset.seed(999)\n# Simulate observations for species 1, which shows a declining trend and 0.7 detection probability\ndata.frame(\n  site = 1,\n  # five replicates per year; six years\n  replicate = rep(1:5, 6),\n  time = sort(rep(1:6, 5)),\n  species = \"sp_1\",\n  # true abundance declines nonlinearly\n  truth = c(\n    rep(28, 5),\n    rep(26, 5),\n    rep(23, 5),\n    rep(16, 5),\n    rep(14, 5),\n    rep(14, 5)\n  ),\n  # observations are taken with detection prob = 0.7\n  obs = c(\n    rbinom(5, 28, 0.7),\n    rbinom(5, 26, 0.7),\n    rbinom(5, 23, 0.7),\n    rbinom(5, 15, 0.7),\n    rbinom(5, 14, 0.7),\n    rbinom(5, 14, 0.7)\n  )\n) %>%\n  # add 'series' information, which is an identifier of site, replicate and species\n  dplyr::mutate(\n    series = paste0(\n      \"site_\", site,\n      \"_\", species,\n      \"_rep_\", replicate\n    ),\n    time = as.numeric(time),\n    # add a 'cap' variable that defines the maximum latent N to\n    # marginalize over when estimating latent abundance; in other words\n    # how large do we realistically think the true abundance could be?\n    cap = 100\n  ) %>%\n  dplyr::select(-replicate) -> testdat\n\n# Now add another species that has a different temporal trend and a smaller\n# detection probability (0.45 for this species)\ntestdat <- testdat %>%\n  dplyr::bind_rows(data.frame(\n    site = 1,\n    replicate = rep(1:5, 6),\n    time = sort(rep(1:6, 5)),\n    species = \"sp_2\",\n    truth = c(\n      rep(4, 5),\n      rep(7, 5),\n      rep(15, 5),\n      rep(16, 5),\n      rep(19, 5),\n      rep(18, 5)\n    ),\n    obs = c(\n      rbinom(5, 4, 0.45),\n      rbinom(5, 7, 0.45),\n      rbinom(5, 15, 0.45),\n      rbinom(5, 16, 0.45),\n      rbinom(5, 19, 0.45),\n      rbinom(5, 18, 0.45)\n    )\n  ) %>%\n    dplyr::mutate(\n      series = paste0(\n        \"site_\", site,\n        \"_\", species,\n        \"_rep_\", replicate\n      ),\n      time = as.numeric(time),\n      cap = 50\n    ) %>%\n    dplyr::select(-replicate))\n```\n\nThis data format isn't too difficult to set up, but it does differ from the traditional multidimensional array setup that is commonly used for fitting N-mixture models in other software packages. Next we ensure that species and series IDs are included as factor variables, in case we'd like to allow certain effects to vary by species\n```{r}\ntestdat$species <- factor(testdat$species,\n  levels = unique(testdat$species)\n)\ntestdat$series <- factor(testdat$series,\n  levels = unique(testdat$series)\n)\n```\n\nPreview the dataset to get an idea of how it is structured:\n```{r}\ndplyr::glimpse(testdat)\nhead(testdat, 12)\n```\n\n### Setting up the `trend_map`\n\nFinally, we need to set up the `trend_map` object. This is crucial for allowing multiple observations to be linked to the same latent process model (see more information about this argument in the [Shared latent states vignette](https://nicholasjclark.github.io/mvgam/articles/shared_states.html){target=\"_blank\"}). In this case, the mapping operates by species and site to state that each set of replicate observations from the same time point should all share the exact same latent abundance model:\n```{r}\ntestdat %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\ntrend_map\n```\n\nNotice how all of the replicates for species 1 in site 1 share the same process (i.e. the same `trend`). This will ensure that all replicates are Binomial draws of the same latent N.\n\n### Modelling with the `nmix()` family\n\nNow we are ready to fit a model using `mvgam()`. This model will allow each species to have different detection probabilities and different temporal trends. We will use `Cmdstan` as the backend, which by default will use Hamiltonian Monte Carlo for full Bayesian inference\n\n```{r include = FALSE, results='hide'}\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n```\n\n```{r eval = FALSE}\nmod <- mvgam(\n  # the observation formula sets up linear predictors for\n  # detection probability on the logit scale\n  formula = obs ~ species - 1,\n\n  # the trend_formula sets up the linear predictors for\n  # the latent abundance processes on the log scale\n  trend_formula = ~ s(time, by = trend, k = 4) + species,\n\n  # the trend_map takes care of the mapping\n  trend_map = trend_map,\n\n  # nmix() family and data\n  family = nmix(),\n  data = testdat,\n\n  # priors can be set in the usual way\n  priors = c(\n    prior(std_normal(), class = b),\n    prior(normal(1, 1.5), class = Intercept_trend)\n  ),\n  samples = 1000\n)\n```\n\nView the automatically-generated `Stan` code to get a sense of how the marginalization over latent N works\n```{r}\ncode(mod)\n```\n\nThe posterior summary of this model shows that it has converged nicely\n```{r}\nsummary(mod)\n```\n\n`loo()` functionality works just as it does for all `mvgam` models to aid in model comparison / selection (though note that Pareto K values often give warnings for mixture models so these may not be too helpful)\n```{r}\nloo(mod)\n```\n\nPlot the estimated smooths of time from each species' latent abundance process (on the log scale)\n```{r}\nplot(mod, type = \"smooths\", trend_effects = TRUE)\n```\n\n`marginaleffects` support allows for more useful prediction-based interrogations on different scales (though note that at the time of writing this Vignette, you must have the development version of `marginaleffects` installed for `nmix()` models to be supported; use `remotes::install_github('vincentarelbundock/marginaleffects')` to install). Objects that use family `nmix()` have a few additional prediction scales that can be used (i.e. `link`, `response`, `detection` or `latent_N`). For example, here are the estimated detection probabilities per species, which show that the model has done a nice job of estimating these parameters:\n```{r}\nmarginaleffects::plot_predictions(mod,\n  condition = \"species\",\n  type = \"detection\"\n) +\n  ylab(\"Pr(detection)\") +\n  ylim(c(0, 1)) +\n  theme_classic() +\n  theme(legend.position = \"none\")\n```\n\nA common goal in N-mixture modelling is to estimate the true latent abundance. The model has automatically generated predictions for the unknown latent abundance that are conditional on the observations. We can extract these and produce decent plots using a small function\n```{r}\nhc <- hindcast(mod, type = \"latent_N\")\n\n# Function to plot latent abundance estimates vs truth\nplot_latentN <- function(hindcasts, data, species = \"sp_1\") {\n  all_series <- unique(data %>%\n    dplyr::filter(species == !!species) %>%\n    dplyr::pull(series))\n\n  # Grab the first replicate that represents this series\n  # so we can get the true simulated values\n  series <- as.numeric(all_series[1])\n  truths <- data %>%\n    dplyr::arrange(time, series) %>%\n    dplyr::filter(series == !!levels(data$series)[series]) %>%\n    dplyr::pull(truth)\n\n  # In case some replicates have missing observations,\n  # pull out predictions for ALL replicates and average over them\n  hcs <- do.call(rbind, lapply(all_series, function(x) {\n    ind <- which(names(hindcasts$hindcasts) %in% as.character(x))\n    hindcasts$hindcasts[[ind]]\n  }))\n\n  # Calculate posterior empirical quantiles of predictions\n  pred_quantiles <- data.frame(t(apply(hcs, 2, function(x) {\n    quantile(x, probs = c(\n      0.05, 0.2, 0.3, 0.4,\n      0.5, 0.6, 0.7, 0.8, 0.95\n    ))\n  })))\n  pred_quantiles$time <- 1:NROW(pred_quantiles)\n  pred_quantiles$truth <- truths\n\n  # Grab observations\n  data %>%\n    dplyr::filter(series %in% all_series) %>%\n    dplyr::select(time, obs) -> observations\n\n  # Plot\n  ggplot(pred_quantiles, aes(x = time, group = 1)) +\n    geom_ribbon(aes(ymin = X5., ymax = X95.), fill = \"#DCBCBC\") +\n    geom_ribbon(aes(ymin = X30., ymax = X70.), fill = \"#B97C7C\") +\n    geom_line(aes(x = time, y = truth),\n      colour = \"black\", linewidth = 1\n    ) +\n    geom_point(aes(x = time, y = truth),\n      shape = 21, colour = \"white\", fill = \"black\",\n      size = 2.5\n    ) +\n    geom_jitter(\n      data = observations, aes(x = time, y = obs),\n      width = 0.06,\n      shape = 21, fill = \"darkred\", colour = \"white\", size = 2.5\n    ) +\n    labs(\n      y = \"Latent abundance (N)\",\n      x = \"Time\",\n      title = species\n    )\n}\n```\n\nLatent abundance plots vs the simulated truths for each species are shown below. Here, the red points show the imperfect observations, the black line shows the true latent abundance, and the ribbons show credible intervals of our estimates:\n```{r}\nplot_latentN(hc, testdat, species = \"sp_1\")\nplot_latentN(hc, testdat, species = \"sp_2\")\n```\n\nWe can see that estimates for both species have correctly captured the true temporal variation and magnitudes in abundance\n\n## Example 2: a larger survey with possible nonlinear effects\n\nNow for another example with a larger dataset. We will use data from [Jeff Doser's simulation example from the wonderful `spAbundance` package](https://doserlab.com/files/spabundance-web/articles/nmixturemodels){target=\"_blank\"}. The simulated data include one continuous site-level covariate, one factor site-level covariate and two continuous sample-level covariates. This example will allow us to examine how we can include possibly nonlinear effects in the latent process and detection probability models.\n  \nDownload the data and grab observations / covariate measurements for one species\n```{r}\n# Date link\nload(url(\"https://github.com/doserjef/spAbundance/raw/main/data/dataNMixSim.rda\"))\ndata.one.sp <- dataNMixSim\n\n# Pull out observations for one species\ndata.one.sp$y <- data.one.sp$y[1, , ]\n\n# Abundance covariates that don't change across repeat sampling observations\nabund.cov <- dataNMixSim$abund.covs[, 1]\nabund.factor <- as.factor(dataNMixSim$abund.covs[, 2])\n\n# Detection covariates that can change across repeat sampling observations\n# Note that `NA`s are not allowed for covariates in mvgam, so we randomly\n# impute them here\ndet.cov <- dataNMixSim$det.covs$det.cov.1[, ]\ndet.cov[is.na(det.cov)] <- rnorm(length(which(is.na(det.cov))))\ndet.cov2 <- dataNMixSim$det.covs$det.cov.2\ndet.cov2[is.na(det.cov2)] <- rnorm(length(which(is.na(det.cov2))))\n```\n\nNext we wrangle into the appropriate 'long' data format, adding indicators of `time` and `series` for working in `mvgam`. We also add the `cap` variable to represent the maximum latent N to marginalize over for each observation\n```{r}\nmod_data <- do.call(\n  rbind,\n  lapply(1:NROW(data.one.sp$y), function(x) {\n    data.frame(\n      y = data.one.sp$y[x, ],\n      abund_cov = abund.cov[x],\n      abund_fac = abund.factor[x],\n      det_cov = det.cov[x, ],\n      det_cov2 = det.cov2[x, ],\n      replicate = 1:NCOL(data.one.sp$y),\n      site = paste0(\"site\", x)\n    )\n  })\n) %>%\n  dplyr::mutate(\n    species = \"sp_1\",\n    series = as.factor(paste0(site, \"_\", species, \"_\", replicate))\n  ) %>%\n  dplyr::mutate(\n    site = factor(site, levels = unique(site)),\n    species = factor(species, levels = unique(species)),\n    time = 1,\n    cap = max(data.one.sp$y, na.rm = TRUE) + 20\n  )\n```\n\nThe data include observations for 225 sites with three replicates per site, though some observations are missing\n```{r}\nNROW(mod_data)\ndplyr::glimpse(mod_data)\nhead(mod_data)\n```\n\nThe final step for data preparation is of course the `trend_map`, which sets up the mapping between observation replicates and the latent abundance models. This is done in the same way as in the example above\n```{r}\nmod_data %>%\n  # each unique combination of site*species is a separate process\n  dplyr::mutate(trend = as.numeric(factor(paste0(site, species)))) %>%\n  dplyr::select(trend, series) %>%\n  dplyr::distinct() -> trend_map\n\ntrend_map %>%\n  dplyr::arrange(trend) %>%\n  head(12)\n```\n\nNow we are ready to fit a model using `mvgam()`. Here we will use penalized splines for each of the continuous covariate effects to detect possible nonlinear associations. We also showcase how `mvgam` can make use of the different approximation algorithms available in `Stan` by using the meanfield variational Bayes approximator (this reduces computation time from around 90 seconds to around 12 seconds for this example)\n```{r include = FALSE, results='hide'}\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 3) + s(det_cov2, k = 3),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 3) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(\n  # effects of covariates on detection probability;\n  # here we use penalized splines for both continuous covariates\n  formula = y ~ s(det_cov, k = 4) + s(det_cov2, k = 4),\n\n  # effects of the covariates on latent abundance;\n  # here we use a penalized spline for the continuous covariate and\n  # hierarchical intercepts for the factor covariate\n  trend_formula = ~ s(abund_cov, k = 4) +\n    s(abund_fac, bs = \"re\"),\n\n  # link multiple observations to each site\n  trend_map = trend_map,\n\n  # nmix() family and supplied data\n  family = nmix(),\n  data = mod_data,\n\n  # standard normal priors on key regression parameters\n  priors = c(\n    prior(std_normal(), class = \"b\"),\n    prior(std_normal(), class = \"Intercept\"),\n    prior(std_normal(), class = \"Intercept_trend\"),\n    prior(std_normal(), class = \"sigma_raw_trend\")\n  ),\n\n  # use Stan's variational inference for quicker results\n  algorithm = \"meanfield\",\n\n  # no need to compute \"series-level\" residuals\n  residuals = FALSE,\n  samples = 1000\n)\n```\n\nInspect the model summary but don't bother looking at estimates for all individual spline coefficients. Notice how we no longer receive information on convergence because we did not use MCMC sampling for this model\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nAgain we can make use of `marginaleffects` support for interrogating the model through targeted predictions. First, we can inspect the estimated average detection probability\n```{r}\nmarginaleffects::avg_predictions(mod, type = \"detection\")\n```\n\nNext investigate estimated effects of covariates on latent abundance using the `conditional_effects()` function and specifying `type = 'link'`; this will return plots on the expectation scale\n```{r}\nabund_plots <- plot(\n  conditional_effects(mod,\n    type = \"link\",\n    effects = c(\n      \"abund_cov\",\n      \"abund_fac\"\n    )\n  ),\n  plot = FALSE\n)\n```\n\nThe effect of the continuous covariate on expected latent abundance\n```{r}\nabund_plots[[1]] +\n  ylab(\"Expected latent abundance\")\n```\n\nThe effect of the factor covariate on expected latent abundance, estimated as a hierarchical random effect\n```{r}\nabund_plots[[2]] +\n  ylab(\"Expected latent abundance\")\n```\n\nNow we can investigate estimated effects of covariates on detection probability using `type = 'detection'`\n```{r}\ndet_plots <- plot(\n  conditional_effects(mod,\n    type = \"detection\",\n    effects = c(\n      \"det_cov\",\n      \"det_cov2\"\n    )\n  ),\n  plot = FALSE\n)\n```\n\nThe covariate smooths were estimated to be somewhat nonlinear on the logit scale according to the model summary (based on their approximate significances). But inspecting conditional effects of each covariate on the probability scale is more intuitive and useful\n```{r}\ndet_plots[[1]] +\n  ylab(\"Pr(detection)\")\ndet_plots[[2]] +\n  ylab(\"Pr(detection)\")\n```\n\nMore targeted predictions are also easy with `marginaleffects` support. For example, we can ask: How does detection probability change as we change *both* detection covariates?\n```{r}\nfivenum_round <- function(x) round(fivenum(x, na.rm = TRUE), 2)\n\nmarginaleffects::plot_predictions(mod,\n  newdata = marginaleffects::datagrid(\n    det_cov = unique,\n    det_cov2 = fivenum_round\n  ),\n  by = c(\"det_cov\", \"det_cov2\"),\n  type = \"detection\"\n) +\n  theme_classic() +\n  ylab(\"Pr(detection)\")\n```\n\nThe model has found support for some important covariate effects, but of course we'd want to interrogate how well the model predicts and think about possible spatial effects to capture unmodelled variation in latent abundance (which can easily be incorporated into both linear predictors using spatial smooths).\n\n## Further reading\nThe following papers and resources offer useful material about N-mixture models for ecological population dynamics investigations:\n  \nGuélat, Jérôme, and Kéry, Marc. “[Effects of Spatial Autocorrelation and Imperfect Detection on Species Distribution Models.](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.12983)” *Methods in Ecology and Evolution* 9 (2018): 1614–25.\n  \nKéry, Marc, and Royle Andrew J. \"[Applied hierarchical modeling in ecology: Analysis of distribution, abundance and species richness in R and BUGS: Volume 2: Dynamic and advanced models](https://shop.elsevier.com/books/applied-hierarchical-modeling-in-ecology-analysis-of-distribution-abundance-and-species-richness-in-r-and-bugs/kery/978-0-12-809585-0)\". London, UK: Academic Press (2020).\n  \nRoyle, Andrew J. \"[N‐mixture models for estimating population size from spatially replicated counts.](https://onlinelibrary.wiley.com/doi/full/10.1111/j.0006-341X.2004.00142.x)\" *Biometrics* 60.1 (2004): 108-115.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "vignettes/shared_states.Rmd",
    "content": "---\ntitle: \"Shared latent states in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Shared latent states in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThis vignette gives an example of how `mvgam` can be used to estimate models where multiple observed time series share the same latent process model. For full details on the basic `mvgam` functionality, please see [the introductory vignette](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html).\n\n## The `trend_map` argument\nThe `trend_map` argument in the `mvgam()` function is an optional `data.frame` that can be used to specify which series should depend on which latent process models (called \"trends\" in `mvgam`). This can be particularly useful if we wish to force multiple observed time series to depend on the same latent trend process, but with different observation processes. If this argument is supplied, a latent factor model is set up by setting `use_lv = TRUE` and using the supplied `trend_map` to set up the shared trends. Users familiar with the `MARSS` family of packages will recognize this as a way of specifying the $Z$ matrix. This `data.frame` needs to have column names `series` and `trend`, with integer values in the `trend` column to state which trend each series should depend on. The `series` column should have a single unique entry for each time series in the data, with names that perfectly match the factor levels of the `series` variable in `data`). For example, if we were to simulate a collection of three integer-valued time series (using `sim_mvgam`), the following `trend_map` would force the first two series to share the same latent trend process:\n```{r}\nset.seed(122)\nsimdat <- sim_mvgam(\n  trend_model = AR(),\n  prop_trend = 0.6,\n  mu = c(0, 1, 2),\n  family = poisson()\n)\ntrend_map <- data.frame(\n  series = unique(simdat$data_train$series),\n  trend = c(1, 1, 2)\n)\ntrend_map\n```\n\nWe can see that the factor levels in `trend_map` match those in the data:\n```{r}\nall.equal(levels(trend_map$series), \n          levels(simdat$data_train$series))\n```\n\n### Checking `trend_map` with `run_model = FALSE`\nSupplying this `trend_map` to the `mvgam` function for a simple model, but setting `run_model = FALSE`, allows us to inspect the constructed `Stan` code and the data objects that would be used to condition the model. Here we will set up a model in which each series has a different observation process (with only a different intercept per series in this case), and the two latent dynamic process models evolve as independent AR1 processes that also contain a shared nonlinear smooth function to capture repeated seasonality. This model is not too complicated but it does show how we can learn shared and independent effects for collections of time series in the `mvgam` framework:\n```{r}\nfake_mod <- mvgam(\n  y ~\n    # observation model formula, which has a\n    # different intercept per series\n    series - 1,\n\n  # process model formula, which has a shared seasonal smooth\n  # (each latent process model shares the SAME smooth)\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n\n  # AR1 dynamics (each latent process model has DIFFERENT)\n  # dynamics; processes are estimated using the noncentred\n  # parameterisation for improved efficiency\n  trend_model = AR(),\n  noncentred = TRUE,\n\n  # supplied trend_map\n  trend_map = trend_map,\n\n  # data and observation family\n  family = poisson(),\n  data = simdat$data_train,\n  run_model = FALSE\n)\n```\n\nInspecting the `Stan` code shows how this model is a dynamic factor model in which the loadings are constructed to reflect the supplied `trend_map`:\n```{r}\nstancode(fake_mod)\n```\n\nNotice the line that states \"lv_coefs = Z;\". This uses the supplied $Z$ matrix to construct the loading coefficients. The supplied matrix now looks exactly like what you'd use if you were to create a similar model in the `MARSS` package:\n```{r}\nfake_mod$model_data$Z\n```\n\n### Fitting and inspecting the model\nThough this model doesn't perfectly match the data-generating process (which allowed each series to have different underlying dynamics), we can still fit it to show what the resulting inferences look like:\n```{r full_mod, include = FALSE, results='hide'}\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nfull_mod <- mvgam(\n  y ~ series - 1,\n  trend_formula = ~ s(season, bs = \"cc\", k = 6),\n  trend_model = AR(),\n  noncentred = TRUE,\n  trend_map = trend_map,\n  family = poisson(),\n  data = simdat$data_train,\n  silent = 2\n)\n```\n\nThe summary of this model is informative as it shows that only two latent process models have been estimated, even though we have three observed time series. The model converges well\n```{r}\nsummary(full_mod)\n```\n\nBoth series 1 and 2 share the exact same latent process estimates, while the estimates for series 3 are different:\n```{r}\nplot(full_mod, type = \"trend\", series = 1)\nplot(full_mod, type = \"trend\", series = 2)\nplot(full_mod, type = \"trend\", series = 3)\n```\n\nHowever, forecasts for series' 1 and 2 will differ because they have different intercepts in the observation model\n\n## Example: signal detection\nNow we will explore a more complicated example. Here we simulate a true hidden signal that we are trying to track. This signal depends nonlinearly on some covariate (called `productivity`, which represents a measure of how productive the landscape is). The signal also demonstrates a fairly large amount of temporal autocorrelation:\n```{r}\nset.seed(123)\n# simulate a nonlinear relationship using the mgcv function gamSim\nsignal_dat <- mgcv::gamSim(n = 100, eg = 1, scale = 1)\n\n# productivity is one of the variables in the simulated data\nproductivity <- signal_dat$x2\n\n# simulate the true signal, which already has a nonlinear relationship\n# with productivity; we will add in a fairly strong AR1 process to\n# contribute to the signal\ntrue_signal <- as.vector(scale(signal_dat$y) +\n  arima.sim(100, model = list(ar = 0.8, sd = 0.1)))\n```\n\nPlot the signal to inspect it's evolution over time\n```{r}\nplot(\n  true_signal,\n  type = \"l\",\n  bty = \"l\", lwd = 2,\n  ylab = \"True signal\",\n  xlab = \"Time\"\n)\n```\n\nNext we simulate three sensors that are trying to track the same hidden signal. All of these sensors have different observation errors that can depend nonlinearly on a second external covariate, called `temperature` in this example. Again this makes use of `gamSim`\n```{r}\n# Function to simulate a monotonic response to a covariate\nsim_monotonic <- function(x, a = 2.2, b = 2) {\n  out <- exp(a * x) / (6 + exp(b * x)) * -1\n  return(2.5 * as.vector(scale(out)))\n}\n\n# Simulated temperature covariate\ntemperature <- runif(100, -2, 2)\n\n# Simulate the three series\nsim_series <- function(n_series = 3, true_signal) {\n  temp_effects <- mgcv::gamSim(n = 100, eg = 7, scale = 0.05)\n  alphas <- rnorm(n_series, sd = 2)\n\n  do.call(rbind, lapply(seq_len(n_series), function(series) {\n    data.frame(\n      observed = rnorm(length(true_signal),\n        mean = alphas[series] +\n          sim_monotonic(temperature, \n                            runif(1, 2.2, 3),\n                            runif(1, 2.2, 3)) +\n          true_signal,\n        sd = runif(1, 1, 2)\n      ),\n      series = paste0(\"sensor_\", series),\n      time = 1:length(true_signal),\n      temperature = temperature,\n      productivity = productivity,\n      true_signal = true_signal\n    )\n  }))\n}\nmodel_dat <- sim_series(true_signal = true_signal) %>%\n  dplyr::mutate(series = factor(series))\n```\n\nPlot the sensor observations\n```{r}\nplot_mvgam_series(\n  data = model_dat, y = \"observed\",\n  series = \"all\"\n)\n```\n\nAnd now plot the observed relationships between the three sensors and the `temperature` covariate\n```{r}\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_1\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 1\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_2\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 2\",\n  xlab = \"Temperature\"\n)\nplot(\n  observed ~ temperature,\n  data = model_dat %>%\n    dplyr::filter(series == \"sensor_3\"),\n  pch = 16, bty = \"l\",\n  ylab = \"Sensor 3\",\n  xlab = \"Temperature\"\n)\n```\n\n### The shared signal model\nNow we can formulate and fit a model that allows each sensor's observation error to depend nonlinearly on `temperature` while allowing the true signal to depend nonlinearly on `productivity`. By fixing all of the values in the `trend` column to `1` in the `trend_map`, we are assuming that all observation sensors are tracking the same latent signal. We use informative priors on the two variance components (process error and observation error), which reflect our prior belief that the observation error is smaller overall than the true process error\n```{r sensor_mod, include = FALSE, results='hide'}\nmod <- mvgam(\n  formula =\n  # formula for observations, allowing for different\n  # intercepts and smooth effects of temperature\n    observed ~ series +\n      s(temperature, k = 10) +\n      s(series, temperature, bs = \"sz\", k = 8),\n  trend_formula =\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n    ~ s(productivity, k = 8) - 1,\n  trend_model =\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n    AR(),\n  noncentred = TRUE,\n  trend_map =\n  # trend_map forces all sensors to track the same\n  # latent signal\n    data.frame(\n      series = unique(model_dat$series),\n      trend = c(1, 1, 1)\n    ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  burnin = 600,\n  control = list(adapt_delta = 0.95),\n  data = model_dat,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(\n  formula =\n  # formula for observations, allowing for different\n  # intercepts and hierarchical smooth effects of temperature\n    observed ~ series +\n      s(temperature, k = 10) +\n      s(series, temperature, bs = \"sz\", k = 8),\n  trend_formula =\n  # formula for the latent signal, which can depend\n  # nonlinearly on productivity\n    ~ s(productivity, k = 8) - 1,\n  trend_model =\n  # in addition to productivity effects, the signal is\n  # assumed to exhibit temporal autocorrelation\n    AR(),\n  noncentred = TRUE,\n  trend_map =\n  # trend_map forces all sensors to track the same\n  # latent signal\n    data.frame(\n      series = unique(model_dat$series),\n      trend = c(1, 1, 1)\n    ),\n\n  # informative priors on process error\n  # and observation error will help with convergence\n  priors = c(\n    prior(normal(2, 0.5), class = sigma),\n    prior(normal(1, 0.5), class = sigma_obs)\n  ),\n\n  # Gaussian observations\n  family = gaussian(),\n  data = model_dat,\n  silent = 2\n)\n```\n\nView a reduced version of the model summary because there will be many spline coefficients in this model\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\n### Inspecting effects on both process and observation models\nDon't pay much attention to the approximate *p*-values of the smooth terms. The calculation for these values is incredibly sensitive to the estimates for the smoothing parameters so I don't tend to find them to be very meaningful. What are meaningful, however, are prediction-based plots of the smooth functions. All main effects can be quickly plotted with `conditional_effects`:\n```{r}\nconditional_effects(mod, type = \"link\")\n```\n\n`conditional_effects` is simply a wrapper to the more flexible `plot_predictions` function from the `marginaleffects` package. We can get more useful plots of these effects using this function for further customisation:\n```{r}\nplot_predictions(\n  mod,\n  condition = c(\"temperature\", \"series\", \"series\"),\n  points = 0.5\n) +\n  theme(legend.position = \"none\")\n```\n\nWe have successfully estimated effects, some of them nonlinear, that impact the hidden process AND the observations. All in a single joint model. But there can always be challenges with these models, particularly when estimating both process and observation error at the same time.\n\n### Recovering the hidden signal\nA final but very key question is whether we can successfully recover the true hidden signal. The `trend` slot in the returned model parameters has the estimates for this signal, which we can easily plot using the `mvgam` S3 method for `plot`. We can also overlay the true values for the hidden signal, which shows that our model has done a good job of recovering it:\n```{r}\nplot(mod, \n     type = \"trend\") +\n  ggplot2::geom_point(data = data.frame(time = 1:100,\n                                        y = true_signal),\n                      mapping = ggplot2::aes(x = time,\n                                             y = y))\n```\n\n## Further reading\nThe following papers and resources offer a lot of useful material about other types of State-Space models and how they can be applied in practice:\n  \nAuger‐Méthé, Marie, et al. [\"A guide to state–space modeling of ecological time series.](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470)\" *Ecological Monographs* 91.4 (2021): e01470.  \n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929  \n  \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. \"[MARSS: multivariate autoregressive state-space models for analyzing time-series data.](https://journal.r-project.org/articles/RJ-2012-002/)\" *R Journal*. 4.1 (2012): 11.\n  \nWard, Eric J., et al. \"[Inferring spatial structure from time‐series data: using multivariate state‐space models to detect metapopulation structure of California sea lions in the Gulf of California, Mexico.](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x)\" *Journal of Applied Ecology* 47.1 (2010): 47-56.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "vignettes/time_varying_effects.Rmd",
    "content": "---\ntitle: \"Time-varying effects in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{Time-varying effects in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to estimate and forecast regression coefficients that vary through time.\n\n## Time-varying effects\nDynamic fixed-effect coefficients (often referred to as dynamic linear models) can be readily incorporated into GAMs / DGAMs. In `mvgam`, the `dynamic()` formula wrapper offers a convenient interface to set these up. The plan is to incorporate a range of dynamic options (such as random walk, AR1 etc...) but for the moment only low-rank Gaussian Process (GP) smooths are allowed (making use either of the `gp` basis in `mgcv` of of Hilbert space approximate GPs). These are advantageous over splines or random walk effects for several reasons. First, GPs will force the time-varying effect to be smooth. This often makes sense in reality, where we would not expect a regression coefficient to change rapidly from one time point to the next. Second, GPs provide information on the 'global' dynamics of a time-varying effect through their length-scale parameters. This means we can use them to provide accurate forecasts of how an effect is expected to change in the future, something that we couldn't do well if we used splines to estimate the effect. An example below illustrates.\n\n### Simulating time-varying effects\nSimulate a time-varying coefficient using a squared exponential Gaussian Process function with length scale $\\rho$=10. We will do this using an internal function from `mvgam` (the `sim_gp` function):\n```{r}\nset.seed(1111)\nN <- 200\nbeta_temp <- mvgam:::sim_gp(rnorm(1),\n  alpha_gp = 0.75,\n  rho_gp = 10,\n  h = N\n) + 0.5\n```\n\nA plot of the time-varying coefficient shows that it changes smoothly through time:\n```{r, fig.alt = \"Simulating time-varying effects in mvgam and R\"}\nplot(beta_temp,\n  type = \"l\", lwd = 3,\n  bty = \"l\", xlab = \"Time\", ylab = \"Coefficient\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n```\n\nNext we need to simulate the values of the covariate, which we will call `temp` (to represent $temperature$). In this case we just use a standard normal distribution to simulate this covariate:\n```{r}\ntemp <- rnorm(N, sd = 1)\n```\n\nFinally, simulate the outcome variable, which is a Gaussian observation process (with observation error) over the time-varying effect of $temperature$\n```{r, fig.alt = \"Simulating time-varying effects in mvgam and R\"}\nout <- rnorm(N,\n  mean = 4 + beta_temp * temp,\n  sd = 0.25\n)\ntime <- seq_along(temp)\nplot(out,\n  type = \"l\", lwd = 3,\n  bty = \"l\", xlab = \"Time\", ylab = \"Outcome\",\n  col = \"darkred\"\n)\nbox(bty = \"l\", lwd = 2)\n```\n\nGather the data into a `data.frame` for fitting models, and split the data into training and testing folds.\n```{r}\ndata <- data.frame(out, temp, time)\ndata_train <- data[1:190, ]\ndata_test <- data[191:200, ]\n```\n\n### The `dynamic()` function\nTime-varying coefficients can be fairly easily set up using the `s()` or `gp()` wrapper functions in `mvgam` formulae by fitting a nonlinear effect of `time` and using the covariate of interest as the numeric `by` variable (see `?mgcv::s` or `?brms::gp` for more details). The `dynamic()` formula wrapper offers a way to automate this process, and will eventually allow for a broader variety of time-varying effects (such as random walk or AR processes). Depending on the arguments that are specified to `dynamic`, it will either set up a low-rank GP smooth function using `s()` with `bs = 'gp'` and a fixed value of the length scale parameter $\\rho$, or it will set up a Hilbert space approximate GP using the `gp()` function with `c=5/4` so that $\\rho$ is estimated (see `?dynamic` for more details). In this first example we will use the `s()` option, and will mis-specify the $\\rho$ parameter here as, in practice, it is never known. This call to `dynamic()` will set up the following smooth: `s(time, by = temp, bs = \"gp\", m = c(-2, 8, 2), k = 40)`\n```{r, include=FALSE}\nmod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\n```{r, eval=FALSE}\nmod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\nInspect the model summary, which shows how the `dynamic()` wrapper was used to construct a low-rank Gaussian Process smooth function:\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nBecause this model used a spline with a `gp` basis, it's smooths can be visualised just like any other `gam`. We can plot the estimates for the in-sample and out-of-sample periods to see how the Gaussian Process function produces sensible smooth forecasts. Here we supply the full dataset to the `newdata` argument in `plot_mvgam_smooth()` to inspect posterior forecasts of the time-varying smooth function. Overlay the true simulated function to see that the model has adequately estimated it's dynamics in both the training and testing data partitions\n```{r}\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n```\n\nWe can also use `plot_predictions()` from the `marginaleffects` package to visualise the time-varying coefficient for what the effect would be estimated to be at different values of $temperature$:\n```{r}\nrequire(marginaleffects)\nrange_round <- function(x) {\n  round(range(x, na.rm = TRUE), 2)\n}\nplot_predictions(mod,\n  newdata = datagrid(\n    time = unique,\n    temp = range_round\n  ),\n  by = c(\"time\", \"temp\", \"temp\"),\n  type = \"link\"\n)\n```\n\nThis results in sensible forecasts of the observations as well\n```{r}\nfc <- forecast(mod, newdata = data_test)\nplot(fc)\n```\n\nThe syntax is very similar if we wish to estimate the parameters of the underlying Gaussian Process, this time using a Hilbert space approximation. We simply omit the `rho` argument in `dynamic()` to make this happen. This will set up a call similar to `gp(time, by = 'temp', c = 5/4, k = 40)`.\n```{r include=FALSE}\nmod <- mvgam(out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod <- mvgam(out ~ dynamic(temp, k = 40),\n  family = gaussian(),\n  data = data_train,\n  silent = 2\n)\n```\n\nThis model summary now contains estimates for the marginal deviation and length scale parameters of the underlying Gaussian Process function:\n```{r}\nsummary(mod, include_betas = FALSE)\n```\n\nEffects for `gp()` terms can also be plotted as smooths:\n```{r}\nplot_mvgam_smooth(mod, smooth = 1, newdata = data)\nabline(v = 190, lty = \"dashed\", lwd = 2)\nlines(beta_temp, lwd = 2.5, col = \"white\")\nlines(beta_temp, lwd = 2)\n```\n\n## Salmon survival example\nHere we will use openly available data on marine survival of Chinook salmon to illustrate how time-varying effects can be used to improve ecological time series models. [Scheuerell and Williams (2005)](https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1365-2419.2005.00346.x) used a dynamic linear model to examine the relationship between marine survival of Chinook salmon and an index of ocean upwelling strength along the west coast of the USA. The authors hypothesized that stronger upwelling in April should create better growing conditions for phytoplankton, which would then translate into more zooplankton and provide better foraging opportunities for juvenile salmon entering the ocean. The data on survival is measured as a proportional variable over 42 years (1964–2005) and is available in the `MARSS` package:\n```{r}\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda\"))\ndplyr::glimpse(SalmonSurvCUI)\n```\n\nFirst we need to prepare the data for modelling. The variable `CUI.apr` will be standardized to make it easier for the sampler to estimate underlying GP parameters for the time-varying effect. We also need to convert the survival back to a proportion, as in its current form it has been logit-transformed (this is because most time series packages cannot handle proportional data). As usual, we also need to create a `time` indicator and a `series` indicator for working in `mvgam`:\n```{r}\nSalmonSurvCUI %>%\n  # create a time variable\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  # create a series variable\n  dplyr::mutate(series = as.factor(\"salmon\")) %>%\n  # z-score the covariate CUI.apr\n  dplyr::mutate(CUI.apr = as.vector(scale(CUI.apr))) %>%\n  # convert logit-transformed survival back to proportional\n  dplyr::mutate(survival = plogis(logit.s)) -> model_data\n```\n\nInspect the data\n```{r}\ndplyr::glimpse(model_data)\n```\n\nPlot features of the outcome variable, which shows that it is a proportional variable with particular restrictions that we want to model:\n```{r}\nplot_mvgam_series(data = model_data, y = \"survival\")\n```\n\n\n### A State-Space Beta regression\n`mvgam` can easily handle data that are bounded at 0 and 1 with a Beta observation model (using the `mgcv` function `betar()`, see `?mgcv::betar` for details).  First we will fit a simple State-Space model that uses an AR1 dynamic process model with no predictors and a Beta observation model:\n```{r include = FALSE}\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\n```{r eval = FALSE}\nmod0 <- mvgam(\n  formula = survival ~ 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\nThe summary of this model shows good behaviour of the Hamiltonian Monte Carlo sampler and provides useful summaries on the Beta observation model parameters:\n```{r}\nsummary(mod0)\n```\n\nA plot of the underlying dynamic component shows how it has easily handled the temporal evolution of the time series:\n```{r}\nplot(mod0, type = \"trend\")\n```\n\n### Including time-varying upwelling effects\nNow we can increase the complexity of our model by constructing and fitting a State-Space model with a time-varying effect of the coastal upwelling index in addition to the autoregressive dynamics. We again use a Beta observation model to capture the restrictions of our proportional observations, but this time will include a `dynamic()` effect of `CUI.apr` in the latent process model. We do not specify the $\\rho$ parameter, instead opting to estimate it using a Hilbert space approximate GP:\n```{r include=FALSE}\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  control = list(adapt_delta = 0.99),\n  silent = 2\n)\n```\n\n```{r eval=FALSE}\nmod1 <- mvgam(\n  formula = survival ~ 1,\n  trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,\n  trend_model = AR(),\n  noncentred = TRUE,\n  priors = prior(normal(-3.5, 0.5), class = Intercept),\n  family = betar(),\n  data = model_data,\n  silent = 2\n)\n```\n\nThe summary for this model now includes estimates for the time-varying GP parameters:\n```{r}\nsummary(mod1, include_betas = FALSE)\n```\n\nThe estimates for the underlying dynamic process, and for the hindcasts, haven't changed much:\n```{r}\nplot(mod1, type = \"trend\")\n```\n\n```{r}\nplot(mod1, type = \"forecast\")\n```\n\nBut the process error parameter $\\sigma$ is slightly smaller for this model than for the first model:\n```{r}\n# Extract estimates of the process error 'sigma' for each model\nmod0_sigma <- as.data.frame(mod0, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod0\")\nmod1_sigma <- as.data.frame(mod1, variable = \"sigma\", regex = TRUE) %>%\n  dplyr::mutate(model = \"Mod1\")\nsigmas <- rbind(mod0_sigma, mod1_sigma)\n\n# Plot using ggplot2\nrequire(ggplot2)\nggplot(sigmas, aes(y = `sigma[1]`, fill = model)) +\n  geom_density(alpha = 0.3, colour = NA) +\n  coord_flip()\n```\n\nWhy does the process error not need to be as flexible in the second model? Because the estimates of this dynamic process are now informed partly by the time-varying effect of upwelling, which we can visualise on the link scale using `plot()`:\n```{r}\nplot(mod1, type = \"smooths\", trend_effects = TRUE)\n```\n\n### Comparing model predictive performances\nA key question when fitting multiple time series models is whether one of them provides better predictions than the other. There are several options in `mvgam` for exploring this quantitatively. First, we can compare models based on in-sample approximate leave-one-out cross-validation as implemented in the popular `loo` package:\n```{r}\nloo_compare(mod0, mod1)\n```\n\nThe second model has the larger Expected Log Predictive Density (ELPD), meaning that it is slightly favoured over the simpler model that did not include the time-varying upwelling effect. However, the two models certainly do not differ by much. But this metric only compares in-sample performance, and we are hoping to use our models to produce reasonable forecasts. Luckily, `mvgam` also has routines for comparing models using approximate leave-future-out cross-validation. Here we refit both models to a reduced training set (starting at time point 30) and produce approximate 1-step ahead forecasts. These forecasts are used to estimate forecast ELPD before expanding the training set one time point at a time. We use Pareto-smoothed importance sampling to reweight posterior predictions, acting as a kind of particle filter so that we don't need to refit the model too often (you can read more about how this process works in Bürkner et al. 2020).\n```{r include=FALSE}\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n```\n\n```{r eval=FALSE}\nlfo_mod0 <- lfo_cv(mod0, min_t = 30)\nlfo_mod1 <- lfo_cv(mod1, min_t = 30)\n```\n\nThe model with the time-varying upwelling effect tends to provides better 1-step ahead forecasts, with a higher total forecast ELPD\n```{r}\nsum(lfo_mod0$elpds)\nsum(lfo_mod1$elpds)\n```\n\nWe can also plot the ELPDs for each model as a contrast. Here, values less than zero suggest the time-varying predictor model (Mod1) gives better 1-step ahead forecasts:\n```{r, fig.alt = \"Comparing forecast skill for dynamic beta regression models in mvgam and R\"}\nplot(\n  x = 1:length(lfo_mod0$elpds) + 30,\n  y = lfo_mod0$elpds - lfo_mod1$elpds,\n  ylab = \"ELPDmod0 - ELPDmod1\",\n  xlab = \"Evaluation time point\",\n  pch = 16,\n  col = \"darkred\",\n  bty = \"l\"\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nA useful exercise to further expand this model would be to think about what kinds of predictors might impact measurement error, which could easily be implemented into the observation formula in `mvgam()`. But for now, we will leave the model as-is.\n\n## Further reading\nThe following papers and resources offer a lot of useful material about dynamic linear models and how they can be applied / evaluated in practice:\n\nBürkner, PC, Gabry, J and Vehtari, A [Approximate leave-future-out cross-validation for Bayesian time series models](https://www.tandfonline.com/doi/full/10.1080/00949655.2020.1783262). *Journal of Statistical Computation and Simulation*. 90:14 (2020) 2499-2523.\n  \nHerrero, Asier, et al. [From the individual to the landscape and back: time‐varying effects of climate and herbivory on tree sapling growth at distribution limits](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/1365-2745.12527). *Journal of Ecology* 104.2 (2016): 430-442.\n    \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. \"[MARSS: multivariate autoregressive state-space models for analyzing time-series data.](https://journal.r-project.org/articles/RJ-2012-002/)\" *R Journal*. 4.1 (2012): 11.\n  \nScheuerell, Mark D., and John G. Williams. [Forecasting climate induced changes in the survival of Snake River Spring/Summer Chinook Salmon (*Oncorhynchus Tshawytscha*)](https://onlinelibrary.wiley.com/doi/10.1111/j.1365-2419.2005.00346.x) *Fisheries Oceanography*  14 (2005): 448–57.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  },
  {
    "path": "vignettes/trend_formulas.Rmd",
    "content": "---\ntitle: \"State-Space models in mvgam\"\nauthor: \"Nicholas J Clark\"\ndate: \"`r Sys.Date()`\"\noutput:\n  rmarkdown::html_vignette:\n    toc: yes\nvignette: >\n  %\\VignetteIndexEntry{State-Space models in mvgam}\n  %\\VignetteEngine{knitr::rmarkdown}\n  \\usepackage[utf8]{inputenc}\nparams:\n  EVAL: !r identical(tolower(Sys.getenv(\"NOT_CRAN\")), \"true\")\n---\n```{r, echo = FALSE} \nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  message = FALSE,\n  warning = FALSE,\n  eval = if (isTRUE(exists(\"params\"))) params$EVAL else FALSE\n)\n```\n\n```{r setup, include=FALSE}\nknitr::opts_chunk$set(\n  echo = TRUE,\n  dpi = 100,\n  fig.asp = 0.8,\n  fig.width = 6,\n  out.width = \"60%\",\n  fig.align = \"center\"\n)\nlibrary(mvgam)\nlibrary(ggplot2)\ntheme_set(theme_bw(base_size = 12, base_family = \"serif\"))\n```\n\nThe purpose of this vignette is to show how the `mvgam` package can be used to fit and interrogate State-Space models with nonlinear effects.\n\n## State-Space Models\n\n![Illustration of a basic State-Space model, which assumes that  a latent dynamic *process* (X) can evolve independently from the way we take *observations* (Y) of that process](SS_model.svg){width=85%}\n\n<br>\n\nState-Space models allow us to separately make inferences about the underlying dynamic *process model* that we are interested in (i.e. the evolution of a time series or a collection of time series) and the *observation model* (i.e. the way that we survey / measure this underlying process). This is extremely useful in ecology because our observations are always imperfect / noisy measurements of the thing we are interested in measuring. It is also helpful because we often know that some covariates will impact our ability to measure accurately (i.e. we cannot take accurate counts of rodents if there is a thunderstorm happening) while other covariates might impact the underlying process (it is highly unlikely that rodent abundance responds to one storm, but instead probably responds to longer-term weather and climate variation). A State-Space model allows us to model both components in a single unified modelling framework. A major advantage of `mvgam` is that it can include nonlinear effects and random effects in BOTH model components while also capturing dynamic processes.\n\n### Lake Washington plankton data\nThe data we will use to illustrate how we can fit State-Space models in `mvgam` are from a long-term monitoring study of plankton counts (cells per mL) taken from Lake Washington in Washington, USA. The data are available as part of the `MARSS` package and can be downloaded using the following: \n```{r}\nload(url(\"https://github.com/atsa-es/MARSS/raw/master/data/lakeWAplankton.rda\"))\n```\n\nWe will work with five different groups of plankton:\n```{r}\noutcomes <- c(\"Greens\", \"Bluegreens\", \"Diatoms\", \"Unicells\", \"Other.algae\")\n```\n\nAs usual, preparing the data into the correct format for `mvgam` modelling takes a little bit of wrangling in `dplyr`:\n```{r}\n# loop across each plankton group to create the long datframe\nplankton_data <- do.call(rbind, lapply(outcomes, function(x) {\n  # create a group-specific dataframe with counts labelled 'y'\n  # and the group name in the 'series' variable\n  data.frame(\n    year = lakeWAplanktonTrans[, \"Year\"],\n    month = lakeWAplanktonTrans[, \"Month\"],\n    y = lakeWAplanktonTrans[, x],\n    series = x,\n    temp = lakeWAplanktonTrans[, \"Temp\"]\n  )\n})) %>%\n  # change the 'series' label to a factor\n  dplyr::mutate(series = factor(series)) %>%\n  # filter to only include some years in the data\n  dplyr::filter(year >= 1965 & year < 1975) %>%\n  dplyr::arrange(year, month) %>%\n  dplyr::group_by(series) %>%\n  # z-score the counts so they are approximately standard normal\n  dplyr::mutate(y = as.vector(scale(y))) %>%\n  # add the time indicator\n  dplyr::mutate(time = dplyr::row_number()) %>%\n  dplyr::ungroup()\n```\n\nInspect the data structure\n```{r}\nhead(plankton_data)\n```\n\n```{r}\ndplyr::glimpse(plankton_data)\n```\n\nNote that we have z-scored the counts in this example as that will make it easier to specify priors (though this is not completely necessary; it is often better to build a model that respects the properties of the actual outcome variables)\n```{r}\nplot_mvgam_series(data = plankton_data, series = \"all\")\n```\n\nWe have some missing observations, but this isn't an issue for modelling in `mvgam`. A useful property to understand about these counts is that they tend to be highly seasonal. Below are some plots of z-scored counts against the z-scored temperature measurements in the lake for each month:\n```{r}\nplankton_data %>%\n  dplyr::filter(series == \"Other.algae\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y),\n    col = \"white\",\n    size = 1.3\n  ) +\n  geom_line(aes(y = y),\n    col = \"darkred\",\n    size = 1.1\n  ) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Other algae (red)\")\n```\n\n\n```{r}\nplankton_data %>%\n  dplyr::filter(series == \"Diatoms\") %>%\n  ggplot(aes(x = time, y = temp)) +\n  geom_line(size = 1.1) +\n  geom_line(aes(y = y),\n    col = \"white\",\n    size = 1.3\n  ) +\n  geom_line(aes(y = y),\n    col = \"darkred\",\n    size = 1.1\n  ) +\n  ylab(\"z-score\") +\n  xlab(\"Time\") +\n  ggtitle(\"Temperature (black) vs Diatoms (red)\")\n```\n\nWe will have to try and capture this seasonality in our process model, which should be easy to do given the flexibility of GAMs. Next we will split the data into training and testing splits:\n```{r}\nplankton_train <- plankton_data %>%\n  dplyr::filter(time <= 112)\nplankton_test <- plankton_data %>%\n  dplyr::filter(time > 112)\n```\n\nNow time to fit some models. This requires a bit of thinking about how we can best tackle the seasonal variation and the likely dependence structure in the data. These algae are interacting as part of a complex system within the same lake, so we certainly expect there to be some lagged cross-dependencies underling their dynamics. But if we do not capture the seasonal variation, our multivariate dynamic model will be forced to try and capture it, which could lead to poor convergence and unstable results (we could feasibly capture cyclic dynamics with a more complex multi-species Lotka-Volterra model, but ordinary differential equation approaches are beyond the scope of `mvgam`). \n\n### Capturing seasonality\n\nFirst we will fit a model that does not include a dynamic component, just to see if it can reproduce the seasonal variation in the observations. This model introduces hierarchical multidimensional smooths, where all time series share a \"global\" tensor product of the `month` and `temp` variables, capturing our expectation that algal seasonality responds to temperature variation. But this response should depend on when in the year these temperatures are recorded (i.e. a response to warm temperatures in Spring should be different to a response to warm temperatures in Autumn). The model also fits series-specific deviation smooths (i.e. one tensor product per series) to capture how each algal group's seasonality differs from the overall \"global\" seasonality. Note that we do not include series-specific intercepts in this model because each series was z-scored to have a mean of 0.\n```{r notrend_mod, include = FALSE, results='hide'}\nnotrend_mod <- mvgam(\n  y ~\n    te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = series) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n```\n\n```{r eval=FALSE}\nnotrend_mod <- mvgam(\n  y ~\n    # tensor of temp and month to capture\n    # \"global\" seasonality\n    te(temp, month, k = c(4, 4)) +\n\n    # series-specific deviation tensor products\n    te(temp, month, k = c(4, 4), by = series) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = \"None\"\n)\n```\n\nThe \"global\" tensor product smooth function can be quickly visualized:\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 1)\n```\n\nOn this plot, red indicates below-average linear predictors and white indicates above-average. We can then plot the deviation smooths for a few algal groups to see how they vary from the \"global\" pattern:\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 2)\n```\n\n```{r}\nplot_mvgam_smooth(notrend_mod, smooth = 3)\n```\n\nThese multidimensional smooths have done a good job of capturing the seasonal variation in our observations:\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 1)\n```\n\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 2)\n```\n\n```{r}\nplot(notrend_mod, type = \"forecast\", series = 3)\n```\n\nThis basic model gives us confidence that we can capture the seasonal variation in the observations. But the model has not captured the remaining temporal dynamics, which is obvious when we inspect Dunn-Smyth residuals for a few series:\n```{r}\nplot(notrend_mod, type = \"residuals\", series = 1)\n```\n\n```{r}\nplot(notrend_mod, type = \"residuals\", series = 3)\n```\n\n\n### Multiseries dynamics\nNow it is time to get into multivariate State-Space models. We will fit two models that can both incorporate lagged cross-dependencies in the latent process models. The first model assumes that the process errors operate independently from one another, while the second assumes that there may be contemporaneous correlations in the process errors. Both models include a Vector Autoregressive component for the process means, and so both can model complex community dynamics. The models can be described mathematically as follows:\n\n\\begin{align*}\n\\boldsymbol{count}_t & \\sim \\text{Normal}(\\mu_{obs[t]}, \\sigma_{obs}) \\\\\n\\mu_{obs[t]} & = process_t \\\\\nprocess_t & \\sim \\text{MVNormal}(\\mu_{process[t]}, \\Sigma_{process}) \\\\\n\\mu_{process[t]} & = A * process_{t-1} + f_{global}(\\boldsymbol{month},\\boldsymbol{temp})_t + f_{series}(\\boldsymbol{month},\\boldsymbol{temp})_t \\\\\nf_{global}(\\boldsymbol{month},\\boldsymbol{temp}) & = \\sum_{k=1}^{K}b_{global} * \\beta_{global} \\\\\nf_{series}(\\boldsymbol{month},\\boldsymbol{temp}) & = \\sum_{k=1}^{K}b_{series} * \\beta_{series} \\end{align*}\n\nHere you can see that there are no terms in the observation model apart from the underlying process model. But we could easily add covariates into the observation model if we felt that they could explain some of the systematic observation errors. We also assume independent observation processes (there is no covariance structure in the observation errors $\\sigma_{obs}$).  At present, `mvgam` does not support multivariate observation models. But this feature will be added in future versions. However the underlying process model is multivariate, and there is a lot going on here. This component has a Vector Autoregressive part, where the process mean at time $t$ $(\\mu_{process[t]})$ is a vector that evolves as a function of where the vector-valued process model was at time $t-1$. The $A$ matrix captures these dynamics with self-dependencies on the diagonal and possibly asymmetric cross-dependencies on the off-diagonals, while also incorporating the nonlinear smooth functions that capture seasonality for each series. The contemporaneous process errors are modeled by $\\Sigma_{process}$, which can be constrained so that process errors are independent (i.e. setting the off-diagonals to 0) or can be fully parameterized using a Cholesky decomposition (using `Stan`'s $LKJcorr$ distribution to place a prior on the strength of inter-species correlations). For those that are interested in the inner-workings, `mvgam` makes use of a recent breakthrough by [Sarah Heaps to enforce stationarity of Bayesian VAR processes](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648). This is advantageous as we often don't expect forecast variance to increase without bound forever into the future, but many estimated VARs tend to behave this way. \n\n<br>\nOk that was a lot to take in. Let's fit some models to try and inspect what is going on and what they assume. But first, we need to update `mvgam`'s default priors for the observation and process errors. By default, `mvgam` uses a fairly wide Student-T prior on these parameters to avoid being overly informative. But our observations are z-scored and so we do not expect very large process or observation errors. However, we also do not expect very small observation errors either as we know these measurements are not perfect. So let's update the priors for these parameters. In doing so, you will get to see how the formula for the latent process (i.e. trend) model is used in `mvgam`:\n```{r}\npriors <- get_mvgam_priors(\n  # observation formula, which has no terms in it\n  y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train\n)\n```\n\nGet names of all parameters whose priors can be modified:\n```{r}\npriors[, 3]\n```\n\nAnd their default prior distributions:\n```{r}\npriors[, 4]\n```\n\nSetting priors is easy in `mvgam` as you can use `brms` routines. Here we use more informative Normal priors for both error components, but we impose a lower bound of 0.2 for the observation errors:\n```{r}\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n```\n\nYou may have noticed something else unique about this model: there is no intercept term in the observation formula. This is because a shared intercept parameter can sometimes be unidentifiable with respect to the latent VAR process, particularly if our series have similar long-run averages (which they do in this case because they were z-scored). We will often get better convergence in these State-Space models if we drop this parameter. `mvgam` accomplishes this by fixing the coefficient for the intercept to zero. Now we can fit the first model, which assumes that process errors are contemporaneously uncorrelated\n```{r var_mod, include = FALSE, results='hide'}\nvar_mod <- mvgam(y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(),\n  priors = priors,\n  adapt_delta = 0.99,\n  burnin = 1000\n)\n```\n\n```{r eval=FALSE}\nvar_mod <- mvgam(\n  # observation formula, which is empty\n  forumla = y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with uncorrelated process errors\n  trend_model = VAR(),\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n\n  # include the updated priors\n  priors = priors,\n  silent = 2\n)\n```\n\n### Inspecting SS models\nThis model's summary is a bit different to other `mvgam` summaries. It separates parameters based on whether they belong to the observation model or to the latent process model. This is because we may often have covariates that impact the observations but not the latent process, so we can have fairly complex models for each component. You will notice that some parameters have not fully converged, particularly for the VAR coefficients (called `A` in the output) and for the process errors (`Sigma`). Note that we set `include_betas = FALSE` to stop the summary from printing output for all of the spline coefficients, which can be dense and hard to interpret:\n```{r}\nsummary(var_mod, include_betas = FALSE)\n```\n\nThe convergence of this model isn't fabulous (more on this in a moment). But we can again plot the smooth functions, which this time operate on the process model. We can see the same plot using `trend_effects = TRUE` in the plotting functions:\n```{r}\nplot(var_mod, \"smooths\", trend_effects = TRUE)\n```\n\nThe autoregressive coefficient matrix is of particular interest here, as it captures lagged dependencies and cross-dependencies in the latent process model. Unfortunately `bayesplot` doesn't know this is a matrix of parameters so what we see is actually the transpose of the VAR matrix. Using `dir = 'v'` in the `facet_args` argument will accomplish this:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  var_mod,\n  variable = 'A',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThere is a lot happening in this matrix. Each cell captures the lagged effect of the process in the column on the process in the row in the next timestep. So for example, the effect in cell [1,3] shows how an *increase* in the process for series 3 (Greens) at time $t$ is expected to impact the process for series 1 (Bluegreens) at time $t+1$. The latent process model is now capturing these effects and the smooth seasonal effects.\n  \nThe process error $(\\Sigma)$ captures unmodelled variation in the process models. Again, we fixed the off-diagonals to 0, so the histograms for these will look like flat boxes:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  var_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThe observation error estimates $(\\sigma_{obs})$ represent how much the model thinks we might miss the true count when we take our imperfect measurements: \n```{r warning=FALSE, message=FALSE}\nmcmc_plot(var_mod, variable = \"sigma_obs\", regex = TRUE, type = \"hist\")\n```\n\nThese are still a bit hard to identify overall, especially when trying to estimate both process and observation error. Often we need to make some strong assumptions about which of these is more important for determining unexplained variation in our observations. \n\n### Correlated process errors\n\nLet's see if these estimates improve when we allow the process errors to be correlated. Once again, we need to first update the priors for the observation errors:\n```{r}\npriors <- c(\n  prior(normal(0.5, 0.1), class = sigma_obs, lb = 0.2),\n  prior(normal(0.5, 0.25), class = sigma)\n)\n```\n\nAnd now we can fit the correlated process error model\n```{r varcor_mod, include = FALSE, results='hide'}\nvarcor_mod <- mvgam(y ~ -1,\n  trend_formula = ~\n    # tensor of temp and month should capture\n    # seasonality\n    te(temp, month, k = c(4, 4)) +\n      # need to use 'trend' rather than series\n      # here\n      te(temp, month, k = c(4, 4), by = trend) - 1,\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n  trend_model = VAR(cor = TRUE),\n  burnin = 1000,\n  adapt_delta = 0.99,\n  priors = priors\n)\n```\n\n```{r eval=FALSE}\nvarcor_mod <- mvgam(\n  # observation formula, which remains empty\n  formula = y ~ -1,\n\n  # process model formula, which includes the smooth functions\n  trend_formula = ~ te(temp, month, k = c(4, 4)) +\n    te(temp, month, k = c(4, 4), by = trend) - 1,\n\n  # VAR1 model with correlated process errors\n  trend_model = VAR(cor = TRUE),\n  family = gaussian(),\n  data = plankton_train,\n  newdata = plankton_test,\n\n  # include the updated priors\n  priors = priors,\n  silent = 2\n)\n```\n\nThe $(\\Sigma)$ matrix now captures any evidence of contemporaneously correlated process error:\n```{r warning=FALSE, message=FALSE}\nmcmc_plot(\n  varcor_mod,\n  variable = 'Sigma',\n  regex = TRUE,\n  type = 'hist',\n  facet_args = list(dir = 'v')\n)\n```\n\nThis symmetric matrix tells us there is support for correlated process errors, as several of the off-diagonal entries are strongly non-zero. But it is easier to interpret these estimates if we convert the covariance matrix to a correlation matrix. Here we compute the posterior median process error correlations:\n```{r}\nSigma_post <- as.matrix(\n  varcor_mod, \n  variable = \"Sigma\", \n  regex = TRUE\n)\nmedian_correlations <- cov2cor(\n  matrix(apply(Sigma_post, 2, median),\n         nrow = 5, \n         ncol = 5\n  )\n)\nrownames(median_correlations) <- \n  colnames(median_correlations) <- \n  levels(plankton_train$series)\n\nround(median_correlations, 2)\n```\n\n### Impulse response functions\nBecause Vector Autoregressions can capture complex lagged dependencies, it is often difficult to understand how the member time series are thought to interact with one another. A method that is commonly used to directly test for possible interactions is to compute an [Impulse Response Function](https://en.wikipedia.org/wiki/Impulse_response) (IRF). If $h$ represents the simulated forecast horizon, an IRF asks how each of the remaining series might respond over times $(t+1):h$ if a focal series is given an innovation \"shock\" at time $t = 0$. `mvgam` can compute Generalized and Orthogonalized IRFs from models that included latent VAR dynamics. We simply feed the fitted model to the `irf()` function and then use the S3 `plot()` function to view the estimated responses. By default, `irf()` will compute IRFs by separately imposing positive shocks of one standard deviation to each series in the VAR process. Here we compute Generalized IRFs over a horizon of 12 timesteps:\n```{r}\nirfs <- irf(varcor_mod, h = 12)\n```\n\nA summary of the IRFs can be computed using the `summary()` function:\n```{r}\nsummary(irfs)\n```\n\nBut it is easier to understand these responses using plots. For example, we can plot the expected responses of the remaining series to a positive shock for series 3 (Greens) using the `plot()` function:\n```{r}\nplot(irfs, series = 3)\n```\n\nThis series of plots makes it clear that some of the other series would be expected to show both instantaneous responses to a shock for the Greens (due to their correlated process errors) as well as delayed and nonlinear responses over time (due to the complex lagged dependence structure captured by the $A$ matrix). This hopefully makes it clear why IRFs are an important tool in the analysis of multivariate autoregressive models. You can also use these IRFs to calculate a relative contribution from each shock to the forecast error variance for a focal series. This method, known as a [Forecast Error Variance Decomposition](https://en.wikipedia.org/wiki/Variance_decomposition_of_forecast_errors) (FEVD), is useful to get an idea about the amount of information that each series contributes to the evolution of all other series in a Vector Autoregression:\n```{r}\nfevds <- fevd(varcor_mod, h = 12)\nplot(fevds)\n```\n\nThe plot above shows the median contribution to forecast error variance for each series.\n\n### Comparing forecast scores\n\nBut which model is better? We can compute the variogram score for out of sample forecasts to get a sense of which model does a better job of capturing the dependence structure in the true evaluation set:\n```{r}\n# create forecast objects for each model\nfcvar <- forecast(var_mod)\nfcvarcor <- forecast(varcor_mod)\n\n# plot the difference in variogram scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"variogram\")$all_series$score -\n  score(fcvar, score = \"variogram\")$all_series$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(variogram[VAR1cor] ~ -~ variogram[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nAnd we can also compute the energy score for out of sample forecasts to get a sense of which model provides forecasts that are better calibrated:\n```{r}\n# plot the difference in energy scores; a negative value means the VAR1cor model is better, while a positive value means the VAR1 model is better\ndiff_scores <- score(fcvarcor, score = \"energy\")$all_series$score -\n  score(fcvar, score = \"energy\")$all_series$score\nplot(diff_scores,\n  pch = 16, cex = 1.25, col = \"darkred\",\n  ylim = c(\n    -1 * max(abs(diff_scores), na.rm = TRUE),\n    max(abs(diff_scores), na.rm = TRUE)\n  ),\n  bty = \"l\",\n  xlab = \"Forecast horizon\",\n  ylab = expression(energy[VAR1cor] ~ -~ energy[VAR1])\n)\nabline(h = 0, lty = \"dashed\")\n```\n\nThe models tend to provide similar forecasts, though the correlated error model does slightly better overall. We would probably need to use a more extensive rolling forecast evaluation exercise if we felt like we needed to only choose one for production. `mvgam` offers some utilities for doing this (i.e. see `?lfo_cv` for guidance). Alternatively, we could use forecasts from *both* models by creating an evenly-weighted ensemble forecast distribution. This capability is available using the `ensemble()` function in `mvgam` (see `?ensemble` for guidance). \n\nUsing `how_to_cite()` for models with VAR dynamics will give you information on how they are restricted to remain stationary:\n```{r}\ndescription <- how_to_cite(varcor_mod)\n```\n\n```{r, eval = FALSE}\ndescription\n```\n\n```{r, echo=FALSE}\ncat(\"Methods text skeleton\\n\")\ncat(insight::format_message(description$methods_text))\n```\n\n```{r echo=FALSE}\ncat(\"\\nPrimary references\\n\")\nfor (i in seq_along(description$citations)) {\n  cat(insight::format_message(description$citations[[i]]))\n  cat('\\n')\n}\ncat(\"\\nOther useful references\\n\")\nfor (i in seq_along(description$other_citations)) {\n  cat(insight::format_message(description$other_citations[[i]]))\n  cat('\\n')\n}\n```\n\nMore advanced hierarchical panel VAR models can also be handled by using the `gr` and `subgr` arguments in `VAR()`. These models are useful if you have a data for the same set of series (`subgr`) that are measured in different regions (`gr`), such as species measured in different sampling regions or financial series measured in different countries.\n\n## Further reading\nThe following papers and resources offer a lot of useful material about multivariate State-Space models and how they can be applied in practice:\n  \nAuger‐Méthé, Marie, et al. [A guide to state–space modeling of ecological time series](https://esajournals.onlinelibrary.wiley.com/doi/full/10.1002/ecm.1470). *Ecological Monographs* 91.4 (2021): e01470.\n  \nClark, Nicholas J., et al. [Beyond single-species models: leveraging multispecies forecasts to navigate the dynamics of ecological predictability](https://peerj.com/articles/18929/). *PeerJ*. (2025): 13:e18929\n  \nHeaps, Sarah E. [Enforcing stationarity through the prior in vector autoregressions](https://www.tandfonline.com/doi/full/10.1080/10618600.2022.2079648). *Journal of Computational and Graphical Statistics* 32.1 (2023): 74-83.\n  \nHannaford, Naomi E., et al. [A sparse Bayesian hierarchical vector autoregressive model for microbial dynamics in a wastewater treatment plant](https://doi.org/10.1016/j.csda.2022.107659). *Computational Statistics & Data Analysis* 179 (2023): 107659.\n  \nHolmes, Elizabeth E., Eric J. Ward, and Wills Kellie. [MARSS: multivariate autoregressive state-space models for analyzing time-series data](https://journal.r-project.org/articles/RJ-2012-002/). *R Journal*. 4.1 (2012): 11.\n  \nKarunarathna, K.A.N.K., et al. [Modelling nonlinear responses of a desert rodent species to environmental change with hierarchical dynamic generalized additive models](https://doi.org/10.1016/j.ecolmodel.2024.110648). *Ecological Modelling* (2024): 490, 110648.  \n  \nWard, Eric J., et al. [Inferring spatial structure from time‐series data: using multivariate state‐space models to detect metapopulation structure of California sea lions in the Gulf of California, Mexico](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/j.1365-2664.2009.01745.x). *Journal of Applied Ecology* 47.1 (2010): 47-56.\n\n## Interested in contributing?\nI'm actively seeking PhD students and other researchers to work in the areas of ecological forecasting, multivariate model evaluation and development of `mvgam`. Please see [this small list of opportunities on my website](https://ecogambler.netlify.app/opportunities/) and do reach out if you are interested (n.clark'at'uq.edu.au)\n"
  }
]